From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [IPv6:2a0f:8001:1:32::40]) by lore.proxmox.com (Postfix) with ESMTPS id 418651FF0B3 for ; Fri, 25 Sep 2026 11:42:52 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 4232D216F8; Fri, 25 Sep 2026 11:42:36 +0200 (CEST) From: Arthur Bied-Charreton To: pve-devel@lists.proxmox.com Subject: [PATCH pve-firewall v3 04/16] api: ipset: add option to handle dangling references on delete Date: Fri, 25 Sep 2026 11:42:18 +0200 Message-ID: <20260925094230.844917-5-a.bied-charreton@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260925094230.844917-1-a.bied-charreton@proxmox.com> References: <20260925094230.844917-1-a.bied-charreton@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 2 DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) KAM_LAZY_DOMAIN_SECURITY 1 Sending domain does not have any anti-forgery methods RDNS_NONE 1.274 Delivered to internal network by a host with no rDNS SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_NONE 0.001 SPF: sender does not publish an SPF Record Message-ID-Hash: PBSTRBJGGZQOZDHEHVBEKLLBSEUBTOBU X-Message-ID-Hash: PBSTRBJGGZQOZDHEHVBEKLLBSEUBTOBU X-MailFrom: abied-charreton@jett.proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Deleting an ipset referenced by rules or security groups leaves dangling references, which the firewall fails to parse and drops. Add a 'dangling-references' option to the delete endpoint, to either 'disable' the referencing rules or 'drop' them along with the ipset. The default, 'keep', leaves them as they are. For cluster ipsets, this also covers all downstream configs (host, guest and vnet). Signed-off-by: Arthur Bied-Charreton --- src/PVE/API2/Firewall/IPSet.pm | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/PVE/API2/Firewall/IPSet.pm b/src/PVE/API2/Firewall/IPSet.pm index e734b8c..32e3630 100644 --- a/src/PVE/API2/Firewall/IPSet.pm +++ b/src/PVE/API2/Firewall/IPSet.pm @@ -2,6 +2,7 @@ package PVE::API2::Firewall::IPSetBase; use strict; use warnings; +use PVE::Firewall::Helpers qw(update_refs get_object_spec); use PVE::Exception qw(raise raise_param_exc); use PVE::JSONSchema qw(get_standard_option); @@ -140,6 +141,15 @@ sub register_delete_ipset { optional => 1, description => 'Delete all members of the IPSet, if there are any.', }; + $properties->{'dangling-references'} = { + type => 'string', + enum => ['keep', 'disable', 'drop'], + optional => 1, + description => + "Handle references that the deletion would leave dangling. Use 'disable' to disable " + . "the referencing rules, or 'drop' to remove them entirely.", + default => 'keep', + }; $class->register_method({ name => 'delete_ipset', @@ -166,6 +176,19 @@ sub register_delete_ipset { die "IPSet '$param->{name}' is not empty\n" if scalar(@$ipset) && !$param->{force}; + my $action = $param->{'dangling-references'} // 'keep'; + if ($action ne 'keep') { + my $spec = get_object_spec('ipset'); + update_refs( + $fw_conf, + $spec, + $param->{name}, + undef, + $class->rule_env(), + $action, + ); + } + $class->save_ipset($param, $fw_conf, undef); }, -- 2.47.3