From: Wolfgang Bumiller <w.bumiller@proxmox.com>
To: Gabriel Goller <g.goller@proxmox.com>
Cc: pbs-devel@lists.proxmox.com
Subject: Re: [pbs-devel] [PATCH v4 proxmox-backup 2/5] node: status: added bootmode
Date: Wed, 29 Nov 2023 11:18:09 +0100 [thread overview]
Message-ID: <a3vp77ptyueaqf45qh3m4la3vhxru7st2mucabzvfnmcm6sodk@yn7dmnzoiymi> (raw)
In-Reply-To: <20231129090746.38798-3-g.goller@proxmox.com>
On Wed, Nov 29, 2023 at 10:07:43AM +0100, Gabriel Goller wrote:
> 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@proxmox.com>
> ---
> pbs-api-types/src/node.rs | 30 +++++++++++++++++++++++++++---
> src/api2/node/status.rs | 29 +++++++++++++++++++++++++++--
> 2 files changed, 54 insertions(+), 5 deletions(-)
>
> diff --git a/pbs-api-types/src/node.rs b/pbs-api-types/src/node.rs
> index 704215bb..ab626157 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,29 @@ pub struct NodeInformation {
> pub fingerprint: String,
> }
>
> +
> +#[api]
> +#[derive(Serialize, Deserialize, Copy, Clone)]
> +#[serde(rename_all = "kebab-case")]
> +/// The possible BootModes
> +pub enum BootMode {
> + /// The BootMode is EFI/UEFI
> + Efi,
> + /// The BootMode is Legacy BIOS
> + LegacyBios,
> +}
^ Should be able to have a From<proxmox_sys::boot_mode::BootMode> here.
> +
> +#[api]
> +#[derive(Serialize, Deserialize, Clone)]
> +#[serde(rename_all = "lowercase")]
> +/// Holds the Bootmodes
> +pub struct BootModeInformation {
> + /// The BootMode, either Efi or Bios
> + pub mode: BootMode,
> + /// SecureBoot status
> + pub secureboot: bool,
> +}
> +
> #[api]
> #[derive(Serialize, Deserialize, Default)]
> #[serde(rename_all = "kebab-case")]
> @@ -78,7 +100,7 @@ pub struct NodeCpuInformation {
> }
> },
> )]
> -#[derive(Serialize, Deserialize, Default)]
> +#[derive(Serialize, Deserialize)]
> #[serde(rename_all = "kebab-case")]
> /// The Node status
> pub struct NodeStatus {
> @@ -97,4 +119,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..17b9aff3 100644
> --- a/src/api2/node/status.rs
> +++ b/src/api2/node/status.rs
> @@ -1,16 +1,18 @@
> -use std::os::unix::prelude::OsStrExt;
> +use std::os::unix::ffi::OsStrExt;
> use std::process::Command;
>
> use anyhow::{bail, format_err, Error};
> use serde_json::Value;
>
> +use proxmox_sys::boot_mode;
> use proxmox_sys::linux::procfs;
>
> 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::{
> @@ -25,6 +27,26 @@ fn procfs_to_node_cpu_info(info: procfs::ProcFsCPUInfo) -> NodeCpuInformation {
> }
> }
>
> +fn boot_mode_to_info(bm: boot_mode::BootMode, sb: boot_mode::SecureBoot) -> BootModeInformation {
> + use boot_mode::BootMode;
> + use boot_mode::SecureBoot;
> +
> + match (bm, sb) {
Since the info we get isn't nested anymore, we could just move the match
inside the struct building.
BootModeInformation {
mode: bm.into(),
sb: sb.into() or sb == SecureBoot::Enabled with the added Eq
}
> + secureboot: true,
> + },
> + (BootMode::Efi, SecureBoot::Enabled) => BootModeInformation {
> + mode: pbs_api_types::BootMode::Efi,
> + secureboot: true,
> + },
> + (BootMode::Efi, SecureBoot::Disabled) => BootModeInformation {
> + mode: pbs_api_types::BootMode::Efi,
> + secureboot: false,
> + },
> + (BootMode::Bios, _) => BootModeInformation {
> + mode: pbs_api_types::BootMode::LegacyBios,
> + secureboot: false,
> + },
> + }
> +}
> +
> #[api(
> input: {
> properties: {
> @@ -79,6 +101,8 @@ async fn get_status(
>
> let disk = crate::tools::fs::fs_info_static(proxmox_lang::c_str!("/")).await?;
>
> + let boot_info = boot_mode_to_info(boot_mode::BootMode::query(), boot_mode::SecureBoot::query());
Btw. I'm not even sure we should have the above function if we query it
all at this point anyway, this could also just be
BootModeInformation::query(), or the function above could just take no
parameters.
> +
> Ok(NodeStatus {
> memory,
> swap,
> @@ -96,6 +120,7 @@ async fn get_status(
> info: NodeInformation {
> fingerprint: crate::cert_info()?.fingerprint()?,
> },
> + boot_info,
> })
> }
>
> --
> 2.39.2
next prev parent reply other threads:[~2023-11-29 10:18 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-29 9:07 [pbs-devel] [PATCH v4 proxmox{, -backup} 0/5] Add boot_mode, improve kernel version Gabriel Goller
2023-11-29 9:07 ` [pbs-devel] [PATCH v4 proxmox 1/5] sys: add helper to get bootmode and secureboot status Gabriel Goller
2023-11-29 10:13 ` Wolfgang Bumiller
2023-11-29 9:07 ` [pbs-devel] [PATCH v4 proxmox-backup 2/5] node: status: added bootmode Gabriel Goller
2023-11-29 10:18 ` Wolfgang Bumiller [this message]
2023-11-29 12:44 ` Gabriel Goller
2023-11-29 9:07 ` [pbs-devel] [PATCH v4 proxmox-backup 3/5] ui: dashboard: show the bootmode Gabriel Goller
2023-11-29 9:07 ` [pbs-devel] [PATCH v4 proxmox-backup 4/5] node: status: declutter kernel-version Gabriel Goller
2023-11-29 10:23 ` Wolfgang Bumiller
2023-11-29 12:50 ` Gabriel Goller
2023-11-29 13:05 ` Wolfgang Bumiller
2023-11-29 9:07 ` [pbs-devel] [PATCH v4 proxmox-backup 5/5] ui: dashboard: nicely display kernel version Gabriel Goller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a3vp77ptyueaqf45qh3m4la3vhxru7st2mucabzvfnmcm6sodk@yn7dmnzoiymi \
--to=w.bumiller@proxmox.com \
--cc=g.goller@proxmox.com \
--cc=pbs-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.