# Erlaube www-data, iSCSI- (+ ext4/xfs/btrfs-) Mounts unter /mnt/* zu erstellen
# und zu lösen. Die App (StorageTargetService) liest den konkreten Pfad
# aus der DB und prüft ihn gegen storage_targets.mount_path, bevor sudo
# aufgerufen wird — Sudoers ist die zweite Verteidigungslinie.
www-data ALL=(root) NOPASSWD: /usr/bin/mount -t ext4 * /mnt/*
www-data ALL=(root) NOPASSWD: /usr/bin/mount -t xfs * /mnt/*
www-data ALL=(root) NOPASSWD: /usr/bin/mount -t btrfs * /mnt/*
www-data ALL=(root) NOPASSWD: /usr/bin/umount /mnt/*
www-data ALL=(root) NOPASSWD: /usr/bin/umount -f /mnt/*
www-data ALL=(root) NOPASSWD: /usr/bin/mkdir -p /mnt/*

# iSCSI-Steuerung via iscsiadm. Pfad auf Debian 13 ist /usr/sbin/iscsiadm —
# sudoers prüft den vollen Pfad genau, daher beide möglichen Locations
# einzeln erlauben.
www-data ALL=(root) NOPASSWD: /usr/sbin/iscsiadm
www-data ALL=(root) NOPASSWD: /usr/bin/iscsiadm

# chown auf den Mountpoint nach dem iSCSI-Mount: bei POSIX-FS steht der
# Owner im FS (Inode 2), nicht in den Mount-Optionen. mkfs setzt root:root,
# der Worker (www-data) muss aber schreiben können.
www-data ALL=(root) NOPASSWD: /usr/bin/chown www-data\:www-data /mnt/*

# Sprint 21 + 21.1: restic-Migration.
# Per-Host-SFTP-User-Lifecycle (useradd/userdel + Chroot-Layout +
# Bind-Mount des Repo-Verzeichnisses). Das Wrapper-Skript validiert
# Eingaben (id ist Integer, repo_real_path unter /mnt/) und macht die
# eigentlichen mount/useradd-Calls selbst — www-data hat hier nur
# „darf das Wrapper-Skript anstoßen", nicht „darf mount/useradd".
www-data ALL=(root) NOPASSWD: /usr/sbin/bpm-restic-user
www-data ALL=(root) NOPASSWD: /usr/bin/rmdir /mnt/*

# Klartext-DR-Fallback für restic-Passwörter unter /root/. Streng
# Pfad-eingegrenzt (nur Dateien unter /root/bpm-restic-passwords/),
# kein -r, kein -f, kein Wildcard außerhalb des Verzeichnisses. Wird
# beim erstmaligen Repo-Init geschrieben (write-once: ResticService
# überschreibt bestehende Dateien nicht).
www-data ALL=(root) NOPASSWD: /usr/bin/tee /root/bpm-restic-passwords/*
www-data ALL=(root) NOPASSWD: /usr/bin/chmod 0600 /root/bpm-restic-passwords/*

# ---------------------------------------------------------------------
# Sprint 22.9 — restic-Repo auf echtem POSIX-FS + Ownership-erhaltender Restore
# ---------------------------------------------------------------------
# (A) Lokale restic-Ops (init/forget/snapshots/ls + VMA-Restore) laufen als
# der jeweilige per-Host-User bpm-restic-<id> bzw. bpm-restic-vma-<id> (alle
# Mitglied der Gruppe bpm-restic), damit auf echtem ext4/iSCSI dasselbe
# 0700-Repo vom lokalen Op UND vom Remote-SFTP-Backup geteilt wird. Das
# Runas-Ziel ist die UNPRIVILEGIERTE Gruppe — kein root. RESTIC_PASSWORD
# wird via env_keep durchgereicht (NICHT als argv → kein ps-Leak).
www-data ALL=(%bpm-restic) NOPASSWD: /usr/lib/backup-manager/bin/restic
Defaults!/usr/lib/backup-manager/bin/restic env_keep += "RESTIC_PASSWORD RESTIC_PROGRESS_FPS XDG_CACHE_HOME"

# (B) Ownership-erhaltender Host-Datei-Restore: restic restore + rsync MÜSSEN
# als root laufen (uid/gid/mode setzen = CAP_CHOWN; Staging auf echtem
# POSIX-FS). Statt breiter (root)-Rechte auf restic/rsync bündelt der
# validierte Helper beide Schritte (Pfade gegen /mnt bzw. /mnt/restore-staging
# geprüft) hinter EINEM Eintrag.
www-data ALL=(root) NOPASSWD: /usr/sbin/bpm-restore-deploy
Defaults!/usr/sbin/bpm-restore-deploy env_keep += "RESTIC_PASSWORD RESTIC_PROGRESS_FPS RESTIC_BINARY"

# Sprint 22.11 — LUN-Resize-Wizard. Nach NAS-seitiger LUN-Vergrößerung
# dehnt der Helper das ext4-Filesystem auf die volle Block-Device-Größe
# aus. Validiert das Device (/dev/sd[a-z], kein root-FS-Device) und liest
# den FS-Typ via blkid — kein direkter resize2fs-Aufruf für www-data.
www-data ALL=(root) NOPASSWD: /usr/sbin/bpm-resize-fs

# Sprint 22.11 — Diagnose bei "target is busy" im umount: lsof auf den
# Mount-Pfad zeigt blockierende Prozesse. Strikt auf /mnt/* eingegrenzt
# (sudoers prüft das erste Argument exakt gegen das Pattern). App-Code
# verifiziert zusätzlich, dass der Pfad zu einem storage_targets-Eintrag
# gehört, bevor sudo aufgerufen wird.
www-data ALL=(root) NOPASSWD: /usr/bin/lsof /mnt/*
