]> git.proxmox.com Git - pve-common.git/blobdiff - src/PVE/INotify.pm
inotify: fix compatibillity with address + netmask separate passed
[pve-common.git] / src / PVE / INotify.pm
index d3998cde8b2d38835d2196111681d7913544ae06..d170cc14163c737ee0c7d90bb64e662272dbbbb8 100644 (file)
@@ -1032,6 +1032,7 @@ sub __read_etc_network_interfaces {
 
     foreach my $iface (keys %$ifaces) {
        my $d = $ifaces->{$iface};
+       $d->{type} = 'unknown';
        if ($iface =~ m/^bond\d+$/) {
            if (!$d->{ovs_type}) {
                $d->{type} = 'bond';
@@ -1051,8 +1052,6 @@ sub __read_etc_network_interfaces {
                }
                my $tag = &$extract_ovs_option($d, 'tag');
                $d->{ovs_tag} = $tag if defined($tag);
-           } else {
-               $d->{type} = 'unknown';
            }
        } elsif ($iface =~ m/^vmbr\d+$/) {
            if (!$d->{ovs_type}) {
@@ -1066,8 +1065,6 @@ sub __read_etc_network_interfaces {
                }
            } elsif ($d->{ovs_type} eq 'OVSBridge') {
                $d->{type} = $d->{ovs_type};
-           } else {
-               $d->{type} = 'unknown';
            }
        } elsif ($iface =~ m/^(\S+):\d+$/) {
            $d->{type} = 'alias';
@@ -1094,20 +1091,18 @@ sub __read_etc_network_interfaces {
                $d->{type} = $d->{ovs_type};
                my $tag = &$extract_ovs_option($d, 'tag');
                $d->{ovs_tag} = $tag if defined($tag);
-           } else {
-               $d->{type} = 'unknown';
            }
        } elsif ($iface =~ m/^lo$/) {
            $d->{type} = 'loopback';
        } else {
            if ($d->{'vxlan-id'}) {
                $d->{type} = 'vxlan';
-           } elsif (!$d->{ovs_type}) {
-               $d->{type} = 'unknown';
-           } elsif ($d->{ovs_type} eq 'OVSIntPort') {
-               $d->{type} = $d->{ovs_type};
-               my $tag = &$extract_ovs_option($d, 'tag');
-               $d->{ovs_tag} = $tag if defined($tag);
+           } elsif (defined($d->{ovs_type})) {
+               if ($d->{ovs_type} eq 'OVSIntPort') {
+                   $d->{type} = $d->{ovs_type};
+                   my $tag = &$extract_ovs_option($d, 'tag');
+                   $d->{ovs_tag} = $tag if defined($tag);
+               }
            }
        }
 
@@ -1176,7 +1171,20 @@ sub __interface_to_string {
     my $raw = '';
 
     $raw .= "iface $iface $family " . $d->{"method$suffix"} . "\n";
-    $raw .= "\taddress " . $d->{"address$suffix"} . "\n" if $d->{"address$suffix"};
+
+    if (my $addr = $d->{"address$suffix"}) {
+
+       if ($addr !~ /\/\d+$/ && $d->{"netmask$suffix"}) {
+           if ($d->{"netmask$suffix"} =~ m/^\d+$/) {
+               $addr .= "/" . $d->{"netmask$suffix"};
+           } elsif (my $mask = PVE::JSONSchema::get_netmask_bits($d->{"netmask$suffix"})) {
+               $addr .= "/" . $mask;
+           }
+       }
+
+       $raw .= "\taddress " . $addr . "\n";
+    }
+
     $raw .= "\tgateway " . $d->{"gateway$suffix"} . "\n" if $d->{"gateway$suffix"};
 
     my $done = { type => 1, priority => 1, method => 1, active => 1, exists => 1,
@@ -1311,7 +1319,12 @@ sub __interface_to_string {
        $done->{ovs_type} = 1;
 
        if (my $bridge = $d->{ovs_bridge}) {
-           $raw = "allow-$bridge $iface\n$raw";
+           if ($ifupdown2) {
+               $raw = "auto $iface\n$raw";
+           } else {
+               $raw = "allow-$bridge $iface\n$raw";
+           }
+
            $raw .= "\tovs_bridge $bridge\n";
            $done->{ovs_bridge} = 1;
        }
@@ -1347,7 +1360,7 @@ sub __interface_to_string {
 
 sub write_etc_network_interfaces {
     my ($filename, $fh, $config) = @_;
-    my $ifupdown2 = -e '/usr/share/ifupdown2';
+    my $ifupdown2 = -e '/usr/share/ifupdown2/ifupdown2';
     my $raw = __write_etc_network_interfaces($config, $ifupdown2);
     PVE::Tools::safe_print($filename, $fh, encode('UTF-8', $raw));
 }
@@ -1385,10 +1398,12 @@ sub __write_etc_network_interfaces {
            my $brname = $used_ports->{$iface};
            if (!$brname || !$ifaces->{$brname}) {
                if ($iface =~ /^$PVE::Network::PHYSICAL_NIC_RE/) {
-                   $ifaces->{$iface} = { type => 'eth',
-                                         exists => 1,
-                                         method => 'manual',
-                                         families => ['inet'] };
+                   $ifaces->{$iface} = {
+                       type => 'eth',
+                       exists => 1,
+                       method => 'manual',
+                       families => ['inet'],
+                   };
                } else {
                    delete $ifaces->{$iface};
                }
@@ -1603,12 +1618,13 @@ NETWORKDOC
        loopback => 100000,
        eth => 200000,
        OVSPort => 200000,
-       OVSIntPort => 200000,
-       bond => 300000,
-       bridge => 400000,
-       OVSBridge => 400000,
-       vlan => 500000,
-       vxlan => 500000,
+       OVSIntPort => 300000,
+       OVSBond => 400000,
+       bond => 400000,
+       bridge => 500000,
+       OVSBridge => 500000,
+       vlan => 600000,
+       vxlan => 600000,
    };
 
     my $lookup_type_prio = sub {
@@ -1653,7 +1669,7 @@ NETWORKDOC
 
        $printed->{$iface} = 1;
        if ($d->{autostart}) {
-           if ($d->{type} eq 'OVSBridge') {
+           if ($d->{type} eq 'OVSBridge' && !$ifupdown2) {
                # cannot use 'auto' for OVS, would add race with systemd ifup@.service
                $raw .= "allow-ovs $iface\n";
            } else {