2 Commits

Author SHA1 Message Date
Gilles Soulier ee5e8710a3 fix(smart v0.1.14): filtre NVMe correct + SmartStatus défensif
- Filtre nvme : n[4..].contains('n') au lieu de n.contains('n')
  pour distinguer nvme0n1 (namespace) de nvme0 (contrôleur)
- SmartStatus.passed : #[serde(default)] pour éviter crash si absent

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-23 13:20:04 +02:00
Gilles Soulier d715b452c1 fix(smart v0.1.13): SmartTemp.current optionnel — évite échec parse JSON
Certains NVMe (ASUS TUF A16) ont un champ temperature sans current.
Le champ requis current: i64 faisait crasher toute la désérialisation.
Correction : #[serde(default)] + and_then au lieu de map.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-23 13:11:10 +02:00
3 changed files with 13 additions and 6 deletions
+1 -1
View File
@@ -248,7 +248,7 @@ dependencies = [
[[package]]
name = "nanometrics-agent"
version = "0.1.12"
version = "0.1.14"
dependencies = [
"libc",
"rumqttc",
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "nanometrics-agent"
version = "0.1.12"
version = "0.1.14"
edition = "2021"
[lib]
+11 -4
View File
@@ -9,10 +9,16 @@ struct SmartJson {
}
#[derive(Deserialize)]
struct SmartStatus { passed: bool }
struct SmartStatus {
#[serde(default)]
passed: bool,
}
#[derive(Deserialize)]
struct SmartTemp { current: i64 }
struct SmartTemp {
#[serde(default)]
current: Option<i64>,
}
#[derive(Deserialize)]
struct SmartAttrs { table: Vec<SmartAttr> }
@@ -44,7 +50,7 @@ pub fn is_available() -> bool {
pub fn parse_json(json: &str) -> Result<crate::payload::SmartMetrics, serde_json::Error> {
let s: SmartJson = serde_json::from_str(json)?;
let temperature = s.temperature.as_ref().map(|t| t.current)
let temperature = s.temperature.as_ref().and_then(|t| t.current)
.or_else(|| s.nvme_smart_health_information_log.as_ref()?.temperature);
let mut reallocated = None;
@@ -93,7 +99,8 @@ pub fn collect() -> Option<Vec<crate::payload::SmartMetrics>> {
.filter_map(|n| {
if n.starts_with("sd") {
Some(format!("/dev/{}", n))
} else if n.starts_with("nvme") && n.contains('n') {
} else if n.starts_with("nvme") && n[4..].contains('n') {
// nvme0n1, nvme1n1 — namespace block device ; "nvme0" (contrôleur) ne passerait pas
Some(format!("/dev/{}", n))
} else {
None