249 lines
6.5 KiB
Bash
249 lines
6.5 KiB
Bash
#!/bin/sh
|
||
###############################################################################
|
||
#
|
||
# authelia-update.sh
|
||
#
|
||
# Zweck:
|
||
# -------
|
||
# Verwaltung von Authelia-Versionen auf FreeBSD-Systemen.
|
||
#
|
||
# Funktionen:
|
||
# - Prüfen, ob eine neuere Authelia-Version verfügbar ist
|
||
# - Update auf neueste GitHub-Release-Version (--apply)
|
||
# - Automatisches Zurückrollen bei fehlgeschlagenem Update (--auto-revert)
|
||
# - Schrittweises Zurückgehen (--revert)
|
||
# - Schrittweises Vorwärtsgehen (--forward)
|
||
#
|
||
# Alle Versionen und Datenbanken werden dauerhaft gespeichert unter:
|
||
#
|
||
# /var/authelia/
|
||
# ├── backups/ (Authelia-Binaries, versioniert)
|
||
# ├── db/ (SQLite-DB pro Version)
|
||
# └── downloads/ (Release-Tarballs)
|
||
#
|
||
# Exit-Codes:
|
||
# 0 Erfolg
|
||
# 10 Update verfügbar, aber nicht angewendet
|
||
# 64 Ungültige Parameter
|
||
# 69 Netzwerk- oder GitHub-Fehler
|
||
# 70 Versions-/Binary-Fehler
|
||
# 72 Kein passendes Backup für revert
|
||
# 73 Kein passendes Backup für forward
|
||
# 74 Download/Entpack-Fehler
|
||
# 75 Dienst läuft nach Wechsel nicht / Version passt nicht
|
||
#
|
||
###############################################################################
|
||
|
||
set -eu
|
||
|
||
### Konfiguration
|
||
GITHUB_REPO="authelia/authelia"
|
||
INSTALL_DIR="/usr/local/bin"
|
||
BIN_PATH="${INSTALL_DIR}/authelia"
|
||
SERVICE_NAME="authelia"
|
||
|
||
DB_PATH="/var/db/authelia.sqlite3"
|
||
|
||
STATE_DIR="/var/authelia"
|
||
BACKUP_DIR="${STATE_DIR}/backups"
|
||
DB_BACKUP_DIR="${STATE_DIR}/db"
|
||
DOWNLOAD_DIR="${STATE_DIR}/downloads"
|
||
|
||
### Flags
|
||
APPLY=0
|
||
AUTO_REVERT=0
|
||
DO_REVERT=0
|
||
DO_FORWARD=0
|
||
|
||
###############################################################################
|
||
print_help() {
|
||
sed -n '1,170p' "$0"
|
||
exit 0
|
||
}
|
||
|
||
usage_error() {
|
||
echo "❌ Ungültige Parameter"
|
||
echo "→ Verwende -h oder --help"
|
||
exit 64
|
||
}
|
||
|
||
###############################################################################
|
||
# Argumente parsen
|
||
for arg in "$@"; do
|
||
case "$arg" in
|
||
--apply) APPLY=1 ;;
|
||
--auto-revert) AUTO_REVERT=1 ;;
|
||
--revert) DO_REVERT=1 ;;
|
||
--forward) DO_FORWARD=1 ;;
|
||
-h|--help) print_help ;;
|
||
*) usage_error ;;
|
||
esac
|
||
done
|
||
|
||
ACTION_COUNT=$((APPLY + DO_REVERT + DO_FORWARD))
|
||
[ "$ACTION_COUNT" -le 1 ] || usage_error
|
||
|
||
###############################################################################
|
||
mkdir -p "${BACKUP_DIR}" "${DB_BACKUP_DIR}" "${DOWNLOAD_DIR}"
|
||
|
||
###############################################################################
|
||
get_version() {
|
||
# Erwartet Ausgabe wie: "authelia version v4.39.15"
|
||
# Liefert: 4.39.15
|
||
authelia -v 2>/dev/null | sed -nE 's/.* v([0-9]+\.[0-9]+\.[0-9]+).*/\1/p' | head -n1
|
||
}
|
||
|
||
latest_github_version() {
|
||
fetch -qo - "https://api.github.com/repos/${GITHUB_REPO}/releases/latest" \
|
||
| sed -nE 's/.*"tag_name": *"v([^"]+)".*/\1/p' | head -n1
|
||
}
|
||
|
||
is_authelia_running() {
|
||
pgrep -af "^${BIN_PATH}" >/dev/null 2>&1
|
||
}
|
||
|
||
stop_service() {
|
||
service "${SERVICE_NAME}" stop || true
|
||
sleep 2
|
||
if is_authelia_running; then
|
||
echo "❌ Authelia läuft noch nach stop"
|
||
exit 75
|
||
fi
|
||
}
|
||
|
||
start_and_verify_running() {
|
||
service "${SERVICE_NAME}" start || return 1
|
||
sleep 10
|
||
is_authelia_running
|
||
}
|
||
|
||
verify_installed_version_is() {
|
||
expected="$1"
|
||
got="$(get_version || true)"
|
||
if [ -z "${got}" ]; then
|
||
echo "❌ Konnte Authelia-Version nicht ermitteln"
|
||
return 1
|
||
fi
|
||
if [ "${got}" != "${expected}" ]; then
|
||
echo "❌ Versionsprüfung fehlgeschlagen: erwartet v${expected}, gefunden v${got}"
|
||
return 1
|
||
fi
|
||
return 0
|
||
}
|
||
|
||
backup_current() {
|
||
ver="$1"
|
||
cp -a "${BIN_PATH}" "${BACKUP_DIR}/authelia-v${ver}"
|
||
cp -a "${DB_PATH}" "${DB_BACKUP_DIR}/authelia-v${ver}.sqlite3"
|
||
}
|
||
|
||
restore_version() {
|
||
ver="$1"
|
||
|
||
stop_service
|
||
|
||
cp -a "${BACKUP_DIR}/authelia-v${ver}" "${BIN_PATH}"
|
||
cp -a "${DB_BACKUP_DIR}/authelia-v${ver}.sqlite3" "${DB_PATH}"
|
||
|
||
chmod 755 "${BIN_PATH}"
|
||
|
||
start_and_verify_running || {
|
||
echo "❌ Dienst läuft nach Start nicht"
|
||
exit 75
|
||
}
|
||
|
||
verify_installed_version_is "${ver}" || exit 75
|
||
}
|
||
|
||
###############################################################################
|
||
command -v authelia >/dev/null 2>&1 || exit 70
|
||
|
||
CURRENT_VERSION="$(get_version)"
|
||
[ -n "${CURRENT_VERSION}" ] || exit 70
|
||
|
||
echo "Aktuelle Version : v${CURRENT_VERSION}"
|
||
|
||
###############################################################################
|
||
# REVERT
|
||
if [ "$DO_REVERT" -eq 1 ]; then
|
||
PREV_VERSION="$(ls "${BACKUP_DIR}" 2>/dev/null | sed -nE 's/^authelia-v//p' | sort -V | grep -B1 "^${CURRENT_VERSION}$" | head -n1)"
|
||
[ -n "${PREV_VERSION}" ] || exit 72
|
||
|
||
echo "↩ Revert auf v${PREV_VERSION}"
|
||
restore_version "${PREV_VERSION}"
|
||
echo "✅ Revert erfolgreich (v${PREV_VERSION})"
|
||
exit 0
|
||
fi
|
||
|
||
###############################################################################
|
||
# FORWARD
|
||
if [ "$DO_FORWARD" -eq 1 ]; then
|
||
NEXT_VERSION="$(ls "${BACKUP_DIR}" 2>/dev/null | sed -nE 's/^authelia-v//p' | sort -V | grep -A1 "^${CURRENT_VERSION}$" | tail -n1)"
|
||
[ -n "${NEXT_VERSION}" ] || exit 73
|
||
|
||
echo "↪ Forward auf v${NEXT_VERSION}"
|
||
restore_version "${NEXT_VERSION}"
|
||
echo "✅ Forward erfolgreich (v${NEXT_VERSION})"
|
||
exit 0
|
||
fi
|
||
|
||
###############################################################################
|
||
# CHECK / APPLY
|
||
LATEST_VERSION="$(latest_github_version)"
|
||
[ -n "${LATEST_VERSION}" ] || exit 69
|
||
|
||
if [ "${LATEST_VERSION}" = "${CURRENT_VERSION}" ]; then
|
||
echo "✔ Authelia ist aktuell"
|
||
exit 0
|
||
fi
|
||
|
||
echo "Neueste Version : v${LATEST_VERSION}"
|
||
echo "⬆ Update verfügbar"
|
||
|
||
[ "$APPLY" -eq 1 ] || {
|
||
echo "ℹ Kein --apply gesetzt, keine Änderungen durchgeführt"
|
||
exit 10
|
||
}
|
||
|
||
###############################################################################
|
||
ARCHIVE="authelia-v${LATEST_VERSION}-freebsd-amd64.tar.gz"
|
||
URL="https://github.com/${GITHUB_REPO}/releases/download/v${LATEST_VERSION}/${ARCHIVE}"
|
||
DEST="${DOWNLOAD_DIR}/${ARCHIVE}"
|
||
|
||
fetch -o "${DEST}" "${URL}" || exit 74
|
||
|
||
TMPDIR="$(mktemp -d)"
|
||
tar -xzf "${DEST}" -C "${TMPDIR}" || exit 74
|
||
|
||
###############################################################################
|
||
backup_current "${CURRENT_VERSION}"
|
||
|
||
stop_service
|
||
|
||
cp -a "${TMPDIR}/authelia" "${BIN_PATH}"
|
||
chmod 755 "${BIN_PATH}"
|
||
|
||
start_and_verify_running || {
|
||
echo "❌ Dienst läuft nach Update-Start nicht"
|
||
if [ "$AUTO_REVERT" -eq 1 ]; then
|
||
echo "⚠ Fehlstart – Auto-Revert auf v${CURRENT_VERSION}"
|
||
restore_version "${CURRENT_VERSION}"
|
||
exit 75
|
||
fi
|
||
exit 75
|
||
}
|
||
|
||
verify_installed_version_is "${LATEST_VERSION}" || {
|
||
echo "❌ Update aktiv, aber Version passt nicht"
|
||
if [ "$AUTO_REVERT" -eq 1 ]; then
|
||
echo "⚠ Auto-Revert auf v${CURRENT_VERSION}"
|
||
restore_version "${CURRENT_VERSION}"
|
||
exit 75
|
||
fi
|
||
exit 75
|
||
}
|
||
|
||
echo "✅ Update erfolgreich auf v${LATEST_VERSION}"
|
||
exit 0
|
||
|