User can rename interfaces with udev/system, we can't rely on simple regex to known if it's a physical inteface.
keep proc_net_dev && PHYSICAL_NIC_RE for tests compatibility. Signed-off-by: Alexandre Derumier <aderum...@odiso.com> --- src/PVE/INotify.pm | 22 ++++++++++++++-------- src/PVE/ProcFSTools.pm | 12 ++++++++++++ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/PVE/INotify.pm b/src/PVE/INotify.pm index d1731fc..9c1aa84 100644 --- a/src/PVE/INotify.pm +++ b/src/PVE/INotify.pm @@ -859,13 +859,13 @@ my $check_mtu = sub { # } sub read_etc_network_interfaces { my ($filename, $fh) = @_; - my $proc_net_dev = IO::File->new('/proc/net/dev', 'r'); + my $phys_net_dev = PVE::ProcFSTools::get_physical_network_interfaces(); my $active = PVE::ProcFSTools::get_active_network_interfaces(); - return __read_etc_network_interfaces($fh, $proc_net_dev, $active); + return __read_etc_network_interfaces($fh, undef, $active, $phys_net_dev); } sub __read_etc_network_interfaces { - my ($fh, $proc_net_dev, $active_ifaces) = @_; + my ($fh, $proc_net_dev, $active_ifaces, $phys_net_dev) = @_; my $config = {}; my $ifaces = $config->{ifaces} = {}; @@ -893,7 +893,12 @@ sub __read_etc_network_interfaces { $ifaces->{$1}->{exists} = 1; } } - close($proc_net_dev); + } + + if($phys_net_dev) { + while (my ($ifname) = each %{$phys_net_dev}) { + $ifaces->{$ifname}->{exists} = 1; + } } # we try to keep order inside the file @@ -1084,7 +1089,7 @@ sub __read_etc_network_interfaces { $ifaces->{$1}->{exists} = 0; $d->{exists} = 0; } - } elsif ($iface =~ m/^$PVE::Network::PHYSICAL_NIC_RE$/) { + } elsif ($iface =~ m/^$PVE::Network::PHYSICAL_NIC_RE$/ || $phys_net_dev->{$iface}) { if (!$d->{ovs_type}) { $d->{type} = 'eth'; } elsif ($d->{ovs_type} eq 'OVSPort') { @@ -1354,11 +1359,12 @@ sub __interface_to_string { sub write_etc_network_interfaces { my ($filename, $fh, $config) = @_; my $ifupdown2 = -e '/usr/share/ifupdown2'; - my $raw = __write_etc_network_interfaces($config, $ifupdown2); + my $phys_net_dev = PVE::ProcFSTools::get_physical_network_interfaces(); + my $raw = __write_etc_network_interfaces($config, $phys_net_dev, $ifupdown2); PVE::Tools::safe_print($filename, $fh, encode('UTF-8', $raw)); } sub __write_etc_network_interfaces { - my ($config, $ifupdown2) = @_; + my ($config, $phys_net_dev, $ifupdown2) = @_; my $ifaces = $config->{ifaces}; my @options = @{$config->{options}}; @@ -1390,7 +1396,7 @@ sub __write_etc_network_interfaces { $d->{type} eq 'OVSBond') { my $brname = $used_ports->{$iface}; if (!$brname || !$ifaces->{$brname}) { - if ($iface =~ /^$PVE::Network::PHYSICAL_NIC_RE/) { + if ($iface =~ /^$PVE::Network::PHYSICAL_NIC_RE/ || $phys_net_dev->{$iface}) { $ifaces->{$iface} = { type => 'eth', exists => 1, method => 'manual', diff --git a/src/PVE/ProcFSTools.pm b/src/PVE/ProcFSTools.pm index 94a2d54..eda9a96 100644 --- a/src/PVE/ProcFSTools.pm +++ b/src/PVE/ProcFSTools.pm @@ -434,4 +434,16 @@ sub get_active_network_interfaces { return $ifaces; } +sub get_physical_network_interfaces { + + my $ifaces = {}; + my @devices = glob('/sys/devices/pci*/*/*/net/*'); + + foreach my $device (@devices) { + if ($device =~ /\/sys\/devices\/(\S+)\/(\S+)\/(\S+)\/net\/(\S+)/) { + $ifaces->{$4} = 1; + } + } + return $ifaces; +} 1; -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel