diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..2a7aacd --- /dev/null +++ b/src/config.rs @@ -0,0 +1,33 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Deserialize, Serialize, Debug, Clone)] +pub struct EndpointConfig { + pub label: Option, + pub endpoint: Option, + pub port: Option, + pub code: Option, + pub body: Option, +} + +#[derive(Deserialize, Serialize, Debug, Clone)] +pub struct WebsiteConfig { + pub label: String, + pub base: String, + pub endpoints: Vec, +} + +#[derive(Deserialize, Serialize, Debug, Clone)] +pub struct Config { + pub refresh_time: u64, + pub bind_address: String, + pub websites: Vec, +} + +pub fn get_endpoint_info(endpoint: EndpointConfig) -> (String, String, Option, u16, String) { + let path = endpoint.endpoint.unwrap_or_default(); + let label = endpoint.label.unwrap_or_else(|| path.clone()); + let code = endpoint.code.unwrap_or_else(|| 200); + let body = endpoint.body.unwrap_or_default(); + + (label, path, endpoint.port, code, body) +} diff --git a/src/main.rs b/src/main.rs index f761ef7..f529d53 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,8 +6,10 @@ extern crate serde; #[macro_use] extern crate tera; +mod config; mod utils; +use self::config::*; use self::utils::EpochTimestamp; use actix_web::{ error::ErrorInternalServerError, @@ -17,7 +19,7 @@ use actix_web::{ }; use reqwest::{Client, Url, UrlError}; use ron::de::from_str; -use serde::{Deserialize, Serialize}; +use serde::Serialize; use std::{ error::Error, fs::read_to_string, @@ -25,29 +27,6 @@ use std::{ }; use tera::{Context, Tera}; -#[derive(Deserialize, Serialize, Debug, Clone)] -struct EndpointConf { - label: Option, - endpoint: Option, - port: Option, - code: Option, - body: Option, -} - -#[derive(Deserialize, Serialize, Debug, Clone)] -struct WebsiteConf { - label: String, - base: String, - endpoints: Vec, -} - -#[derive(Deserialize, Serialize, Debug, Clone)] -struct Config { - refresh_time: u64, - bind_address: String, - websites: Vec, -} - #[derive(Clone, Serialize)] pub struct Status { status: u8, @@ -133,7 +112,7 @@ fn update_status(config: &Config) -> Vec { results } -fn get_result(website_conf: &WebsiteConf, client: &Client, endpoint: &EndpointConf) -> Status { +fn get_result(website_conf: &WebsiteConfig, client: &Client, endpoint: &EndpointConfig) -> Status { let (label, path, port, code, body) = get_endpoint_info(endpoint.clone()); let url = get_url(&website_conf.base, &path, port).expect("reading config"); let ping_result = client.get(&url).send(); @@ -143,39 +122,35 @@ fn get_result(website_conf: &WebsiteConf, client: &Client, endpoint: &EndpointCo let res_body = res.text().expect("could not get body of request"); let does_code_match = res.status() == code; let does_body_match = body.is_empty() || res_body == body; + let mut error = None; if !does_code_match { - Status { - status: 1, - location: url, - domain: website_conf.label.clone(), - endpoint: label, - error: Some(format!( - "Status code mismatch! {} != {}", - res.status().as_u16(), - code - )), - } - } else if !does_body_match { - Status { - status: 1, - location: url, - domain: website_conf.label.clone(), - endpoint: label, - error: Some(format!( - "Body mismatch! {} != {}", + error = Some(format!( + "Status code mismatch: {} != {}!", + res.status().as_u16(), + code + )); + } + + if !does_body_match { + error = Some(if let Some(msg) = error { + format!( + "{} Body mismatch! {} != {}", + msg, res_body.len(), body.len() - )), - } - } else { - Status { - status: 0, - location: url, - domain: website_conf.label.clone(), - endpoint: label, - error: None, - } + ) + } else { + format!("Body mismatch! {} != {}", res_body.len(), body.len()) + }); + } + + Status { + status: if error.is_some() { 1 } else { 0 }, + location: url, + domain: website_conf.label.clone(), + endpoint: label, + error, } } Err(e) => Status { @@ -195,12 +170,3 @@ fn get_url(base: &String, path: &String, port: Option) -> Result (String, String, Option, u16, String) { - let path = endpoint.endpoint.unwrap_or_default(); - let label = endpoint.label.unwrap_or_else(|| path.clone()); - let code = endpoint.code.unwrap_or_else(|| 200); - let body = endpoint.body.unwrap_or_default(); - - (label, path, endpoint.port, code, body) -} diff --git a/templates/index.html b/templates/index.html index 410d0eb..d459209 100644 --- a/templates/index.html +++ b/templates/index.html @@ -20,7 +20,7 @@ display: flex; background-color: #424242; align-items: center; - margin: 1rem; + margin: 1rem 0; padding: 1rem; border-radius: 1rem; }