Feature: require_root startet sich bei fehlenden Root-Rechten automatisch per sudo neu
Testing Build, Publish & Preview Release / Build, Publish Packages (Testing) & Create Preview Release (push) Skipped
TruffleHog Secret Scan / TruffleHog (push) Successful in 15s
Security Scans / Trivy & OSV-Scanner (push) Successful in 24s
Code Quality (Auto-Format & Clippy-Fix) / Formatierung & Clippy automatisch beheben (push) Successful in 33s
Auto Patch-Version-Bump (Dev → Testing PR) / Erkenne relevante Änderungen im PR (pull_request) Successful in 10s
TruffleHog Secret Scan / TruffleHog (pull_request) Successful in 17s
Auto Patch-Version-Bump (Dev → Testing PR) / Patch-Version erhöhen & auf Dev pushen (pull_request) Successful in 12s
Security Scans / Trivy & OSV-Scanner (pull_request) Successful in 35s
Unit-Tests / Unit-Tests (pull_request) Successful in 4m6s

Statt nur mit einer Fehlermeldung abzubrechen, ersetzt sich der Prozess
für root-pflichtige Commands (mount/unmount/watch/service crontab/
drive add/edit/remove) jetzt transparent über sudo-ctdra::run_as_root()
via execve mit sudo neu; der Fehlerpfad greift nur noch, wenn sudo
selbst nicht gefunden werden kann.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-20 16:15:42 +02:00
co-authored by Claude Sonnet 5
parent d88dcac7a0
commit cd9a016cf8
+10 -5
View File
@@ -10,13 +10,18 @@ pub mod watch;
use clap::{CommandFactory, Parser, Subcommand};
use clap_complete::Shell;
/// Bricht mit einer klaren Fehlermeldung ab, falls nicht als root aufgerufen. Mounten läuft
/// ausschließlich als root/System-Dienst (siehe [`smart_mount::systemd`]) - es gibt seit dem
/// Wegfall des Nutzerkontexts keine unprivilegierte Mount-Variante mehr, für die ein
/// Rechte-Check hier zu früh käme.
/// Startet den Prozess bei Bedarf transparent über `sudo` neu, falls nicht bereits als root
/// aufgerufen. Mounten läuft ausschließlich als root/System-Dienst (siehe
/// [`smart_mount::systemd`]) - es gibt seit dem Wegfall des Nutzerkontexts keine
/// unprivilegierte Mount-Variante mehr, für die ein Rechte-Check hier zu früh käme.
///
/// `run_as_root()` ersetzt den aktuellen Prozess per `execve` und kehrt bei Erfolg nie zurück
/// (siehe sudo-ctdra); der `io::Error`-Rückgabewert ist ausschließlich der Fehlerfall (z. B.
/// `sudo` nicht gefunden).
pub(crate) fn require_root(context: &str) -> anyhow::Result<()> {
if !sudo_ctdra::is_run_as_root() {
anyhow::bail!("'{context}' requires root privileges (re-run with sudo).");
let err = sudo_ctdra::run_as_root();
anyhow::bail!("'{context}' requires root privileges: could not re-exec via sudo: {err}");
}
Ok(())
}