From 5d8d77a98fb84d05d34b57df73e0bc180c3140c2 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Fri, 3 May 2024 22:06:37 +0200 Subject: works --- src/log.rs | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/log.rs (limited to 'src/log.rs') diff --git a/src/log.rs b/src/log.rs new file mode 100644 index 0000000..408df88 --- /dev/null +++ b/src/log.rs @@ -0,0 +1,53 @@ +use crate::{mail::send_mail, Config, STATUS}; +use chrono::{DateTime, Utc}; +use std::{ + collections::{BTreeMap, VecDeque}, + sync::Arc, +}; +use tokio::sync::RwLock; + +static LAST_STATUS: RwLock> = RwLock::const_new(BTreeMap::new()); +pub static LOG: RwLock> = RwLock::const_new(VecDeque::new()); + +pub struct Event { + pub time: DateTime, + pub service: usize, + pub check: usize, + pub error: Option, +} + +pub async fn update_service( + config: Arc, + service: usize, + check: usize, + error: Option<(String, String)>, +) -> anyhow::Result<()> { + let mut last_status = LAST_STATUS.write().await; + let last_status = last_status.entry(service).or_insert(true); + eprintln!("{service} {error:?}"); + + let current_status = { + let status = STATUS.read().await; + !status + .range((service, usize::MIN)..(service, usize::MAX)) + .any(|(_, v)| v.is_err()) + }; + + if *last_status != current_status { + *last_status = current_status; + let mut log = LOG.write().await; + log.push_front(Event { + error: error.clone().map(|(e, _)| e), + service, + check, + time: Utc::now(), + }); + while log.len() > 32 { + log.pop_back(); + } + if let Some((_short, long)) = error.clone() { + send_mail(&config, service, check, long).await?; + } + } + Ok(()) +} -- cgit v1.2.3-70-g09d2