Files
proxmox-snapshot-service/uninstall.sh
T
duffyduckandClaude Opus 5 963463a1a1 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>
2026-07-31 10:15:56 +02:00

105 lines
3.1 KiB
Bash
Executable File

#!/bin/bash
# ---------------------------------------------------------------------
# pvesnap - Deinstallation
#
# ./uninstall.sh Programm und Dienst entfernen,
# Konfiguration und Zustand bleiben erhalten
# ./uninstall.sh --purge zusaetzlich /etc/pvesnap und /var/lib/pvesnap
# entfernen
#
# Bereits angelegte Snapshots werden NIE angeruehrt.
# ---------------------------------------------------------------------
set -euo pipefail
LIB_DIR="/usr/lib/pvesnap"
BIN="/usr/local/bin/pvesnap"
CONF_DIR="/etc/pvesnap"
STATE_DIR="/var/lib/pvesnap"
DOC_DIR="/usr/share/doc/pvesnap"
UNIT="/etc/systemd/system/pvesnap.service"
WEB_UNIT="/etc/systemd/system/pvesnap-web.service"
PURGE=0
YES=0
for arg in "$@"; do
case "$arg" in
--purge) PURGE=1 ;;
-y|--yes) YES=1 ;;
-h|--help) sed -n '2,11p' "$0" | sed 's/^#[[:space:]]\{0,1\}//'; exit 0 ;;
*) echo "Unbekannte Option: $arg" >&2; exit 1 ;;
esac
done
info() { printf '\033[1;32m==>\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33m==>\033[0m %s\n' "$*" >&2; }
fail() { printf '\033[1;31m==>\033[0m %s\n' "$*" >&2; exit 1; }
[ "$(id -u)" -eq 0 ] || fail "Bitte als root ausfuehren (sudo ./uninstall.sh)."
if [ "$YES" -eq 0 ]; then
if [ "$PURGE" -eq 1 ]; then
printf 'pvesnap inklusive Konfiguration und Zustand entfernen? [j/N] '
else
printf 'pvesnap entfernen (Konfiguration bleibt erhalten)? [j/N] '
fi
read -r answer
case "$answer" in
j|J|y|Y) ;;
*) echo "Abgebrochen."; exit 0 ;;
esac
fi
for unit in pvesnap.service pvesnap-web.service; do
if systemctl list-unit-files 2>/dev/null | grep -q "^${unit}"; then
info "Stoppe und deaktiviere ${unit}"
systemctl stop "$unit" 2>/dev/null || true
systemctl disable "$unit" 2>/dev/null || true
fi
done
# Eingebundene Snapshots loesen, bevor das Programm verschwindet.
if [ -x "${BIN}-explorer" ]; then
info "Haenge eventuell eingebundene Snapshots aus"
"${BIN}-explorer" --cleanup >/dev/null 2>&1 || true
fi
for unit in "$UNIT" "$WEB_UNIT"; do
if [ -f "$unit" ]; then
info "Entferne $unit"
rm -f "$unit"
fi
done
systemctl daemon-reload 2>/dev/null || true
systemctl reset-failed pvesnap.service pvesnap-web.service 2>/dev/null || true
for command in "$BIN" "${BIN}-explorer" "${BIN}-web"; do
if [ -e "$command" ]; then
info "Entferne $command"
rm -f "$command"
fi
done
if [ -d "$LIB_DIR" ]; then
info "Entferne $LIB_DIR"
rm -rf "$LIB_DIR"
fi
rm -rf "$DOC_DIR"
rm -f /run/pvesnap.lock /run/pvesnap.lock.daemon
if [ "$PURGE" -eq 1 ]; then
info "Entferne Konfiguration und Zustand"
rm -rf "$CONF_DIR" "$STATE_DIR"
else
warn "Behalten: $CONF_DIR und $STATE_DIR (mit --purge ebenfalls entfernen)"
fi
cat <<EOF
pvesnap wurde entfernt.
Bereits vorhandene Snapshots bleiben bestehen. Auflisten und loeschen lassen
sie sich weiterhin in der Proxmox-Oberflaeche oder mit:
qm listsnapshot <VMID> / qm delsnapshot <VMID> <NAME>
pct listsnapshot <VMID> / pct delsnapshot <VMID> <NAME>
EOF