Skip to content

🐧 Small rust crate to interact with systemd

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT
Notifications You must be signed in to change notification settings

gwbres/systemctl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

112 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

systemctl

Small rust crate to interact with systemd units through systemctl.

At the time I needed those features, I was not aware of zbus-systemd, which is now available and should be prefered.
This crate uses systemctl interaction directly, which is far from ideal for applications. zbus-systemd should therefore be prefered.

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

Features

  • serde: Enable to make structs in this crate De-/Serializable

Limitations

Currently, systemd Version <245 are not supported as unit-file-list changed from two column to three column setup. See: systemd Changelog

Unit / service operation

Nominal service operations:

let systemctl = systemctl::SystemCtl::default();
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

let systemctl = systemctl::SystemCtl::default();
// list all units
systemctl.list_units(None, None, None);

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

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

// list all services starting with cron
systemctl.list_units(Some("service"), None, Some("cron*"));

// Check if a unit is active
systemctl.get_active_state("service");

// list dependencies of a service or target
systemctl.list_dependencies("some.target");

Unit structure

Use the unit structure for more information

let systemctl = systemctl::SystemCtl::default();
let unit = systemctl.create_unit("ssh.service")
    .unwrap();
systemctl.restart(&unit.name).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);
println!("Memory consumption: {:?}", unit.memory);

TODO

  • parse all known attributes in from_systemctl

About

🐧 Small rust crate to interact with systemd

Topics

Resources

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Stars

Watchers

Forks

Packages

No packages published

Contributors 12

Languages