diff options
author | Kjetil Orbekk <kjetil.orbekk@gmail.com> | 2017-06-17 09:44:42 -0400 |
---|---|---|
committer | Kjetil Orbekk <kjetil.orbekk@gmail.com> | 2017-06-17 09:44:42 -0400 |
commit | 6221d330e12c2b5738301eb0a63e584fa4cc9db4 (patch) | |
tree | 17b18b34f8ea251b78a6e8ad2e07c02edf4833a5 /src | |
parent | dc642430468a1942246642775040f9784ca3e8f2 (diff) |
refactor: Move server part to the library.
Diffstat (limited to 'src')
-rw-r--r-- | src/auth/mod.rs | 1 | ||||
-rw-r--r-- | src/bin/main.rs | 121 | ||||
-rw-r--r-- | src/lib.rs | 13 | ||||
-rw-r--r-- | src/server.rs | 114 |
4 files changed, 130 insertions, 119 deletions
diff --git a/src/auth/mod.rs b/src/auth/mod.rs index 9ef9960..f3db525 100644 --- a/src/auth/mod.rs +++ b/src/auth/mod.rs @@ -1,4 +1,3 @@ -extern crate crypto; extern crate base64; use crypto::bcrypt_pbkdf::bcrypt_pbkdf; diff --git a/src/bin/main.rs b/src/bin/main.rs index 36463a6..b54c4c0 100644 --- a/src/bin/main.rs +++ b/src/bin/main.rs @@ -1,127 +1,12 @@ // CSRF protection // https://github.com/heartsucker/iron-csrf #[macro_use] -extern crate iron; -#[macro_use] extern crate log; -#[macro_use] -extern crate router; -extern crate env_logger; extern crate systemhttp; -extern crate iron_sessionstorage; -extern crate staticfile; -extern crate regex; - -use iron_sessionstorage::traits::*; -use iron_sessionstorage::SessionStorage; -use iron_sessionstorage::backends::SignedCookieBackend; -use iron::status; -use iron::modifiers::Header; -use iron::headers::ContentType; -use iron::{Iron, Request, IronResult, Response, Chain}; -use router::Router; -use systemhttp::systemd::unit; -use systemhttp::systemd::journal; -use systemhttp::render; -use staticfile::Static; -use regex::Regex; - -struct Aaa(String); - -impl iron_sessionstorage::Value for Aaa { - fn get_key() -> &'static str { - "aaa" - } - fn into_raw(self) -> String { - self.0 - } - fn from_raw(v: String) -> Option<Self> { - Some(Aaa(v)) - } -} - -fn overview(r: &mut Request) -> IronResult<Response> { - let mut _value = match try!(r.session().get::<Aaa>()) { - Some(aaa) => aaa, - None => Aaa("".to_owned()), - }; - - let name = r.extensions - .get::<Router>() - .unwrap() - .find("name") - .unwrap_or("World").to_owned(); - - let units = unit::get_units("*").unwrap(); - - let sections = ["service", "timer", "socket", "target", "slice", "mount", - "path"]; - let units_by_section = sections.iter().map(|&s| { - (s.to_owned(), - units.iter().filter(|&u| &u.type_ == s).collect::<Vec<&unit::Unit>>()) - }).collect::<Vec<_>>(); - - // let res = Ok(Response::with((status::Ok, - // Header(ContentType::html()), - // render_message(&format!("Hello, {} ({})", - // name, - // session_value.0), - // &units)))); - - // info!("Updating session value. Current value: {}", session_value.0); - // session_value.0.push('a'); - // try!(r.session().set(session_value)); - Ok(Response::with((status::Ok, - Header(ContentType::html()), - render::system_status(&units_by_section)))) -} - -fn journal(r: &mut Request) -> IronResult<Response> { - let unit = iexpect!(r.extensions - .get::<Router>() - .unwrap() - .find("unit"), status::BadRequest); - let re = Regex::new(r"[-_\w\d]*").unwrap(); - if !re.is_match(unit) { - return Ok(Response::with( - (status::BadRequest, - format!("Unit ({}) does not match {}", - unit, re)))); - } - Ok(Response::with((status::Ok, - itry!(journal::get_log(unit, 100))))) -} - -fn unit_status(r: &mut Request) -> IronResult<Response> { - let unit_name = iexpect!(r.extensions - .get::<Router>() - .unwrap() - .find("unit"), status::BadRequest); - let re = Regex::new(r"[-_\w\d]*").unwrap(); - if !re.is_match(unit_name) { - return Ok(Response::with( - (status::BadRequest, - format!("Unit ({}) does not match {}", - unit_name, re)))); - } - let ref unit = itry!(unit::get_units(unit_name))[0]; - let log = itry!(journal::get_log(unit_name, 15)); - Ok(Response::with((status::Ok, - Header(ContentType::html()), - render::unit_status(&unit, &log)))) -} +extern crate env_logger; fn main() { env_logger::init().unwrap(); - let secret = b"secret2".to_vec(); - let router = router!( - root: get "/" => overview, - details: get "/status/:unit" => unit_status, - journal: get "/journal/:unit" => journal, - css: get "/static/main.css" => Static::new(""), - ); - let mut chain = Chain::new(router); - chain.link_around(SessionStorage::new(SignedCookieBackend::new(secret))); - let _server = Iron::new(chain).http(":::8080").unwrap(); - println!("On 8080"); + let _server = systemhttp::server::serve(8080).unwrap(); + println!("Serving on {}", 8080); } @@ -1,10 +1,23 @@ #[macro_use] extern crate horrorshow; extern crate sqlite; +extern crate crypto; +extern crate base64; +#[macro_use] +extern crate iron; +#[macro_use] +extern crate log; +#[macro_use] +extern crate router; +extern crate env_logger; +extern crate iron_sessionstorage; +extern crate staticfile; +extern crate regex; pub mod systemd; pub mod render; pub mod auth; +pub mod server; #[cfg(test)] mod tests { diff --git a/src/server.rs b/src/server.rs new file mode 100644 index 0000000..dad728e --- /dev/null +++ b/src/server.rs @@ -0,0 +1,114 @@ +extern crate iron_sessionstorage; +use iron_sessionstorage::traits::*; +use iron_sessionstorage::SessionStorage; +use iron_sessionstorage::backends::SignedCookieBackend; +use iron::status; +use iron::modifiers::Header; +use iron::headers::ContentType; +use iron::{Iron, Request, IronResult, Response, Chain, Listening}; +use iron::error::{HttpResult}; +use router::Router; +use systemd::unit; +use systemd::journal; +use render; +use staticfile::Static; +use regex::Regex; + +struct Aaa(String); + +impl iron_sessionstorage::Value for Aaa { + fn get_key() -> &'static str { + "aaa" + } + fn into_raw(self) -> String { + self.0 + } + fn from_raw(v: String) -> Option<Self> { + Some(Aaa(v)) + } +} + +fn overview(r: &mut Request) -> IronResult<Response> { + let mut _value = match try!(r.session().get::<Aaa>()) { + Some(aaa) => aaa, + None => Aaa("".to_owned()), + }; + + let name = r.extensions + .get::<Router>() + .unwrap() + .find("name") + .unwrap_or("World").to_owned(); + + let units = unit::get_units("*").unwrap(); + + let sections = ["service", "timer", "socket", "target", "slice", "mount", + "path"]; + let units_by_section = sections.iter().map(|&s| { + (s.to_owned(), + units.iter().filter(|&u| &u.type_ == s).collect::<Vec<&unit::Unit>>()) + }).collect::<Vec<_>>(); + + // let res = Ok(Response::with((status::Ok, + // Header(ContentType::html()), + // render_message(&format!("Hello, {} ({})", + // name, + // session_value.0), + // &units)))); + + // info!("Updating session value. Current value: {}", session_value.0); + // session_value.0.push('a'); + // try!(r.session().set(session_value)); + Ok(Response::with((status::Ok, + Header(ContentType::html()), + render::system_status(&units_by_section)))) +} + +fn journal(r: &mut Request) -> IronResult<Response> { + let unit = iexpect!(r.extensions + .get::<Router>() + .unwrap() + .find("unit"), status::BadRequest); + let re = Regex::new(r"[-_\w\d]*").unwrap(); + if !re.is_match(unit) { + return Ok(Response::with( + (status::BadRequest, + format!("Unit ({}) does not match {}", + unit, re)))); + } + Ok(Response::with((status::Ok, + itry!(journal::get_log(unit, 100))))) +} + +fn unit_status(r: &mut Request) -> IronResult<Response> { + let unit_name = iexpect!(r.extensions + .get::<Router>() + .unwrap() + .find("unit"), status::BadRequest); + let re = Regex::new(r"[-_\w\d]*").unwrap(); + if !re.is_match(unit_name) { + return Ok(Response::with( + (status::BadRequest, + format!("Unit ({}) does not match {}", + unit_name, re)))); + } + let ref unit = itry!(unit::get_units(unit_name))[0]; + let log = itry!(journal::get_log(unit_name, 15)); + Ok(Response::with((status::Ok, + Header(ContentType::html()), + render::unit_status(&unit, &log)))) +} + +pub fn serve(port: u16) -> HttpResult<Listening> { + let secret = b"secret2".to_vec(); + let router = router!( + root: get "/" => overview, + details: get "/status/:unit" => unit_status, + journal: get "/journal/:unit" => journal, + css: get "/static/main.css" => Static::new(""), + ); + let mut chain = Chain::new(router); + chain.link_around(SessionStorage::new(SignedCookieBackend::new(secret))); + let bind_address = format!("{}:{}", "::", port); + Iron::new(chain).http(bind_address.as_str()) +} |