diff options
author | Kjetil Orbekk <kjetil.orbekk@gmail.com> | 2017-05-24 08:32:53 -0400 |
---|---|---|
committer | Kjetil Orbekk <kjetil.orbekk@gmail.com> | 2017-05-24 08:32:53 -0400 |
commit | cd986ee64cf627ab0d39138e2cb24b115c4032b4 (patch) | |
tree | b0aa9fb743daf906bcb1cb49a78bad2eb032309e /src | |
parent | 92ab79b327e4b3e7fb8e7b8688b1c63a284ada1c (diff) |
unit: Renamed from job.
Improved unit parsing and some refactoring.
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 9 | ||||
-rw-r--r-- | src/systemd/mod.rs | 2 | ||||
-rw-r--r-- | src/systemd/unit.rs (renamed from src/systemd/job.rs) | 33 |
3 files changed, 33 insertions, 11 deletions
diff --git a/src/main.rs b/src/main.rs index 3fe1b7f..ce50828 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,8 +21,7 @@ use iron::{Iron, Request, IronResult, Response, Chain}; use router::Router; use horrorshow::prelude::*; use horrorshow::Raw; -use std::process::Command; -use systemhttp::systemd::job; +use systemhttp::systemd::unit; struct Aaa(String); @@ -38,7 +37,7 @@ impl iron_sessionstorage::Value for Aaa { } } -fn render_message(message: &str, units: &[job::Unit]) -> String { +fn render_message(message: &str, units: &[unit::Unit]) -> String { (html!{ : Raw("<!DOCTYPE html>"); html { @@ -76,14 +75,14 @@ fn hello(r: &mut Request) -> IronResult<Response> { .find("name") .unwrap_or("World").to_owned(); - let jobs = job::get_jobs().unwrap(); + let units = unit::get_units().unwrap(); let res = Ok(Response::with((status::Ok, Header(ContentType::html()), render_message(&format!("Hello, {} ({})", name, session_value.0), - &jobs)))); + &units)))); info!("Updating session value. Current value: {}", session_value.0); session_value.0.push('a'); diff --git a/src/systemd/mod.rs b/src/systemd/mod.rs index 80daa3e..a5acbce 100644 --- a/src/systemd/mod.rs +++ b/src/systemd/mod.rs @@ -1 +1 @@ -pub mod job; +pub mod unit; diff --git a/src/systemd/job.rs b/src/systemd/unit.rs index 967bb42..3be7fa5 100644 --- a/src/systemd/job.rs +++ b/src/systemd/unit.rs @@ -3,7 +3,7 @@ use std::process::Command; use std::io; -#[derive(Debug)] +#[derive(Debug, PartialEq, Eq)] pub struct Unit { pub name: String, pub type_: String @@ -24,7 +24,32 @@ fn test_parse_key_value() { assert_eq!(Some(("a".to_owned(), "b=c".to_owned())), parse_key_value("a=b=c")); } -pub fn get_jobs() -> io::Result<Vec<Unit>> { +fn make_unit(info: HashMap<String, String>) -> Option<Unit> { + fn from_id(id: &str) -> Option<String> { + id.rsplit('.').next().map(|t| t.to_owned()) + }; + let id = info.get("Id").map(|id| id.clone()); + let type_ = id.as_ref().and_then(|id| from_id(&id)); + + if let (Some(id), Some(type_)) = (id, type_) { + Some(Unit { name: id, type_: type_ }) + } else { + None + } +} + +#[test] +fn test_make_unit() { + let s = |s: &str| -> String { s.to_owned() }; + let info = [(s("Id"), s("Test.service"))] + .iter().cloned().collect::<HashMap<String, String>>(); + assert_eq!(Some(Unit { name: s("Test.service"), type_: s("service") }), make_unit(info)); + + let info = HashMap::new(); + assert_eq!(None, make_unit(info)); +} + +pub fn get_units() -> io::Result<Vec<Unit>> { let mut units = Vec::new(); let status = try!(Command::new("systemctl") .args(&["show", "*"]).output()); @@ -34,9 +59,7 @@ pub fn get_jobs() -> io::Result<Vec<Unit>> { if let Some((k, v)) = parse_key_value(line) { unit_info.insert(k, v); } else { - if let Some(id) = unit_info.remove("Id") { - units.push(Unit { name: id, type_: String::new() }); - } + make_unit(unit_info).map(|u| units.push(u)); unit_info = HashMap::new(); } } |