From 3d2b37b26cd966041fa13c559fe2af9ee828ca8a Mon Sep 17 00:00:00 2001 From: Christoffer Martinsson Date: Tue, 21 Oct 2025 21:54:23 +0200 Subject: [PATCH] Remove hardcoded defaults and migrate dashboard config to NixOS - Remove all unused configuration options from dashboard config module - Eliminate hardcoded defaults - dashboard now requires config file like agent - Keep only actually used config: zmq.subscriber_ports and hosts.predefined_hosts - Remove unused get_host_metrics function from metric store - Clean up missing module imports (hosts, utils) - Make dashboard fail fast if no configuration provided - Align dashboard config approach with agent configuration pattern --- agent/src/main.rs | 1 - dashboard/src/app.rs | 13 ++-- dashboard/src/config/mod.rs | 131 +-------------------------------- dashboard/src/main.rs | 4 +- dashboard/src/metrics/store.rs | 5 -- 5 files changed, 12 insertions(+), 142 deletions(-) diff --git a/agent/src/main.rs b/agent/src/main.rs index 13d7eb7..67cf23d 100644 --- a/agent/src/main.rs +++ b/agent/src/main.rs @@ -11,7 +11,6 @@ mod config; mod metrics; mod notifications; mod status; -mod utils; use agent::Agent; diff --git a/dashboard/src/app.rs b/dashboard/src/app.rs index cdb498f..8bf4af7 100644 --- a/dashboard/src/app.rs +++ b/dashboard/src/app.rs @@ -28,11 +28,14 @@ impl Dashboard { pub async fn new(config_path: Option, headless: bool) -> Result { info!("Initializing dashboard"); - // Load configuration - let config = if let Some(path) = config_path { - DashboardConfig::load_from_file(&path)? - } else { - DashboardConfig::default() + // Load configuration - config file is required + let config = match config_path { + Some(path) => DashboardConfig::load_from_file(&path)?, + None => { + error!("Configuration file is required. Use --config to specify path."); + error!("Dashboard configuration must be provided - no hardcoded defaults allowed."); + return Err(anyhow::anyhow!("Missing required configuration file")); + } }; // Initialize ZMQ consumer diff --git a/dashboard/src/config/mod.rs b/dashboard/src/config/mod.rs index 02a5445..3d23519 100644 --- a/dashboard/src/config/mod.rs +++ b/dashboard/src/config/mod.rs @@ -6,58 +6,19 @@ use std::path::Path; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct DashboardConfig { pub zmq: ZmqConfig, - pub ui: UiConfig, pub hosts: HostsConfig, - pub metrics: MetricsConfig, - pub widgets: WidgetsConfig, } /// ZMQ consumer configuration #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ZmqConfig { pub subscriber_ports: Vec, - pub connection_timeout_ms: u64, - pub reconnect_interval_ms: u64, -} - -/// UI configuration -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct UiConfig { - pub refresh_rate_ms: u64, - pub theme: String, - pub preserve_layout: bool, } /// Hosts configuration #[derive(Debug, Clone, Serialize, Deserialize)] pub struct HostsConfig { - pub auto_discovery: bool, pub predefined_hosts: Vec, - pub default_host: Option, -} - -/// Metrics configuration -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct MetricsConfig { - pub history_retention_hours: u64, - pub max_metrics_per_host: usize, -} - -/// Widget configuration -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct WidgetsConfig { - pub cpu: WidgetConfig, - pub memory: WidgetConfig, - pub storage: WidgetConfig, - pub services: WidgetConfig, - pub backup: WidgetConfig, -} - -/// Individual widget configuration -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct WidgetConfig { - pub enabled: bool, - pub metrics: Vec, } impl DashboardConfig { @@ -71,104 +32,18 @@ impl DashboardConfig { impl Default for DashboardConfig { fn default() -> Self { - Self { - zmq: ZmqConfig::default(), - ui: UiConfig::default(), - hosts: HostsConfig::default(), - metrics: MetricsConfig::default(), - widgets: WidgetsConfig::default(), - } + panic!("Dashboard configuration must be loaded from file - no hardcoded defaults allowed") } } impl Default for ZmqConfig { fn default() -> Self { - Self { - subscriber_ports: vec![6130], - connection_timeout_ms: 15000, - reconnect_interval_ms: 5000, - } - } -} - -impl Default for UiConfig { - fn default() -> Self { - Self { - refresh_rate_ms: 100, - theme: "default".to_string(), - preserve_layout: true, - } + panic!("Dashboard configuration must be loaded from file - no hardcoded defaults allowed") } } impl Default for HostsConfig { fn default() -> Self { - Self { - auto_discovery: true, - predefined_hosts: vec![ - "cmbox".to_string(), - "labbox".to_string(), - "simonbox".to_string(), - "steambox".to_string(), - "srv01".to_string(), - "srv02".to_string(), - ], - default_host: Some("cmbox".to_string()), - } - } -} - -impl Default for MetricsConfig { - fn default() -> Self { - Self { - history_retention_hours: 24, - max_metrics_per_host: 10000, - } - } -} - -impl Default for WidgetsConfig { - fn default() -> Self { - Self { - cpu: WidgetConfig { - enabled: true, - metrics: vec![ - "cpu_load_1min".to_string(), - "cpu_load_5min".to_string(), - "cpu_load_15min".to_string(), - "cpu_temperature_celsius".to_string(), - ], - }, - memory: WidgetConfig { - enabled: true, - metrics: vec![ - "memory_usage_percent".to_string(), - "memory_total_gb".to_string(), - "memory_available_gb".to_string(), - ], - }, - storage: WidgetConfig { - enabled: true, - metrics: vec![ - "disk_nvme0_temperature_celsius".to_string(), - "disk_nvme0_wear_percent".to_string(), - "disk_nvme0_usage_percent".to_string(), - ], - }, - services: WidgetConfig { - enabled: true, - metrics: vec![ - "service_ssh_status".to_string(), - "service_ssh_memory_mb".to_string(), - ], - }, - backup: WidgetConfig { - enabled: true, - metrics: vec![ - "backup_status".to_string(), - "backup_last_run_timestamp".to_string(), - ], - }, - } + panic!("Dashboard configuration must be loaded from file - no hardcoded defaults allowed") } } diff --git a/dashboard/src/main.rs b/dashboard/src/main.rs index 1511129..30dd11c 100644 --- a/dashboard/src/main.rs +++ b/dashboard/src/main.rs @@ -6,10 +6,8 @@ use tracing_subscriber::EnvFilter; mod app; mod communication; mod config; -mod hosts; mod metrics; mod ui; -mod utils; use app::Dashboard; @@ -22,7 +20,7 @@ struct Cli { #[arg(short, long, action = clap::ArgAction::Count)] verbose: u8, - /// Configuration file path + /// Configuration file path (required) #[arg(short, long)] config: Option, diff --git a/dashboard/src/metrics/store.rs b/dashboard/src/metrics/store.rs index 801548f..6b7f6be 100644 --- a/dashboard/src/metrics/store.rs +++ b/dashboard/src/metrics/store.rs @@ -78,11 +78,6 @@ impl MetricStore { self.current_metrics.get(hostname)?.get(metric_name) } - /// Get all current metrics for a host - #[allow(dead_code)] - pub fn get_host_metrics(&self, hostname: &str) -> Option<&HashMap> { - self.current_metrics.get(hostname) - } /// Get all current metrics for a host as a vector pub fn get_metrics_for_host(&self, hostname: &str) -> Vec<&Metric> {