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 095E61FF183 for ; Wed, 2 Jul 2025 16:54:09 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id EA1651F0B6; Wed, 2 Jul 2025 16:51:52 +0200 (CEST) From: Gabriel Goller To: pve-devel@lists.proxmox.com Date: Wed, 2 Jul 2025 16:49:52 +0200 Message-Id: <20250702145101.894299-8-g.goller@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250702145101.894299-1-g.goller@proxmox.com> References: <20250702145101.894299-1-g.goller@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.069 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] [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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" 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