diff --git a/src/handlers.rs b/src/handlers.rs index 3b4b7b8..2925882 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -8,21 +8,26 @@ use serde::Serialize; use tera::{Context, Tera}; #[derive(Clone, Serialize, Default, Debug)] -pub struct Status { +pub struct EndpointStatus { pub status: u8, pub location: String, - pub domain: String, pub endpoint: String, pub error: Option, } +#[derive(Serialize, Debug)] +pub struct StatusGroup { + pub label: String, + pub endpoints: Vec, +} + #[derive(Serialize, Debug)] pub struct QueryResults { pub timestamp: DateTime, pub timestamp_str: String, pub refresh_time: u64, pub config: Config, - pub statuses: Vec, + pub groups: Vec, } pub fn index(tmpl: Data, state: Data) -> WebResult { @@ -38,5 +43,5 @@ pub fn index(tmpl: Data, state: Data) -> WebResult) -> HttpResponse { let state = state.read().unwrap(); - HttpResponse::Ok().json(&state.statuses) + HttpResponse::Ok().json(&*state.groups) } diff --git a/src/main.rs b/src/main.rs index 4424c1b..9bdf02c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -45,7 +45,7 @@ fn main() { timestamp_str: Utc::now().format("%Y-%m-%d %H:%M:%S").to_string(), refresh_time: config.refresh_time.clone(), config: config.clone(), - statuses: update_status(&config), + groups: update_status(&config), })); let clone_state = Arc::clone(&state); diff --git a/src/updater.rs b/src/updater.rs index 6b01048..268e447 100644 --- a/src/updater.rs +++ b/src/updater.rs @@ -1,4 +1,8 @@ -use crate::{config::*, handlers::Status, State}; +use crate::{ + config::*, + handlers::{EndpointStatus, StatusGroup}, + State, +}; use chrono::prelude::*; use reqwest::{Client, Url, UrlError}; @@ -7,23 +11,33 @@ pub fn update_state(state: State) { let mut write_state = state.try_write().expect("Could not unlock"); write_state.timestamp = Utc::now(); write_state.timestamp_str = Utc::now().format("%Y-%m-%d %H:%M:%S").to_string(); - write_state.statuses = new_statuses.unwrap(); + write_state.groups = new_statuses.unwrap(); } -pub fn update_status(config: &Config) -> Vec { +pub fn update_status(config: &Config) -> Vec { let client = Client::new(); - let mut results: Vec = vec![]; + let mut results: Vec = Vec::with_capacity(config.websites.len()); for website_conf in &config.websites { + let mut group = Vec::with_capacity(website_conf.endpoints.len()); for endpoint in &website_conf.endpoints { - results.push(get_result(website_conf, &client, endpoint)); + group.push(get_result(website_conf, &client, endpoint)); } + + results.push(StatusGroup { + label: website_conf.label.clone(), + endpoints: group, + }); } results } -fn get_result(website_conf: &WebsiteConfig, client: &Client, endpoint: &EndpointConfig) -> Status { +fn get_result( + website_conf: &WebsiteConfig, + client: &Client, + endpoint: &EndpointConfig, +) -> EndpointStatus { 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(); @@ -56,18 +70,16 @@ fn get_result(website_conf: &WebsiteConfig, client: &Client, endpoint: &Endpoint }); } - Status { + EndpointStatus { status: if error.is_some() { 1 } else { 0 }, location: url, - domain: website_conf.label.clone(), endpoint: label, error, } } - Err(e) => Status { + Err(e) => EndpointStatus { status: 2, location: url, - domain: website_conf.label.clone(), endpoint: label, error: Some(format!("{}", e)), }, diff --git a/templates/index.html b/templates/index.html index 69de65e..394e157 100644 --- a/templates/index.html +++ b/templates/index.html @@ -8,17 +8,17 @@ -
-

Status

+

Status Overview

{{ results.timestamp_str }}

- {% for status in results.statuses -%} + {% for group in results.groups -%} +

{{ group.label }}

+ {% for status in group.endpoints -%}
-
- -

{{ status.endpoint }}

-

{{ status.location }}

- {% if status.error %}

{{ status.error }}

{% endif %} -
+
+

{{ status.endpoint }}

+ {{ status.location }} + {% if status.error %}

{{ status.error }}

{% endif %} +
{% endfor -%} -
+ {% endfor -%}