Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 017d7bb1bb | |||
| 5ee8b66464 | |||
| c238e9f2b8 |
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "nanometrics-agent"
|
name = "nanometrics-agent"
|
||||||
version = "0.1.6"
|
version = "0.1.8"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
|||||||
@@ -13,8 +13,12 @@ pub struct Config {
|
|||||||
pub struct ServerConfig {
|
pub struct ServerConfig {
|
||||||
pub ip: String,
|
pub ip: String,
|
||||||
pub port: u16,
|
pub port: u16,
|
||||||
|
#[serde(default = "default_iperf3_port")]
|
||||||
|
pub iperf3_port: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn default_iperf3_port() -> u16 { 5201 }
|
||||||
|
|
||||||
#[derive(Deserialize, Debug, Clone, Default)]
|
#[derive(Deserialize, Debug, Clone, Default)]
|
||||||
pub struct ProtocolsConfig {
|
pub struct ProtocolsConfig {
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
|
|||||||
+2
-2
@@ -86,7 +86,7 @@ fn main() {
|
|||||||
let mut startup_net: Option<Vec<payload::NetworkInterface>> = None;
|
let mut startup_net: Option<Vec<payload::NetworkInterface>> = None;
|
||||||
let mut startup_hw: Option<payload::HardwareInfo> = None;
|
let mut startup_hw: Option<payload::HardwareInfo> = None;
|
||||||
if cfg.metrics.network_info.udp || cfg.metrics.network_info.mqtt {
|
if cfg.metrics.network_info.udp || cfg.metrics.network_info.mqtt {
|
||||||
let ni = metrics::network_info::collect(&cfg.server.ip);
|
let ni = metrics::network_info::collect(&cfg.server.ip, cfg.server.iperf3_port);
|
||||||
if !ni.is_empty() { startup_net = Some(ni); }
|
if !ni.is_empty() { startup_net = Some(ni); }
|
||||||
}
|
}
|
||||||
if cfg.metrics.hardware_info.udp || cfg.metrics.hardware_info.mqtt {
|
if cfg.metrics.hardware_info.udp || cfg.metrics.hardware_info.mqtt {
|
||||||
@@ -116,7 +116,7 @@ fn main() {
|
|||||||
if ch == slow_time.0 && cm == slow_time.1 {
|
if ch == slow_time.0 && cm == slow_time.1 {
|
||||||
slow_daily_done = true;
|
slow_daily_done = true;
|
||||||
if cfg.metrics.network_info.udp || cfg.metrics.network_info.mqtt {
|
if cfg.metrics.network_info.udp || cfg.metrics.network_info.mqtt {
|
||||||
let ni = metrics::network_info::collect(&cfg.server.ip);
|
let ni = metrics::network_info::collect(&cfg.server.ip, cfg.server.iperf3_port);
|
||||||
if !ni.is_empty() { daily_net = Some(ni); }
|
if !ni.is_empty() { daily_net = Some(ni); }
|
||||||
}
|
}
|
||||||
if cfg.metrics.hardware_info.udp || cfg.metrics.hardware_info.mqtt {
|
if cfg.metrics.hardware_info.udp || cfg.metrics.hardware_info.mqtt {
|
||||||
|
|||||||
@@ -56,12 +56,13 @@ fn wol_status(name: &str) -> Option<bool> {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn iperf_mbps(server_ip: &str) -> Option<f64> {
|
fn iperf_mbps(server_ip: &str, port: u16) -> Option<f64> {
|
||||||
std::process::Command::new("which").arg("iperf3")
|
std::process::Command::new("which").arg("iperf3")
|
||||||
.output().ok()
|
.output().ok()
|
||||||
.filter(|o| o.status.success())?;
|
.filter(|o| o.status.success())?;
|
||||||
|
let port_str = port.to_string();
|
||||||
let out = std::process::Command::new("iperf3")
|
let out = std::process::Command::new("iperf3")
|
||||||
.args(["-c", server_ip, "-J", "-t", "5", "-P", "1"])
|
.args(["-c", server_ip, "-p", &port_str, "-J", "-t", "5", "-P", "1"])
|
||||||
.output().ok()?;
|
.output().ok()?;
|
||||||
let json = String::from_utf8_lossy(&out.stdout);
|
let json = String::from_utf8_lossy(&out.stdout);
|
||||||
let v: serde_json::Value = serde_json::from_str(&json).ok()?;
|
let v: serde_json::Value = serde_json::from_str(&json).ok()?;
|
||||||
@@ -69,7 +70,7 @@ fn iperf_mbps(server_ip: &str) -> Option<f64> {
|
|||||||
Some((bps / 1_000_000.0 * 10.0).round() / 10.0)
|
Some((bps / 1_000_000.0 * 10.0).round() / 10.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn collect(server_ip: &str) -> Vec<crate::payload::NetworkInterface> {
|
pub fn collect(server_ip: &str, iperf3_port: u16) -> Vec<crate::payload::NetworkInterface> {
|
||||||
let entries = match std::fs::read_dir("/sys/class/net") {
|
let entries = match std::fs::read_dir("/sys/class/net") {
|
||||||
Ok(e) => e,
|
Ok(e) => e,
|
||||||
Err(_) => return vec![],
|
Err(_) => return vec![],
|
||||||
@@ -82,7 +83,7 @@ pub fn collect(server_ip: &str) -> Vec<crate::payload::NetworkInterface> {
|
|||||||
ifaces.sort();
|
ifaces.sort();
|
||||||
if ifaces.is_empty() { return vec![]; }
|
if ifaces.is_empty() { return vec![]; }
|
||||||
|
|
||||||
let iperf = iperf_mbps(server_ip);
|
let iperf = iperf_mbps(server_ip, iperf3_port);
|
||||||
|
|
||||||
ifaces.iter().map(|name| {
|
ifaces.iter().map(|name| {
|
||||||
let speed = read_sysfs(name, "speed")
|
let speed = read_sysfs(name, "speed")
|
||||||
|
|||||||
@@ -89,15 +89,29 @@ pub fn collect() -> Option<Vec<crate::payload::SmartMetrics>> {
|
|||||||
.flatten()
|
.flatten()
|
||||||
.flatten()
|
.flatten()
|
||||||
.map(|e| e.file_name().into_string().unwrap_or_default())
|
.map(|e| e.file_name().into_string().unwrap_or_default())
|
||||||
.filter(|n| n.starts_with("sd") || n.starts_with("nvme"))
|
.filter_map(|n| {
|
||||||
.map(|n| format!("/dev/{}", n))
|
if n.starts_with("sd") {
|
||||||
|
Some(format!("/dev/{}", n))
|
||||||
|
} else if n.starts_with("nvme") && !n.contains('n') {
|
||||||
|
// /sys/block contient nvme0n1 (namespace) — on utilise le contrôleur nvme0
|
||||||
|
Some(format!("/dev/{}", n))
|
||||||
|
} else if n.starts_with("nvme") && n.contains('n') {
|
||||||
|
// Déduit le contrôleur depuis nvme0n1 → nvme0
|
||||||
|
let ctrl = n.split('n').next()?;
|
||||||
|
Some(format!("/dev/{}", ctrl))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect::<std::collections::HashSet<_>>()
|
||||||
|
.into_iter()
|
||||||
.collect();
|
.collect();
|
||||||
devs.sort();
|
devs.sort();
|
||||||
|
|
||||||
let mut results = Vec::new();
|
let mut results = Vec::new();
|
||||||
for dev in &devs {
|
for dev in &devs {
|
||||||
let Ok(output) = std::process::Command::new("smartctl")
|
let Ok(output) = std::process::Command::new("smartctl")
|
||||||
.args(["-j", dev])
|
.args(["-a", "-j", dev])
|
||||||
.output() else { continue };
|
.output() else { continue };
|
||||||
let json = String::from_utf8_lossy(&output.stdout);
|
let json = String::from_utf8_lossy(&output.stdout);
|
||||||
if let Ok(metrics) = parse_json(&json) {
|
if let Ok(metrics) = parse_json(&json) {
|
||||||
|
|||||||
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
@@ -38,8 +38,8 @@ services:
|
|||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
command: ["-s"]
|
command: ["-s"]
|
||||||
ports:
|
ports:
|
||||||
- "5201:5201/tcp"
|
- "5202:5201/tcp"
|
||||||
- "5201:5201/udp"
|
- "5202:5201/udp"
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
nanometrics_data:
|
nanometrics_data:
|
||||||
|
|||||||
Reference in New Issue
Block a user