install.sh: laufende Web-Oberflaeche vor der Aktualisierung anhalten

Bisher warnte der Installer "Auf Port 8823 lauscht bereits etwas" - dabei war
das der eigene, laufende Dienst. Der Hinweis war also falsch und verdeckte
zugleich einen echten Fall: wenn wirklich etwas Fremdes den Port haelt.

Jetzt wird unterschieden. Laeuft pvesnap-web, wird das als Normalfall einer
Aktualisierung behandelt und der Dienst angehalten, bevor der Code unter ihm
ausgetauscht wird - beim Stoppen bekommt er sein SIGTERM und haengt offene
Snapshots sauber aus. Am Ende faehrt er wieder hoch. Haelt dagegen ein anderer
Prozess den Port, steht die Warnung weiterhin da, jetzt mit der Angabe, wer es
ist (ss -ltnp).

Bewusst kein "pvesnap-explorer --cleanup" an der Stelle: das wuerde auch die
Einbindungen einer Sitzung loesen, die jemand gerade in einem anderen Terminal
offen hat.

Geprueft: Installation ueber den laufenden Dienst hinweg (anhalten, ersetzen,
wieder starten, HTTP 401 = Anmeldemaske), und mit einem fremden Prozess auf
dem Port (Warnung samt PID, Dienste nicht gestartet).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
duffyduck
2026-08-03 12:08:25 +02:00
co-authored by Claude Opus 5
parent f2de07ecfd
commit a1076c6641
+29 -3
View File
@@ -40,6 +40,7 @@ SRC="$(cd "$(dirname "$0")" && pwd)"
START=1 START=1
FORCE=0 FORCE=0
DEPS=1 DEPS=1
WEB_RUNNING=0
WEB=0 WEB=0
WEB_PORT="" WEB_PORT=""
WEB_BIND="0.0.0.0" WEB_BIND="0.0.0.0"
@@ -80,9 +81,15 @@ if [ "$WEB" -eq 1 ]; then
if [ "$WEB_PORT" -eq 8006 ]; then if [ "$WEB_PORT" -eq 8006 ]; then
fail "Port 8006 gehoert dem Proxmox-Webinterface - bitte einen anderen waehlen." fail "Port 8006 gehoert dem Proxmox-Webinterface - bitte einen anderen waehlen."
fi fi
if ss -ltn 2>/dev/null | grep -qE "[:.]${WEB_PORT}[[:space:]]"; then # Laeuft unsere eigene Web-Oberflaeche schon, gehoert ihr der Port auch -
warn "Auf Port ${WEB_PORT} lauscht bereits etwas - der Dienst wird sich " # das ist kein Konflikt, sondern der Normalfall bei einer Aktualisierung.
warn "moeglicherweise nicht starten lassen." # Sie wird weiter unten gestoppt, bevor der Code ausgetauscht wird.
if systemctl is-active --quiet pvesnap-web.service 2>/dev/null; then
WEB_RUNNING=1
elif ss -ltn 2>/dev/null | grep -qE "[:.]${WEB_PORT}[[:space:]]"; then
warn "Auf Port ${WEB_PORT} lauscht bereits etwas anderes - der Dienst"
warn "wird sich moeglicherweise nicht starten lassen."
ss -ltnp 2>/dev/null | grep -E "[:.]${WEB_PORT}[[:space:]]" | sed 's/^/ /' >&2 || true
fi fi
[ -n "$WEB_BIND" ] || fail "--bind erwartet eine Adresse" [ -n "$WEB_BIND" ] || fail "--bind erwartet eine Adresse"
elif [ -n "$WEB_PORT" ]; then elif [ -n "$WEB_PORT" ]; then
@@ -147,6 +154,25 @@ if [ "$DEPS" -eq 1 ]; then
fi fi
# --- Laufendes anhalten -----------------------------------------------
# Der Code wird gleich ersetzt. Die Web-Oberflaeche kann dabei noch Snapshots
# eingebunden haben - sie bekommt beim Stoppen ihr SIGTERM und haengt sauber
# aus. Wuerde sie einfach weiterlaufen, blieben rbd-Zuordnungen und
# Mountpunkte einer Fassung stehen, die es nicht mehr gibt.
if [ "$WEB_RUNNING" -eq 1 ]; then
info "Web-Oberflaeche laeuft - halte sie fuer die Aktualisierung an"
if systemctl stop pvesnap-web.service; then
info " angehalten, Port ${WEB_PORT} ist frei"
else
warn " liess sich nicht anhalten - bitte pruefen:"
warn " systemctl status pvesnap-web"
fi
fi
# Bewusst kein "pvesnap-explorer --cleanup" an dieser Stelle: das wuerde auch
# die Einbindungen einer Sitzung loesen, die jemand gerade in einem anderen
# Terminal offen hat. Wer nach einem Absturz aufraeumen will, ruft es selbst.
# --- Programm --------------------------------------------------------- # --- Programm ---------------------------------------------------------
info "Installiere Programm nach ${LIB_DIR}" info "Installiere Programm nach ${LIB_DIR}"
rm -rf "${LIB_DIR}/pvesnap" rm -rf "${LIB_DIR}/pvesnap"