fix(smart v0.1.10): extraction contrôleur NVMe — rfind au lieu de split

split('n').next() sur "nvme0n1" retourne "" (chaîne vide avant le premier 'n')
→ smartctl -a -j /dev/ (chemin invalide, échec silencieux, aucun SMART collecté)

Correction : rfind('n') trouve le dernier séparateur namespace (nvme0[n]1)
et n[..pos] donne le nom du contrôleur correct (nvme0, nvme10, etc.)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Gilles Soulier
2026-05-23 07:34:45 +02:00
parent db6fc65ee1
commit 55e68189d3
4 changed files with 10 additions and 7 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "nanometrics-agent" name = "nanometrics-agent"
version = "0.1.9" version = "0.1.10"
edition = "2021" edition = "2021"
[lib] [lib]
+9 -6
View File
@@ -92,12 +92,15 @@ pub fn collect() -> Option<Vec<crate::payload::SmartMetrics>> {
.filter_map(|n| { .filter_map(|n| {
if n.starts_with("sd") { if n.starts_with("sd") {
Some(format!("/dev/{}", n)) Some(format!("/dev/{}", n))
} else if n.starts_with("nvme") && !n.contains('n') { } else if n.starts_with("nvme") {
// /sys/block contient nvme0n1 (namespace) — on utilise le contrôleur nvme0 // /sys/block a nvme0n1 (namespace) → extraire le contrôleur nvme0
Some(format!("/dev/{}", n)) // rfind('n') trouve le dernier 'n' séparateur namespace, ex: nvme0[n]1
} else if n.starts_with("nvme") && n.contains('n') { let ctrl = if let Some(pos) = n.rfind('n')
// Déduit le contrôleur depuis nvme0n1 → nvme0 .filter(|&p| p >= 5 && n[p+1..].chars().all(|c| c.is_ascii_digit())) {
let ctrl = n.split('n').next()?; &n[..pos]
} else {
&n // déjà un nom de contrôleur (rare)
};
Some(format!("/dev/{}", ctrl)) Some(format!("/dev/{}", ctrl))
} else { } else {
None None
Binary file not shown.
Binary file not shown.