update.sh: Selbstmodifikation während der Ausführung verhindern

git pull innerhalb des laufenden Skripts konnte die Datei auf der Platte
verändern, während Bash sie noch zeilenweise nachlädt - das führte auf einem
Zielserver zu einer inkonsistenten Mischung aus alter und neuer Ablauflogik
(Tests liefen nach statt vor dem Kopieren, Fehlermeldungen wichen vom
tatsächlichen Skriptinhalt ab). Fix: gesamte Logik in main() gekapselt, das
erst nach vollständigem Einlesen der Datei aufgerufen wird.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
fds2610-bot 2026-07-23 19:16:19 +02:00
parent 6f377ea251
commit 6851e7d4b3

View file

@ -12,13 +12,18 @@
set -euo pipefail set -euo pipefail
# Die gesamte Logik steckt bewusst in einer Funktion, die erst ganz am Ende
# der Datei aufgerufen wird: Bash liest eine Funktionsdefinition komplett ein,
# bevor sie ausgeführt wird. Würde der Skriptkörper stattdessen direkt (ohne
# Funktion) ausgeführt, könnte der "git pull" in Schritt 2 die Datei auf der
# Festplatte mitten in der Ausführung verändern - Bash liest dann ab diesem
# Punkt inkonsistente/veraltete Zeilen nach und das Skript verhält sich
# unvorhersehbar (genau das ist ohne dieses main()-Pattern schon passiert).
main() {
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
WEBROOT="${WEBROOT:-/var/www/html}" WEBROOT="${WEBROOT:-/var/www/html}"
CONFIG_FILE="${CONFIG_FILE:-$WEBROOT/config.php}" CONFIG_FILE="${CONFIG_FILE:-$WEBROOT/config.php}"
log() { echo "==> $*"; }
fail() { echo "FEHLER: $*" >&2; exit 1; }
cd "$PROJECT_DIR" cd "$PROJECT_DIR"
command -v php >/dev/null 2>&1 || fail "php ist nicht installiert bzw. nicht im PATH." command -v php >/dev/null 2>&1 || fail "php ist nicht installiert bzw. nicht im PATH."
@ -75,3 +80,9 @@ if [ -d migrations ] && [ -f migrations/run_migrations.php ]; then
fi fi
log "Update abgeschlossen." log "Update abgeschlossen."
}
log() { echo "==> $*"; }
fail() { echo "FEHLER: $*" >&2; exit 1; }
main "$@"