- get_local_ip: construit d'abord la liste des IPs physiques (getifaddrs
avec IFF_POINTOPOINT exclu + type=1 ARPHRD_ETHER requis), puis vérifie
que l'IP choisie par le UDP-connect-trick en fait partie → évite de
retourner une IP VPN même quand le trafic y est routé
- is_physical: remplace le filtrage par préfixe de nom par type kernel
/sys/class/net/<iface>/type == 1 (Ethernet/WiFi) ; exclut WireGuard
(type 65534), tunnels et autres interfaces virtuelles nommées librement
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- /sys/block expose nvme0n1 (namespace), mais smartctl a besoin du contrôleur
nvme0 → déduplication via HashSet pour éviter les doublons nvme0n1/nvme0
- smartctl -j → smartctl -a -j pour inclure nvme_smart_health_information_log
(sans -a, le log de santé NVMe n'est pas dans la sortie JSON)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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>
- Capture SIGTERM et SIGINT via libc::signal → AtomicBool RUNNING
- La boucle principale s'arrête proprement à la prochaine itération
- Envoi d'un paquet status:offline via UDP avant de quitter
- MQTT : publish status offline + disconnect() pour déconnexion gracieuse
(le last_will reste actif pour les déconnexions brutales)
- payload.rs: #[serde(default)] sur version pour compatibilité descendante
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- payload.rs : champ version (env!("CARGO_PKG_VERSION"))
- models.go : Version dans AgentMetrics et Agent
- db.go : colonne version dans agents + migration ALTER TABLE
- popups.js : badge version dans la section INFORMATIONS
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>
Implémente le transport MQTT complet avec rumqttc 0.24 :
- Birth message (online) au ConnAck + subscribe config topic
- Last Will Testament (offline) configuré au connect
- Réception config agent via topic {base}/{hostname}/config
- publish_metrics helper pour envoyer les métriques
- Transport::Tcp forcé pour broker sans TLS (malgré use-native-tls feature)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implémentation complète des 4 modules sysinfo 0.30 (sans default-features).
- cpu: moyenne sur tous les cœurs via refresh_cpu_usage()
- memory: used/free/total via System
- network: total_received/total_transmitted via Networks
- uptime: System::uptime() statique
10 tests unitaires passent.
TDD : 3 tests d'intégration écrits en premier (config_test.rs), puis
implémentation MqttConfig avec default_mqtt_host/port/topic_base pour
garantir des valeurs par défaut même si la section [protocols.mqtt] est
minimale dans le TOML.
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>