user_startup/utils/
linux.rs

1//! use systemd to manage startup.
2
3use std::{path::PathBuf, sync::LazyLock as Lazy};
4
5use super::parse_command;
6
7pub static CONFIG_PATH: Lazy<PathBuf> = Lazy::new(|| {
8    dirs::home_dir()
9        .expect("Could not find home directory")
10        .join(".config")
11        .join("systemd")
12        .join("user")
13});
14
15pub const COMMENT_PREFIX: &str = "# ";
16
17pub fn comment(s: &str) -> String {
18    format!("{}{}", COMMENT_PREFIX, s)
19}
20
21pub const OPEN_COMMAND: &str = "xdg-open";
22
23pub const FILE_EXT: &str = ".service";
24
25pub fn format(cmd: &str, name: Option<&str>, stdout: Option<&str>, stderr: Option<&str>) -> String {
26    let name = name
27        .map(|s| s.to_string())
28        .unwrap_or_else(|| parse_command(cmd).0);
29    format!(
30        r#"{prefixed_cmd}
31[Unit]
32Description={name}
33After=network.target
34
35[Service]
36ExecStart={cmd}
37Restart=on-failure
38RestartSec=5
39LimitNOFILE=4096
40StandardOutput={stdout}
41StandardError={stderr}
42SyslogIdentifier={name}
43LogLevelMax=info
44TimeoutStartSec=60
45TimeoutStopSec=30
46WorkingDirectory=/tmp
47
48[Install]
49WantedBy=default.target
50"#,
51        prefixed_cmd = comment(cmd),
52        name = name,
53        cmd = cmd,
54        stdout = stdout.unwrap_or("journal"),
55        stderr = stderr.unwrap_or("journal"),
56    )
57}