diff options
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();          }      } | 
