* [pve-devel] [PATCH manager] api: network: fix #3385 check for used ports before writing
@ 2021-04-19 18:11 Stoiko Ivanov
2021-04-22 19:35 ` [pve-devel] applied: " Thomas Lamprecht
0 siblings, 1 reply; 2+ messages in thread
From: Stoiko Ivanov @ 2021-04-19 18:11 UTC (permalink / raw)
To: pve-devel
Currently the check for used ports for bonds and bridges happens while
rendering '/etc/network/interfaces.new' in PVE::Inotify (pve-common).
However at that stage the new/updated interface is already merged with
the old settings, making it impossible to indicate where a NIC is
currently used.
The code is adapted from the renderer in
PVE::Inotify::__write_etc_network_interfaces.
Tested on a virtual PVE instance.
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
---
PVE/API2/Network.pm | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/PVE/API2/Network.pm b/PVE/API2/Network.pm
index 9ac289c4..2d8c4ca1 100644
--- a/PVE/API2/Network.pm
+++ b/PVE/API2/Network.pm
@@ -301,6 +301,39 @@ my $check_duplicate_gateway6 = sub {
return &$check_duplicate($config, $newiface, 'gateway6', 'Default ipv6 gateway');
};
+my $check_duplicate_ports = sub {
+ my ($config, $newiface, $newparam) = @_;
+
+ my $param_name;
+ my $get_portlist = sub {
+ my ($param) = @_;
+ my $ports = '';
+ for my $k (qw(bridge_ports ovs_ports slaves ovs_bonds)) {
+ if ($param->{$k}) {
+ $ports .= " $param->{$k}";
+ $param_name //= $k;
+ }
+ }
+ return PVE::Tools::split_list($ports);
+ };
+
+ my $new_ports = {};
+ for my $p ($get_portlist->($newparam)) {
+ $new_ports->{$p} = 1;
+ }
+ return if !(keys %$new_ports);
+
+ for my $iface (keys %$config) {
+ next if $iface eq $newiface;
+
+ my $d = $config->{$iface};
+ for my $p ($get_portlist->($d)) {
+ raise_param_exc({ $param_name => "$p is already used on interface '$iface'." })
+ if $new_ports->{$p};
+ }
+ }
+};
+
sub ipv6_tobin {
return Net::IP::ip_iptobin(Net::IP::ip_expand_address(shift, 6), 6);
}
@@ -387,6 +420,8 @@ __PACKAGE__->register_method({
&$check_duplicate_gateway6($ifaces, $iface)
if $param->{gateway6};
+ $check_duplicate_ports->($ifaces, $iface, $param);
+
$map_cidr_to_address_netmask->($param);
&$check_ipv6_settings($param->{address6}, int($param->{netmask6}))
@@ -488,6 +523,8 @@ __PACKAGE__->register_method({
&$check_duplicate_gateway6($ifaces, $iface)
if $param->{gateway6};
+ $check_duplicate_ports->($ifaces, $iface, $param);
+
if ($param->{address}) {
push @$families, 'inet' if !grep(/^inet$/, @$families);
} else {
--
2.20.1
^ permalink raw reply [flat|nested] 2+ messages in thread
* [pve-devel] applied: [PATCH manager] api: network: fix #3385 check for used ports before writing
2021-04-19 18:11 [pve-devel] [PATCH manager] api: network: fix #3385 check for used ports before writing Stoiko Ivanov
@ 2021-04-22 19:35 ` Thomas Lamprecht
0 siblings, 0 replies; 2+ messages in thread
From: Thomas Lamprecht @ 2021-04-22 19:35 UTC (permalink / raw)
To: Proxmox VE development discussion, Stoiko Ivanov
On 19.04.21 20:11, Stoiko Ivanov wrote:
> Currently the check for used ports for bonds and bridges happens while
> rendering '/etc/network/interfaces.new' in PVE::Inotify (pve-common).
> However at that stage the new/updated interface is already merged with
> the old settings, making it impossible to indicate where a NIC is
> currently used.
>
> The code is adapted from the renderer in
> PVE::Inotify::__write_etc_network_interfaces.
>
> Tested on a virtual PVE instance.
>
> Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
> ---
> PVE/API2/Network.pm | 37 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 37 insertions(+)
>
>
applied, thanks!
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-04-22 19:36 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-19 18:11 [pve-devel] [PATCH manager] api: network: fix #3385 check for used ports before writing Stoiko Ivanov
2021-04-22 19:35 ` [pve-devel] applied: " Thomas Lamprecht
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal