diff --git a/agent/Cargo.lock b/agent/Cargo.lock index a2b530b..ab45763 100644 --- a/agent/Cargo.lock +++ b/agent/Cargo.lock @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "nanometrics-agent" -version = "0.1.11" +version = "0.1.12" dependencies = [ "libc", "rumqttc", diff --git a/agent/Cargo.toml b/agent/Cargo.toml index 5801ea8..380590d 100644 --- a/agent/Cargo.toml +++ b/agent/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nanometrics-agent" -version = "0.1.11" +version = "0.1.12" edition = "2021" [lib] diff --git a/agent/src/metrics/smart.rs b/agent/src/metrics/smart.rs index a19ec4c..6f3e780 100644 --- a/agent/src/metrics/smart.rs +++ b/agent/src/metrics/smart.rs @@ -82,6 +82,7 @@ pub fn parse_json(json: &str) -> Result Option> { if !is_available() { + eprintln!("[smart] smartctl introuvable dans PATH"); return None; } let mut devs: Vec = std::fs::read_dir("/sys/block") @@ -91,11 +92,8 @@ pub fn collect() -> Option> { .map(|e| e.file_name().into_string().unwrap_or_default()) .filter_map(|n| { if n.starts_with("sd") { - // /dev/sda, /dev/sdb — block device, groupe disk OK Some(format!("/dev/{}", n)) } else if n.starts_with("nvme") && n.contains('n') { - // /dev/nvme0n1 — block device (brw-rw---- root disk), groupe disk OK - // NE PAS utiliser /dev/nvme0 (contrôleur crw------- root root, root only) Some(format!("/dev/{}", n)) } else { None @@ -105,18 +103,32 @@ pub fn collect() -> Option> { .into_iter() .collect(); devs.sort(); + eprintln!("[smart] disques détectés: {:?}", devs); let mut results = Vec::new(); for dev in &devs { - let Ok(output) = std::process::Command::new("smartctl") + let output = match std::process::Command::new("smartctl") .args(["-a", "-j", dev]) - .output() else { continue }; + .output() + { + Ok(o) => o, + Err(e) => { eprintln!("[smart] erreur exec smartctl {}: {}", dev, e); continue } + }; + eprintln!("[smart] smartctl {} → exit={}, stdout={} octets, stderr={} octets", + dev, output.status, output.stdout.len(), output.stderr.len()); let json = String::from_utf8_lossy(&output.stdout); - if let Ok(metrics) = parse_json(&json) { - results.push(crate::payload::SmartMetrics { - device: dev.trim_start_matches("/dev/").to_string(), - ..metrics - }); + match parse_json(&json) { + Ok(metrics) => { + eprintln!("[smart] {} parsé OK (passed={})", dev, metrics.passed); + results.push(crate::payload::SmartMetrics { + device: dev.trim_start_matches("/dev/").to_string(), + ..metrics + }); + } + Err(e) => { + eprintln!("[smart] {} parse JSON échoué: {}", dev, e); + eprintln!("[smart] premiers 200 octets stdout: {:?}", &json.chars().take(200).collect::()); + } } } if results.is_empty() { None } else { Some(results) }