From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 5DCE01FF14F for ; Fri, 08 May 2026 14:51:32 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 35B4C18022; Fri, 8 May 2026 14:51:32 +0200 (CEST) From: Erik Fastermann To: pdm-devel@lists.proxmox.com Subject: [PATCH proxmox-datacenter-manager] fix #7187: report: add ethtool output for physical interfaces Date: Fri, 8 May 2026 14:50:54 +0200 Message-ID: <20260508125054.62224-1-e.fastermann@proxmox.com> X-Mailer: git-send-email 2.47.3 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment KAM_LAZY_DOMAIN_SECURITY 1 Sending domain does not have any anti-forgery methods RDNS_NONE 0.793 Delivered to internal network by a host with no rDNS SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_NONE 0.001 SPF: sender does not publish an SPF Record Message-ID-Hash: 6EPX423DCDGNDT7WT4J3ATVJ2XD7ID2G X-Message-ID-Hash: 6EPX423DCDGNDT7WT4J3ATVJ2XD7ID2G X-MailFrom: root@erik-pdm.proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Erik Fastermann X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox Datacenter Manager development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: The implementation mirrors the change in proxmox-backup, as the report functionality in pdm is adapted from there. Signed-off-by: Erik Fastermann --- NOTE: A similar patch was applied to all products: pmg, pve, pbs, pdm. server/src/report.rs | 63 ++++++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/server/src/report.rs b/server/src/report.rs index 371d8cf..e327051 100644 --- a/server/src/report.rs +++ b/server/src/report.rs @@ -2,6 +2,8 @@ use std::fmt::Write; use std::path::Path; use std::process::Command; +use proxmox_network_api::NetworkInterfaceType; + // TODO: This was copied from PBS. Might make sense to refactor these a little // bit and move them a `proxmox-system-report` crate or something. @@ -46,42 +48,63 @@ fn files() -> Vec<(&'static str, Vec<&'static str>)> { ] } -fn commands() -> Vec<(&'static str, Vec<&'static str>)> { - vec![ - // ("", vec![]) - ("date", vec!["-R"]), +fn commands() -> Vec<(&'static str, Vec)> { + // ("", vec![]) + const BASE_COMMANDS: &[(&str, &[&str])] = &[ + ("date", &["-R"]), ( "proxmox-datacenter-manager-admin", - vec!["versions", "--verbose"], + &["versions", "--verbose"], ), - ("proxmox-datacenter-manager-admin", vec!["remote", "list"]), + ("proxmox-datacenter-manager-admin", &["remote", "list"]), ( "proxmox-datacenter-manager-admin", - vec!["remote", "subscriptions"], + &["remote", "subscriptions"], ), ( "proxmox-datacenter-manager-admin", - vec!["support-status", "get"], + &["support-status", "get"], ), - ("proxmox-boot-tool", vec!["status"]), - ("df", vec!["-h", "-T"]), + ("proxmox-boot-tool", &["status"]), + ("df", &["-h", "-T"]), ( "lsblk", - vec![ + &[ "--ascii", "-M", "-o", "+HOTPLUG,ROTA,PHY-SEC,FSTYPE,MODEL,TRAN", ], ), - ("ls", vec!["-l", "/dev/disk/by-id", "/dev/disk/by-path"]), - ("zpool", vec!["status"]), - ("zfs", vec!["list"]), - ("zarcstat", vec![]), - ("ip", vec!["-details", "-statistics", "address"]), - ("ip", vec!["-4", "route", "show"]), - ("ip", vec!["-6", "route", "show"]), - ] + ("ls", &["-l", "/dev/disk/by-id", "/dev/disk/by-path"]), + ("zpool", &["status"]), + ("zfs", &["list"]), + ("zarcstat", &[]), + ("ip", &["-details", "-statistics", "address"]), + ("ip", &["-4", "route", "show"]), + ("ip", &["-6", "route", "show"]), + ]; + + let mut commands: Vec<_> = BASE_COMMANDS + .into_iter() + .map(|(cmd, args)| (*cmd, args.into_iter().map(|arg| arg.to_string()).collect())) + .collect(); + + match proxmox_network_api::config() { + Ok((config, _)) => { + let ethtool_commands = config + .interfaces + .into_iter() + .filter(|(_, iface)| iface.interface_type == NetworkInterfaceType::Eth) + .map(|(name, _)| ("ethtool", vec![name])); + commands.extend(ethtool_commands) + } + Err(err) => { + eprintln!("error while querying network interfaces: {err}") + } + }; + + commands } // (description, function()) @@ -137,7 +160,7 @@ fn get_directory_content(path: impl AsRef) -> String { out } -fn get_command_output(exe: &str, args: &Vec<&str>) -> String { +fn get_command_output(exe: &str, args: &[String]) -> String { let output = Command::new(exe) .env("PROXMOX_OUTPUT_NO_BORDER", "1") .args(args) -- 2.47.3