Version 2.8.18: Versionspruefung im Update, zweiter Anlauf beim Bildschirm

This commit is contained in:
alientim committed 2026-09-13 13:23:39 +02:00
1 parent 491724beb5
commit d34baa67be
7 files changed
+180 -22

No files matched your search

+54
View File
@@ -39,6 +39,7 @@ HTTPS=0
HTTPS_PORT=""
DOMAIN=""
ACME_EMAIL=""
ERZWINGEN=0
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
@@ -49,6 +50,39 @@ warn() { printf '%s !!%s %s\n' "$COLOR_WARN" "$COLOR_OFF" "$*"; }
fail() { printf '%s !!%s %s\n' "$COLOR_ERR" "$COLOR_OFF" "$*" >&2; exit 1; }
info() { printf ' %s\n' "$*"; }
# -- Welche Fassung liegt hier, und welche laeuft schon? ---------------------
#
# Ein Installationslauf auf dieselbe Fassung macht nichts besser: er baut die
# Python-Umgebung neu, kopiert dieselben Dateien, laedt nginx neu und startet
# den Dienst -- mit der einzigen Wirkung, dass die Anwendung ein paar Sekunden
# weg ist. Wer "update.sh" in einen Zeitplan haengt, bekaeme das taeglich.
#
# Verglichen wird die Anwendung **und** der Kern: die beiden Nummern laufen
# absichtlich auseinander (siehe pyproject.toml), und eine Auslieferung kann
# denselben Anwendungsstand mit neuem Kern enthalten.
#: Die Nummer aus einer pyproject.toml. Die erste Zeile "version = ..." gilt --
#: weitere Vorkommen stehen in Abhaengigkeiten und gehen uns nichts an.
paket_version() {
sed -n 's/^version = "\([^"]*\)"/\1/p' "$1" 2>/dev/null | head -1
}
#: Was in dieser Installation laeuft: "<anwendung> <kern>", sonst leer.
laufende_version() {
local wurzel="$1" modul="$2"
[[ -x "$wurzel/venv/bin/python" ]] || return 0
"$wurzel/venv/bin/python" -c \
"import $modul, tesm_core; print($modul.__version__, tesm_core.__version__)" \
2>/dev/null || true
}
#: Ist das, was hier liegt, schon installiert? Eine eigene Funktion, weil genau
#: diese Frage sich pruefen lassen muss -- ohne einen Server aufzusetzen.
gleiche_version() {
local laeuft="$1" liegt="$2"
[[ -n "$laeuft" && "$laeuft" == "$liegt" ]]
}
#: Merker fuer die EXIT-Falle. Zurueckgerollt wird nur, was auch gesichert ist.
SICHERUNG_STEHT=0
INSTALL_FERTIG=0
@@ -129,6 +163,7 @@ Verwendung: install.sh --app <tesm|tesm-license> [Optionen]
--acme-email <a> Kontaktadresse fuer Let's Encrypt.
--skip-packages Keine Systempakete installieren
--yes Rueckfragen ueberspringen
--force Auch dann einrichten, wenn dieselbe Fassung schon laeuft
USAGE
}
@@ -144,6 +179,7 @@ while [[ $# -gt 0 ]]; do
--acme-email) ACME_EMAIL="${2:?}"; shift 2 ;;
--skip-packages) SKIP_PACKAGES=1; shift ;;
--yes|-y) ASSUME_YES=1; shift ;;
--force) ERZWINGEN=1; shift ;;
-h|--help) usage; exit 0 ;;
*) fail "unbekannte Option: $1" ;;
esac
@@ -261,6 +297,23 @@ FAILED_DIR="/srv/$NAME-failed-$TIMESTAMP"
IS_UPDATE=0
[[ -f "$ROOT/data/app.db" ]] && IS_UPDATE=1
# Laeuft hier schon genau das, was hier liegt? Dann ist Schluss, bevor
# irgendetwas angefasst wird -- und zwar mit Ausstiegscode 0: es ist nichts
# schiefgegangen, es war nur nichts zu tun.
MODUL="tesm"
[[ "$APP" == "tesm-license" ]] && MODUL="tesm_license"
LIEGT="$(paket_version "$REPO_DIR/apps/$APP/pyproject.toml") $(
paket_version "$REPO_DIR/packages/tesm-core/pyproject.toml")"
LAEUFT="$(laufende_version "$ROOT" "$MODUL")"
if [[ $IS_UPDATE -eq 1 && $ERZWINGEN -eq 0 ]] && gleiche_version "$LAEUFT" "$LIEGT"; then
step "Nichts zu tun"
info "$APP ${LIEGT%% *} (tesm-core ${LIEGT##* }) laeuft hier bereits."
info "Ein zweiter Durchlauf wuerde nur die Umgebung neu bauen und den"
info "Dienst neu starten -- ohne dass sich etwas aendert."
info "Trotzdem neu einrichten: --force"
exit 0
fi
step "TESM-Installation"
info "Anwendung : $APP${INSTANCE:+ (Instanz $INSTANCE)}"
info "Ziel : $ROOT"
@@ -278,6 +331,7 @@ else
info "nginx : Port $HTTP_PORT (nur HTTP)"
fi
info "Modus : $([[ $IS_UPDATE -eq 1 ]] && echo Aktualisierung || echo Neuinstallation)"
info "Fassung : ${LIEGT%% *} (tesm-core ${LIEGT##* })${LAEUFT:+, bisher ${LAEUFT%% *}}"
if [[ $ASSUME_YES -eq 0 ]]; then
read -r -p "Fortfahren? [j/N] " answer