diff --git a/agent/Cargo.toml b/agent/Cargo.toml index c56b5e6..5971f78 100644 --- a/agent/Cargo.toml +++ b/agent/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nanometrics-agent" -version = "0.1.6" +version = "0.1.7" edition = "2021" [lib] diff --git a/agent/src/config.rs b/agent/src/config.rs index ec1f8da..827401f 100644 --- a/agent/src/config.rs +++ b/agent/src/config.rs @@ -13,8 +13,12 @@ pub struct Config { pub struct ServerConfig { pub ip: String, pub port: u16, + #[serde(default = "default_iperf3_port")] + pub iperf3_port: u16, } +fn default_iperf3_port() -> u16 { 5201 } + #[derive(Deserialize, Debug, Clone, Default)] pub struct ProtocolsConfig { #[serde(default)] diff --git a/agent/src/main.rs b/agent/src/main.rs index f53c1fd..e2a9790 100644 --- a/agent/src/main.rs +++ b/agent/src/main.rs @@ -86,7 +86,7 @@ fn main() { let mut startup_net: Option> = None; let mut startup_hw: Option = None; 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 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 { slow_daily_done = true; 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 cfg.metrics.hardware_info.udp || cfg.metrics.hardware_info.mqtt { diff --git a/agent/src/metrics/network_info.rs b/agent/src/metrics/network_info.rs index db3a5c4..757119f 100644 --- a/agent/src/metrics/network_info.rs +++ b/agent/src/metrics/network_info.rs @@ -56,12 +56,13 @@ fn wol_status(name: &str) -> Option { None } -fn iperf_mbps(server_ip: &str) -> Option { +fn iperf_mbps(server_ip: &str, port: u16) -> Option { std::process::Command::new("which").arg("iperf3") .output().ok() .filter(|o| o.status.success())?; + let port_str = port.to_string(); 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()?; let json = String::from_utf8_lossy(&out.stdout); let v: serde_json::Value = serde_json::from_str(&json).ok()?; @@ -69,7 +70,7 @@ fn iperf_mbps(server_ip: &str) -> Option { Some((bps / 1_000_000.0 * 10.0).round() / 10.0) } -pub fn collect(server_ip: &str) -> Vec { +pub fn collect(server_ip: &str, iperf3_port: u16) -> Vec { let entries = match std::fs::read_dir("/sys/class/net") { Ok(e) => e, Err(_) => return vec![], @@ -82,7 +83,7 @@ pub fn collect(server_ip: &str) -> Vec { ifaces.sort(); if ifaces.is_empty() { return vec![]; } - let iperf = iperf_mbps(server_ip); + let iperf = iperf_mbps(server_ip, iperf3_port); ifaces.iter().map(|name| { let speed = read_sysfs(name, "speed") diff --git a/dist/nanometrics-agent-linux-amd64 b/dist/nanometrics-agent-linux-amd64 index f64656a..dd4b378 100755 Binary files a/dist/nanometrics-agent-linux-amd64 and b/dist/nanometrics-agent-linux-amd64 differ diff --git a/dist/nanometrics-agent-linux-arm64 b/dist/nanometrics-agent-linux-arm64 index e113b40..f47b9e8 100755 Binary files a/dist/nanometrics-agent-linux-arm64 and b/dist/nanometrics-agent-linux-arm64 differ diff --git a/server/docker-compose.yml b/server/docker-compose.yml index 7637887..15d5002 100644 --- a/server/docker-compose.yml +++ b/server/docker-compose.yml @@ -29,5 +29,17 @@ services: depends_on: - server + iperf3: + build: + context: . + dockerfile: Dockerfile.iperf3 + args: + ALPINE_IMAGE: ${ALPINE_IMAGE:-public.ecr.aws/docker/library/alpine:latest} + restart: unless-stopped + command: ["-s"] + ports: + - "5202:5201/tcp" + - "5202:5201/udp" + volumes: nanometrics_data: