From cd9a016cf89c8bcadf1d823717b5a9584c23d955 Mon Sep 17 00:00:00 2001 From: DragonSlayer_14 Date: Sun, 20 Sep 2026 16:15:42 +0200 Subject: [PATCH] Feature: require_root startet sich bei fehlenden Root-Rechten automatisch per sudo neu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/cli/mod.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/cli/mod.rs b/src/cli/mod.rs index f7ba31d..3e5b8a8 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -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(()) }