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 EB693B393F for ; Wed, 29 Nov 2023 11:23:36 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id CCC8E3C9B for ; Wed, 29 Nov 2023 11:23:36 +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 11:23:36 +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 D375A41B2B for ; Wed, 29 Nov 2023 11:23:35 +0100 (CET) Date: Wed, 29 Nov 2023 11:23:34 +0100 From: Wolfgang Bumiller To: Gabriel Goller Cc: pbs-devel@lists.proxmox.com Message-ID: References: <20231129090746.38798-1-g.goller@proxmox.com> <20231129090746.38798-5-g.goller@proxmox.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20231129090746.38798-5-g.goller@proxmox.com> X-SPAM-LEVEL: Spam detection results: 0 AWL 0.097 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: Re: [pbs-devel] [PATCH v4 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 10:23:37 -0000 On Wed, Nov 29, 2023 at 10:07:45AM +0100, Gabriel Goller wrote: > 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 | 47 ++++++++++++++++++++++++++++++++++++++- > src/api2/node/status.rs | 18 +++++++-------- > 2 files changed, 55 insertions(+), 10 deletions(-) > > diff --git a/pbs-api-types/src/node.rs b/pbs-api-types/src/node.rs > index ab626157..fd1fbe3b 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,47 @@ 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_ostr(sysname: &OsStr, release: &OsStr, version: &OsStr, machine: &OsStr) -> Self { from_ostr is a bit of a weird name for a public method taking 4 parameters. consider a `From<&UtsName>` implementation. > + KernelVersionInformation { > + sysname: sysname > + .to_os_string() > + .into_string() > + .unwrap_or("".to_string()), .unwrap_or_default(), also, whenver you think "".to_string(), type String::new() instead ;-) also, you first convert to an owned string - this always works, and then do the fallible `into_string()`, so even if it's not a valid string you clone and discard, instead, do: sysname .to_str() .map(String::from) .unwrap_or_default() this way there's no string copying if it's not valid utf-8 becausee that is checked first same for the cases below > + release: release > + .to_os_string() > + .into_string() > + .unwrap_or("".to_string()), > + version: version > + .to_os_string() > + .into_string() > + .unwrap_or("".to_string()), > + machine: machine > + .to_os_string() > + .into_string() > + .unwrap_or("".to_string()), > + } > + } > + > + pub fn get_legacy(&self) -> String { > + format!("{} {} {}", self.sysname, self.release, self.version) > + } > +} > > #[api] > #[derive(Serialize, Deserialize, Copy, Clone)] > @@ -111,7 +154,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..8b4d1638 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_ostr( > + 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 > > > > _______________________________________________ > pbs-devel mailing list > pbs-devel@lists.proxmox.com > https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel > >