From 3ae7e15961d19fab11bb2a60daebe6a59f3c78ab Mon Sep 17 00:00:00 2001 From: Dark-Alex-17 Date: Tue, 8 Aug 2023 10:50:04 -0600 Subject: [PATCH] Added uptime metrics for radarr --- Cargo.toml | 2 +- src/app/radarr.rs | 5 ++--- src/network/radarr.rs | 12 +++++------ src/ui/mod.rs | 48 +++++++++++++++++++++++++++++++------------ src/utils.rs | 2 +- 5 files changed, 45 insertions(+), 24 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 955169a..adf9d5a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] anyhow = "1.0.68" -chrono = "0.4" +chrono = { version = "0.4", features = ["serde"] } clap = { version = "4.0.30", features = ["help", "usage", "error-context", "derive"] } confy = { version = "0.5.1", default_features = false, features = ["yaml_conf"] } crossterm = "0.25.0" diff --git a/src/app/radarr.rs b/src/app/radarr.rs index 760de04..c6b7d74 100644 --- a/src/app/radarr.rs +++ b/src/app/radarr.rs @@ -1,10 +1,9 @@ -use chrono::Duration; - -use crate::network::radarr::DiskSpace; +use chrono::{DateTime, Utc}; #[derive(Default, Debug)] pub struct RadarrData { pub free_space: u64, pub total_space: u64, pub version: String, + pub start_time: DateTime } diff --git a/src/network/radarr.rs b/src/network/radarr.rs index 7881833..9686ec5 100644 --- a/src/network/radarr.rs +++ b/src/network/radarr.rs @@ -1,12 +1,9 @@ -use std::borrow::Borrow; - use anyhow::Result; +use chrono::{DateTime, Utc}; use log::{debug, error}; use reqwest::RequestBuilder; use serde::{Deserialize, Serialize}; use serde_json::Number; - -use crate::app::radarr::RadarrData; use crate::app::RadarrConfig; use crate::network::{Network, RadarrEvent}; @@ -22,7 +19,7 @@ impl RadarrEvent { #[derive(Serialize, Deserialize, Debug)] #[serde(rename_all = "camelCase")] -pub struct DiskSpace { +struct DiskSpace { pub path: String, pub label: String, pub free_space: Number, @@ -30,8 +27,10 @@ pub struct DiskSpace { } #[derive(Deserialize, Debug)] -pub struct SystemStatus { +#[serde(rename_all = "camelCase")] +struct SystemStatus { version: String, + start_time: DateTime, } impl<'a> Network<'a> { @@ -59,6 +58,7 @@ impl<'a> Network<'a> { Ok(system_status) => { let mut app = self.app.lock().await; app.data.radarr_data.version = system_status.version; + app.data.radarr_data.start_time = system_status.start_time; } Err(e) => { error!("Failed to fetch system status. {:?}", e); diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 1ea3e3c..960d1f7 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -1,9 +1,11 @@ +use std::ops::Sub; +use chrono::{Duration, Utc}; use tui::backend::Backend; -use tui::layout::{Alignment, Constraint, Direction, Layout, Rect}; +use tui::layout::{Alignment, Constraint, Rect}; use tui::style::Color::Cyan; -use tui::style::{Color, Style}; +use tui::style::Style; use tui::text::{Spans, Text}; -use tui::widgets::{Block, Borders, Gauge, LineGauge, Paragraph}; +use tui::widgets::{Block, Borders, LineGauge, Paragraph}; use tui::{symbols, Frame}; use crate::app::radarr::RadarrData; @@ -51,6 +53,7 @@ fn draw_stats(f: &mut Frame<'_, B>, app: &App, area: Rect) { let RadarrData { free_space, total_space, + start_time, .. } = app.data.radarr_data; let ratio = if total_space == 0 { @@ -63,22 +66,40 @@ fn draw_stats(f: &mut Frame<'_, B>, app: &App, area: Rect) { f.render_widget(base_block, area); let chunks = - vertical_chunks_with_margin(vec![Constraint::Length(1), Constraint::Min(2)], area, 1); + vertical_chunks_with_margin(vec![ + Constraint::Length(1), + Constraint::Length(1), + Constraint::Min(2)], area, 1); - let version = Paragraph::new(Text::from(format!( - "Version: {}", + let version_paragraph = Paragraph::new(Text::from(format!( + "Radarr Version: {}", app.data.radarr_data.version ))) .block(Block::default()); - f.render_widget(version, chunks[0]); + + let uptime = Utc::now().sub(start_time); + let days = uptime.num_days(); + let day_difference = uptime.sub(Duration::days(days)); + let hours = day_difference.num_hours(); + let hour_difference = day_difference.sub(Duration::hours(hours)); + let minutes = hour_difference.num_minutes(); + let seconds = hour_difference.sub(Duration::minutes(minutes)).num_seconds(); + + let uptime_paragraph = Paragraph::new(Text::from(format!( + "Uptime: {}d {}:{}:{}", + days, hours, minutes, seconds + ))).block(Block::default()); let space_gauge = LineGauge::default() - .block(Block::default().title("Storage:")) - .gauge_style(Style::default().fg(Cyan)) - .line_set(symbols::line::THICK) - .ratio(ratio) - .label(Spans::from(format!("{:.0}%", ratio * 100.0))); - f.render_widget(space_gauge, chunks[1]); + .block(Block::default().title("Storage:")) + .gauge_style(Style::default().fg(Cyan)) + .line_set(symbols::line::THICK) + .ratio(ratio) + .label(Spans::from(format!("{:.0}%", ratio * 100.0))); + + f.render_widget(version_paragraph, chunks[0]); + f.render_widget(uptime_paragraph, chunks[1]); + f.render_widget(space_gauge, chunks[2]); } fn draw_logo(f: &mut Frame<'_, B>, area: Rect) { @@ -89,5 +110,6 @@ fn draw_logo(f: &mut Frame<'_, B>, area: Rect) { let logo = Paragraph::new(Text::from(RADARR_LOGO)) .block(Block::default()) .alignment(Alignment::Center); + f.render_widget(logo, chunks[0]); } diff --git a/src/utils.rs b/src/utils.rs index 027e85b..b0dae80 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -4,7 +4,7 @@ use log4rs::encode::pattern::PatternEncoder; use log::LevelFilter; pub fn init_logging_config() -> log4rs::Config { - let file_path = "/tmp/devtools.log"; + let file_path = "/tmp/managarr.log"; let logfile = FileAppender::builder() .encoder(Box::new(PatternEncoder::new("{l} - {m}\n"))) .build(file_path)