Dateien nach "authelia" hochladen

This commit is contained in:
2026-01-10 12:17:13 +01:00
parent c04547f831
commit 4414d6db4e

247
authelia/authelia-update.sh Normal file
View File

@@ -0,0 +1,247 @@
#!/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