#!/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