all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Christoph Heiss <c.heiss@proxmox.com>
To: pdm-devel@lists.proxmox.com
Subject: [PATCH installer v3 33/38] auto: sysinfo: switch to types from proxmox-installer-types
Date: Fri,  3 Apr 2026 18:54:05 +0200	[thread overview]
Message-ID: <20260403165437.2166551-34-c.heiss@proxmox.com> (raw)
In-Reply-To: <20260403165437.2166551-1-c.heiss@proxmox.com>

No functional changes.

Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
Changes v2 -> v3:
  * new patch

 proxmox-auto-install-assistant/src/main.rs    |   9 +-
 proxmox-auto-installer/src/sysinfo.rs         | 106 ++++++++----------
 proxmox-fetch-answer/Cargo.toml               |   1 +
 .../src/fetch_plugins/http.rs                 |   7 +-
 proxmox-installer-common/src/lib.rs           |   1 -
 proxmox-installer-common/src/sysinfo.rs       |  52 ---------
 6 files changed, 56 insertions(+), 120 deletions(-)
 delete mode 100644 proxmox-installer-common/src/sysinfo.rs

diff --git a/proxmox-auto-install-assistant/src/main.rs b/proxmox-auto-install-assistant/src/main.rs
index 901ab81..a92ac75 100644
--- a/proxmox-auto-install-assistant/src/main.rs
+++ b/proxmox-auto-install-assistant/src/main.rs
@@ -19,7 +19,7 @@ use std::{
 
 use proxmox_auto_installer::{
     answer::{Answer, FilterMatch},
-    sysinfo::SysInfo,
+    sysinfo,
     utils::{
         AutoInstSettings, FetchAnswerFrom, HttpOptions, default_partition_label,
         get_matched_udev_indexes, get_nic_list, get_single_udev_index, verify_disks_settings,
@@ -674,10 +674,9 @@ fn validate_answer(args: &CommandValidateAnswerArgs) -> Result<()> {
 }
 
 fn show_system_info(_args: &CommandSystemInfoArgs) -> Result<()> {
-    match SysInfo::as_json_pretty() {
-        Ok(res) => println!("{res}"),
-        Err(err) => eprintln!("Error fetching system info: {err}"),
-    }
+    let info = sysinfo::get().context("fetching system info")?;
+    println!("{}", serde_json::to_string_pretty(&info)?);
+
     Ok(())
 }
 
diff --git a/proxmox-auto-installer/src/sysinfo.rs b/proxmox-auto-installer/src/sysinfo.rs
index fe3a10d..5129829 100644
--- a/proxmox-auto-installer/src/sysinfo.rs
+++ b/proxmox-auto-installer/src/sysinfo.rs
@@ -1,66 +1,54 @@
 use anyhow::{Result, bail};
-use proxmox_installer_common::{
-    RUNTIME_DIR,
-    setup::{IsoInfo, ProductConfig, SetupInfo},
-    sysinfo::SystemDMI,
-};
-use serde::Serialize;
 use std::{fs, io, path::PathBuf};
 
 use crate::utils::get_nic_list;
+use proxmox_installer_common::{
+    RUNTIME_DIR,
+    setup::{ProxmoxProduct, SetupInfo},
+};
+use proxmox_installer_types::{NetworkInterface, SystemInfo};
 
-#[derive(Debug, Serialize)]
-pub struct SysInfo {
-    product: ProductConfig,
-    iso: IsoInfo,
-    dmi: SystemDMI,
-    network_interfaces: Vec<NetdevWithMac>,
-}
-
-impl SysInfo {
-    pub fn get() -> Result<Self> {
-        let path = PathBuf::from(RUNTIME_DIR).join("iso-info.json").to_owned();
-        let setup_info: SetupInfo = match fs::File::open(path) {
-            Ok(iso_info_file) => {
-                let reader = io::BufReader::new(iso_info_file);
-                serde_json::from_reader(reader)?
-            }
-            Err(err) if err.kind() == io::ErrorKind::NotFound => SetupInfo::mocked(),
-            Err(err) => bail!("failed to open iso-info.json - {err}"),
-        };
-
-        Ok(Self {
-            product: setup_info.config,
-            iso: setup_info.iso_info,
-            network_interfaces: NetdevWithMac::get_all()?,
-            dmi: SystemDMI::get()?,
-        })
-    }
-
-    pub fn as_json_pretty() -> Result<String> {
-        let info = Self::get()?;
-        Ok(serde_json::to_string_pretty(&info)?)
-    }
-}
-
-#[derive(Debug, Serialize)]
-struct NetdevWithMac {
-    /// The network link name
-    pub link: String,
-    /// The MAC address of the network device
-    pub mac: String,
-}
-
-impl NetdevWithMac {
-    fn get_all() -> Result<Vec<Self>> {
-        let mut result: Vec<Self> = Vec::new();
-
-        let links = get_nic_list()?;
-        for link in links {
-            let mac = fs::read_to_string(format!("/sys/class/net/{link}/address"))?;
-            let mac = String::from(mac.trim());
-            result.push(Self { link, mac });
+pub fn get() -> Result<SystemInfo> {
+    let path = PathBuf::from(RUNTIME_DIR).join("iso-info.json").to_owned();
+    let setup_info: SetupInfo = match fs::File::open(path) {
+        Ok(iso_info_file) => {
+            let reader = io::BufReader::new(iso_info_file);
+            serde_json::from_reader(reader)?
         }
-        Ok(result)
-    }
+        Err(err) if err.kind() == io::ErrorKind::NotFound => SetupInfo::mocked(),
+        Err(err) => bail!("failed to open iso-info.json - {err}"),
+    };
+
+    Ok(SystemInfo {
+        product: proxmox_installer_types::ProductConfig {
+            fullname: setup_info.config.fullname,
+            product: match setup_info.config.product {
+                ProxmoxProduct::PVE => proxmox_installer_types::ProxmoxProduct::Pve,
+                ProxmoxProduct::PBS => proxmox_installer_types::ProxmoxProduct::Pbs,
+                ProxmoxProduct::PMG => proxmox_installer_types::ProxmoxProduct::Pmg,
+                ProxmoxProduct::PDM => proxmox_installer_types::ProxmoxProduct::Pdm,
+            },
+            enable_btrfs: setup_info.config.enable_btrfs,
+        },
+        iso: proxmox_installer_types::IsoInfo {
+            release: setup_info.iso_info.release,
+            isorelease: setup_info.iso_info.isorelease,
+        },
+        network_interfaces: get_all_network_interfaces()?,
+        dmi: proxmox_installer_common::dmi::get()?,
+    })
+}
+
+fn get_all_network_interfaces() -> Result<Vec<NetworkInterface>> {
+    let mut result: Vec<NetworkInterface> = Vec::new();
+
+    let links = get_nic_list()?;
+    for link in links {
+        let mac = fs::read_to_string(format!("/sys/class/net/{link}/address"))?;
+        result.push(NetworkInterface {
+            link,
+            mac: mac.trim().parse()?,
+        });
+    }
+    Ok(result)
 }
diff --git a/proxmox-fetch-answer/Cargo.toml b/proxmox-fetch-answer/Cargo.toml
index d779ad4..2d3b149 100644
--- a/proxmox-fetch-answer/Cargo.toml
+++ b/proxmox-fetch-answer/Cargo.toml
@@ -15,6 +15,7 @@ anyhow.workspace = true
 log.workspace = true
 proxmox-auto-installer.workspace = true
 proxmox-installer-common = { workspace = true, features = ["http"] }
+proxmox-installer-types.workspace = true
 serde = { workspace = true, features = ["derive"] }
 serde_json.workspace = true
 toml.workspace = true
diff --git a/proxmox-fetch-answer/src/fetch_plugins/http.rs b/proxmox-fetch-answer/src/fetch_plugins/http.rs
index b958a35..fceabc2 100644
--- a/proxmox-fetch-answer/src/fetch_plugins/http.rs
+++ b/proxmox-fetch-answer/src/fetch_plugins/http.rs
@@ -6,8 +6,9 @@ use std::{
     process::Command,
 };
 
-use proxmox_auto_installer::{sysinfo::SysInfo, utils::HttpOptions};
+use proxmox_auto_installer::{sysinfo, utils::HttpOptions};
 use proxmox_installer_common::http::{self, header::HeaderMap};
+use proxmox_installer_types::SystemInfo;
 
 static ANSWER_URL_SUBDOMAIN: &str = "proxmox-auto-installer";
 static ANSWER_CERT_FP_SUBDOMAIN: &str = "proxmox-auto-installer-cert-fingerprint";
@@ -70,7 +71,7 @@ struct HttpFetchPayload {
     schema: HttpFetchInfoSchema,
     /// Information about the running system, flattened into this structure directly.
     #[serde(flatten)]
-    sysinfo: SysInfo,
+    sysinfo: SystemInfo,
 }
 
 impl HttpFetchPayload {
@@ -79,7 +80,7 @@ impl HttpFetchPayload {
     fn get() -> Result<Self> {
         Ok(Self {
             schema: HttpFetchInfoSchema::default(),
-            sysinfo: SysInfo::get()?,
+            sysinfo: sysinfo::get()?,
         })
     }
 
diff --git a/proxmox-installer-common/src/lib.rs b/proxmox-installer-common/src/lib.rs
index 05445d5..fde17b7 100644
--- a/proxmox-installer-common/src/lib.rs
+++ b/proxmox-installer-common/src/lib.rs
@@ -2,7 +2,6 @@ pub mod disk_checks;
 pub mod dmi;
 pub mod options;
 pub mod setup;
-pub mod sysinfo;
 
 #[cfg(feature = "http")]
 pub mod http;
diff --git a/proxmox-installer-common/src/sysinfo.rs b/proxmox-installer-common/src/sysinfo.rs
deleted file mode 100644
index 05e6de6..0000000
--- a/proxmox-installer-common/src/sysinfo.rs
+++ /dev/null
@@ -1,52 +0,0 @@
-use std::{collections::HashMap, fs};
-
-use anyhow::{Result, bail};
-use serde::Serialize;
-
-const DMI_PATH: &str = "/sys/devices/virtual/dmi/id";
-
-#[derive(Debug, Serialize)]
-pub struct SystemDMI {
-    system: HashMap<String, String>,
-    baseboard: HashMap<String, String>,
-    chassis: HashMap<String, String>,
-}
-
-impl SystemDMI {
-    pub fn get() -> Result<Self> {
-        let system_files = [
-            "product_serial",
-            "product_sku",
-            "product_uuid",
-            "product_name",
-        ];
-        let baseboard_files = ["board_asset_tag", "board_serial", "board_name"];
-        let chassis_files = ["chassis_serial", "chassis_sku", "chassis_asset_tag"];
-
-        Ok(Self {
-            system: Self::get_dmi_infos(&system_files)?,
-            baseboard: Self::get_dmi_infos(&baseboard_files)?,
-            chassis: Self::get_dmi_infos(&chassis_files)?,
-        })
-    }
-
-    fn get_dmi_infos(files: &[&str]) -> Result<HashMap<String, String>> {
-        let mut res: HashMap<String, String> = HashMap::new();
-
-        for file in files {
-            let path = format!("{DMI_PATH}/{file}");
-            let content = match fs::read_to_string(&path) {
-                Err(ref err) if err.kind() == std::io::ErrorKind::NotFound => continue,
-                Err(ref err) if err.kind() == std::io::ErrorKind::PermissionDenied => {
-                    bail!("Could not read data. Are you running as root or with sudo?")
-                }
-                Err(err) => bail!("Error: '{err}' on '{path}'"),
-                Ok(content) => content.trim().into(),
-            };
-            let key = file.splitn(2, '_').last().unwrap();
-            res.insert(key.into(), content);
-        }
-
-        Ok(res)
-    }
-}
-- 
2.53.0





  parent reply	other threads:[~2026-04-03 16:57 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-03 16:53 [PATCH proxmox/yew-pwt/datacenter-manager/installer v3 00/38] add auto-installer integration Christoph Heiss
2026-04-03 16:53 ` [PATCH proxmox v3 01/38] api-macro: allow $ in identifier name Christoph Heiss
2026-04-03 16:53 ` [PATCH proxmox v3 02/38] schema: oneOf: allow single string variant Christoph Heiss
2026-04-03 16:53 ` [PATCH proxmox v3 03/38] schema: implement UpdaterType for HashMap and BTreeMap Christoph Heiss
2026-04-03 16:53 ` [PATCH proxmox v3 04/38] network-types: move `Fqdn` type from proxmox-installer-common Christoph Heiss
2026-04-03 16:53 ` [PATCH proxmox v3 05/38] network-types: implement api type for Fqdn Christoph Heiss
2026-04-03 16:53 ` [PATCH proxmox v3 06/38] network-types: add api wrapper type for std::net::IpAddr Christoph Heiss
2026-04-03 16:53 ` [PATCH proxmox v3 07/38] network-types: cidr: implement generic `IpAddr::new` constructor Christoph Heiss
2026-04-03 16:53 ` [PATCH proxmox v3 08/38] network-types: fqdn: implement standard library Error for Fqdn Christoph Heiss
2026-04-03 16:53 ` [PATCH proxmox v3 09/38] node-status: make KernelVersionInformation Clone + PartialEq Christoph Heiss
2026-04-03 16:53 ` [PATCH proxmox v3 10/38] installer-types: add common types used by the installer Christoph Heiss
2026-04-03 16:53 ` [PATCH proxmox v3 11/38] installer-types: add types used by the auto-installer Christoph Heiss
2026-04-03 16:53 ` [PATCH proxmox v3 12/38] installer-types: implement api type for all externally-used types Christoph Heiss
2026-04-03 16:53 ` [PATCH yew-widget-toolkit v3 13/38] widget: kvlist: add widget for user-modifiable data tables Christoph Heiss
2026-04-03 16:53 ` [PATCH datacenter-manager v3 14/38] api-types, cli: use ReturnType::new() instead of constructing it manually Christoph Heiss
2026-04-03 16:53 ` [PATCH datacenter-manager v3 15/38] api-types: add api types for auto-installer integration Christoph Heiss
2026-04-03 16:53 ` [PATCH datacenter-manager v3 16/38] config: add auto-installer configuration module Christoph Heiss
2026-04-03 16:53 ` [PATCH datacenter-manager v3 17/38] acl: wire up new /system/auto-installation acl path Christoph Heiss
2026-04-03 16:53 ` [PATCH datacenter-manager v3 18/38] server: api: add auto-installer integration module Christoph Heiss
2026-04-03 16:53 ` [PATCH datacenter-manager v3 19/38] server: api: auto-installer: add access token management endpoints Christoph Heiss
2026-04-03 16:53 ` [PATCH datacenter-manager v3 20/38] client: add bindings for auto-installer endpoints Christoph Heiss
2026-04-03 16:53 ` [PATCH datacenter-manager v3 21/38] ui: auto-installer: add installations overview panel Christoph Heiss
2026-04-03 16:53 ` [PATCH datacenter-manager v3 22/38] ui: auto-installer: add prepared answer configuration panel Christoph Heiss
2026-04-03 16:53 ` [PATCH datacenter-manager v3 23/38] ui: auto-installer: add access token " Christoph Heiss
2026-04-03 16:53 ` [PATCH datacenter-manager v3 24/38] docs: add documentation for auto-installer integration Christoph Heiss
2026-04-03 16:53 ` [PATCH installer v3 25/38] install: iso env: use JSON boolean literals for product config Christoph Heiss
2026-04-03 16:53 ` [PATCH installer v3 26/38] common: http: allow passing custom headers to post() Christoph Heiss
2026-04-03 16:53 ` [PATCH installer v3 27/38] common: options: move regex construction out of loop Christoph Heiss
2026-04-03 16:54 ` [PATCH installer v3 28/38] assistant: support adding an authorization token for HTTP-based answers Christoph Heiss
2026-04-03 16:54 ` [PATCH installer v3 29/38] tree-wide: used moved `Fqdn` type to proxmox-network-types Christoph Heiss
2026-04-03 16:54 ` [PATCH installer v3 30/38] tree-wide: use `Cidr` type from proxmox-network-types Christoph Heiss
2026-04-03 16:54 ` [PATCH installer v3 31/38] tree-wide: switch to filesystem types from proxmox-installer-types Christoph Heiss
2026-04-03 16:54 ` [PATCH installer v3 32/38] post-hook: switch to types in proxmox-installer-types Christoph Heiss
2026-04-03 16:54 ` Christoph Heiss [this message]
2026-04-03 16:54 ` [PATCH installer v3 34/38] fetch-answer: switch to types from proxmox-installer-types Christoph Heiss
2026-04-03 16:54 ` [PATCH installer v3 35/38] fetch-answer: http: prefer json over toml for answer format Christoph Heiss
2026-04-03 16:54 ` [PATCH installer v3 36/38] fetch-answer: send auto-installer HTTP authorization token if set Christoph Heiss
2026-04-03 16:54 ` [PATCH installer v3 37/38] tree-wide: switch out `Answer` -> `AutoInstallerConfig` types Christoph Heiss
2026-04-03 16:54 ` [PATCH installer v3 38/38] auto: drop now-dead answer file definitions Christoph Heiss

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=20260403165437.2166551-34-c.heiss@proxmox.com \
    --to=c.heiss@proxmox.com \
    --cc=pdm-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.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal