Files
webmin/kea-dhcp/delete_objects.cgi
2026-05-23 02:24:03 +02:00

54 lines
1.9 KiB
Perl
Executable File

#!/usr/local/bin/perl
# Delete selected Kea DHCP subnets and shared networks.
use strict;
use warnings;
require './kea-dhcp-lib.pl'; ## no critic
&ReadParse();
our (%in, %text);
&error_setup($text{'eacl_aviol'});
my $ver = $in{'version'} == 6 ? 6 : 4;
&kea_assert_acl('edit'.$ver);
my ($c, $root, $data, $err) = &kea_read_dhcp_config($ver);
&error($err) if ($err);
&error_setup($text{'delete_failsave'});
my @shared = split(/\0/, defined($in{'d_shared'}) ? $in{'d_shared'} : "");
my @subnets = split(/\0/, defined($in{'d_subnet'}) ? $in{'d_subnet'} : "");
@shared || @subnets || &error($text{'delete_enone'});
# Group subnet deletions by parent so indexes can be removed descending within
# each array without disturbing later deletions.
my %subnets_by_parent;
foreach my $v (@subnets) {
$v =~ /^(\d*):(\d+)$/ || &error($text{'subnet_enone'});
my ($sidx, $idx) = ($1, $2);
&error($text{'subnet_enone'})
if (!&kea_valid_subnet_parent($root, $sidx));
my $list = &kea_subnet_list($root, $ver, $sidx);
&error($text{'subnet_enone'}) if (!$list->[$idx]);
push(@{$subnets_by_parent{$sidx}}, $idx);
}
foreach my $sidx (keys %subnets_by_parent) {
my $list = &kea_subnet_list($root, $ver, $sidx);
foreach my $idx (sort { $b <=> $a } @{$subnets_by_parent{$sidx}}) {
splice(@$list, $idx, 1);
}
}
# Shared networks are top-level siblings, so delete them after nested subnets.
my $shareds = &kea_shared_networks($root);
foreach my $idx (sort { $b <=> $a } @shared) {
$idx =~ /^\d+$/ || &error($text{'shared_enone'});
&error($text{'shared_enone'}) if (!$shareds->[$idx]);
my $subs = &kea_subnet_list($root, $ver, $idx);
&error($text{'shared_enonempty'}) if (@$subs);
splice(@$shareds, $idx, 1);
}
my $saveerr = &kea_save_component_config($c, $data);
&error($saveerr) if ($saveerr);
&webmin_log("delete", "objects", scalar(@shared) + scalar(@subnets), \%in);
&redirect("index.cgi?mode=dhcp$ver");