diff --git a/src/sudo.rs b/src/sudo.rs index fd0ef65..e4c1564 100644 --- a/src/sudo.rs +++ b/src/sudo.rs @@ -1,6 +1,7 @@ +use crate::log::{LogLevel, log}; use std::env; use std::os::unix::process::CommandExt; -use std::process::Command; +use std::process::{Command, exit}; /// Prüft, ob das Programm mit Root-/Administrator-Rechten ausgeführt wird. /// @@ -11,10 +12,17 @@ use std::process::Command; pub fn is_run_as_root() -> bool { unsafe { libc::geteuid() == 0 } } + /// Startet das Programm mit Root-Rechten über `sudo` neu. /// /// Diese Funktion versucht das Programm mit erhöhten Rechten neu zu starten. pub fn run_as_root() { let commandline_args: Vec = env::args().collect(); - let _output = Command::new("sudo").args(&commandline_args).exec(); // Bye bye never returns + let err = Command::new("sudo").args(&commandline_args).exec(); + log( + "auth", + &format!("Fehler beim Ausführen von 'sudo': {}", err), + LogLevel::Error, + ); + exit(1); } diff --git a/src/updater.rs b/src/updater.rs index 90ecc0d..20422f2 100644 --- a/src/updater.rs +++ b/src/updater.rs @@ -93,7 +93,7 @@ fn run_docker_command(args: &[&str]) -> std::io::Result { } /// Führt einen Docker-Compose-Befehl im angegebenen Verzeichnis aus. -/// Versucht zuerst `docker compose` und fällt bei Bedarf auf `docker-compose` zurück. +/// Versucht zuerst `docker compose` und fällt bei Nichtverfügbarkeit auf `docker-compose` zurück. pub fn run_compose_command(dir: &Path, args: &[&str]) -> std::io::Result { let mut compose_args = vec!["compose"]; compose_args.extend_from_slice(args); @@ -104,14 +104,32 @@ pub fn run_compose_command(dir: &Path, args: &[&str]) -> std::io::Result .output(); match output { - Ok(out) if out.status.success() => Ok(out), - _ => { - // Fallback auf docker-compose (v1) + Ok(out) => { + let stderr = String::from_utf8_lossy(&out.stderr); + let is_unavailable = !out.status.success() + && (stderr.contains("is not a docker command") + || stderr.contains("unknown command \"compose\"") + || stderr.contains("unknown command: compose")); + + if is_unavailable { + if let Ok(fallback_out) = Command::new("docker-compose") + .current_dir(dir) + .args(args) + .output() + { + return Ok(fallback_out); + } + } + Ok(out) + } + Err(err) if err.kind() == std::io::ErrorKind::NotFound => { + // docker-Binary nicht gefunden, versuche docker-compose Command::new("docker-compose") .current_dir(dir) .args(args) .output() } + Err(err) => Err(err), } }