init_daemon/
lib.rs

1use std::path::Path;
2use std::process::Command;
3
4/// Various init daemons
5pub enum Daemon {
6    /// Most systems are using systemd these days.  Those include:
7    /// Arch, Debian, Fedora, Gentoo, Mageia, OpenSUSE, Ubuntu and probably others
8    Systemd,
9    /// Any daemon that we don't know how to detect yet
10    Unknown,
11    /// Older versions of Ubuntu
12    Upstart,
13}
14
15pub fn detect_daemon() -> Result<Daemon, String> {
16    // If this folder exists it is likely a systemd system
17    if Path::new("/run/systemd/system").exists() {
18        return Ok(Daemon::Systemd);
19    }
20    if Path::new("/sbin/initctl").exists() {
21        // Check for upstart
22        let mut cmd = Command::new("/sbin/initctl");
23        cmd.arg("--version");
24        let output = cmd.output().map_err(|e| e.to_string())?;
25        if output.status.success() {
26            let output_str = String::from_utf8_lossy(&output.stdout).into_owned();
27            if output_str.contains("upstart") {
28                return Ok(Daemon::Upstart);
29            }
30        }
31    }
32    return Ok(Daemon::Unknown);
33}