Dateien nach "authelia" hochladen
This commit is contained in:
247
authelia/authelia-update.sh
Normal file
247
authelia/authelia-update.sh
Normal 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
|
||||
Reference in New Issue
Block a user