X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=blobdiff_plain;f=src%2FPVE%2FINotify.pm;h=8cc00f80df28b0e4e94b846a6d33eb4f3ec3d890;hp=564814e819b038d965ac9c4dfa0b91f527f5d16f;hb=c8e5d28e29a932a3729ec3396a0081080041c866;hpb=562fad0baba949c98e49677758490b0784d65f1b diff --git a/src/PVE/INotify.pm b/src/PVE/INotify.pm index 564814e..8cc00f8 100644 --- a/src/PVE/INotify.pm +++ b/src/PVE/INotify.pm @@ -340,7 +340,7 @@ sub register_file { sub register_regex { my ($dir, $regex, $parser, $writer, $update, %options) = @_; - die "can't register regex after initify_init" if $inotify; + die "can't register regex after inotify_init" if $inotify; my $uid = "$dir/$regex"; die "regular expression '$uid' already added :ERROR" if defined ($ccacheregex->{$uid}); @@ -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"; @@ -665,7 +665,7 @@ register_file('active', "/var/log/pve/tasks/active", \&write_active_workers); -my $bond_modes = { 'balance-rr' => 0, +our $bond_modes = { 'balance-rr' => 0, 'active-backup' => 1, 'balance-xor' => 2, 'broadcast' => 3, @@ -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', @@ -1216,6 +1226,7 @@ sub __write_etc_network_interfaces { my $n = $ifaces->{$p}; die "OVS bridge '$iface' - unable to find port '$p'\n" if !$n; + $n->{autostart} = 0; if ($n->{type} eq 'eth') { $n->{type} = 'OVSPort'; $n->{ovs_bridge} = $iface; @@ -1260,7 +1271,6 @@ NETWORKDOC my $printed = {}; my $if_type_hash = { - unknown => 0, loopback => 100000, eth => 200000, bond => 300000, @@ -1270,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;