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 77DDB9DB28 for ; Fri, 24 Nov 2023 15:20:50 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 5811210C42 for ; Fri, 24 Nov 2023 15:20:20 +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 ; Fri, 24 Nov 2023 15:20:19 +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 63DF243C03 for ; Fri, 24 Nov 2023 15:20:19 +0100 (CET) Message-ID: Date: Fri, 24 Nov 2023 15:19:51 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: Lukas Wagner To: Proxmox Backup Server development discussion , Gabriel Goller References: <20231124120228.180173-1-g.goller@proxmox.com> <20231124120228.180173-4-g.goller@proxmox.com> Content-Language: de-AT, en-US In-Reply-To: <20231124120228.180173-4-g.goller@proxmox.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.158 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 POISEN_SPAM_PILL 0.1 Meta: its spam POISEN_SPAM_PILL_2 0.1 random spam to be learned in bayes POISEN_SPAM_PILL_4 0.1 random spam to be learned in bayes 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 v2 proxmox-backup 3/3] 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: Fri, 24 Nov 2023 14:20:50 -0000 Hi, some comments inline :) On 11/24/23 13:02, Gabriel Goller wrote: > Return a struct with all the components of the kernel version like it > has been done in pve. Extract and display the build version and kernel > release nicely. > > Signed-off-by: Gabriel Goller > --- > pbs-api-types/src/node.rs | 47 ++++++++++++++++++++++++++++++++++++++- > src/api2/node/status.rs | 18 +++++++-------- > www/panel/NodeInfo.js | 13 +++++++++-- > 3 files changed, 66 insertions(+), 12 deletions(-) > > diff --git a/pbs-api-types/src/node.rs b/pbs-api-types/src/node.rs > index 6d1fa7f0..ad2be5e3 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 { > + KernelVersionInformation { > + sysname: sysname > + .to_os_string() > + .into_string() > + .unwrap_or("".to_string()), > + 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, Default)] > @@ -103,7 +146,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 7cbf9cd6..92273515 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::{ > @@ -80,11 +79,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?; > @@ -101,7 +100,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, > diff --git a/www/panel/NodeInfo.js b/www/panel/NodeInfo.js > index 14f84a2e..b1e4ece2 100644 > --- a/www/panel/NodeInfo.js > +++ b/www/panel/NodeInfo.js > @@ -140,11 +140,20 @@ Ext.define('PBS.NodeInfoPanel', { > value: '', > }, > { > - itemId: 'kversion', > colspan: 2, > title: gettext('Kernel Version'), > printBar: false, > - textField: 'kversion', > + // TODO: remove with next major and only use newish current-kernel textfield > + multiField: true, > + //textField: 'current-kernel', I guess this is not needed? > + renderer: ({ data }) => { > + if (!data['current-kernel']) { > + return data.kversion; > + } > + let kernel = data['current-kernel']; > + let buildDate = kernel.version.match(/\((.+)\)\s*$/)[1] ?? 'unknown'; > + return `${kernel.sysname} ${kernel.release} (${buildDate})`; Identation is off here, spaces instead of tabs+spaces > + }, > value: '', > }, > { -- - Lukas