Import alt-mysql plugin

This commit is contained in:
Marek Miklewicz
2026-07-04 15:48:19 +02:00
commit d71fcf9ace
101 changed files with 18635 additions and 0 deletions
+365
View File
@@ -0,0 +1,365 @@
#!/bin/bash
set -euo pipefail
# Upgrade alternatywnej instancji MariaDB instalowanej z oficjalnego tarballa.
TARGET_MARIADB_VERSION="${TARGET_MARIADB_VERSION:-11.8}"
MARIADB_DIR="${MARIADB_DIR:-/usr/local/mariadb-$TARGET_MARIADB_VERSION}"
DATADIR="${DATADIR:-/var/lib/mariadb_data}"
SERVICE_NAME="${SERVICE_NAME:-alt-mariadb}"
INSTANCE_CNF="${INSTANCE_CNF:-/etc/alt-mariadb.cnf}"
ALT_MY_CNF="${ALT_MY_CNF:-/usr/local/directadmin/conf/alt-my.cnf}"
ALT_MYSQL_CONF="${ALT_MYSQL_CONF:-/usr/local/directadmin/conf/alt-mysql.conf}"
ALT_METADATA_ENV="${ALT_METADATA_ENV:-/usr/local/directadmin/conf/alt-mariadb.env}"
DOWNLOAD_DIR="${DOWNLOAD_DIR:-/usr/local/src}"
MARIADB_TARBALL_URL="${MARIADB_TARBALL_URL:-}"
FORCE_UPGRADE="${FORCE_UPGRADE:-no}"
PORT="${PORT:-}"
SOCKET="${SOCKET:-}"
CURRENT_MARIADB_DIR=""
RESOLVED_MARIADB_RELEASE=""
DOWNLOAD_URL=""
TARBALL_PATH=""
TMP_DIR=""
TARGET_BACKUP_DIR=""
INSTANCE_CNF_BACKUP=""
UPGRADE_EXTRACTED=0
UPGRADE_COMMITTED=0
SERVICE_WAS_ACTIVE=0
log() {
printf '[INFO] %s\n' "$*"
}
warn() {
printf '[UWAGA] %s\n' "$*" >&2
}
die() {
printf '[BŁĄD] %s\n' "$*" >&2
exit 1
}
cleanup() {
if [ -n "${TMP_DIR:-}" ] && [ -d "$TMP_DIR" ]; then
rm -rf "$TMP_DIR"
fi
}
trap cleanup EXIT
rollback_upgrade() {
local code="$1"
if [ "$code" -eq 0 ] || [ "$UPGRADE_COMMITTED" -eq 1 ]; then
cleanup
return 0
fi
warn "Upgrade nie zakończył się poprawnie, uruchamiam rollback."
if [ -n "$INSTANCE_CNF_BACKUP" ] && [ -r "$INSTANCE_CNF_BACKUP" ]; then
cp -a "$INSTANCE_CNF_BACKUP" "$INSTANCE_CNF" || true
warn "RESTORED_INSTANCE_CNF: $INSTANCE_CNF"
fi
if [ "$UPGRADE_EXTRACTED" -eq 1 ] && [ -d "$MARIADB_DIR" ]; then
if [ -n "$TARGET_BACKUP_DIR" ] && [ -d "$TARGET_BACKUP_DIR" ]; then
rm -rf "$MARIADB_DIR" || true
elif [ "$MARIADB_DIR" != "$CURRENT_MARIADB_DIR" ]; then
rm -rf "$MARIADB_DIR" || true
fi
fi
if [ -n "$TARGET_BACKUP_DIR" ] && [ -d "$TARGET_BACKUP_DIR" ] && [ ! -e "$MARIADB_DIR" ]; then
mv "$TARGET_BACKUP_DIR" "$MARIADB_DIR" || true
warn "RESTORED_PREVIOUS_DIR: $MARIADB_DIR"
fi
if [ "$SERVICE_WAS_ACTIVE" -eq 1 ]; then
if command -v systemctl >/dev/null 2>&1; then
systemctl daemon-reload || true
systemctl restart "$SERVICE_NAME" || true
fi
fi
cleanup
}
trap 'code=$?; rollback_upgrade "$code"' EXIT
require_root() {
if [ "${EUID:-$(id -u)}" -ne 0 ]; then
die "Ten skrypt musi być uruchomiony jako root."
fi
}
validate_version() {
case "$TARGET_MARIADB_VERSION" in
10.11|11.4|11.8)
log "Wybrano docelową wersję MariaDB: $TARGET_MARIADB_VERSION."
;;
*)
die "Nieobsługiwana wersja MariaDB: $TARGET_MARIADB_VERSION. Dozwolone wartości: 10.11, 11.4, 11.8."
;;
esac
}
detect_architecture() {
case "$(uname -m)" in
x86_64|amd64) printf 'x86_64\n' ;;
*) die "Nieobsługiwana architektura: $(uname -m). Skrypt obsługuje automatycznie tylko x86_64/amd64." ;;
esac
}
detect_current_mariadb_dir() {
if [ -r "$INSTANCE_CNF" ]; then
CURRENT_MARIADB_DIR="$(awk -F= '
/^[[:space:]]*basedir[[:space:]]*=/ {
value=$2
gsub(/^[[:space:]]+|[[:space:]]+$/, "", value)
print value
exit
}
' "$INSTANCE_CNF")"
DATADIR="$(awk -F= '
/^[[:space:]]*datadir[[:space:]]*=/ {
value=$2
gsub(/^[[:space:]]+|[[:space:]]+$/, "", value)
print value
exit
}
' "$INSTANCE_CNF")"
PORT="$(awk -F= '
/^[[:space:]]*port[[:space:]]*=/ {
value=$2
gsub(/^[[:space:]]+|[[:space:]]+$/, "", value)
print value
exit
}
' "$INSTANCE_CNF")"
SOCKET="$(awk -F= '
/^[[:space:]]*socket[[:space:]]*=/ {
value=$2
gsub(/^[[:space:]]+|[[:space:]]+$/, "", value)
print value
exit
}
' "$INSTANCE_CNF")"
fi
if [ -z "$CURRENT_MARIADB_DIR" ] && systemctl cat "$SERVICE_NAME" >/dev/null 2>&1; then
CURRENT_MARIADB_DIR="$(systemctl cat "$SERVICE_NAME" \
| awk '/ExecStart=/ {
sub(/^.*ExecStart=/, "")
sub(/\/bin\/mariadbd.*$/, "")
print
exit
}')"
fi
[ -n "$CURRENT_MARIADB_DIR" ] || die "Nie udało się wykryć bieżącego katalogu MariaDB."
[ -x "$CURRENT_MARIADB_DIR/bin/mariadbd" ] || die "Bieżący katalog MariaDB nie zawiera bin/mariadbd: $CURRENT_MARIADB_DIR."
[ -n "$DATADIR" ] || die "Nie udało się wykryć katalogu danych z $INSTANCE_CNF."
log "Wykryto bieżący katalog MariaDB: $CURRENT_MARIADB_DIR."
}
resolve_latest_release_from_archive() {
local series="$1"
local listing=""
local release=""
listing="$(curl -fsSL "https://archive.mariadb.org/" || true)"
release="$(printf '%s\n' "$listing" \
| grep -Eo "mariadb-${series//./\\.}\.[0-9]+/" \
| sed 's#^mariadb-##; s#/$##' \
| sort -V \
| tail -n 1)"
[ -n "$release" ] || return 1
printf '%s\n' "$release"
}
resolve_tarball_from_directory() {
local release="$1"
local arch="$2"
local dir_url="https://archive.mariadb.org/mariadb-${release}/bintar-linux-systemd-${arch}/"
local listing=""
local file=""
listing="$(curl -fsSL "$dir_url" || true)"
file="$(printf '%s\n' "$listing" \
| grep -Eo "mariadb-${release}-linux-systemd-${arch}\.tar\.(gz|xz)" \
| head -n 1)"
[ -n "$file" ] || return 1
printf '%s%s\n' "$dir_url" "$file"
}
resolve_download_url() {
local arch=""
arch="$(detect_architecture)"
if [ -n "$MARIADB_TARBALL_URL" ]; then
DOWNLOAD_URL="$MARIADB_TARBALL_URL"
log "Używam ręcznie ustawionego adresu tarballa MariaDB."
return 0
fi
RESOLVED_MARIADB_RELEASE="$(resolve_latest_release_from_archive "$TARGET_MARIADB_VERSION" || true)"
[ -n "$RESOLVED_MARIADB_RELEASE" ] || die "Nie udało się wykryć najnowszego wydania dla gałęzi $TARGET_MARIADB_VERSION."
DOWNLOAD_URL="$(resolve_tarball_from_directory "$RESOLVED_MARIADB_RELEASE" "$arch" || true)"
[ -n "$DOWNLOAD_URL" ] || die "Nie udało się automatycznie ustalić URL tarballa. Ustaw MARIADB_TARBALL_URL."
log "Wykryto tarball MariaDB $RESOLVED_MARIADB_RELEASE."
}
download_tarball() {
local filename=""
install -d -m 0755 "$DOWNLOAD_DIR"
filename="$(basename "${DOWNLOAD_URL%%\?*}")"
TARBALL_PATH="$DOWNLOAD_DIR/$filename"
log "Pobieram tarball MariaDB do $TARBALL_PATH."
curl -fL --retry 3 --connect-timeout 20 -o "$TARBALL_PATH" "$DOWNLOAD_URL"
[ -s "$TARBALL_PATH" ] || die "Pobrany tarball jest pusty albo nie istnieje: $TARBALL_PATH."
}
extract_tarball() {
local extracted_dir=""
local backup_dir=""
if [ -d "$MARIADB_DIR" ] && [ -n "$(find "$MARIADB_DIR" -mindepth 1 -maxdepth 1 -print -quit)" ]; then
if [ "$FORCE_UPGRADE" != "yes" ]; then
die "Katalog docelowy $MARIADB_DIR już istnieje. Ustaw FORCE_UPGRADE=yes, aby zastąpić go po kopii."
fi
TARGET_BACKUP_DIR="${MARIADB_DIR}.pre-upgrade.$(date +%Y%m%d%H%M%S)"
log "Tworzę kopię istniejącego katalogu docelowego: $TARGET_BACKUP_DIR."
mv "$MARIADB_DIR" "$TARGET_BACKUP_DIR"
fi
TMP_DIR="$(mktemp -d)"
tar -xf "$TARBALL_PATH" -C "$TMP_DIR"
extracted_dir="$(find "$TMP_DIR" -mindepth 1 -maxdepth 1 -type d -print -quit)"
[ -n "$extracted_dir" ] || die "Tarball nie zawiera oczekiwanego katalogu MariaDB."
mv "$extracted_dir" "$MARIADB_DIR"
chown -R root:root "$MARIADB_DIR"
UPGRADE_EXTRACTED=1
log "Nowe binaria MariaDB są w $MARIADB_DIR."
}
rewrite_instance_basedir() {
local backup=""
[ -r "$INSTANCE_CNF" ] || die "Brak konfiguracji instancji: $INSTANCE_CNF."
backup="${INSTANCE_CNF}.pre-upgrade.$(date +%Y%m%d%H%M%S)"
cp -a "$INSTANCE_CNF" "$backup"
INSTANCE_CNF_BACKUP="$backup"
sed -i "s#^[[:space:]]*basedir[[:space:]]*=.*#basedir=$MARIADB_DIR#" "$INSTANCE_CNF"
sed -i "s#^[[:space:]]*plugin-dir[[:space:]]*=.*#plugin-dir=$MARIADB_DIR/lib/plugin#" "$INSTANCE_CNF"
log "Zaktualizowano basedir i plugin-dir w $INSTANCE_CNF. Kopia: $backup."
}
restart_service() {
log "Restartuję usługę $SERVICE_NAME."
systemctl daemon-reload
systemctl restart "$SERVICE_NAME"
sleep 5
systemctl is-active --quiet "$SERVICE_NAME" || {
systemctl status "$SERVICE_NAME" --no-pager || true
die "Usługa $SERVICE_NAME nie uruchomiła się po upgrade."
}
}
run_mariadb_upgrade() {
local upgrade_bin=""
if [ -x "$MARIADB_DIR/bin/mariadb-upgrade" ]; then
upgrade_bin="$MARIADB_DIR/bin/mariadb-upgrade"
elif [ -x "$MARIADB_DIR/bin/mysql_upgrade" ]; then
upgrade_bin="$MARIADB_DIR/bin/mysql_upgrade"
else
warn "Nie znaleziono mariadb-upgrade ani mysql_upgrade, pomijam etap aktualizacji tabel systemowych."
return 0
fi
[ -r "$ALT_MY_CNF" ] || die "Brak pliku klienta alternatywnej instancji: $ALT_MY_CNF."
log "Uruchamiam aktualizację tabel systemowych MariaDB."
"$upgrade_bin" --defaults-extra-file="$ALT_MY_CNF"
}
credential_group() {
if getent group diradmin >/dev/null 2>&1; then
printf 'diradmin\n'
else
printf 'root\n'
fi
}
sh_single_quote() {
local value="$1"
value="${value//\'/\'\\\'\'}"
printf "'%s'" "$value"
}
write_alt_metadata_env() {
local group_name metadata_mode tmp_file
group_name="$(credential_group)"
metadata_mode="0600"
if [ "$group_name" = "diradmin" ]; then
metadata_mode="0640"
fi
tmp_file="$(mktemp)"
cat > "$tmp_file" <<EOF
# Metadata alternatywnej instancji MariaDB zarządzanej przez mysql_upgrade.sh.
# Ten plik jest kontraktem dla pluginu DirectAdmin i nie jest natywną konfiguracją MySQL DirectAdmina.
SERVICE_NAME=$(sh_single_quote "$SERVICE_NAME")
MARIADB_VERSION=$(sh_single_quote "$TARGET_MARIADB_VERSION")
MARIADB_RELEASE=$(sh_single_quote "${RESOLVED_MARIADB_RELEASE:-$TARGET_MARIADB_VERSION}")
MARIADB_DIR=$(sh_single_quote "$MARIADB_DIR")
DATADIR=$(sh_single_quote "$DATADIR")
PORT=$(sh_single_quote "$PORT")
SOCKET=$(sh_single_quote "$SOCKET")
ALT_MYSQL_CONF=$(sh_single_quote "$ALT_MYSQL_CONF")
ALT_MY_CNF=$(sh_single_quote "$ALT_MY_CNF")
INSTANCE_CNF=$(sh_single_quote "$INSTANCE_CNF")
EOF
install -m "$metadata_mode" -o root -g "$group_name" "$tmp_file" "$ALT_METADATA_ENV"
rm -f "$tmp_file"
log "Zaktualizowano metadane alternatywnej instancji: $ALT_METADATA_ENV."
}
print_summary() {
cat <<EOF
Upgrade alternatywnej instancji MariaDB zakończony.
Poprzedni katalog programu: $CURRENT_MARIADB_DIR
Nowy katalog programu: $MARIADB_DIR
Katalog danych: $DATADIR
Konfiguracja instancji: $INSTANCE_CNF
Usługa systemd: $SERVICE_NAME
Polecenie testowe:
$MARIADB_DIR/bin/mariadb --defaults-extra-file=$ALT_MY_CNF -e "SELECT VERSION();"
EOF
}
main() {
require_root
validate_version
detect_current_mariadb_dir
resolve_download_url
download_tarball
if systemctl is-active --quiet "$SERVICE_NAME"; then
SERVICE_WAS_ACTIVE=1
fi
systemctl stop "$SERVICE_NAME"
extract_tarball
rewrite_instance_basedir
restart_service
run_mariadb_upgrade
write_alt_metadata_env
UPGRADE_COMMITTED=1
print_summary
}
main "$@"