From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id A6B57B3C03 for ; Wed, 29 Nov 2023 14:29:09 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 8F8897A79 for ; Wed, 29 Nov 2023 14:29:09 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS for ; Wed, 29 Nov 2023 14:29:08 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 5E35E40C70 for ; Wed, 29 Nov 2023 14:29:08 +0100 (CET) From: Gabriel Goller To: pbs-devel@lists.proxmox.com Date: Wed, 29 Nov 2023 14:29:00 +0100 Message-Id: <20231129132901.160282-5-g.goller@proxmox.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231129132901.160282-1-g.goller@proxmox.com> References: <20231129132901.160282-1-g.goller@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.170 Adjusted score from AWL reputation of From: address 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 SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record T_SCC_BODY_TEXT_LINE -0.01 - Subject: [pbs-devel] [PATCH v6 proxmox-backup 4/5] node: status: declutter kernel-version X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 29 Nov 2023 13:29:09 -0000 Return a struct with all the components of the kernel version like it has been done in pve. Also return the legacy `kversion` to keep backwards compat. Signed-off-by: Gabriel Goller --- pbs-api-types/src/node.rs | 40 ++++++++++++++++++++++++++++++++++++++- src/api2/node/status.rs | 18 +++++++++--------- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/pbs-api-types/src/node.rs b/pbs-api-types/src/node.rs index ab626157..c4e9a179 100644 --- a/pbs-api-types/src/node.rs +++ b/pbs-api-types/src/node.rs @@ -1,3 +1,5 @@ +use std::ffi::OsStr; + use proxmox_schema::*; use serde::{Deserialize, Serialize}; @@ -38,6 +40,40 @@ pub struct NodeInformation { pub fingerprint: String, } +#[api] +#[derive(Serialize, Deserialize, Default)] +#[serde(rename_all = "lowercase")] +/// The current kernel version (output of `uname`) +pub struct KernelVersionInformation { + /// The systemname/nodename + pub sysname: String, + /// The kernel release number + pub release: String, + /// The kernel version + pub version: String, + /// The machine architecture + pub machine: String, +} + +impl KernelVersionInformation { + pub fn from_uname_parts( + sysname: &OsStr, + release: &OsStr, + version: &OsStr, + machine: &OsStr, + ) -> Self { + KernelVersionInformation { + sysname: sysname.to_str().map(String::from).unwrap_or_default(), + release: release.to_str().map(String::from).unwrap_or_default(), + version: version.to_str().map(String::from).unwrap_or_default(), + machine: machine.to_str().map(String::from).unwrap_or_default(), + } + } + + pub fn get_legacy(&self) -> String { + format!("{} {} {}", self.sysname, self.release, self.version) + } +} #[api] #[derive(Serialize, Deserialize, Copy, Clone)] @@ -111,7 +147,9 @@ pub struct NodeStatus { pub uptime: u64, /// Load for 1, 5 and 15 minutes. pub loadavg: [f64; 3], - /// The current kernel version. + /// The current kernel version (NEW struct type). + pub current_kernel: KernelVersionInformation, + /// The current kernel version (LEGACY string type). pub kversion: String, /// Total CPU usage since last query. pub cpu: f64, diff --git a/src/api2/node/status.rs b/src/api2/node/status.rs index 17b9aff3..07c20444 100644 --- a/src/api2/node/status.rs +++ b/src/api2/node/status.rs @@ -1,4 +1,3 @@ -use std::os::unix::ffi::OsStrExt; use std::process::Command; use anyhow::{bail, format_err, Error}; @@ -11,8 +10,8 @@ use proxmox_router::{ApiMethod, Permission, Router, RpcEnvironment}; use proxmox_schema::api; use pbs_api_types::{ - BootModeInformation, NodePowerCommand, StorageStatus, NODE_SCHEMA, PRIV_SYS_AUDIT, - PRIV_SYS_POWER_MANAGEMENT, + BootModeInformation, KernelVersionInformation, NodePowerCommand, StorageStatus, NODE_SCHEMA, + PRIV_SYS_AUDIT, PRIV_SYS_POWER_MANAGEMENT, }; use pbs_api_types::{ @@ -92,11 +91,11 @@ async fn get_status( let cpuinfo = procfs_to_node_cpu_info(cpuinfo); let uname = nix::sys::utsname::uname()?; - let kversion = format!( - "{} {} {}", - std::str::from_utf8(uname.sysname().as_bytes())?, - std::str::from_utf8(uname.release().as_bytes())?, - std::str::from_utf8(uname.version().as_bytes())? + let kernel_version = KernelVersionInformation::from_uname_parts( + uname.sysname(), + uname.release(), + uname.version(), + uname.machine(), ); let disk = crate::tools::fs::fs_info_static(proxmox_lang::c_str!("/")).await?; @@ -113,7 +112,8 @@ async fn get_status( }, uptime: procfs::read_proc_uptime()?.0 as u64, loadavg, - kversion, + kversion: kernel_version.get_legacy(), + current_kernel: kernel_version, cpuinfo, cpu, wait, -- 2.39.2