Merge pull request #34 from jokeyrhyme/optional-systemd-target

fix: allow calls for systemd graphical target to fail
This commit is contained in:
Victoria Brekenfeld 2024-01-16 20:49:56 +01:00 committed by GitHub
commit efe4b58279
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 32 additions and 23 deletions

View file

@ -110,15 +110,13 @@ async fn start(
) )
.wrap_err("failed to start compositor")?; .wrap_err("failed to start compositor")?;
sleep(Duration::from_millis(2000)).await; sleep(Duration::from_millis(2000)).await;
systemd::start_systemd_target()
.await systemd::start_systemd_target().await;
.wrap_err("failed to start systemd target")?;
// Always stop the target when the process exits or panics. // Always stop the target when the process exits or panics.
scopeguard::defer! { scopeguard::defer! {
if let Err(error) = systemd::stop_systemd_target() { systemd::stop_systemd_target();
error!("failed to stop systemd target: {:?}", error);
}
} }
let env_vars = env_rx let env_vars = env_rx
.await .await
.expect("failed to receive environmental variables") .expect("failed to receive environmental variables")

View file

@ -1,23 +1,34 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
use color_eyre::{eyre::WrapErr, Result}; use std::process::{Command, Stdio};
pub async fn start_systemd_target() -> Result<()> { pub async fn start_systemd_target() {
let _ = std::process::Command::new("systemctl") run_optional_command(
.arg("start") "systemctl",
.arg("--user") &["--user", "start", "--no-block", "cosmic-session.target"],
.arg("cosmic-session.target") )
.spawn()
.wrap_err("Failed to start cosmic-session.target")?;
Ok(())
} }
pub fn stop_systemd_target() -> Result<()> { pub fn stop_systemd_target() {
let _ = std::process::Command::new("systemctl") run_optional_command(
.arg("stop") "systemctl",
.arg("--user") &["--user", "stop", "--no-block", "cosmic-session.target"],
.arg("cosmic-session.target") )
.spawn() }
.wrap_err("Failed to stop cosmic-session.target")?;
Ok(()) /// run a command, but log errors instead of returning them or panicking
fn run_optional_command(cmd: &str, args: &[&str]) {
match Command::new(cmd).args(args).stdin(Stdio::null()).status() {
Ok(status) => {
if !status.success() {
match status.code() {
Some(code) => warn!("{} {}: exit code {}", cmd, args.join(" "), code),
None => warn!("{} {}: terminated by signal", cmd, args.join(" ")),
}
}
}
Err(error) => {
warn!("unable to start {} {}: {}", cmd, args.join(" "), error);
}
}
} }