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 0C61A9E3CB for ; Mon, 27 Nov 2023 11:52:45 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id E9D025812 for ; Mon, 27 Nov 2023 11:52:44 +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 ; Mon, 27 Nov 2023 11:52:44 +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 F2D7644BCD for ; Mon, 27 Nov 2023 11:52:43 +0100 (CET) From: Gabriel Goller To: pbs-devel@lists.proxmox.com Date: Mon, 27 Nov 2023 11:52:38 +0100 Message-Id: <20231127105238.99947-4-g.goller@proxmox.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231127105238.99947-1-g.goller@proxmox.com> References: <20231127105238.99947-1-g.goller@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.354 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: [pbs-devel] [PATCH v4 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: Mon, 27 Nov 2023 10:52:45 -0000 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 8bcf8fd6..6004acb3 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)] @@ -112,7 +155,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 21f1bc2c..e4723938 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::{ @@ -91,11 +90,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?; @@ -112,7 +111,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 cba6d2a1..72f97c7c 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', + 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})`; + }, value: '', }, { -- 2.39.2