diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f315ada..8f60eec8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ 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] +# [3.1.7] - 2021-03-11 +### Changed +- Refactor many parts of daemon +- Switch out session monitoring to logind-zbus + # [3.1.6] - 2021-03-11 ### Changed - Graphics switching will now wait until all users logged out before switching diff --git a/Cargo.lock b/Cargo.lock index 233af7a4..8407b4bc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -64,6 +64,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "async-lock" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1996609732bde4a9988bc42125f55f2af5f3c36370e27c778d5191a4a1b63bfb" +dependencies = [ + "event-listener", +] + [[package]] name = "atty" version = "0.2.14" @@ -187,11 +196,12 @@ dependencies = [ [[package]] name = "daemon" -version = "3.1.6" +version = "3.1.7" dependencies = [ "env_logger", "intel-pstate", "log", + "logind-zbus", "rog_dbus", "rog_fan_curve", "rog_types", @@ -202,7 +212,7 @@ dependencies = [ "sysfs-class", "toml", "udev", - "zbus", + "zbus 2.0.0-beta.3", "zvariant", ] @@ -214,7 +224,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote 1.0.9", - "syn 1.0.63", + "syn 1.0.64", ] [[package]] @@ -246,7 +256,7 @@ checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" dependencies = [ "proc-macro2", "quote 1.0.9", - "syn 1.0.63", + "syn 1.0.64", ] [[package]] @@ -272,10 +282,16 @@ dependencies = [ "proc-macro2", "quote 1.0.9", "rustversion", - "syn 1.0.63", + "syn 1.0.64", "synstructure", ] +[[package]] +name = "event-listener" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59" + [[package]] name = "fastrand" version = "1.4.0" @@ -357,7 +373,7 @@ dependencies = [ "proc-macro-hack", "proc-macro2", "quote 1.0.9", - "syn 1.0.63", + "syn 1.0.64", ] [[package]] @@ -403,6 +419,17 @@ dependencies = [ "wasi 0.9.0+wasi-snapshot-preview1", ] +[[package]] +name = "getrandom" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", +] + [[package]] name = "gumdrop" version = "0.8.0" @@ -420,7 +447,7 @@ checksum = "915ef07c710d84733522461de2a734d4d62a3fd39a4d4f404c2f385ef8618d05" dependencies = [ "proc-macro2", "quote 1.0.9", - "syn 1.0.63", + "syn 1.0.64", ] [[package]] @@ -432,6 +459,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "humantime" version = "2.1.0" @@ -471,9 +504,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03b07a082330a35e43f63177cc01689da34fbffa0105e1246cf0311472cac73a" +checksum = "538c092e5586f4cdd7dd8078c4a79220e3e168880218124dcbce860f0ea938c6" [[package]] name = "libudev-sys" @@ -506,6 +539,20 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "logind-zbus" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6671f6cf88b63e9d63009f4f6f8826fcc265c51a9977e4c7dc1263d743e0dfbb" +dependencies = [ + "serde", + "serde_json", + "zbus 2.0.0-beta.3", + "zbus_macros 2.0.0-beta.3", + "zvariant", + "zvariant_derive", +] + [[package]] name = "mac-notification-sys" version = "0.3.0" @@ -556,6 +603,18 @@ dependencies = [ "void", ] +[[package]] +name = "nix" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ccba0cfe4fdf15982d1674c69b1fd80bad427d293849982668dfe454bd61f2" +dependencies = [ + "bitflags 1.2.1", + "cc", + "cfg-if 1.0.0", + "libc", +] + [[package]] name = "nom" version = "5.1.2" @@ -575,7 +634,7 @@ dependencies = [ "mac-notification-sys", "serde", "winrt-notification", - "zbus", + "zbus 1.8.0", "zvariant", "zvariant_derive", ] @@ -677,6 +736,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + [[package]] name = "proc-macro-crate" version = "0.1.5" @@ -695,7 +760,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote 1.0.9", - "syn 1.0.63", + "syn 1.0.64", "version_check", ] @@ -746,6 +811,46 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +dependencies = [ + "getrandom 0.2.2", +] + +[[package]] +name = "rand_hc" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core", +] + [[package]] name = "redox_syscall" version = "0.1.57" @@ -758,16 +863,16 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" dependencies = [ - "getrandom", + "getrandom 0.1.16", "redox_syscall", "rust-argon2", ] [[package]] name = "regex" -version = "1.4.4" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54fd1046a3107eb58f42de31d656fee6853e5d276c455fd943742dce89fc3dd3" +checksum = "957056ecddbeba1b26965114e191d2e8589ce74db242b6ea25fc4062427a5c19" dependencies = [ "aho-corasick", "memchr", @@ -787,8 +892,8 @@ dependencies = [ "rog_fan_curve", "rog_types", "serde_json", - "zbus", - "zbus_macros", + "zbus 1.8.0", + "zbus_macros 1.8.0", "zvariant", ] @@ -870,7 +975,7 @@ checksum = "1800f7693e94e186f5e25a28291ae1570da908aff7d97a095dec1e56ff99069b" dependencies = [ "proc-macro2", "quote 1.0.9", - "syn 1.0.63", + "syn 1.0.64", ] [[package]] @@ -892,15 +997,30 @@ checksum = "2dc6b7951b17b051f3210b063f12cc17320e2fe30ae05b0fe2a3abb068551c76" dependencies = [ "proc-macro2", "quote 1.0.9", - "syn 1.0.63", + "syn 1.0.64", ] +[[package]] +name = "sha1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" + [[package]] name = "slab" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" +[[package]] +name = "slotmap" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3003725ae562cf995f3dc82bb99e70926e09000396816765bb6d7adbe740b1" +dependencies = [ + "version_check", +] + [[package]] name = "smart-default" version = "0.6.0" @@ -909,7 +1029,7 @@ checksum = "133659a15339456eeeb07572eb02a91c91e9815e9cbc89566944d2c8d3efdbf6" dependencies = [ "proc-macro2", "quote 1.0.9", - "syn 1.0.63", + "syn 1.0.64", ] [[package]] @@ -952,9 +1072,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd9bc7ccc2688b3344c2f48b9b546648b25ce0b20fc717ee7fa7981a8ca9717" +checksum = "3fd9d1e9976102a03c542daa2eff1b43f9d72306342f3f8b3ed5fb8908195d6f" dependencies = [ "proc-macro2", "quote 1.0.9", @@ -978,7 +1098,7 @@ checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" dependencies = [ "proc-macro2", "quote 1.0.9", - "syn 1.0.63", + "syn 1.0.64", "unicode-xid 0.2.1", ] @@ -1002,12 +1122,11 @@ dependencies = [ [[package]] name = "time" -version = "0.1.44" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" dependencies = [ "libc", - "wasi 0.10.0+wasi-snapshot-preview1", "winapi", ] @@ -1066,9 +1185,9 @@ checksum = "eafc1b9b2dfc6f5529177b62cf806484db55b32dc7c9658a118e11bbeb33061d" [[package]] name = "version_check" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" [[package]] name = "void" @@ -1090,9 +1209,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wepoll-sys" @@ -1187,13 +1306,41 @@ dependencies = [ "fastrand", "futures", "nb-connect", - "nix", + "nix 0.17.0", "once_cell", "polling", "scoped-tls", "serde", "serde_repr", - "zbus_macros", + "zbus_macros 1.8.0", + "zvariant", +] + +[[package]] +name = "zbus" +version = "2.0.0-beta.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e1e656194618d167524f97e88ff9bf87f2b1e8bf58f357b2a7abfdff8cc85c9" +dependencies = [ + "async-io", + "async-lock", + "byteorder", + "derivative", + "enumflags2", + "event-listener", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix 0.19.1", + "once_cell", + "rand", + "scoped-tls", + "serde", + "serde_repr", + "sha1", + "slotmap", + "zbus_macros 2.0.0-beta.3", "zvariant", ] @@ -1206,14 +1353,26 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote 1.0.9", - "syn 1.0.63", + "syn 1.0.64", +] + +[[package]] +name = "zbus_macros" +version = "2.0.0-beta.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcd4cb372bc2cade3f2323e4104112dceb6819f5dd9afa98515b4e821d232932" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote 1.0.9", + "syn 1.0.64", ] [[package]] name = "zvariant" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fc67d552ac18ccd9e440f062f5b32c46776f96073122a8da2fe0c533833a213" +checksum = "678e7262502a135f49b1ece65010526649be7ee68acb80e1fc5377fc71fef878" dependencies = [ "byteorder", "enumflags2", @@ -1223,12 +1382,12 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaee686340b5bff077d52423d8cc4f0f7cb323fe3f31ef676b8a3a2810bc53c5" +checksum = "27d7c34325a35020b94343389cc9391e0f8ac245cca9155429c4022d93141241" dependencies = [ "proc-macro-crate", "proc-macro2", "quote 1.0.9", - "syn 1.0.63", + "syn 1.0.64", ] diff --git a/asusctl/src/main.rs b/asusctl/src/main.rs index ee66a6a1..d78371e2 100644 --- a/asusctl/src/main.rs +++ b/asusctl/src/main.rs @@ -4,7 +4,13 @@ use daemon::{ }; use gumdrop::{Opt, Options}; use rog_dbus::AuraDbusClient; -use rog_types::{anime_matrix::{AniMeDataBuffer, FULL_PANE_LEN}, aura_modes::AuraModes, cli_options::{AniMeActions, AniMeStatusValue, LedBrightness, SetAuraBuiltin}, gfx_vendors::GfxVendors, profile::{FanLevel, ProfileCommand, ProfileEvent}}; +use rog_types::{ + anime_matrix::{AniMeDataBuffer, FULL_PANE_LEN}, + aura_modes::AuraModes, + cli_options::{AniMeActions, AniMeStatusValue, LedBrightness, SetAuraBuiltin}, + gfx_vendors::GfxVendors, + profile::{FanLevel, ProfileCommand, ProfileEvent}, +}; use std::env::args; use yansi_term::Colour::Green; use yansi_term::Colour::Red; @@ -199,7 +205,7 @@ fn main() -> Result<(), Box> { if parsed.show_supported { let dat = dbus.proxies().supported().get_supported_functions()?; - println!("Supported laptop functions:\n{}", dat.to_string()); + println!("Supported laptop functions:\n{}", dat); } if let Some(fan_level) = parsed.fan_mode { @@ -272,11 +278,9 @@ fn do_gfx( } if let Some(mode) = command.mode { - if supported.dedicated_gfx_toggle { - if dbus.proxies().rog_bios().get_dedicated_gfx()? == 1 { - println!("You can not change modes until you turn dedicated/G-Sync off and reboot"); - std::process::exit(-1); - } + if supported.dedicated_gfx_toggle && dbus.proxies().rog_bios().get_dedicated_gfx()? == 1 { + println!("You can not change modes until you turn dedicated/G-Sync off and reboot"); + std::process::exit(-1); } println!( @@ -296,9 +300,9 @@ fn do_gfx( if command.pow { let res = dbus.proxies().gfx().gfx_get_pwr()?; if res.contains("active") { - println!("Current power status: {}", Red.paint(&format!("{}", res))); + println!("Current power status: {}", Red.paint(&res)); } else { - println!("Current power status: {}", Green.paint(&format!("{}", res))); + println!("Current power status: {}", Green.paint(&res)); } } Ok(()) @@ -347,7 +351,9 @@ fn handle_led_mode( println!("{}", mode.self_usage()); return Ok(()); } - dbus.proxies().led().set_led_mode(&::from(mode))?; + dbus.proxies() + .led() + .set_led_mode(&::from(mode))?; } Ok(()) } @@ -375,7 +381,7 @@ fn handle_profile( .collect(); for line in usage .iter() - .filter(|line| !(line.contains("--curve") && !supported.fan_curve_set)) + .filter(|line| !line.contains("--curve") || supported.fan_curve_set) { println!("{}", line); } @@ -427,11 +433,7 @@ fn handle_bios_option( dbus.proxies().rog_bios().set_post_sound(opt)?; } if cmd.post_sound_get { - let res = if dbus.proxies().rog_bios().get_post_sound()? == 1 { - true - } else { - false - }; + let res = dbus.proxies().rog_bios().get_post_sound()? == 1; println!("Bios POST sound on: {}", res); } if let Some(opt) = cmd.dedicated_gfx_set { @@ -447,11 +449,7 @@ fn handle_bios_option( } } if cmd.dedicated_gfx_get { - let res = if dbus.proxies().rog_bios().get_dedicated_gfx()? == 1 { - true - } else { - false - }; + let res = dbus.proxies().rog_bios().get_dedicated_gfx()? == 1; println!("Bios dedicated GPU on: {}", res); } } diff --git a/daemon/Cargo.toml b/daemon/Cargo.toml index 3a2425a1..99a2f756 100644 --- a/daemon/Cargo.toml +++ b/daemon/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "daemon" -version = "3.1.6" +version = "3.1.7" license = "MPL-2.0" readme = "README.md" authors = ["Luke "] @@ -27,8 +27,9 @@ udev = "^0.6" log = "^0.4" env_logger = "^0.8" -zbus = "^1.8" +zbus = "^2.0.0-beta.3" zvariant = "^2.5" +logind-zbus = "*" # serialisation serde = "^1.0" diff --git a/daemon/src/config.rs b/daemon/src/config.rs index 3c90b615..24226a9e 100644 --- a/daemon/src/config.rs +++ b/daemon/src/config.rs @@ -56,10 +56,12 @@ impl Config { .write(true) .create(true) .open(&CONFIG_PATH) - .expect(&format!( - "The file {} or directory /etc/asusd/ is missing", - CONFIG_PATH - )); // okay to cause panic here + .unwrap_or_else(|_| { + panic!( + "The file {} or directory /etc/asusd/ is missing", + CONFIG_PATH + ) + }); // okay to cause panic here let mut buf = String::new(); if let Ok(read_len) = file.read_to_string(&mut buf) { if read_len == 0 { diff --git a/daemon/src/ctrl_anime.rs b/daemon/src/ctrl_anime.rs index 414a9c22..09de479f 100644 --- a/daemon/src/ctrl_anime.rs +++ b/daemon/src/ctrl_anime.rs @@ -21,7 +21,6 @@ use rog_types::{ error::AuraError, }; use rusb::{Device, DeviceHandle}; -use std::convert::TryInto; use std::error::Error; use std::time::Duration; use zbus::dbus_interface; @@ -60,7 +59,7 @@ pub trait Dbus { impl crate::ZbusAdd for CtrlAnimeDisplay { fn add_to_server(self, server: &mut zbus::ObjectServer) { server - .at(&"/org/asuslinux/Anime".try_into().unwrap(), self) + .at("/org/asuslinux/Anime", self) .map_err(|err| { warn!("CtrlAnimeDisplay: add_to_server {}", err); err diff --git a/daemon/src/ctrl_charge.rs b/daemon/src/ctrl_charge.rs index 65bb5a11..56e577da 100644 --- a/daemon/src/ctrl_charge.rs +++ b/daemon/src/ctrl_charge.rs @@ -2,7 +2,6 @@ use crate::{config::Config, error::RogError, GetSupported}; //use crate::dbus::DbusEvents; use log::{info, warn}; use serde_derive::{Deserialize, Serialize}; -use std::convert::TryInto; use std::fs::OpenOptions; use std::io::Write; use std::path::Path; @@ -64,7 +63,7 @@ impl CtrlCharge { impl crate::ZbusAdd for CtrlCharge { fn add_to_server(self, server: &mut zbus::ObjectServer) { server - .at(&"/org/asuslinux/Charge".try_into().unwrap(), self) + .at("/org/asuslinux/Charge", self) .map_err(|err| { warn!("CtrlCharge: add_to_server {}", err); err diff --git a/daemon/src/ctrl_fan_cpu.rs b/daemon/src/ctrl_fan_cpu.rs index da064c8c..5dc7599f 100644 --- a/daemon/src/ctrl_fan_cpu.rs +++ b/daemon/src/ctrl_fan_cpu.rs @@ -6,7 +6,6 @@ use crate::{ use log::{info, warn}; use rog_types::profile::{FanLevel, ProfileEvent}; use serde_derive::{Deserialize, Serialize}; -use std::convert::TryInto; use std::fs::OpenOptions; use std::io::Write; use std::path::Path; @@ -135,7 +134,7 @@ impl DbusFanAndCpu { impl crate::ZbusAdd for DbusFanAndCpu { fn add_to_server(self, server: &mut zbus::ObjectServer) { server - .at(&"/org/asuslinux/Profile".try_into().unwrap(), self) + .at("/org/asuslinux/Profile", self) .map_err(|err| { warn!("DbusFanAndCpu: add_to_server {}", err); err diff --git a/daemon/src/ctrl_gfx/gfx.rs b/daemon/src/ctrl_gfx/gfx.rs index 9340f6cb..22d3afb7 100644 --- a/daemon/src/ctrl_gfx/gfx.rs +++ b/daemon/src/ctrl_gfx/gfx.rs @@ -2,19 +2,24 @@ use ctrl_gfx::error::GfxError; use ctrl_gfx::*; use ctrl_rog_bios::CtrlRogBios; use log::{error, info, warn}; +use logind_zbus::{ + types::{SessionClass, SessionInfo, SessionType}, + ManagerProxy, SessionProxy, +}; use rog_types::gfx_vendors::GfxVendors; -use session_manager::{are_gfx_sessions_alive, get_sessions}; -use std::{io::Write, ops::Add, path::Path}; +use std::{io::Write, ops::Add, path::Path, time::Instant}; use std::{iter::FromIterator, thread::JoinHandle}; use std::{process::Command, thread::sleep, time::Duration}; use std::{str::FromStr, sync::mpsc}; use std::{sync::Arc, sync::Mutex}; use sysfs_class::{PciDevice, SysClass}; use system::{GraphicsDevice, PciBus}; -use zbus::dbus_interface; +use zbus::{dbus_interface, Connection}; use crate::*; +const THREAD_TIMEOUT_MSG: &str = "GFX: thread time exceeded 3 minutes, exiting"; + pub struct CtrlGraphics { bus: PciBus, _amd: Vec, @@ -34,8 +39,6 @@ trait Dbus { fn notify_action(&self, action: &str) -> zbus::Result<()>; } -use std::convert::TryInto; - #[dbus_interface(name = "org.asuslinux.Daemon")] impl Dbus for CtrlGraphics { fn vendor(&self) -> String { @@ -72,12 +75,7 @@ impl Dbus for CtrlGraphics { impl ZbusAdd for CtrlGraphics { fn add_to_server(self, server: &mut zbus::ObjectServer) { server - .at( - &"/org/asuslinux/Gfx" - .try_into() - .expect("Couldn't add to zbus"), - self, - ) + .at("/org/asuslinux/Gfx", self) .map_err(|err| { warn!("GFX: CtrlGraphics: add_to_server {}", err); err @@ -165,20 +163,18 @@ impl CtrlGraphics { self.nvidia.clone() } - fn save_gfx_mode(vendor: GfxVendors, config: Arc>) -> Result<(), RogError> { + fn save_gfx_mode(vendor: GfxVendors, config: Arc>) { if let Ok(mut config) = config.lock() { - config.gfx_mode = vendor.clone(); + config.gfx_mode = vendor; config.write(); - return Ok(()); } // TODO: Error here - Ok(()) } /// Associated method to get which vendor mode is set pub fn get_gfx_mode(&self) -> Result { if let Ok(config) = self.config.lock() { - return Ok(config.gfx_mode.clone()); + return Ok(config.gfx_mode); } // TODO: Error here Ok(GfxVendors::Hybrid) @@ -379,7 +375,7 @@ impl CtrlGraphics { std::thread::sleep(std::time::Duration::from_millis(500)); count += 1; } - return Err(GfxError::DisplayManagerTimeout(state.into()).into()); + Err(GfxError::DisplayManagerTimeout(state.into()).into()) } /// Write the config changes and add/remove drivers and devices depending @@ -425,34 +421,69 @@ impl CtrlGraphics { Ok(()) } + fn graphical_session_active( + connection: &Connection, + sessions: &[SessionInfo], + ) -> Result { + for session in sessions { + let session_proxy = SessionProxy::new(&connection, session)?; + if session_proxy.get_class()? == SessionClass::User { + match session_proxy.get_type()? { + SessionType::X11 | SessionType::Wayland | SessionType::MIR => { + if session_proxy.get_active()? { + return Ok(true); + } + } + _ => {} + } + } + } + Ok(false) + } + /// Spools until all user sessions are ended then switches to requested mode fn fire_starter( vendor: GfxVendors, devices: Vec, bus: PciBus, - killer: mpsc::Receiver, + thread_stop: mpsc::Receiver, ) -> Result { info!("GFX: display-manager thread started"); - let mut sessions: Vec = get_sessions()?; - const SLEEP_PERIOD: Duration = Duration::from_millis(300); - const REFRESH_COUNTDOWN: u32 = 3; - let mut refresh_sessions = REFRESH_COUNTDOWN; - while are_gfx_sessions_alive(&sessions) { - if let Ok(stop) = killer.try_recv() { + const SLEEP_PERIOD: Duration = Duration::from_millis(100); + let start_time = Instant::now(); + + let connection = Connection::new_system()?; + let manager = ManagerProxy::new(&connection)?; + let mut sessions = manager.list_sessions()?; + + loop { + let tmp = manager.list_sessions()?; + if !tmp.iter().eq(&sessions) { + warn!("GFX: Sessions list changed"); + warn!("GFX: Old list:\n{:?}\nNew list:\n{:?}", &sessions, &tmp); + sessions = tmp; + } + + if !Self::graphical_session_active(&connection, &sessions)? { + break; + } + + if let Ok(stop) = thread_stop.try_recv() { if stop { return Ok("Graphics mode change was cancelled".into()); } } + // exit if 3 minutes pass + if Instant::now().duration_since(start_time).as_secs() > 180 { + warn!("{}", THREAD_TIMEOUT_MSG); + return Ok(THREAD_TIMEOUT_MSG.into()); + } + // Don't spin at max speed sleep(SLEEP_PERIOD); - if refresh_sessions == 0 { - refresh_sessions = REFRESH_COUNTDOWN; - sessions = get_sessions()?; - } - refresh_sessions -= 1; } - + info!("GFX: all graphical user sessions ended, continuing"); Self::do_display_manager_action("stop")?; @@ -514,7 +545,7 @@ impl CtrlGraphics { let killer = self.thread_kill.clone(); // Save selected mode in case of reboot - Self::save_gfx_mode(vendor, self.config.clone())?; + Self::save_gfx_mode(vendor, self.config.clone()); let _join: JoinHandle<()> = std::thread::spawn(move || { Self::fire_starter(vendor, devices, bus, rx) @@ -526,7 +557,6 @@ impl CtrlGraphics { if let Ok(mut lock) = killer.try_lock() { *lock = None; } - return; }); // TODO: undo if failed? Save last mode, catch errors... diff --git a/daemon/src/ctrl_leds.rs b/daemon/src/ctrl_leds.rs index 3ba4e20b..e0f67ba0 100644 --- a/daemon/src/ctrl_leds.rs +++ b/daemon/src/ctrl_leds.rs @@ -18,9 +18,9 @@ use rog_types::{ }; use std::fs::OpenOptions; use std::io::{Read, Write}; +use std::path::Path; use std::sync::Arc; use std::sync::Mutex; -use std::{convert::TryInto, path::Path}; use zbus::dbus_interface; use crate::GetSupported; @@ -88,7 +88,7 @@ trait Dbus { impl crate::ZbusAdd for DbusKbdBacklight { fn add_to_server(self, server: &mut zbus::ObjectServer) { server - .at(&"/org/asuslinux/Led".try_into().unwrap(), self) + .at("/org/asuslinux/Led", self) .map_err(|err| { error!("DbusKbdBacklight: add_to_server {}", err); }) diff --git a/daemon/src/ctrl_rog_bios.rs b/daemon/src/ctrl_rog_bios.rs index 9ff1df0c..4cfdd8e4 100644 --- a/daemon/src/ctrl_rog_bios.rs +++ b/daemon/src/ctrl_rog_bios.rs @@ -2,12 +2,12 @@ use crate::{config::Config, error::RogError, GetSupported}; use log::{error, info, warn}; use serde_derive::{Deserialize, Serialize}; use std::fs::OpenOptions; +use std::io::BufRead; use std::io::{Read, Write}; use std::path::Path; use std::process::Command; use std::sync::Arc; use std::sync::Mutex; -use std::{convert::TryInto, io::BufRead}; use zbus::dbus_interface; const INITRAMFS_PATH: &str = "/usr/sbin/update-initramfs"; @@ -101,7 +101,7 @@ impl CtrlRogBios { impl crate::ZbusAdd for CtrlRogBios { fn add_to_server(self, server: &mut zbus::ObjectServer) { server - .at(&"/org/asuslinux/RogBios".try_into().unwrap(), self) + .at("/org/asuslinux/RogBios", self) .map_err(|err| { warn!("CtrlRogBios: add_to_server {}", err); err @@ -334,7 +334,7 @@ impl CtrlRogBios { .map_err(|err| RogError::Write(format!("{:?}", cmd), err))?; if !status.success() { error!("Ram disk update failed"); - return Err(RogError::Initramfs("Ram disk update failed".into()).into()); + return Err(RogError::Initramfs("Ram disk update failed".into())); } else { info!("Successfully updated initramfs"); } diff --git a/daemon/src/ctrl_supported.rs b/daemon/src/ctrl_supported.rs index 93b3642f..64d043d6 100644 --- a/daemon/src/ctrl_supported.rs +++ b/daemon/src/ctrl_supported.rs @@ -1,5 +1,3 @@ -use std::convert::TryInto; - use log::warn; use serde_derive::{Deserialize, Serialize}; use zbus::dbus_interface; @@ -32,7 +30,7 @@ impl SupportedFunctions { impl crate::ZbusAdd for SupportedFunctions { fn add_to_server(self, server: &mut zbus::ObjectServer) { server - .at(&"/org/asuslinux/Supported".try_into().unwrap(), self) + .at("/org/asuslinux/Supported", self) .map_err(|err| { warn!("SupportedFunctions: add_to_server {}", err); err diff --git a/daemon/src/daemon.rs b/daemon/src/daemon.rs index fafdbccb..a43c4623 100644 --- a/daemon/src/daemon.rs +++ b/daemon/src/daemon.rs @@ -19,7 +19,6 @@ use std::sync::Mutex; use daemon::ctrl_rog_bios::CtrlRogBios; use std::convert::Into; -use std::convert::TryInto; use zbus::fdo; use zbus::Connection; @@ -180,7 +179,7 @@ fn start_daemon() -> Result<(), Box> { }); object_server - .with(&"/org/asuslinux/Charge".try_into()?, |obj: &CtrlCharge| { + .with("/org/asuslinux/Charge", |obj: &CtrlCharge| { let x = obj.limit(); obj.notify_charge(x as u8) }) diff --git a/daemon/src/error.rs b/daemon/src/error.rs index e2f71e08..2a86675d 100644 --- a/daemon/src/error.rs +++ b/daemon/src/error.rs @@ -4,7 +4,7 @@ use rog_types::error::GraphicsError; use std::convert::From; use std::fmt; -use crate::{ctrl_gfx::error::GfxError, session_manager::SessionError}; +use crate::ctrl_gfx::error::GfxError; #[derive(Debug)] pub enum RogError { @@ -28,7 +28,7 @@ pub enum RogError { Initramfs(String), Modprobe(String), Command(String, std::io::Error), - Session(SessionError), + Zbus(zbus::Error), } impl fmt::Display for RogError { @@ -55,7 +55,7 @@ impl fmt::Display for RogError { RogError::Initramfs(detail) => write!(f, "Initiramfs error: {}", detail), RogError::Modprobe(detail) => write!(f, "Modprobe error: {}", detail), RogError::Command(func, error) => write!(f, "Command exec error: {}: {}", func, error), - RogError::Session(detail) => write!(f, "Session error: {}", detail), + RogError::Zbus(detail) => write!(f, "Zbus error: {}", detail), } } } @@ -82,8 +82,8 @@ impl From for RogError { } } -impl From for RogError { - fn from(err: SessionError) -> Self { - RogError::Session(err) +impl From for RogError { + fn from(err: zbus::Error) -> Self { + RogError::Zbus(err) } -} \ No newline at end of file +} diff --git a/daemon/src/laptops.rs b/daemon/src/laptops.rs index 8f96e22b..9b8b92f4 100644 --- a/daemon/src/laptops.rs +++ b/daemon/src/laptops.rs @@ -34,21 +34,19 @@ pub fn match_laptop() -> Option { let device_desc = device .device_descriptor() .expect("Couldn't get device descriptor"); - if device_desc.vendor_id() == 0x0b05 { - if LAPTOP_DEVICES.contains(&device_desc.product_id()) { - let prod_str = format!("{:x?}", device_desc.product_id()); + if device_desc.vendor_id() == 0x0b05 && LAPTOP_DEVICES.contains(&device_desc.product_id()) { + let prod_str = format!("{:x?}", device_desc.product_id()); - if device_desc.product_id() == 0x1854 { - let mut laptop = laptop(prod_str, None); - if laptop.supported_modes.is_empty() { - laptop.supported_modes = vec![STATIC, BREATHING]; - } - return Some(laptop); + if device_desc.product_id() == 0x1854 { + let mut laptop = laptop(prod_str, None); + if laptop.supported_modes.is_empty() { + laptop.supported_modes = vec![STATIC, BREATHING]; } - - let laptop = laptop(prod_str, Some("02".to_owned())); return Some(laptop); } + + let laptop = laptop(prod_str, Some("02".to_owned())); + return Some(laptop); } } warn!( diff --git a/daemon/src/lib.rs b/daemon/src/lib.rs index d6c16788..aa59cd58 100644 --- a/daemon/src/lib.rs +++ b/daemon/src/lib.rs @@ -30,8 +30,6 @@ pub mod laptops; /// Fetch all supported functions for the laptop pub mod ctrl_supported; -pub mod session_manager; - mod error; use crate::error::RogError; diff --git a/daemon/src/session_manager.rs b/daemon/src/session_manager.rs deleted file mode 100644 index 5244cd60..00000000 --- a/daemon/src/session_manager.rs +++ /dev/null @@ -1,175 +0,0 @@ -use log::{error, warn}; -use serde_derive::{Deserialize, Serialize}; -use std::process::Command; - -#[derive(Debug, PartialEq)] -enum SessionType { - X11, - Wayland, - TTY, -} - -#[derive(Deserialize, Serialize, Debug)] -pub struct UserSession { - pub session: String, - pub uid: u32, - pub user: String, - pub seat: String, - pub tty: String, -} - -#[derive(Debug)] -pub struct Session { - session_id: String, - session_type: SessionType, -} - -pub fn are_gfx_sessions_alive(sessions: &[Session]) -> bool { - for session in sessions { - match is_gfx_alive(session) { - Ok(alive) => { - if alive { - return true; - } - } - Err(err) => warn!("Error checking sessions: {}", err), - } - } - false -} - -pub fn get_sessions() -> Result, SessionError> { - // loginctl list-sessions --no-legend - let mut cmd = Command::new("loginctl"); - cmd.arg("list-sessions"); - cmd.arg("--output"); - cmd.arg("json"); - - let mut sessions = Vec::new(); - - match cmd.output() { - Ok(output) => { - if !output.status.success() { - error!( - "Couldn't get sessions: {}", - String::from_utf8_lossy(&output.stderr) - ); - } else if output.status.success() { - if let Ok(data) = serde_json::from_slice::>(&output.stdout) { - for s in &data { - if let Ok(t) = get_session_type(&s.session) { - sessions.push(Session { - session_id: s.session.to_owned(), - session_type: t, - }) - } - } - return Ok(sessions); - } - } - } - Err(err) => error!("Couldn't get sessions: {}", err), - } - Err(SessionError::NoSessions) -} - -fn is_gfx_alive(session: &Session) -> Result { - if session.session_type == SessionType::TTY { - return Ok(false); - } - let session_id = session.session_id.to_owned(); - let mut cmd = Command::new("loginctl"); - cmd.arg("show-session"); - cmd.arg(&session_id); - cmd.arg("--property"); - cmd.arg("Type"); - - match cmd.output() { - Ok(output) => { - if !output.status.success() { - let msg = String::from_utf8_lossy(&output.stderr); - if msg.contains("No session") { - return Ok(false); - } - error!( - "Couldn't get session: {}", - String::from_utf8_lossy(&output.stderr) - ); - } else if output.status.success() { - return Ok(true); - } - } - Err(err) => error!("Couldn't get session: {}", err), - } - Ok(false) -} - -fn get_session_type(session_id: &str) -> Result { - //loginctl show-session 2 --property Type - let mut cmd = Command::new("loginctl"); - cmd.arg("show-session"); - cmd.arg(session_id); - cmd.arg("--property"); - cmd.arg("Type"); - cmd.arg("--property"); - cmd.arg("Class"); - - match cmd.output() { - Ok(output) => { - if !output.status.success() { - let msg = String::from_utf8_lossy(&output.stderr); - if msg.contains("No session") { - return Err(SessionError::NoSession(session_id.into())); - } - error!( - "Couldn't get session: {}", - String::from_utf8_lossy(&output.stderr) - ); - } else if output.status.success() { - let what = String::from_utf8_lossy(&output.stdout); - let mut stype = SessionType::TTY; - let mut user = false; - for line in what.lines() { - if let Some(is_it) = line.split("=").last() { - match is_it.trim() { - "user" => user = true, - "wayland" => stype = SessionType::Wayland, - "x11" => stype = SessionType::X11, - "tty" => stype = SessionType::TTY, - _ => return Err(SessionError::NoSession(session_id.into())), - } - } - } - if user { - return Ok(stype); - } - } - } - Err(err) => error!("Couldn't get session: {}", err), - } - Err(SessionError::NoSession(session_id.into())) -} - -use std::fmt; - -#[derive(Debug)] -pub enum SessionError { - NoSession(String), - NoSessions, - Command(String, std::io::Error), -} - -impl fmt::Display for SessionError { - // This trait requires `fmt` with this exact signature. - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - SessionError::NoSession(id) => write!(f, "Session {} not active", id), - SessionError::NoSessions => write!(f, "No active sessions"), - SessionError::Command(func, error) => { - write!(f, "Command exec error: {}: {}", func, error) - } - } - } -} - -impl std::error::Error for SessionError {}