diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f0667ab..6362efbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +## [v4.5.7] ### Changed - ROGCC: Don't notify user if changing to same mux mode +- asusd: don't block on systemd-unit change: removes all shoddy external command calls in favour of async dbus calls ## [v4.5.6] ### Changed @@ -23,7 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 + This is ideal for tasks that require root access (BE SAFE!) - The above AC/Battery commands are probably best set to run a script for more complex tasks - asusd: check if nvidia-powerd enabled before toggling - + ## [v4.5.5] ### Changed - remove an unwrap() causing panic on main ROGCC thread diff --git a/Cargo.lock b/Cargo.lock index 8f129946..4466cddc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -91,7 +91,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf6ccdb167abbf410dcb915cabd428929d7f6a04980b54a11f26a39f1c7f7107" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "once_cell", "version_check", ] @@ -149,7 +149,7 @@ checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" [[package]] name = "asusctl" -version = "4.5.6" +version = "4.5.7" dependencies = [ "daemon", "gif", @@ -265,7 +265,7 @@ dependencies = [ "async-lock", "autocfg", "blocking", - "cfg-if", + "cfg-if 1.0.0", "event-listener", "futures-lite", "libc", @@ -349,6 +349,26 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" +[[package]] +name = "bindgen" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66c0bb6167449588ff70803f4127f0684f9063097eca5016f37eb52b92c2cf36" +dependencies = [ + "bitflags", + "cexpr", + "cfg-if 0.1.10", + "clang-sys", + "lazy_static", + "lazycell", + "peeking_take_while", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -490,6 +510,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" +[[package]] +name = "cexpr" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27" +dependencies = [ + "nom 5.1.2", +] + [[package]] name = "cfg-expr" version = "0.11.0" @@ -499,6 +528,12 @@ dependencies = [ "smallvec", ] +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + [[package]] name = "cfg-if" version = "1.0.0" @@ -520,6 +555,16 @@ dependencies = [ "libc", ] +[[package]] +name = "clang-sys" +version = "0.29.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6837df1d5cba2397b835c8530f51723267e16abbf83892e9e5af4f0e5dd10a" +dependencies = [ + "glob", + "libc", +] + [[package]] name = "clipboard-win" version = "4.4.2" @@ -674,7 +719,7 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -683,7 +728,7 @@ version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -727,7 +772,7 @@ checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" [[package]] name = "daemon" -version = "4.5.6" +version = "4.5.7" dependencies = [ "async-trait", "concat-idents", @@ -743,6 +788,7 @@ dependencies = [ "serde_derive", "serde_json", "sysfs-class", + "systemd-zbus", "tokio", "toml", "zbus", @@ -750,7 +796,7 @@ dependencies = [ [[package]] name = "daemon-user" -version = "4.5.6" +version = "4.5.7" dependencies = [ "dirs", "rog_anime", @@ -869,7 +915,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "dirs-sys-next", ] @@ -1031,16 +1077,36 @@ dependencies = [ "byteorder", ] +[[package]] +name = "enumflags2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0" +dependencies = [ + "enumflags2_derive 0.6.4", +] + [[package]] name = "enumflags2" version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e75d4cd21b95383444831539909fbb14b9dc3fdceb2a6f5d36577329a1f55ccb" dependencies = [ - "enumflags2_derive", + "enumflags2_derive 0.7.4", "serde", ] +[[package]] +name = "enumflags2_derive" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "enumflags2_derive" version = "0.7.4" @@ -1423,7 +1489,7 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "wasi", ] @@ -1533,6 +1599,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + [[package]] name = "glow" version = "0.11.2" @@ -1772,7 +1844,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "wasm-bindgen", "web-sys", @@ -1856,6 +1928,12 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "libappindicator" version = "0.7.1" @@ -1892,7 +1970,7 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "winapi", ] @@ -1940,7 +2018,7 @@ version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -2116,7 +2194,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" dependencies = [ "bitflags", - "cfg-if", + "cfg-if 1.0.0", "libc", "memoffset 0.6.5", ] @@ -2129,7 +2207,7 @@ checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" dependencies = [ "autocfg", "bitflags", - "cfg-if", + "cfg-if 1.0.0", "libc", "memoffset 0.6.5", "pin-utils", @@ -2142,7 +2220,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46a58d1d356c6597d08cde02c2f09d785b09e28711837b1ed667dc652c08a694" dependencies = [ "bitflags", - "cfg-if", + "cfg-if 1.0.0", "libc", "memoffset 0.7.1", "pin-utils", @@ -2155,6 +2233,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" +[[package]] +name = "nom" +version = "5.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" +dependencies = [ + "memchr", + "version_check", +] + [[package]] name = "nom" version = "7.1.1" @@ -2349,7 +2437,7 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "redox_syscall", "smallvec", @@ -2362,6 +2450,12 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1" +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + [[package]] name = "percent-encoding" version = "2.2.0" @@ -2431,7 +2525,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "166ca89eb77fd403230b9c156612965a81e094ec6ec3aa13663d4c8b113fa748" dependencies = [ "autocfg", - "cfg-if", + "cfg-if 1.0.0", "libc", "log", "wepoll-ffi", @@ -2602,7 +2696,7 @@ dependencies = [ [[package]] name = "rog-control-center" -version = "4.5.6" +version = "4.5.7" dependencies = [ "daemon", "dirs", @@ -2632,7 +2726,7 @@ dependencies = [ [[package]] name = "rog_anime" -version = "4.5.6" +version = "4.5.7" dependencies = [ "gif", "glam", @@ -2642,12 +2736,13 @@ dependencies = [ "serde", "serde_derive", "sysfs-class", + "uhid-virt", "zbus", ] [[package]] name = "rog_aura" -version = "4.5.6" +version = "4.5.7" dependencies = [ "serde", "serde_derive", @@ -2658,7 +2753,7 @@ dependencies = [ [[package]] name = "rog_dbus" -version = "4.5.6" +version = "4.5.7" dependencies = [ "rog_anime", "rog_aura", @@ -2669,7 +2764,7 @@ dependencies = [ [[package]] name = "rog_platform" -version = "4.5.6" +version = "4.5.7" dependencies = [ "concat-idents", "inotify", @@ -2685,7 +2780,7 @@ dependencies = [ [[package]] name = "rog_profiles" -version = "4.5.6" +version = "4.5.7" dependencies = [ "serde", "serde_derive", @@ -2703,6 +2798,12 @@ dependencies = [ "libusb1-sys", ] +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc_version" version = "0.3.3" @@ -2861,11 +2962,17 @@ version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest", ] +[[package]] +name = "shlex" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" + [[package]] name = "signal-hook" version = "0.3.14" @@ -3054,6 +3161,16 @@ dependencies = [ "version-compare", ] +[[package]] +name = "systemd-zbus" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abba675e441b13248eaf74f1acfacf64adc7b5c030f2f3ff66cc7e02b9a0c417" +dependencies = [ + "serde", + "zbus", +] + [[package]] name = "tauri-winrt-notification" version = "0.1.0" @@ -3071,7 +3188,7 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "fastrand", "libc", "redox_syscall", @@ -3133,7 +3250,7 @@ dependencies = [ "arrayref", "arrayvec 0.5.2", "bytemuck", - "cfg-if", + "cfg-if 1.0.0", "png", "safe_arch", "tiny-skia-path", @@ -3215,7 +3332,7 @@ version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -3291,6 +3408,26 @@ dependencies = [ "winapi", ] +[[package]] +name = "uhid-virt" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e317bfbb0281bb799f4802d62261a798443a88df4352f302269ad32b4cfc822" +dependencies = [ + "enumflags2 0.6.4", + "libc", + "uhidrs-sys", +] + +[[package]] +name = "uhidrs-sys" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfcc3b1a199338bcfe0e64b3c427ffab84514e7b23f9402d7fef9b38c0a9916e" +dependencies = [ + "bindgen", +] + [[package]] name = "unicode-bidi" version = "0.3.8" @@ -3382,7 +3519,7 @@ version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "wasm-bindgen-macro", ] @@ -3407,7 +3544,7 @@ version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "wasm-bindgen", "web-sys", @@ -3865,7 +4002,7 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7" dependencies = [ - "nom", + "nom 7.1.1", ] [[package]] @@ -3891,7 +4028,7 @@ dependencies = [ "byteorder", "derivative", "dirs", - "enumflags2", + "enumflags2 0.7.5", "event-listener", "futures-core", "futures-sink", @@ -3944,7 +4081,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f8c89c183461e11867ded456db252eae90874bc6769b7adbea464caa777e51" dependencies = [ "byteorder", - "enumflags2", + "enumflags2 0.7.5", "libc", "serde", "static_assertions", diff --git a/Cargo.toml b/Cargo.toml index efc65887..bd9b409b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ members = ["asusctl", "daemon", "daemon-user", "rog-platform", "rog-dbus", "rog-anime", "rog-aura", "rog-profiles", "rog-control-center"] [workspace.package] -version = "4.5.6" +version = "4.5.7" [workspace.dependencies] async-trait = "^0.1" diff --git a/daemon/Cargo.toml b/daemon/Cargo.toml index eacc53ad..476d9f6a 100644 --- a/daemon/Cargo.toml +++ b/daemon/Cargo.toml @@ -44,3 +44,5 @@ toml.workspace = true sysfs-class.workspace = true # used for backlight control and baord ID concat-idents.workspace = true + +systemd-zbus = "*" \ No newline at end of file diff --git a/daemon/src/ctrl_power.rs b/daemon/src/ctrl_power.rs index 41822856..3f8433ad 100644 --- a/daemon/src/ctrl_power.rs +++ b/daemon/src/ctrl_power.rs @@ -1,6 +1,3 @@ -use crate::systemd::{ - do_systemd_unit_action, is_systemd_unit_enabled, SystemdUnitAction, SystemdUnitState, -}; use crate::{config::Config, error::RogError, GetSupported}; use crate::{task_watch_item, CtrlTask}; use async_trait::async_trait; @@ -10,6 +7,7 @@ use rog_platform::supported::ChargeSupportedFunctions; use std::process::Command; use std::sync::Arc; use std::time::Duration; +use systemd_zbus::{ManagerProxy as SystemdProxy, Mode, UnitFileState}; use tokio::time::sleep; use zbus::dbus_interface; use zbus::export::futures_util::lock::Mutex; @@ -155,16 +153,22 @@ impl CtrlTask for CtrlPower { } async fn create_tasks(&self, signal_ctxt: SignalContext<'static>) -> Result<(), RogError> { + let conn = zbus::Connection::system().await?; + let sysd1 = SystemdProxy::new(&conn).await?; + let sysd2 = sysd1.clone(); + let sysd3 = sysd1.clone(); + let power1 = self.clone(); let power2 = self.clone(); self.create_sys_event_tasks( move || async {}, move || { - let power1 = power1.clone(); + let power = power1.clone(); + let sysd = sysd1.clone(); async move { info!("CtrlCharge reloading charge limit"); - let lock = power1.config.lock().await; - power1 + let lock = power.config.lock().await; + power .set(lock.bat_charge_limit) .map_err(|err| { warn!("CtrlCharge: set_limit {}", err); @@ -172,18 +176,19 @@ impl CtrlTask for CtrlPower { }) .ok(); - if let Ok(value) = power1.power.get_online() { - do_nvidia_powerd_action(value == 1); + if let Ok(value) = power.power.get_online() { + do_nvidia_powerd_action(&sysd, value == 1).await; } } }, move || async {}, move || { - let power2 = power2.clone(); + let power = power2.clone(); + let sysd = sysd2.clone(); async move { info!("CtrlCharge reloading charge limit"); - let lock = power2.config.lock().await; - power2 + let lock = power.config.lock().await; + power .set(lock.bat_charge_limit) .map_err(|err| { warn!("CtrlCharge: set_limit {}", err); @@ -191,8 +196,8 @@ impl CtrlTask for CtrlPower { }) .ok(); - if let Ok(value) = power2.power.get_online() { - do_nvidia_powerd_action(value == 1); + if let Ok(value) = power.power.get_online() { + do_nvidia_powerd_action(&sysd, value == 1).await; } } }, @@ -210,7 +215,7 @@ impl CtrlTask for CtrlPower { if let Ok(value) = ctrl.power.get_online() { if online != value { online = value; - do_nvidia_powerd_action(value == 1); + do_nvidia_powerd_action(&sysd3, value == 1).await; Self::notify_mains_online(&signal_ctxt, value == 1) .await @@ -252,16 +257,22 @@ impl CtrlTask for CtrlPower { } } -fn do_nvidia_powerd_action(ac_on: bool) { - let action = if ac_on { - SystemdUnitAction::Restart - } else { - SystemdUnitAction::Stop - }; - - if let Ok(res) = is_systemd_unit_enabled(SystemdUnitState::Enabled, NVIDIA_POWERD) { - if res && do_systemd_unit_action(action, NVIDIA_POWERD).is_ok() { - info!("CtrlPower task: did {action:?} on {NVIDIA_POWERD}"); +async fn do_nvidia_powerd_action(proxy: &SystemdProxy<'_>, ac_on: bool) { + if let Ok(res) = proxy.get_unit_file_state(NVIDIA_POWERD).await { + if res == UnitFileState::Enabled { + if ac_on { + proxy + .stop_unit(NVIDIA_POWERD, Mode::Replace) + .await + .map_err(|e| error!("Error stopping {NVIDIA_POWERD}, {e:?}")) + .ok(); + } else { + proxy + .start_unit(NVIDIA_POWERD, Mode::Replace) + .await + .map_err(|e| error!("Error stopping {NVIDIA_POWERD}, {e:?}")) + .ok(); + } } } } diff --git a/daemon/src/lib.rs b/daemon/src/lib.rs index 5c708b4e..7767543f 100644 --- a/daemon/src/lib.rs +++ b/daemon/src/lib.rs @@ -14,8 +14,6 @@ pub mod ctrl_profiles; /// Laptop matching to determine capabilities pub mod laptops; -pub mod systemd; - /// Fetch all supported functions for the laptop pub mod ctrl_supported; diff --git a/daemon/src/systemd.rs b/daemon/src/systemd.rs deleted file mode 100644 index e806bb9d..00000000 --- a/daemon/src/systemd.rs +++ /dev/null @@ -1,111 +0,0 @@ -use std::process::Command; - -use crate::error::RogError; - -/// An action for `systemctl` -#[derive(Debug, Copy, Clone)] -pub enum SystemdUnitAction { - Stop, - Start, - Restart, -} - -impl From for &str { - fn from(s: SystemdUnitAction) -> Self { - match s { - SystemdUnitAction::Stop => "stop", - SystemdUnitAction::Start => "start", - SystemdUnitAction::Restart => "restart", - } - } -} - -#[derive(Debug, Copy, Clone)] -pub enum SystemdUnitState { - Active, - Inactive, - Masked, - Disabled, - Enabled, -} - -impl From for &str { - fn from(s: SystemdUnitState) -> Self { - match s { - SystemdUnitState::Active => "active", - SystemdUnitState::Inactive => "inactive", - SystemdUnitState::Masked => "masked", - SystemdUnitState::Disabled => "disabled", - SystemdUnitState::Enabled => "enabled", - } - } -} - -/// Change the state of a systemd unit. Blocks while running command. -pub fn do_systemd_unit_action(action: SystemdUnitAction, unit: &str) -> Result<(), RogError> { - let mut cmd = Command::new("systemctl"); - cmd.arg(<&str>::from(action)); - cmd.arg(unit); - - let status = cmd - .status() - .map_err(|err| RogError::Command(format!("{:?}", cmd), err))?; - if !status.success() { - let msg = format!("systemctl {action:?} {unit} failed: {status:?}",); - return Err(RogError::SystemdUnitAction(msg)); - } - Ok(()) -} - -/// Get systemd unit state. Blocks while command is run. -pub fn is_systemd_unit_state(state: SystemdUnitState, unit: &str) -> Result { - let mut cmd = Command::new("systemctl"); - cmd.arg("is-active"); - cmd.arg(unit); - - let output = cmd - .output() - .map_err(|err| RogError::Command(format!("{:?}", cmd), err))?; - if output.stdout.starts_with(<&str>::from(state).as_bytes()) { - return Ok(true); - } - Ok(false) -} - -/// Get systemd unit state. Blocks while command is run. -pub fn is_systemd_unit_enabled(state: SystemdUnitState, unit: &str) -> Result { - let mut cmd = Command::new("systemctl"); - cmd.arg("is-enabled"); - cmd.arg(unit); - - let output = cmd - .output() - .map_err(|err| RogError::Command(format!("{:?}", cmd), err))?; - if output.stdout.starts_with(<&str>::from(state).as_bytes()) { - return Ok(true); - } - Ok(false) -} - -/// Wait for a systemd unit to change to `state`. Checks state every 250ms for 3 seconds. Blocks while running wait. -pub fn wait_systemd_unit_state(state: SystemdUnitState, unit: &str) -> Result<(), RogError> { - let mut cmd = Command::new("systemctl"); - cmd.arg("is-active"); - cmd.arg(unit); - - let mut count = 0; - - while count <= (4 * 3) { - // 3 seconds max - let output = cmd - .output() - .map_err(|err| RogError::Command(format!("{:?}", cmd), err))?; - if output.stdout.starts_with(<&str>::from(state).as_bytes()) { - return Ok(()); - } - // fine to block here, nobody doing shit now - std::thread::sleep(std::time::Duration::from_millis(250)); - count += 1; - } - Err(RogError::SystemdUnitWaitTimeout(<&str>::from(state).into())) -} diff --git a/rog-anime/Cargo.toml b/rog-anime/Cargo.toml index a5fa23ef..f88e8251 100644 --- a/rog-anime/Cargo.toml +++ b/rog-anime/Cargo.toml @@ -31,3 +31,5 @@ glam.workspace = true zbus = { workspace = true, optional = true } sysfs-class = { workspace = true, optional = true } + +uhid-virt = "^0.0.5" \ No newline at end of file