Files
infra-maintenance/authelia/authelia-update.sh
matthiasberner a6e3e58afb
Some checks failed
continuous-integration/drone/push Build is failing
authelia/authelia-update.sh aktualisiert
2026-01-10 21:59:44 +01:00

249 lines
6.5 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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