Agent:
- SmartMetrics + champ device (nom du disque ex: sda, nvme0)
- smart: Option<Vec<SmartMetrics>> — tous les disques, pas seulement le 1er
- collect() itère /sys/block, accumule les résultats de tous les disques valides
Serveur:
- SmartMetrics.Device + Smart []SmartMetrics dans AgentMetrics
- InsertMetrics: stocke smart_json (JSON array) au lieu de colonnes plates
- GetLastMetrics: désérialise smart_json
- Migration: smart_json TEXT ajoutée
Dashboard:
- Tuile: une icône shield/triangle par disque avec tooltip incluant le nom
- Popup détail: un bouton SMART par disque (couleur ok/err)
- showSmart(agentId, diskIdx): affiche le disque sélectionné
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Agent: détection IP via server_ip en priorité (fallback 8.8.8.8) — résout 0.0.0.0 sur LAN sans internet
- Agent: détection auto des disques /sys/block (sd*, nvme*) + fix continue dans la boucle smartctl
- Agent: SupplementaryGroups=disk dans le service systemd pour accès smartctl
- Dashboard: icône SMART (shield-check/triangle-exclamation) dans la ligne disque de la tuile
- Dashboard: bouton Copier compatible HTTP (fallback execCommand si clipboard API indisponible)
- Dashboard: suppression du texte redondant dans la section INSTALLATION AGENT
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remplace sysinfo::Disks par un appel direct à libc::statvfs("/").
- used = (f_blocks − f_bfree) × f_frsize → correspond à df "Utilisé"
- free = f_bavail × f_frsize → correspond à df "Dispo"
- total = f_blocks × f_frsize
Avant (sysinfo) : used comptait les blocs réservés root → surestimation de ~3-4 Go.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Initialise la structure de l'agent Rust avec tous les modules stub :
config, payload, metrics (cpu/memory/disk/network/uptime/temperature/smart),
transport (udp/mqtt). Corrige les features sysinfo 0.30 (pas de feature
disk/networks séparées). Compile sans erreurs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>