[pbs-devel] [PATCH proxmox-backup 1/2] node: status: added bootmode

Gabriel Goller g.goller at proxmox.com
Thu Nov 23 14:09:34 CET 2023


Added field that shows the bootmode of the node. The bootmode is either
Legacy Bios, EFI, or EFI (Secure Boot). To detect the mode we use the
exact same method as in pve: We check if the `/sys/firmware/efi` folder
exists, then check if the `SecureBoot-xx...` file in the `efivars`
directory has the SecureBoot flag enabled.

Signed-off-by: Gabriel Goller <g.goller at proxmox.com>
---
 pbs-api-types/src/node.rs | 20 ++++++++++++++++++--
 src/api2/node/status.rs   | 28 +++++++++++++++++++++++++++-
 www/panel/NodeInfo.js     | 17 +++++++++++++++++
 3 files changed, 62 insertions(+), 3 deletions(-)

diff --git a/pbs-api-types/src/node.rs b/pbs-api-types/src/node.rs
index 704215bb..6d1fa7f0 100644
--- a/pbs-api-types/src/node.rs
+++ b/pbs-api-types/src/node.rs
@@ -1,9 +1,8 @@
-use serde::{Deserialize, Serialize};
 use proxmox_schema::*;
+use serde::{Deserialize, Serialize};
 
 use crate::StorageStatus;
 
-
 #[api]
 #[derive(Serialize, Deserialize, Default)]
 #[serde(rename_all = "kebab-case")]
@@ -39,6 +38,21 @@ pub struct NodeInformation {
     pub fingerprint: String,
 }
 
+
+#[api]
+#[derive(Serialize, Deserialize, Default)]
+#[serde(rename_all = "lowercase")]
+/// The possible BootModes
+pub enum BootModeInformation {
+    /// The BootMode is EFI/UEFI
+    Efi,
+    /// The BootMode is EFI/UEFI with Secure Boot enabled
+    EfiSecureBoot,
+    /// The BootMode is Legacy BIOS
+    #[default]
+    Bios,
+}
+
 #[api]
 #[derive(Serialize, Deserialize, Default)]
 #[serde(rename_all = "kebab-case")]
@@ -97,4 +111,6 @@ pub struct NodeStatus {
     pub wait: f64,
     pub cpuinfo: NodeCpuInformation,
     pub info: NodeInformation,
+    /// Current boot mode
+    pub boot_info: BootModeInformation,
 }
diff --git a/src/api2/node/status.rs b/src/api2/node/status.rs
index 639d7211..1b3b9e33 100644
--- a/src/api2/node/status.rs
+++ b/src/api2/node/status.rs
@@ -1,4 +1,7 @@
+use std::fs::File;
+use std::io::Read;
 use std::os::unix::prelude::OsStrExt;
+use std::path::Path;
 use std::process::Command;
 
 use anyhow::{bail, format_err, Error};
@@ -10,7 +13,8 @@ use proxmox_router::{ApiMethod, Permission, Router, RpcEnvironment};
 use proxmox_schema::api;
 
 use pbs_api_types::{
-    NodePowerCommand, StorageStatus, NODE_SCHEMA, PRIV_SYS_AUDIT, PRIV_SYS_POWER_MANAGEMENT,
+    BootModeInformation, NodePowerCommand, StorageStatus, NODE_SCHEMA, PRIV_SYS_AUDIT,
+    PRIV_SYS_POWER_MANAGEMENT,
 };
 
 use pbs_api_types::{
@@ -79,6 +83,27 @@ async fn get_status(
 
     let disk = crate::tools::fs::fs_info_static(proxmox_lang::c_str!("/")).await?;
 
+    let boot_info: BootModeInformation;
+    if Path::new("/sys/firmware/efi").exists() {
+        // Check if SecureBoot is enabled
+        // Attention: this file is not seekable!
+        let efivar =
+            File::open("/sys/firmware/efi/efivars/SecureBoot-8be4df61-93ca-11d2-aa0d-00e098032b8c");
+        if let Ok(mut file) = efivar {
+            let mut buf = [0; 5];
+            file.read_exact(&mut buf)?;
+            if buf[4..] == [1] {
+                boot_info = BootModeInformation::EfiSecureBoot;
+            } else {
+                boot_info = BootModeInformation::Efi;
+            }
+        } else {
+            boot_info = BootModeInformation::Efi;
+        }
+    } else {
+        boot_info = BootModeInformation::Bios;
+    }
+
     Ok(NodeStatus {
         memory,
         swap,
@@ -96,6 +121,7 @@ async fn get_status(
         info: NodeInformation {
             fingerprint: crate::cert_info()?.fingerprint()?,
         },
+        boot_info,
     })
 }
 
diff --git a/www/panel/NodeInfo.js b/www/panel/NodeInfo.js
index 2551c9a5..14f84a2e 100644
--- a/www/panel/NodeInfo.js
+++ b/www/panel/NodeInfo.js
@@ -147,6 +147,23 @@ Ext.define('PBS.NodeInfoPanel', {
 	    textField: 'kversion',
 	    value: '',
 	},
+	{
+	    colspan: 2,
+	    title: gettext('Boot Mode'),
+	    printBar: false,
+	    textField: 'boot-info',
+	    renderer: boot_mode => {
+	        if (boot_mode === 'bios') {
+	            return 'Legacy BIOS';
+	        } else if (boot_mode === 'efi') {
+	            return 'EFI';
+	        } else if (boot_mode === 'efisecureboot') {
+	            return 'EFI (Secure Boot)';
+	        }
+	        return Proxmox.Utils.unknownText;
+	    },
+	    value: '',
+	},
 	{
 	    xtype: 'pmxNodeInfoRepoStatus',
 	    itemId: 'repositoryStatus',
-- 
2.39.2






More information about the pbs-devel mailing list