From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 6160B1FF17A for ; Fri, 4 Jul 2025 16:09:13 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id A687E3956F; Fri, 4 Jul 2025 16:09:52 +0200 (CEST) Date: Fri, 4 Jul 2025 16:09:47 +0200 From: Wolfgang Bumiller To: Gabriel Goller Message-ID: References: <20250702145101.894299-1-g.goller@proxmox.com> <20250702145101.894299-8-g.goller@proxmox.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20250702145101.894299-8-g.goller@proxmox.com> X-SPAM-LEVEL: Spam detection results: 0 AWL 0.030 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 URIBL_CSS_A 0.1 Contains URL's A record listed in the Spamhaus CSS blocklist [195.154.200.217] Subject: [pve-devel] applied: [PATCH proxmox-ve-rs v4 01/22] config: use proxmox_serde perl helpers 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 Cc: pve-devel@lists.proxmox.com Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" applied this one early, thanks On Wed, Jul 02, 2025 at 04:49:52PM +0200, Gabriel Goller wrote: > From: Stefan Hanreich > > proxmox_serde provides helpers for parsing optional numbers / booleans > coming from perl, so move to using them instead of implementing our > own versions here. No functional changes intended. > > Signed-off-by: Stefan Hanreich > --- > proxmox-ve-config/Cargo.toml | 1 + > proxmox-ve-config/debian/control | 4 ++ > proxmox-ve-config/src/firewall/bridge.rs | 3 +- > proxmox-ve-config/src/firewall/cluster.rs | 6 +- > proxmox-ve-config/src/firewall/guest.rs | 14 ++-- > proxmox-ve-config/src/firewall/host.rs | 26 ++++---- > proxmox-ve-config/src/firewall/parse.rs | 80 ----------------------- > 7 files changed, 28 insertions(+), 106 deletions(-) > > diff --git a/proxmox-ve-config/Cargo.toml b/proxmox-ve-config/Cargo.toml > index 83ee12db2cdf..ecf3fd22b07a 100644 > --- a/proxmox-ve-config/Cargo.toml > +++ b/proxmox-ve-config/Cargo.toml > @@ -16,6 +16,7 @@ serde = { version = "1", features = [ "derive" ] } > serde_json = "1" > serde_plain = "1" > serde_with = "3" > +proxmox-serde = { version = "1.0.0", features = [ "perl" ]} > > proxmox-schema = "4.1" > proxmox-sys = "1" > diff --git a/proxmox-ve-config/debian/control b/proxmox-ve-config/debian/control > index 4f17d557ddc7..0f6766f93fdc 100644 > --- a/proxmox-ve-config/debian/control > +++ b/proxmox-ve-config/debian/control > @@ -10,6 +10,8 @@ Build-Depends-Arch: cargo:native , > librust-log-0.4+default-dev , > librust-nix-0.29+default-dev , > librust-proxmox-schema-4+default-dev (>= 4.1-~~) , > + librust-proxmox-serde-1+default-dev , > + librust-proxmox-serde-1+perl-dev , > librust-proxmox-sortable-macro-1+default-dev , > librust-proxmox-sys-1+default-dev , > librust-serde-1+default-dev , > @@ -34,6 +36,8 @@ Depends: > librust-log-0.4+default-dev, > librust-nix-0.29+default-dev, > librust-proxmox-schema-4+default-dev (>= 4.1-~~), > + librust-proxmox-serde-1+default-dev, > + librust-proxmox-serde-1+perl-dev, > librust-proxmox-sortable-macro-1+default-dev, > librust-proxmox-sys-1+default-dev, > librust-serde-1+default-dev, > diff --git a/proxmox-ve-config/src/firewall/bridge.rs b/proxmox-ve-config/src/firewall/bridge.rs > index 4acb6fa23096..6dea60ea74c4 100644 > --- a/proxmox-ve-config/src/firewall/bridge.rs > +++ b/proxmox-ve-config/src/firewall/bridge.rs > @@ -3,7 +3,6 @@ use std::io; > use anyhow::Error; > use serde::Deserialize; > > -use crate::firewall::parse::serde_option_bool; > use crate::firewall::types::log::LogLevel; > use crate::firewall::types::rule::{Direction, Verdict}; > > @@ -55,7 +54,7 @@ impl Config { > #[derive(Debug, Default, Deserialize)] > #[cfg_attr(test, derive(Eq, PartialEq))] > pub struct Options { > - #[serde(default, with = "serde_option_bool")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_bool")] > enable: Option, > > policy_forward: Option, > diff --git a/proxmox-ve-config/src/firewall/cluster.rs b/proxmox-ve-config/src/firewall/cluster.rs > index ce3dd53446f8..a775cd99ade4 100644 > --- a/proxmox-ve-config/src/firewall/cluster.rs > +++ b/proxmox-ve-config/src/firewall/cluster.rs > @@ -10,7 +10,7 @@ use crate::firewall::types::log::LogRateLimit; > use crate::firewall::types::rule::{Direction, Verdict}; > use crate::firewall::types::{Alias, Group, Rule}; > > -use crate::firewall::parse::{serde_option_bool, serde_option_log_ratelimit}; > +use crate::firewall::parse::serde_option_log_ratelimit; > > #[derive(Debug, Default)] > pub struct Config { > @@ -118,10 +118,10 @@ impl Config { > #[derive(Debug, Default, Deserialize)] > #[cfg_attr(test, derive(Eq, PartialEq))] > pub struct Options { > - #[serde(default, with = "serde_option_bool")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_bool")] > enable: Option, > > - #[serde(default, with = "serde_option_bool")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_bool")] > ebtables: Option, > > #[serde(default, with = "serde_option_log_ratelimit")] > diff --git a/proxmox-ve-config/src/firewall/guest.rs b/proxmox-ve-config/src/firewall/guest.rs > index 23eaa4e29d0d..4428a75b0696 100644 > --- a/proxmox-ve-config/src/firewall/guest.rs > +++ b/proxmox-ve-config/src/firewall/guest.rs > @@ -13,8 +13,6 @@ use crate::firewall::types::Ipset; > use anyhow::{bail, Error}; > use serde::Deserialize; > > -use crate::firewall::parse::serde_option_bool; > - > /// default return value for [`Config::is_enabled()`] > pub const GUEST_ENABLED_DEFAULT: bool = false; > /// default return value for [`Config::allow_ndp()`] > @@ -37,25 +35,25 @@ pub const GUEST_POLICY_FORWARD_DEFAULT: Verdict = Verdict::Accept; > #[derive(Debug, Default, Deserialize)] > #[cfg_attr(test, derive(Eq, PartialEq))] > pub struct Options { > - #[serde(default, with = "serde_option_bool")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_bool")] > dhcp: Option, > > - #[serde(default, with = "serde_option_bool")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_bool")] > enable: Option, > > - #[serde(default, with = "serde_option_bool")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_bool")] > ipfilter: Option, > > - #[serde(default, with = "serde_option_bool")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_bool")] > ndp: Option, > > - #[serde(default, with = "serde_option_bool")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_bool")] > radv: Option, > > log_level_in: Option, > log_level_out: Option, > > - #[serde(default, with = "serde_option_bool")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_bool")] > macfilter: Option, > > #[serde(rename = "policy_in")] > diff --git a/proxmox-ve-config/src/firewall/host.rs b/proxmox-ve-config/src/firewall/host.rs > index 394896c48221..f7b02f96d0a7 100644 > --- a/proxmox-ve-config/src/firewall/host.rs > +++ b/proxmox-ve-config/src/firewall/host.rs > @@ -36,49 +36,49 @@ pub const HOST_LOG_INVALID_CONNTRACK: bool = false; > #[derive(Debug, Default, Deserialize)] > #[cfg_attr(test, derive(Eq, PartialEq))] > pub struct Options { > - #[serde(default, with = "parse::serde_option_bool")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_bool")] > enable: Option, > > - #[serde(default, with = "parse::serde_option_bool")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_bool")] > nftables: Option, > > log_level_in: Option, > log_level_out: Option, > log_level_forward: Option, > > - #[serde(default, with = "parse::serde_option_bool")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_bool")] > log_nf_conntrack: Option, > - #[serde(default, with = "parse::serde_option_bool")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_bool")] > ndp: Option, > > - #[serde(default, with = "parse::serde_option_bool")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_bool")] > nf_conntrack_allow_invalid: Option, > > // is Option> for easier deserialization > #[serde(default, with = "parse::serde_option_conntrack_helpers")] > nf_conntrack_helpers: Option>, > > - #[serde(default, with = "parse::serde_option_number")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_i64")] > nf_conntrack_max: Option, > - #[serde(default, with = "parse::serde_option_number")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_i64")] > nf_conntrack_tcp_timeout_established: Option, > - #[serde(default, with = "parse::serde_option_number")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_i64")] > nf_conntrack_tcp_timeout_syn_recv: Option, > > - #[serde(default, with = "parse::serde_option_bool")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_bool")] > nosmurfs: Option, > > - #[serde(default, with = "parse::serde_option_bool")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_bool")] > protection_synflood: Option, > - #[serde(default, with = "parse::serde_option_number")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_i64")] > protection_synflood_burst: Option, > - #[serde(default, with = "parse::serde_option_number")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_i64")] > protection_synflood_rate: Option, > > smurf_log_level: Option, > tcp_flags_log_level: Option, > > - #[serde(default, with = "parse::serde_option_bool")] > + #[serde(default, deserialize_with = "proxmox_serde::perl::deserialize_bool")] > tcpflags: Option, > } > > diff --git a/proxmox-ve-config/src/firewall/parse.rs b/proxmox-ve-config/src/firewall/parse.rs > index 8cf475740eab..7fd5c8461a56 100644 > --- a/proxmox-ve-config/src/firewall/parse.rs > +++ b/proxmox-ve-config/src/firewall/parse.rs > @@ -148,86 +148,6 @@ pub fn parse_named_section_tail<'a>( > }) > } > > -// parses a number from a string OR number > -pub mod serde_option_number { > - use std::fmt; > - > - use serde::de::{Deserializer, Error, Visitor}; > - > - pub fn deserialize<'de, D: Deserializer<'de>>( > - deserializer: D, > - ) -> Result, D::Error> { > - struct V; > - > - impl<'de> Visitor<'de> for V { > - type Value = Option; > - > - fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result { > - f.write_str("a numerical value") > - } > - > - fn visit_str(self, v: &str) -> Result { > - v.parse().map_err(E::custom).map(Some) > - } > - > - fn visit_none(self) -> Result { > - Ok(None) > - } > - > - fn visit_some(self, deserializer: D) -> Result > - where > - D: Deserializer<'de>, > - { > - deserializer.deserialize_any(self) > - } > - } > - > - deserializer.deserialize_any(V) > - } > -} > - > -// parses a bool from a string OR bool > -pub mod serde_option_bool { > - use std::fmt; > - > - use serde::de::{Deserializer, Error, Visitor}; > - > - pub fn deserialize<'de, D: Deserializer<'de>>( > - deserializer: D, > - ) -> Result, D::Error> { > - struct V; > - > - impl<'de> Visitor<'de> for V { > - type Value = Option; > - > - fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result { > - f.write_str("a boolean-like value") > - } > - > - fn visit_bool(self, v: bool) -> Result { > - Ok(Some(v)) > - } > - > - fn visit_str(self, v: &str) -> Result { > - super::parse_bool(v).map_err(E::custom).map(Some) > - } > - > - fn visit_none(self) -> Result { > - Ok(None) > - } > - > - fn visit_some(self, deserializer: D) -> Result > - where > - D: Deserializer<'de>, > - { > - deserializer.deserialize_any(self) > - } > - } > - > - deserializer.deserialize_any(V) > - } > -} > - > // parses a comma_separated list of strings > pub mod serde_option_conntrack_helpers { > use std::fmt; > -- > 2.39.5 > > > > _______________________________________________ > pve-devel mailing list > pve-devel@lists.proxmox.com > https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel > > _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel