X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=blobdiff_plain;f=src%2FPVE%2FINotify.pm;h=fd543132a3b5bfdbc2b775a21a694fe8b7887858;hp=c52d99255c98d93e474e9a93f5e7621d99c25b71;hb=d949babe56bde89b2935bfab041574e360a1201e;hpb=b3e3b51ba00dbb6fb2e44bc53495583eb03bfe2a diff --git a/src/PVE/INotify.pm b/src/PVE/INotify.pm index c52d992..fd54313 100644 --- a/src/PVE/INotify.pm +++ b/src/PVE/INotify.pm @@ -16,6 +16,7 @@ use PVE::Exception qw(raise_param_exc); use PVE::Network; use PVE::Tools; use PVE::ProcFSTools; +use PVE::JSONSchema; use Clone qw(clone); use Linux::Inotify2; use base 'Exporter'; @@ -954,6 +955,7 @@ sub __read_etc_network_interfaces { 'bridge-multicast-flood' => 1, 'bond_miimon' => 1, 'bond_xmit_hash_policy' => 1, + 'uplink-id' => 1, 'vlan-protocol' => 1, 'vxlan-id' => 1, 'vxlan-svcnodeip' => 1, @@ -1103,6 +1105,33 @@ sub __read_etc_network_interfaces { } } + # map address and netmask to cidr + if ($d->{address}) { + if ($d->{netmask} && $d->{netmask} =~ m/^\d+$/) { # e.g. netmask 20 + $d->{cidr} = $d->{address} . "/" . $d->{netmask}; + } elsif ($d->{netmask} && + (my $cidr = PVE::JSONSchema::get_netmask_bits($d->{netmask}))) { # e.g. netmask 255.255.255.0 + $d->{cidr} = $d->{address} . "/" . $cidr; + } elsif ($d->{address} =~ m!^(.*)/(\d+)$!) { + $d->{cidr} = $d->{address}; + $d->{address} = $1; + $d->{netmask} = $2; + } else { + $d->{cidr} = $d->{address}; + } + } + + # map address6 and netmask6 to cidr6 + if ($d->{address6}) { + $d->{cidr6} = $d->{address6}; + if ($d->{netmask6}) { + $d->{cidr6} .= "/" . $d->{netmask6}; + } elsif ($d->{address6} =~ m!^(.*)/(\d+)$!) { + $d->{address6} = $1; + $d->{netmask6} = $2; + } + } + $d->{method} = 'manual' if !$d->{method}; $d->{method6} = 'manual' if !$d->{method6}; @@ -1155,7 +1184,7 @@ sub __interface_to_string { comments => 1, autostart => 1, options => 1, address => 1, netmask => 1, gateway => 1, broadcast => 1, method6 => 1, families => 1, options6 => 1, - address6 => 1, netmask6 => 1, gateway6 => 1, broadcast6 => 1 }; + address6 => 1, netmask6 => 1, gateway6 => 1, broadcast6 => 1, 'uplink-id' => 1 }; if (!$first_block) { # not printing out options @@ -1317,6 +1346,9 @@ sub __write_etc_network_interfaces { foreach my $iface (keys %$ifaces) { my $d = $ifaces->{$iface}; + delete $d->{cidr}; + delete $d->{cidr6}; + my $ports = ''; foreach my $k (qw(bridge_ports ovs_ports slaves ovs_bonds)) { $ports .= " $d->{$k}" if $d->{$k}; @@ -1456,6 +1488,21 @@ sub __write_etc_network_interfaces { } } + # check uplink + my $uplinks = {}; + foreach my $iface (keys %$ifaces) { + my $d = $ifaces->{$iface}; + if (my $uplinkid = $d->{'uplink-id'}) { + die "iface '$iface' - uplink-id $uplinkid is only allowed on physical and linux bond interfaces\n" + if $d->{type} ne 'eth' && $d->{type} ne 'bond'; + + die "iface '$iface' - uplink-id $uplinkid is already assigned on '$uplinks->{$uplinkid}'\n" + if $uplinks->{$uplinkid}; + + $uplinks->{$uplinkid} = $iface; + } + } + # check bridgeport option my $bridgeports = {}; my $bridges = {};