]> git.proxmox.com Git - pve-installer.git/commitdiff
assistant: rustify getting sysinfo
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Fri, 19 Apr 2024 16:33:02 +0000 (18:33 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Mon, 22 Apr 2024 12:31:37 +0000 (14:31 +0200)
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
proxmox-auto-install-assistant/src/main.rs
proxmox-auto-installer/src/sysinfo.rs
proxmox-fetch-answer/src/fetch_plugins/http.rs

index da55cf6bd6bc8086f735a1171406d9dfecdcc0ac..34e93cbc4f520475ce8fb365adfb35490c619ed1 100644 (file)
@@ -14,7 +14,7 @@ use std::{
 use proxmox_auto_installer::{
     answer::Answer,
     answer::FilterMatch,
-    sysinfo,
+    sysinfo::SysInfo,
     utils::{
         get_matched_udev_indexes, get_nic_list, get_single_udev_index, AutoInstModes,
         AutoInstSettings,
@@ -267,7 +267,7 @@ fn validate_answer(args: &CommandValidateAnswer) -> Result<()> {
 }
 
 fn show_identifiers(_args: &CommandIdentifiers) -> Result<()> {
-    match sysinfo::get_sysinfo(true) {
+    match SysInfo::as_json_pretty() {
         Ok(res) => println!("{res}"),
         Err(err) => eprintln!("Error fetching system identifiers: {err}"),
     }
index e4070c33cc4916b96cba399e17b4b4051e216505..a9b9ffdfba05de931c37e750c93accbc1200f114 100644 (file)
@@ -7,38 +7,44 @@ use crate::utils::get_nic_list;
 
 const DMI_PATH: &str = "/sys/devices/virtual/dmi/id";
 
-pub fn get_sysinfo(pretty: bool) -> Result<String> {
-    let dmi = SystemDMI::get()?;
-
-    let setup_info: SetupInfo = match fs::File::open("/run/proxmox-installer/iso-info.json") {
-        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}"),
-    };
-
-    let sysinfo = SysInfo {
-        product: setup_info.config,
-        iso: setup_info.iso_info,
-        network_interfaces: NetdevWithMac::get_all()?,
-        dmi,
-    };
-    if pretty {
-        return Ok(serde_json::to_string_pretty(&sysinfo)?);
-    }
-    Ok(serde_json::to_string(&sysinfo)?)
-}
-
 #[derive(Debug, Serialize)]
-struct SysInfo {
+pub struct SysInfo {
     product: ProductConfig,
     iso: IsoInfo,
     dmi: SystemDMI,
     network_interfaces: Vec<NetdevWithMac>,
 }
 
+impl SysInfo {
+    pub fn get() -> Result<Self> {
+        let setup_info: SetupInfo = match fs::File::open("/run/proxmox-installer/iso-info.json") {
+            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)?)
+    }
+
+    pub fn as_json() -> Result<String> {
+        let info = Self::get()?;
+        Ok(serde_json::to_string(&info)?)
+    }
+}
+
 #[derive(Debug, Serialize)]
 struct NetdevWithMac {
     /// The network link name
index 3461d9e9a3763e4a64c71c27864025afddd06b4e..ae29196e068bdf3b33568d410d26ca4b4bf6a30c 100644 (file)
@@ -5,7 +5,7 @@ use std::{
     process::Command,
 };
 
-use proxmox_auto_installer::{sysinfo, utils::AutoInstSettings};
+use proxmox_auto_installer::{sysinfo::SysInfo, utils::AutoInstSettings};
 
 static ANSWER_URL_SUBDOMAIN: &str = "proxmox-auto-installer";
 static ANSWER_CERT_FP_SUBDOMAIN: &str = "proxmox-auto-installer-cert-fingerprint";
@@ -66,7 +66,7 @@ impl FetchFromHTTP {
         }
 
         info!("Gathering system information.");
-        let payload = sysinfo::get_sysinfo(false)?;
+        let payload = SysInfo::as_json()?;
         info!("Sending POST request to '{answer_url}'.");
         let answer = http_post::call(answer_url, fingerprint.as_deref(), payload)?;
         Ok(answer)