integrated Component temperature + Disks from sysinfo
This commit is contained in:
@@ -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"
|
@@ -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::<f32>() {
|
||||
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<f32> {
|
||||
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
|
||||
|
Reference in New Issue
Block a user