systemctl 0.1.8

Small crate to interact with systemd units
Documentation

systemctl

Small rust crate to interact with systemd units

crates.io License License crates.io
Rust crates.io

Environment

SYSTEMCTL_PATH custom env. variable describes the absolute location path of systemctl binary, by default this crate uses /usr/bin/systemctl, but that can be customized:

SYSTEMCTL_PATH=/home/$me/bin/systemctl cargo build

Unit / service operation

Nominal service operations:

systemctl::stop("systemd-journald.service")
    .unwrap();
systemctl::restart("systemd-journald.service")
    .unwrap();

if let Ok(true) = systemctl::exists("ntpd") {
    let is_active = systemctl::is_active("ntpd")
        .unwrap();
}

Service enumeration

use systemctl;
// list all units
systemctl::list_units(None, None);

// list all services 
// by adding a --type filter
systemctl::list_units(Some("service"), None);

// list all services currently `enabled` 
// by adding a --state filter
systemctl::list_units(Some("service"), Some("enabled"));

Unit structure

Use the unit structure for more information

let unit = systemctl::Unit::from_systemctl("sshd")
    .unwrap();
unit.restart().unwrap();
println!("active: {}", unit.active);
println!("preset: {}", unit.preset);

if let Some(docs) = unit.docs { // doc pages available
    for doc in docs {
        if let Some(page) = doc.as_man() {
            // `man` page exists 
        }
        if let Some(url) = doc.as_url() {
            // `url` is indicated
        }
    }
}

println!("auto_start (enabled): {}", unit.auto_start);
println!("config script : {}", unit.script);
println!("pid: {}", unit.pid);
println!("Running task(s): {}", unit.tasks.unwrap());
println!("Memory consumption: {}", unit.memory.unwrap());

TODO

  • parse all known attributes in from_systemctl
  • currently we study (try to parse) stdio result from systemctl() invokation, without testing the exit status, which is bad. This is due to the fact that we get apparently get an error code, on existing units that currently have a dead state