diff --git a/Cargo.lock b/Cargo.lock index d96563d..015713b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -279,7 +279,7 @@ checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "cm-dashboard" -version = "0.1.123" +version = "0.1.124" dependencies = [ "anyhow", "chrono", @@ -301,7 +301,7 @@ dependencies = [ [[package]] name = "cm-dashboard-agent" -version = "0.1.123" +version = "0.1.124" dependencies = [ "anyhow", "async-trait", @@ -324,7 +324,7 @@ dependencies = [ [[package]] name = "cm-dashboard-shared" -version = "0.1.123" +version = "0.1.124" dependencies = [ "chrono", "serde", diff --git a/agent/Cargo.toml b/agent/Cargo.toml index c7b7085..473a74c 100644 --- a/agent/Cargo.toml +++ b/agent/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cm-dashboard-agent" -version = "0.1.123" +version = "0.1.124" edition = "2021" [dependencies] diff --git a/agent/src/collectors/disk.rs b/agent/src/collectors/disk.rs index 0d52432..6f3ee0f 100644 --- a/agent/src/collectors/disk.rs +++ b/agent/src/collectors/disk.rs @@ -210,7 +210,7 @@ impl DiskCollector { .collect(); // Convert numeric references to actual mount points if needed - let member_paths = if raw_paths.iter().any(|path| !path.starts_with('/')) { + let mut member_paths = if raw_paths.iter().any(|path| !path.starts_with('/')) { // Handle numeric format like "1:2" by finding corresponding /mnt/disk* paths self.resolve_numeric_mergerfs_paths(&raw_paths)? } else { @@ -218,6 +218,10 @@ impl DiskCollector { raw_paths }; + // For SnapRAID setups, also include parity drives as part of the pool + let snapraid_parity_paths = self.discover_snapraid_parity_drives()?; + member_paths.extend(snapraid_parity_paths); + // Categorize as data vs parity drives let (data_drives, parity_drives) = match self.categorize_pool_drives(&member_paths) { Ok(drives) => drives, @@ -240,6 +244,16 @@ impl DiskCollector { Ok(pools) } + /// Discover SnapRAID parity drives + fn discover_snapraid_parity_drives(&self) -> Result> { + let mount_devices = self.get_mount_devices()?; + let parity_paths: Vec = mount_devices.keys() + .filter(|path| path.contains("parity")) + .cloned() + .collect(); + Ok(parity_paths) + } + /// Categorize pool member drives as data vs parity fn categorize_pool_drives(&self, member_paths: &[String]) -> Result<(Vec, Vec)> { let mut data_drives = Vec::new(); diff --git a/dashboard/Cargo.toml b/dashboard/Cargo.toml index 00249e3..64c3717 100644 --- a/dashboard/Cargo.toml +++ b/dashboard/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cm-dashboard" -version = "0.1.123" +version = "0.1.124" edition = "2021" [dependencies] diff --git a/dashboard/src/ui/widgets/system.rs b/dashboard/src/ui/widgets/system.rs index 3dd74cb..0c6be93 100644 --- a/dashboard/src/ui/widgets/system.rs +++ b/dashboard/src/ui/widgets/system.rs @@ -470,26 +470,7 @@ impl SystemWidget { ); lines.push(Line::from(pool_spans)); - // Pool health line (for multi-disk pools) - if pool.pool_type != "single" { - if let Some(health) = &pool.pool_health { - let health_text = match health.as_str() { - "healthy" => format!("Pool Status: {} Healthy", - if pool.drives.len() > 1 { format!("({} drives)", pool.drives.len()) } else { String::new() }), - "degraded" => "Pool Status: ⚠ Degraded".to_string(), - "critical" => "Pool Status: ✗ Critical".to_string(), - "rebuilding" => "Pool Status: ⟳ Rebuilding".to_string(), - _ => format!("Pool Status: ? {}", health), - }; - - let mut health_spans = vec![ - Span::raw(" "), - Span::styled("├─ ", Typography::tree()), - ]; - health_spans.extend(StatusIcons::create_status_spans(pool.health_status.clone(), &health_text)); - lines.push(Line::from(health_spans)); - } - } + // Skip pool health line as discussed - removed // Total usage line (always show for pools) let usage_text = match (pool.usage_percent, pool.used_gb, pool.total_gb) { @@ -641,10 +622,12 @@ impl SystemWidget { if let Some(wear) = drive.wear_percent { drive_info.push(format!("W: {:.0}%", wear)); } + + // Always show drive name with info, or just name if no info available let drive_text = if drive_info.is_empty() { drive.name.clone() } else { - format!("{} {}", drive.name, drive_info.join(" • ")) + format!("{} {}", drive.name, drive_info.join(" ")) }; let mut drive_spans = vec![ diff --git a/shared/Cargo.toml b/shared/Cargo.toml index c233860..79c3af7 100644 --- a/shared/Cargo.toml +++ b/shared/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cm-dashboard-shared" -version = "0.1.123" +version = "0.1.124" edition = "2021" [dependencies]