Author SHA1 Message Date
DragonSlayer_14 705ecd8142 Merge pull request 'Merge dev in testing: Automatischer Aufruf von sudo' (#4) from dev into testing
Unit-Tests / Unit-Tests (pull_request) Skipped
Auto-PR (Testing → Main) / Erstelle automatisch PR von testing nach main (push) Successful in 11s
Testing Build, Publish & Preview Release / Erkenne relevante Code-Änderungen (push) Successful in 14s
TruffleHog Secret Scan / TruffleHog (pull_request) Successful in 25s
Security Scans / Trivy & OSV-Scanner (push) Successful in 41s
Security Scans / Trivy & OSV-Scanner (pull_request) Successful in 42s
Testing Build, Publish & Preview Release / Build, Publish Packages (Testing) & Create Preview Release (push) Successful in 12m0s
TruffleHog Secret Scan / TruffleHog (push) Successful in 10s
Reviewed-on: #4
2026-09-20 14:24:48 +00:00
Gitea-Bot 9c34fc93cb Chore: Erhöht Patch-Version auf 2.0.1 für Promotion nach testing
Testing Build, Publish & Preview Release / Build, Publish Packages (Testing) & Create Preview Release (push) Skipped
TruffleHog Secret Scan / TruffleHog (push) Successful in 29s
Security Scans / Trivy & OSV-Scanner (push) Successful in 55s
Security Scans / Trivy & OSV-Scanner (pull_request) Successful in 55s
TruffleHog Secret Scan / TruffleHog (pull_request) Successful in 26s
Code Quality (Auto-Format & Clippy-Fix) / Formatierung & Clippy automatisch beheben (push) Successful in 1m39s
Unit-Tests / Unit-Tests (pull_request) Successful in 3m20s
2026-09-20 14:19:22 +00:00
DragonSlayer_14andClaude Sonnet 5 cd9a016cf8 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>
2026-09-20 16:15:42 +02:00
DragonSlayer_14andClaude Sonnet 5 d88dcac7a0 Fix: Entfernt nmap als eigene Abhängigkeit, mac2ip verlangt es bereits selbst
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 <noreply@anthropic.com>
2026-09-20 16:10:02 +02:00
5 changed files with 22 additions and 16 deletions
Generated
+1 -1
View File
@@ -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",
+8 -7
View File
@@ -1,6 +1,6 @@
[package]
name = "smart-mount"
version = "2.0.0"
version = "2.0.1"
edition = "2024"
authors = ['DragonSlayer_14']
readme = "README.md"
@@ -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",
+3 -2
View File
@@ -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.
+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(())
}
-1
View File
@@ -64,7 +64,6 @@ pub fn run_checks(cfg: &AppConfig) -> Vec<CheckResult> {
&cfg.settings.mac2ip_binary,
"install mac2ip (private tool, see README)",
));
results.push(check_binary("nmap", "nmap", "install package 'nmap'"));
}
results