summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKjetil Orbekk <kjetil.orbekk@gmail.com>2017-05-24 08:32:53 -0400
committerKjetil Orbekk <kjetil.orbekk@gmail.com>2017-05-24 08:32:53 -0400
commitcd986ee64cf627ab0d39138e2cb24b115c4032b4 (patch)
treeb0aa9fb743daf906bcb1cb49a78bad2eb032309e /src
parent92ab79b327e4b3e7fb8e7b8688b1c63a284ada1c (diff)
unit: Renamed from job.
Improved unit parsing and some refactoring.
Diffstat (limited to 'src')
-rw-r--r--src/main.rs9
-rw-r--r--src/systemd/mod.rs2
-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();
}
}