mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-02-06 00:15:04 +01:00
asusd: check if nvidia-powerd enabled before toggling
This commit is contained in:
@@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
- asusd: Very basic support for running a command on AC/Battery switching, this is in config at `/etc/asusd/asusd.conf`. A restart of asusd is not required if edited.
|
- asusd: Very basic support for running a command on AC/Battery switching, this is in config at `/etc/asusd/asusd.conf`. A restart of asusd is not required if edited.
|
||||||
+ This is ideal for tasks that require root access (BE SAFE!)
|
+ 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
|
- 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]
|
## [v4.5.5]
|
||||||
### Changed
|
### Changed
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
use crate::systemd::{do_systemd_unit_action, SystemdUnitAction};
|
use crate::systemd::{
|
||||||
|
do_systemd_unit_action, is_systemd_unit_enabled, SystemdUnitAction, SystemdUnitState,
|
||||||
|
};
|
||||||
use crate::{config::Config, error::RogError, GetSupported};
|
use crate::{config::Config, error::RogError, GetSupported};
|
||||||
use crate::{task_watch_item, CtrlTask};
|
use crate::{task_watch_item, CtrlTask};
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
@@ -171,14 +173,7 @@ impl CtrlTask for CtrlPower {
|
|||||||
.ok();
|
.ok();
|
||||||
|
|
||||||
if let Ok(value) = power1.power.get_online() {
|
if let Ok(value) = power1.power.get_online() {
|
||||||
let action = if value == 1 {
|
do_nvidia_powerd_action(value == 1);
|
||||||
SystemdUnitAction::Restart
|
|
||||||
} else {
|
|
||||||
SystemdUnitAction::Stop
|
|
||||||
};
|
|
||||||
if do_systemd_unit_action(action, NVIDIA_POWERD).is_ok() {
|
|
||||||
info!("CtrlPower task: did {action:?} on {NVIDIA_POWERD}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -197,14 +192,7 @@ impl CtrlTask for CtrlPower {
|
|||||||
.ok();
|
.ok();
|
||||||
|
|
||||||
if let Ok(value) = power2.power.get_online() {
|
if let Ok(value) = power2.power.get_online() {
|
||||||
let action = if value == 1 {
|
do_nvidia_powerd_action(value == 1);
|
||||||
SystemdUnitAction::Restart
|
|
||||||
} else {
|
|
||||||
SystemdUnitAction::Stop
|
|
||||||
};
|
|
||||||
if do_systemd_unit_action(action, NVIDIA_POWERD).is_ok() {
|
|
||||||
info!("CtrlPower task: did {action:?} on {NVIDIA_POWERD}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -222,14 +210,7 @@ impl CtrlTask for CtrlPower {
|
|||||||
if let Ok(value) = ctrl.power.get_online() {
|
if let Ok(value) = ctrl.power.get_online() {
|
||||||
if online != value {
|
if online != value {
|
||||||
online = value;
|
online = value;
|
||||||
let action = if value == 1 {
|
do_nvidia_powerd_action(value == 1);
|
||||||
SystemdUnitAction::Restart
|
|
||||||
} else {
|
|
||||||
SystemdUnitAction::Stop
|
|
||||||
};
|
|
||||||
if do_systemd_unit_action(action, NVIDIA_POWERD).is_ok() {
|
|
||||||
info!("CtrlPower task: did {action:?} on {NVIDIA_POWERD}");
|
|
||||||
}
|
|
||||||
|
|
||||||
Self::notify_mains_online(&signal_ctxt, value == 1)
|
Self::notify_mains_online(&signal_ctxt, value == 1)
|
||||||
.await
|
.await
|
||||||
@@ -270,3 +251,17 @@ impl CtrlTask for CtrlPower {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -24,6 +24,9 @@ impl From<SystemdUnitAction> for &str {
|
|||||||
pub enum SystemdUnitState {
|
pub enum SystemdUnitState {
|
||||||
Active,
|
Active,
|
||||||
Inactive,
|
Inactive,
|
||||||
|
Masked,
|
||||||
|
Disabled,
|
||||||
|
Enabled,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<SystemdUnitState> for &str {
|
impl From<SystemdUnitState> for &str {
|
||||||
@@ -31,6 +34,9 @@ impl From<SystemdUnitState> for &str {
|
|||||||
match s {
|
match s {
|
||||||
SystemdUnitState::Active => "active",
|
SystemdUnitState::Active => "active",
|
||||||
SystemdUnitState::Inactive => "inactive",
|
SystemdUnitState::Inactive => "inactive",
|
||||||
|
SystemdUnitState::Masked => "masked",
|
||||||
|
SystemdUnitState::Disabled => "disabled",
|
||||||
|
SystemdUnitState::Enabled => "enabled",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -66,6 +72,21 @@ pub fn is_systemd_unit_state(state: SystemdUnitState, unit: &str) -> Result<bool
|
|||||||
Ok(false)
|
Ok(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get systemd unit state. Blocks while command is run.
|
||||||
|
pub fn is_systemd_unit_enabled(state: SystemdUnitState, unit: &str) -> Result<bool, RogError> {
|
||||||
|
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.
|
/// 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> {
|
pub fn wait_systemd_unit_state(state: SystemdUnitState, unit: &str) -> Result<(), RogError> {
|
||||||
let mut cmd = Command::new("systemctl");
|
let mut cmd = Command::new("systemctl");
|
||||||
|
|||||||
Reference in New Issue
Block a user