Web-Oberflaeche als Dienst, Anmeldung mit den Proxmox-Benutzern

install.sh --with-webexplorer --port <nummer> richtet pvesnap-web.service
ein. Fehlt der Port, bricht das Skript mit einer Erklaerung ab; --port
ohne --with-webexplorer, ein Port ausserhalb 1-65535, etwas anderes als
eine Zahl und Port 8006 (Proxmox selbst) werden ebenfalls abgefangen -
und zwar vor der root-Pruefung, damit ein Tippfehler sofort auffaellt.
--help beschreibt jetzt alle Optionen mit Beispielen.

Port, Adresse und Anmeldeart stehen in /etc/pvesnap/web.conf und lassen
sich dort aendern, ohne die Unit anzufassen.

Angemeldet wird mit den Benutzern von Proxmox VE: dieselbe Maske aus
Benutzer, Passwort und Realm-Auswahl, geprueft ueber POST /access/ticket
auf der lokalen API - also derselbe Weg wie im Proxmox-Webinterface. Alle
Realms funktionieren damit automatisch; Zwei-Faktor-Anmeldungen werden
abgewiesen statt halb durchgewinkt.

Ein gueltiges Passwort allein reicht nicht: zusaetzlich braucht der
Benutzer auf dem Gast das Recht VM.Snapshot (geprueft auf /, /vms,
/vms/<id> und dem Pool). Sonst koennte jeder Proxmox-Benutzer saemtliche
Dateien aller Gaeste lesen. In der Gastliste erscheinen nur erlaubte
Gaeste, root@pam sieht wie in Proxmox alles. Anpassbar ueber
--require-privilege und --allow-user.

Ausserdem: SIGTERM haengt einen offenen Snapshot wieder aus (ohne das
bliebe er bei "systemctl stop" eingebunden), und beim Start werden Reste
von Prozessen abgeraeumt, die es nicht mehr gibt - parallel laufende
Sitzungen bleiben dabei unangetastet.

Auf pvetest01 geprueft: Dienststart ueber systemd, Anmeldemaske mit den
Realms des Hosts, Abweisung ohne und mit falschen Zugangsdaten (401,
protokolliert mit Absender-IP), Zugriff ohne Recht (403 auf Snapshot-
Liste und Oeffnen), vollstaendiger Ablauf als Berechtigter bis zum
Datei-Download, Abmelden macht die Sitzung ungueltig, und SIGTERM
hinterlaesst weder rbd-Maps noch Mountpunkte.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
duffyduck
2026-07-31 10:15:56 +02:00
co-authored by Claude Opus 5
parent 91bfdea76c
commit 963463a1a1
9 changed files with 647 additions and 91 deletions
+20 -2
View File
@@ -225,10 +225,28 @@ def _registry_remove(kind, value):
_registry_save(entries)
def cleanup_leftovers(verbose=False):
"""Raeumt auf, was ein abgestuerzter Lauf hinterlassen hat."""
def _pid_alive(pid):
if not pid:
return False
try:
os.kill(int(pid), 0)
return True
except ProcessLookupError:
return False
except OSError:
return True # existiert, gehoert uns nur nicht
def cleanup_leftovers(verbose=False, only_dead=False):
"""Raeumt auf, was ein abgestuerzter Lauf hinterlassen hat.
only_dead=True fasst nur an, was von einem nicht mehr laufenden Prozess
stammt - so stoert der Start eines Dienstes keine parallel offene Sitzung.
"""
removed = []
for entry in reversed(_registry_load()):
if only_dead and _pid_alive(entry.get("pid")):
continue
kind, value = entry.get("kind"), entry.get("value")
extra = entry.get("extra") or {}
try: