From d88dcac7a054e4c292c9fd1e46e7adca82311b0f Mon Sep 17 00:00:00 2001 From: DragonSlayer_14 Date: Sun, 20 Sep 2026 16:10:02 +0200 Subject: [PATCH 1/3] =?UTF-8?q?Fix:=20Entfernt=20nmap=20als=20eigene=20Abh?= =?UTF-8?q?=C3=A4ngigkeit,=20mac2ip=20verlangt=20es=20bereits=20selbst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit nmap wird von smart-mount nie direkt aufgerufen, sondern nur intern von mac2ip für den MAC->IP-Scan verwendet. Da das mac2ip-Paket nmap bereits selbst als Abhängigkeit deklariert (siehe dessen Depends), war die zusätzliche Nennung in den deb-/rpm-/arch-Paketmetadaten sowie der nmap-Check in `doctor` redundant. Co-Authored-By: Claude Sonnet 5 --- Cargo.toml | 13 +++++++------ README.md | 5 +++-- src/doctor.rs | 1 - 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2f0b3e6..aba39f1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,10 +46,11 @@ maintainer = "DragonSlayer_14" copyright = "2026 DragonSlayer_14" section = "net" priority = "optional" -# mac2ip und nmap sind harte Laufzeitabhängigkeiten (MAC->IP-Auflösung); davfs2/cifs-utils/ -# nfs-common werden bewusst NICHT hart verlangt, da smart-mount pro konfiguriertem Laufwerk -# nur das jeweils benötigte Mount-Backend zur Laufzeit prüft/lädt (siehe MountBackend::check_available). -depends = "$auto, mac2ip, nmap" +# mac2ip ist eine harte Laufzeitabhängigkeit (MAC->IP-Auflösung; +# davfs2/cifs-utils/nfs-common werden bewusst NICHT hart verlangt, +# da smart-mount pro konfiguriertem Laufwerk nur das jeweils benötigte Mount-Backend +# zur Laufzeit prüft/lädt (siehe MountBackend::check_available). +depends = "$auto, mac2ip" recommends = "davfs2, cifs-utils, nfs-common" extended-description = """\ smart-mount bindet Paare aus einem lokalen (LAN, WebDAV/SMB/NFS) und einem Cloud-Laufwerk @@ -78,7 +79,7 @@ assets = [ { source = "packaging/systemd/smart-mount-watch.service", dest = "/usr/lib/systemd/system/smart-mount-watch.service", mode = "644" }, { source = "packaging/systemd/smart-mount-watch.timer", dest = "/usr/lib/systemd/system/smart-mount-watch.timer", mode = "644" }, ] -requires = { "mac2ip" = "*", "nmap" = "*" } +requires = { "mac2ip" = "*" } suggests = { "davfs2" = "*", "cifs-utils" = "*", "nfs-utils" = "*" } # postinst/postrm-Äquivalente: richten den paketierten systemd-Dienst automatisch ein/entfernen # (Gegenstück zu packaging/deb/postinst+postrm). $1 in %postun: Anzahl verbleibender Versionen @@ -99,7 +100,7 @@ fi [package.metadata.arch] pkgrel = "1" # Wird in CI durch get-build-number.py dynamisch überschrieben arch = "x86_64" -depends = ["gcc-libs", "glibc", "mac2ip", "nmap"] +depends = ["gcc-libs", "glibc", "mac2ip"] optdepends = [ "davfs2: WebDAV-Laufwerke einbinden", "cifs-utils: SMB/CIFS-Laufwerke einbinden", diff --git a/README.md b/README.md index 1947c7b..32130a7 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,9 @@ werden (z. B. über ein separates Sync-Tool). ## Voraussetzungen -- **[`mac2ip`](https://gitea.creative-dragonslayer.de/Linuxapps/Mac2Ip)** und **`nmap`**: hart - benötigt, sofern lokale Laufwerke per MAC-Adresse adressiert werden (Auflösung MAC → IP). +- **[`mac2ip`](https://gitea.creative-dragonslayer.de/Linuxapps/Mac2Ip)**: hart benötigt, sofern + lokale Laufwerke per MAC-Adresse adressiert werden (Auflösung MAC → IP). `mac2ip` verlangt + `nmap` bereits selbst als eigene Paketabhängigkeit. - **`timeout`** (GNU coreutils): auf praktisch jedem Linux-System bereits vorhanden (Basis- Systempaket). Wird verwendet, um `mount`/`umount`-Aufrufe zeitlich zu begrenzen - siehe "Verhalten bei nicht mehr erreichbarem Server" unten. diff --git a/src/doctor.rs b/src/doctor.rs index 8dff1f8..4f0689e 100644 --- a/src/doctor.rs +++ b/src/doctor.rs @@ -64,7 +64,6 @@ pub fn run_checks(cfg: &AppConfig) -> Vec { &cfg.settings.mac2ip_binary, "install mac2ip (private tool, see README)", )); - results.push(check_binary("nmap", "nmap", "install package 'nmap'")); } results From cd9a016cf89c8bcadf1d823717b5a9584c23d955 Mon Sep 17 00:00:00 2001 From: DragonSlayer_14 Date: Sun, 20 Sep 2026 16:15:42 +0200 Subject: [PATCH 2/3] 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(()) } From 9c34fc93cbd2d0ede3faf4b6a36b64b95e32ab15 Mon Sep 17 00:00:00 2001 From: Gitea-Bot Date: Sun, 20 Sep 2026 14:19:22 +0000 Subject: [PATCH 3/3] =?UTF-8?q?Chore:=20Erh=C3=B6ht=20Patch-Version=20auf?= =?UTF-8?q?=202.0.1=20f=C3=BCr=20Promotion=20nach=20testing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e9d4496..024e7fb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2052,7 +2052,7 @@ checksum = "ba467056f1b547ed52077911161fc86985becbc60e8e1857c8a144dab0def891" [[package]] name = "smart-mount" -version = "2.0.0" +version = "2.0.1" dependencies = [ "aes-gcm 0.11.1", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index aba39f1..d44ca91 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "smart-mount" -version = "2.0.0" +version = "2.0.1" edition = "2024" authors = ['DragonSlayer_14'] readme = "README.md"