README: Web-Oberflaeche vollstaendig dokumentiert; "pvesnap-web <vmid>"

Der Abschnitt zur Web-Oberflaeche beschreibt jetzt beides ausfuehrlich:
die Einrichtung als Dienst ueber install.sh --with-webexplorer --port
(mit Beispielen fuer eigene Adresse und --no-start), das Nachtraegliche
Aendern ueber /etc/pvesnap/web.conf und die ueblichen systemctl-Befehle -
sowie den Start von Hand mit einer Tabelle aller Parameter und
Beispielen fuer die typischen Faelle: SSH-Tunnel, Backup-Team mit
VM.Backup statt VM.Snapshot, einzelner Dienstleister ueber --allow-user,
Zugangsschluessel statt Anmeldung, freies Verzeichnis, Aufraeumen.

Der Explorer hat ebenfalls eine Parametertabelle bekommen.

Dabei fiel auf, dass "pvesnap-web <vmid>" ohne Snapshot-Namen bisher gar
nichts bewirkte - man bekam trotzdem die vollstaendige Gastliste. Jetzt
schraenkt die Angabe die Oberflaeche wirklich auf diesen Gast ein, und
zwar auch gegen Aufrufe ueber die Adresszeile.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
duffyduck
2026-07-31 10:28:20 +02:00
co-authored by Claude Opus 5
parent 3acbebce6f
commit ab610a1f5a
2 changed files with 94 additions and 10 deletions
+9 -2
View File
@@ -85,13 +85,16 @@ class AppState:
"""Was gerade geoeffnet ist. Es ist immer hoechstens ein Snapshot offen."""
def __init__(self, token="", proxmox=None, fixed_path="", auth_mode="token",
privilege=DEFAULT_PRIVILEGE, allowed_users=()):
privilege=DEFAULT_PRIVILEGE, allowed_users=(), only_vmid=None):
self.token = token
self.proxmox = proxmox
self.fixed_path = fixed_path
self.auth_mode = auth_mode # pve | token | none
self.privilege = privilege
self.allowed_users = tuple(allowed_users or ())
# Wurde beim Start eine VMID angegeben, gibt es auch nur diesen Gast -
# weder in der Liste noch ueber die Adresszeile.
self.only_vmid = only_vmid
self.sessions = Sessions()
self.session = None
self.guest = None
@@ -107,6 +110,8 @@ class AppState:
def visible_guests(self, userid):
"""Nur die Gaeste, in die dieser Benutzer hineinsehen darf."""
guests = self.proxmox.inventory(refresh=True)
if self.only_vmid:
guests = [g for g in guests if g.vmid == self.only_vmid]
if self.auth_mode != "pve":
return guests
tree = permissions(userid)
@@ -114,6 +119,8 @@ class AppState:
if may_access(userid, g, self.privilege, tree, self.allowed_users)]
def may_open(self, userid, guest):
if self.only_vmid and guest.vmid != self.only_vmid:
return False
if self.auth_mode != "pve":
return True
return may_access(userid, guest, self.privilege, None, self.allowed_users)
@@ -905,7 +912,7 @@ def main(argv=None):
token = (args.token or secrets.token_urlsafe(18)) if mode == "token" else ""
state = AppState(token=token, proxmox=proxmox, fixed_path=args.path or "",
auth_mode=mode, privilege=args.require_privilege,
allowed_users=args.allow_user)
allowed_users=args.allow_user, only_vmid=args.vmid)
if args.vmid and args.snapshot and proxmox:
guest = next((g for g in proxmox.inventory() if g.vmid == args.vmid), None)