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