From e1eb1fc8b78545029bd5967099db14d069e1ef12 Mon Sep 17 00:00:00 2001 From: donpat1to Date: Thu, 31 Jul 2025 21:26:15 +0200 Subject: [PATCH] integrated Component temperature + Disks from sysinfo --- WatcherAgent/Cargo.toml | 2 +- WatcherAgent/src/main.rs | 77 +++++++--------------------------------- 2 files changed, 14 insertions(+), 65 deletions(-) diff --git a/WatcherAgent/Cargo.toml b/WatcherAgent/Cargo.toml index 183f1b9..bb8a9db 100644 --- a/WatcherAgent/Cargo.toml +++ b/WatcherAgent/Cargo.toml @@ -18,7 +18,7 @@ chrono = "0.4" nvml-wrapper = "0.10" [target.'cfg(windows)'.dependencies] -winapi = { version = "0.3.9", features = ["winuser", "pdh"] } +winapi = { version = "0.3", features = ["winuser", "pdh", "ifmib", "iphlpapi", "winerror"] } [target.'cfg(unix)'.dependencies] glob = "0.3" \ No newline at end of file diff --git a/WatcherAgent/src/main.rs b/WatcherAgent/src/main.rs index 9526260..ca01497 100644 --- a/WatcherAgent/src/main.rs +++ b/WatcherAgent/src/main.rs @@ -3,7 +3,7 @@ use nvml_wrapper::Nvml; use reqwest::{Client, StatusCode}; use serde::{Deserialize, Serialize}; use std::{error::Error, fs, process::Command, time::Duration}; -use sysinfo::{CpuExt, DiskExt, System, SystemExt}; +use sysinfo::{Components, Disks, System}; use tokio::time::{interval, sleep, Instant}; // Data structures matching the C# DTOs @@ -342,60 +342,7 @@ impl MetricsCollector { let ram_size = total_memory; // Disk - updated for sysinfo 0.35 - let (disk_size, disk_usage, disk_temp) = { - let mut total_size = 0u64; - let mut total_used = 0u64; - let mut count = 0; - - for disk in self.sys.disks() { - total_size += disk.total_space(); - total_used += disk.total_space() - disk.available_space(); - count += 1; - } - - // Disk temperature (Linux only) - #[cfg(target_os = "linux")] - { - if let Ok(dir) = fs::read_dir("/sys/block") { - for entry in dir.flatten() { - if let Some(disk_name) = entry.file_name().to_str() { - if disk_name.starts_with("sd") || disk_name.starts_with("nvme") { - let temp_path = format!( - "/sys/block/{}/device/hwmon/hwmon*/temp1_input", - disk_name - ); - if let Ok(paths) = glob::glob(&temp_path) { - for path in paths.flatten() { - if let Ok(content) = fs::read_to_string(path) { - if let Ok(t) = content.trim().parse::() { - temp += t / 1000.0; // Convert millidegrees - break; - } - } - } - } - } - } - } - } - } - - let size_b = if count > 0 { total_size as f64 } else { 0.0 }; - - let usage = if total_size > 0 { - (total_used as f64 / total_size as f64) * 100.0 - } else { - 0.0 - }; - - let avg_temp = if count > 0 { - disk_temp / count as f32 - } else { - 0.0 - }; - - (size_b, usage, avg_temp as f64) - }; + let (disk_size, disk_usage, disk_temp) = get_disk_info(); // GPU (NVIDIA) let (gpu_temp, gpu_load, vram_used, vram_total) = if let Some(nvml) = &self.nvml { if let Ok(device) = nvml.device_by_index(0) { @@ -467,15 +414,16 @@ impl MetricsCollector { } fn get_cpu_temp() -> Option { - let sys = System::new_all(); - - // Try to get CPU temperature from sysinfo first - if let Some(temp) = sys.cpus().first().and_then(|cpu| cpu.get_temperature()) { - return Some(temp as f32); + let components = Components::new_with_refreshed_list(); + for component in &components { + if let Some(temperature) = component.temperature() { + println!("{temperature}°C"); + } } - None + Some(0.0) // Placeholder, actual implementation depends on platform } + /* #[cfg(target_os = "linux")] { @@ -576,14 +524,15 @@ None*/ fn get_disk_info() -> (f64, f64, f64) { let mut sys = System::new(); - sys.refresh_disks(); - sys.refresh_disks_list(); + sys.refresh_all(); + //sys.refresh_disks_list(); let mut total_size = 0u64; let mut total_used = 0u64; let mut count = 0; - for disk in sys.disks() { + let disks = Disks::new_with_refreshed_list(); + for disk in disks.list() { // Ignoriere CD-ROMs und kleine Systempartitionen if disk.total_space() > 100 * 1024 * 1024 { // > 100MB