use anyhow::Result;
use dialoguer::Confirm;
use tokio::process::Command;
pub async fn is_enabled() -> bool {
let Ok(user) = std::env::var("USER") else {
return false;
};
let output = Command::new("loginctl")
.args(["show-user", &user, "-p", "Linger", "--value"])
.output()
.await;
match output {
Ok(out) if out.status.success() => String::from_utf8_lossy(&out.stdout).trim() == "yes",
_ => false,
}
}
pub async fn warn_if_disabled() -> Result<()> {
if is_enabled().await {
return Ok(());
}
let user = std::env::var("USER").unwrap_or_else(|_| "<your-user>".into());
eprintln!();
eprintln!(
" ! systemd lingering is NOT enabled for {user}. Services added by ryra\n \
will stop when you log out. To keep them running across logouts and reboots:\n\n \
sudo loginctl enable-linger {user}"
);
eprintln!();
Ok(())
}
pub async fn offer_enable() -> Result<()> {
if is_enabled().await {
return Ok(());
}
let user = std::env::var("USER").unwrap_or_else(|_| "<your-user>".into());
println!();
println!(" systemd lingering is not enabled for {user}. Without it, services");
println!(" added by ryra stop when you log out. To enable it:");
println!();
println!(" sudo loginctl enable-linger {user}");
println!();
if !super::is_interactive() {
eprintln!(" (non-interactive; run the command above when convenient)");
return Ok(());
}
let run = match Confirm::new()
.with_prompt(" Run this now?")
.default(true)
.interact()
{
Ok(v) => v,
Err(e) => {
eprintln!(" Warning: could not read confirmation ({e}); skipping");
return Ok(());
}
};
if !run {
return Ok(());
}
match Command::new("sudo")
.args(["loginctl", "enable-linger", &user])
.status()
.await
{
Ok(s) if s.success() => println!(" Lingering enabled."),
Ok(s) => eprintln!(" sudo loginctl enable-linger exited with {s}"),
Err(e) => eprintln!(" Failed to run sudo: {e}"),
}
Ok(())
}
pub async fn note_if_enabled() {
if !is_enabled().await {
return;
}
let user = std::env::var("USER").unwrap_or_else(|_| "<your-user>".into());
println!(
" Note: systemd lingering is still enabled for {user}. \
Run `sudo loginctl disable-linger {user}` to disable."
);
}