// Implementations Linux (logind, sudoers, gnome busctl, x11 xset). use anyhow::{bail, Context, Result}; use std::process::Command; use crate::commands::{CommandAction, CommandValue}; // Execute une commande d'alimentation selon le backend choisi. pub fn execute_power(backend: &str, action: CommandAction) -> Result<()> { match backend { "linux_logind_polkit" => match action { CommandAction::Shutdown => run("systemctl", &["poweroff"]), CommandAction::Reboot => run("systemctl", &["reboot"]), CommandAction::Sleep => run("systemctl", &["suspend"]), CommandAction::Screen => bail!("screen action not supported in power backend"), }, "linux_sudoers" => match action { CommandAction::Shutdown => run("shutdown", &["-h", "now"]), CommandAction::Reboot => run("reboot", &[]), CommandAction::Sleep => run("systemctl", &["suspend"]), CommandAction::Screen => bail!("screen action not supported in power backend"), }, _ => bail!("unknown linux power backend"), } } // Execute une commande d'ecran selon le backend choisi. pub fn execute_screen(backend: &str, value: CommandValue) -> Result<()> { match backend { "gnome_busctl" => match value { CommandValue::Off => run( "busctl", &[ "--user", "set-property", "org.gnome.Mutter.DisplayConfig", "/org/gnome/Mutter/DisplayConfig", "org.gnome.Mutter.DisplayConfig", "PowerSaveMode", "i", "1", ], ), CommandValue::On => run( "busctl", &[ "--user", "set-property", "org.gnome.Mutter.DisplayConfig", "/org/gnome/Mutter/DisplayConfig", "org.gnome.Mutter.DisplayConfig", "PowerSaveMode", "i", "0", ], ), }, "x11_xset" => match value { CommandValue::Off => run("xset", &["dpms", "force", "off"]), CommandValue::On => run("xset", &["dpms", "force", "on"]), }, _ => bail!("unknown linux screen backend"), } } fn run(cmd: &str, args: &[&str]) -> Result<()> { let status = Command::new(cmd) .args(args) .status() .with_context(|| format!("failed to run {cmd}"))?; if status.success() { Ok(()) } else { bail!("command failed: {cmd}") } }