X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=blobdiff_plain;f=src%2FPVE%2FINotify.pm;h=c34659fc843a1263565bb7dd587885ff57d7bc71;hp=136dd90f36d22abf37bd596fd385c592346b9b6c;hb=899f8c4aa54c59f01c7fa3c516a465b438edc172;hpb=21d32c95cdb63fa96091f2efe735a9c8a1a3e44e diff --git a/src/PVE/INotify.pm b/src/PVE/INotify.pm index 136dd90..c34659f 100644 --- a/src/PVE/INotify.pm +++ b/src/PVE/INotify.pm @@ -540,7 +540,7 @@ sub read_etc_resolv_conf { chomp $line; if ($line =~ m/^(search|domain)\s+(\S+)\s*/) { $res->{search} = $2; - } elsif ($line =~ m/^nameserver\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s*/) { + } elsif ($line =~ m/^\s*nameserver\s+($PVE::Tools::IPRE)\s*/) { $nscount++; if ($nscount <= 3) { $res->{"dns$nscount"} = $1; @@ -648,9 +648,9 @@ sub write_active_workers { my $saved = $task->{saved} ? 1 : 0; if ($task->{endtime}) { if ($task->{status}) { - $raw .= sprintf("$upid $saved %08X $task->{status}\n", $task->{endtime}); + $raw .= sprintf("%s %s %08X %s\n", $upid, $saved, $task->{endtime}, $task->{status}); } else { - $raw .= sprintf("$upid $saved %08X\n", $task->{endtime}); + $raw .= sprintf("%s %s %08X\n", $upid, $saved, $task->{endtime}); } } else { $raw .= "$upid $saved\n"; @@ -785,12 +785,12 @@ my $extract_ovs_option = sub { sub read_etc_network_interfaces { my ($filename, $fh) = @_; my $proc_net_dev = IO::File->new('/proc/net/dev', 'r'); - my $proc_net_if_inet6 = IO::File->new('/proc/net/if_inet6', 'r'); - return __read_etc_network_interfaces($fh, $proc_net_dev, $proc_net_if_inet6); + my $active = PVE::Network::get_active_interfaces(); + return __read_etc_network_interfaces($fh, $proc_net_dev, $active); } sub __read_etc_network_interfaces { - my ($fh, $proc_net_dev, $proc_net_if_inet6) = @_; + my ($fh, $proc_net_dev, $active_ifaces) = @_; my $config = {}; my $ifaces = $config->{ifaces} = {}; @@ -800,7 +800,7 @@ sub __read_etc_network_interfaces { if ($proc_net_dev) { while (defined ($line = <$proc_net_dev>)) { - if ($line =~ m/^\s*(eth\d+):.*/) { + if ($line =~ m/^\s*(eth\d+|en[^:.]+):.*/) { $ifaces->{$1}->{exists} = 1; } } @@ -874,6 +874,8 @@ sub __read_etc_network_interfaces { } } elsif ($id eq 'bridge_fd') { $d->{$id} = $value; + } elsif ($id eq 'bridge_vlan_aware') { + $d->{$id} = 1; } elsif ($id eq 'bond_miimon') { $d->{$id} = $value; } elsif ($id eq 'bond_xmit_hash_policy') { @@ -903,7 +905,11 @@ sub __read_etc_network_interfaces { } } - + foreach my $ifname (@$active_ifaces) { + if (my $iface = $ifaces->{$ifname}) { + $iface->{active} = 1; + } + } if (!$ifaces->{lo}) { $ifaces->{lo}->{priority} = 1; @@ -959,7 +965,15 @@ sub __read_etc_network_interfaces { $ifaces->{$1}->{exists} = 0; $d->{exists} = 0; } - } elsif ($iface =~ m/^eth\d+$/) { + } elsif ($iface =~ m/^(\S+)\.\d+$/) { + $d->{type} = 'vlan'; + if (defined ($ifaces->{$1})) { + $d->{exists} = $ifaces->{$1}->{exists}; + } else { + $ifaces->{$1}->{exists} = 0; + $d->{exists} = 0; + } + } elsif ($iface =~ m/^(?:eth\d+|en[^:.]+)$/) { if (!$d->{ovs_type}) { $d->{type} = 'eth'; } elsif ($d->{ovs_type} eq 'OVSPort') { @@ -987,15 +1001,6 @@ sub __read_etc_network_interfaces { $d->{families} ||= ['inet']; } - if ($proc_net_if_inet6) { - while (defined ($line = <$proc_net_if_inet6>)) { - if ($line =~ m/^[a-f0-9]{32}\s+[a-f0-9]{2}\s+[a-f0-9]{2}\s+[a-f0-9]{2}\s+[a-f0-9]{2}\s+(\S+)$/) { - $ifaces->{$1}->{active} = 1 if defined($ifaces->{$1}); - } - } - close ($proc_net_if_inet6); - } - # OVS bridges create "allow-$BRIDGE $IFACE" lines which we need to remove # from the {options} hash for them to be removed correctly. @$options = grep {defined($_)} map { @@ -1059,6 +1064,11 @@ sub __interface_to_string { $v = defined($d->{bridge_fd}) ? $d->{bridge_fd} : 0; $raw .= "\tbridge_fd $v\n"; $done->{bridge_fd} = 1; + + if( defined($d->{bridge_vlan_aware})) { + $raw .= "\tbridge_vlan_aware yes\n"; + } + $done->{bridge_vlan_aware} = 1; } elsif ($d->{type} eq 'bond') { @@ -1190,7 +1200,7 @@ sub __write_etc_network_interfaces { $d->{type} eq 'OVSBond') { my $brname = $used_ports->{$iface}; if (!$brname || !$ifaces->{$brname}) { - if ($iface =~ /^eth/) { + if ($iface =~ /^(?:eth|en)/) { $ifaces->{$iface} = { type => 'eth', exists => 1, method => 'manual', @@ -1230,19 +1240,6 @@ sub __write_etc_network_interfaces { } } - # Remove autostart from linux bridge ports - foreach my $iface (keys %$ifaces) { - my $d = $ifaces->{$iface}; - if ($d->{type} eq 'bridge' && $d->{bridge_ports}) { - foreach my $p (split (/\s+/, $d->{bridge_ports})) { - my $n = $ifaces->{$p}; - die "bridge '$iface' - unable to find port '$p'\n" - if !$n; - $n->{autostart} = 0; - } - } - } - # check OVS bond ports foreach my $iface (keys %$ifaces) { my $d = $ifaces->{$iface}; @@ -1274,7 +1271,6 @@ NETWORKDOC my $printed = {}; my $if_type_hash = { - unknown => 0, loopback => 100000, eth => 200000, bond => 300000, @@ -1284,34 +1280,38 @@ NETWORKDOC my $lookup_type_prio = sub { my $iface = shift; - my $alias = 0; - if ($iface =~ m/^(\S+):\d+$/) { + my $child = 0; + if ($iface =~ m/^(\S+)(\.|:)\d+$/) { $iface = $1; - $alias = 1; + $child = 1; } my $pri; if ($iface eq 'lo') { $pri = $if_type_hash->{loopback}; - } elsif ($iface =~ m/^eth\d+$/) { - $pri = $if_type_hash->{eth} + $alias; + } elsif ($iface =~ m/^(?:eth\d+|en[^:.]+)$/) { + $pri = $if_type_hash->{eth} + $child; } elsif ($iface =~ m/^bond\d+$/) { - $pri = $if_type_hash->{bond} + $alias; + $pri = $if_type_hash->{bond} + $child; } elsif ($iface =~ m/^vmbr\d+$/) { - $pri = $if_type_hash->{bridge} + $alias; + $pri = $if_type_hash->{bridge} + $child; } - return $pri || ($if_type_hash->{unknown} + $alias); + return $pri; }; foreach my $iface (sort { my $ref1 = $ifaces->{$a}; my $ref2 = $ifaces->{$b}; - my $p1 = &$lookup_type_prio($a); - my $p2 = &$lookup_type_prio($b); + my $tp1 = &$lookup_type_prio($a); + my $tp2 = &$lookup_type_prio($b); + + # Only recognized types are in relation to each other. If one type + # is unknown then only consider the interfaces' priority attributes. + $tp1 = $tp2 = 0 if !defined($tp1) || !defined($tp2); - $p1 += $ref1->{priority} // 50000; - $p2 += $ref2->{priority} // 50000; + my $p1 = $tp1 + ($ref1->{priority} // 50000); + my $p2 = $tp2 + ($ref2->{priority} // 50000); return $p1 <=> $p2 if $p1 != $p2;