From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id C35AB1FF38E for ; Mon, 13 May 2024 11:50:16 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 42235125F8; Mon, 13 May 2024 11:50:18 +0200 (CEST) From: Christoph Heiss To: pve-devel@lists.proxmox.com Date: Mon, 13 May 2024 11:49:12 +0200 Message-ID: <20240513094936.412650-5-c.heiss@proxmox.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240513094936.412650-1-c.heiss@proxmox.com> References: <20240513094936.412650-1-c.heiss@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.005 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 SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH installer v2 4/4] assistant: avoid regex for simple prefix matching X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox VE development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" udev properties are very easy to parse and can be done by doing a line-based scan and matching the prefix, splitting once for properties. Avoids the use of regexes and signicantly reduces binary size by about -38%(!). Tested by comparing the output of `proxmox-auto-install-assistant device-info`, running it before and after the changes. Stripped binary size for release builds: before: 3103104 bytes ~ 2.96MiB after: 1935744 bytes ~ 1.85MiB text data bss dec hex filename 2906765 187144 537 3094446 2f37ae proxmox-auto-install-assistant-before 1871090 55736 497 1927323 1d689b proxmox-auto-install-assistant-after No functional changes. Signed-off-by: Christoph Heiss --- Changes v1 -> v2: * rebased on latest master proxmox-auto-install-assistant/Cargo.toml | 1 - proxmox-auto-install-assistant/src/main.rs | 57 +++++++++------------- 2 files changed, 24 insertions(+), 34 deletions(-) diff --git a/proxmox-auto-install-assistant/Cargo.toml b/proxmox-auto-install-assistant/Cargo.toml index 0286c80..766b445 100644 --- a/proxmox-auto-install-assistant/Cargo.toml +++ b/proxmox-auto-install-assistant/Cargo.toml @@ -15,7 +15,6 @@ anyhow = "1.0" clap = { version = "4.0", features = ["derive"] } glob = "0.3" proxmox-auto-installer = { path = "../proxmox-auto-installer" } -regex = "1.7" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" toml = "0.7" diff --git a/proxmox-auto-install-assistant/src/main.rs b/proxmox-auto-install-assistant/src/main.rs index 790dbc7..7c0b0c6 100644 --- a/proxmox-auto-install-assistant/src/main.rs +++ b/proxmox-auto-install-assistant/src/main.rs @@ -1,7 +1,6 @@ use anyhow::{bail, format_err, Result}; use clap::{Args, Parser, Subcommand, ValueEnum}; use glob::Pattern; -use regex::Regex; use serde::Serialize; use std::{ collections::BTreeMap, @@ -439,13 +438,9 @@ fn get_disks() -> Result>> { Pattern::new("sr[0-9]*")?, ]; - // compile Regex here once and not inside the loop - let re_disk = Regex::new(r"(?m)^E: DEVTYPE=disk")?; - let re_cdrom = Regex::new(r"(?m)^E: ID_CDROM")?; - let re_iso9660 = Regex::new(r"(?m)^E: ID_FS_TYPE=iso9660")?; - - let re_name = Regex::new(r"(?m)^N: (.*)$")?; - let re_props = Regex::new(r"(?m)^E: ([^=]+)=(.*)$")?; + const PROP_DEVTYP_PREFIX: &str = "E: DEVTYPE="; + const PROP_CDROM: &str = "E: ID_CDROM"; + const PROP_ISO9660_FS: &str = "E: ID_FS_TYPE=iso9660"; let mut disks: BTreeMap> = BTreeMap::new(); @@ -467,30 +462,27 @@ fn get_disks() -> Result>> { } }; - if !re_disk.is_match(&output) { - continue 'outer; - }; - if re_cdrom.is_match(&output) { - continue 'outer; - }; - if re_iso9660.is_match(&output) { - continue 'outer; - }; - let mut name = filename; - if let Some(cap) = re_name.captures(&output) { - if let Some(res) = cap.get(1) { - name = String::from(res.as_str()); + let mut udev_props: BTreeMap = BTreeMap::new(); + for line in output.lines() { + if let Some(prop) = line.strip_prefix(PROP_DEVTYP_PREFIX) { + if prop != "disk" { + continue 'outer; + } } - } - let mut udev_props: BTreeMap = BTreeMap::new(); + if line.starts_with(PROP_CDROM) || line.starts_with(PROP_ISO9660_FS) { + continue 'outer; + } - for line in output.lines() { - if let Some(caps) = re_props.captures(line) { - let key = String::from(caps.get(1).unwrap().as_str()); - let value = String::from(caps.get(2).unwrap().as_str()); - udev_props.insert(key, value); + if let Some(prop) = line.strip_prefix("N: ") { + name = prop.to_owned(); + }; + + if let Some(prop) = line.strip_prefix("E: ") { + if let Some((key, val)) = prop.split_once('=') { + udev_props.insert(key.to_owned(), val.to_owned()); + } } } @@ -500,7 +492,6 @@ fn get_disks() -> Result>> { } fn get_nics() -> Result>> { - let re_props = Regex::new(r"(?m)^E: (.*)=(.*)$")?; let mut nics: BTreeMap> = BTreeMap::new(); let links = get_nic_list()?; @@ -518,10 +509,10 @@ fn get_nics() -> Result>> { let mut udev_props: BTreeMap = BTreeMap::new(); for line in output.lines() { - if let Some(caps) = re_props.captures(line) { - let key = String::from(caps.get(1).unwrap().as_str()); - let value = String::from(caps.get(2).unwrap().as_str()); - udev_props.insert(key, value); + if let Some(prop) = line.strip_prefix("E: ") { + if let Some((key, val)) = prop.split_once('=') { + udev_props.insert(key.to_owned(), val.to_owned()); + } } } -- 2.44.0 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel