]> git.proxmox.com Git - pve-common.git/blobdiff - src/PVE/INotify.pm
inotify: indentation fix
[pve-common.git] / src / PVE / INotify.pm
index e3e43c1ade054228631b19863a140db841e0a75c..86d5459852234ebe3a61728cdbb19f8d8db769ee 100644 (file)
@@ -1,7 +1,6 @@
 package PVE::INotify;
 
 # todo: maybe we do not need update_file() ?
-
 use strict;
 use warnings;
 
@@ -872,6 +871,7 @@ sub __read_etc_network_interfaces {
     my $options = $config->{options} = [];
 
     my $options_alternatives = {
+       'ovs_mtu'     => 'mtu',
        'bond-slaves' => 'slaves',
        'bond_slaves' => 'slaves',
        'bond-xmit-hash-policy' => 'bond_xmit_hash_policy',
@@ -959,6 +959,8 @@ sub __read_etc_network_interfaces {
                        'bond-primary' => 1,
                        'uplink-id' => 1,
                        'vlan-protocol' => 1,
+                       'vlan-raw-device' => 1,
+                       'vlan-id' => 1,
                        'vxlan-id' => 1,
                        'vxlan-svcnodeip' => 1,
                        'vxlan-physdev' => 1,
@@ -1030,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';
@@ -1049,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}) {
@@ -1064,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';
@@ -1075,12 +1074,14 @@ sub __read_etc_network_interfaces {
                $ifaces->{$1}->{exists} = 0;
                $d->{exists} = 0;
            }
-       } elsif ($iface =~ m/^(\S+)\.\d+$/) {
+       } elsif ($iface =~ m/^(\S+)\.\d+$/ || $d->{'vlan-raw-device'}) {
            $d->{type} = 'vlan';
-           if (defined ($ifaces->{$1})) {
-               $d->{exists} = $ifaces->{$1}->{exists};
+
+           my $raw_iface = $d->{'vlan-raw-device'} ? $d->{'vlan-raw-device'} : $1;
+           if (defined ($ifaces->{$raw_iface})) {
+               $d->{exists} = $ifaces->{$raw_iface}->{exists};
            } else {
-               $ifaces->{$1}->{exists} = 0;
+               $ifaces->{$raw_iface}->{exists} = 0;
                $d->{exists} = 0;
            }
        } elsif ($iface =~ m/^$PVE::Network::PHYSICAL_NIC_RE$/) {
@@ -1090,48 +1091,39 @@ 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);
+               }
            }
        }
 
        # 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};
+           if ($d->{netmask}) {
+               if ($d->{netmask} =~ m/^\d+$/) { # e.g. netmask 20
+                   $d->{address} = $d->{address} . "/" . $d->{netmask};
+               } elsif (my $mask = PVE::JSONSchema::get_netmask_bits($d->{netmask})) {
+                   $d->{address} = $d->{address} . "/" . $mask;
+               }
            }
+          # for api compatibility
+          $d->{cidr} = $d->{address};
        }
 
        # map address6 and netmask6 to cidr6
        if ($d->{address6}) {
+           $d->{address6} .= "/" . $d->{netmask6} if $d->{address6} !~ m!^(.*)/(\d+)$! && $d->{netmask6};
+           # for api compatibility
            $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};
@@ -1179,10 +1171,8 @@ sub __interface_to_string {
     my $raw = '';
 
     $raw .= "iface $iface $family " . $d->{"method$suffix"} . "\n";
-    $raw .= "\taddress  " . $d->{"address$suffix"} . "\n" if $d->{"address$suffix"};
-    $raw .= "\tnetmask  " . $d->{"netmask$suffix"} . "\n" if $d->{"netmask$suffix"};
-    $raw .= "\tgateway  " . $d->{"gateway$suffix"} . "\n" if $d->{"gateway$suffix"};
-    $raw .= "\tbroadcast  " . $d->{"broadcast$suffix"} . "\n" if $d->{"broadcast$suffix"};
+    $raw .= "\taddress " . $d->{"address$suffix"} . "\n" if $d->{"address$suffix"};
+    $raw .= "\tgateway " . $d->{"gateway$suffix"} . "\n" if $d->{"gateway$suffix"};
 
     my $done = { type => 1, priority => 1, method => 1, active => 1, exists => 1,
                 comments => 1, autostart => 1, options => 1,
@@ -1215,6 +1205,9 @@ sub __interface_to_string {
        $done->{bridge_vlan_aware} = 1;
        $done->{bridge_vids} = 1;
 
+       $raw .= "\tmtu $d->{mtu}\n" if $d->{mtu};
+       $done->{mtu} = 1;
+
     } elsif ($d->{type} eq 'bond') {
 
        $d->{slaves} =~ s/[;,\s]+/ /g;
@@ -1241,6 +1234,9 @@ sub __interface_to_string {
        }
        $done->{'bond-primary'} = 1;
 
+       $raw .= "\tmtu $d->{mtu}\n" if $d->{mtu};
+       $done->{mtu} = 1;
+
     } elsif ($d->{type} eq 'vlan') {
        die "$iface: wrong vlan-protocol $d->{'vlan-protocol'}\n"
            if $d->{'vlan-protocol'} && $d->{'vlan-protocol'} ne '802.1ad' && $d->{'vlan-protocol'} ne '802.1q';
@@ -1258,14 +1254,21 @@ sub __interface_to_string {
            }
            $done->{'vxlan-remoteip'} = 1;
        }
+
+       $raw .= "\tmtu $d->{mtu}\n" if $d->{mtu};
+       $done->{mtu} = 1;
+
     } elsif ($d->{type} eq 'OVSBridge') {
 
        $raw .= "\tovs_type $d->{type}\n";
        $done->{ovs_type} = 1;
 
        $raw .= "\tovs_ports $d->{ovs_ports}\n" if $d->{ovs_ports};
-
        $done->{ovs_ports} = 1;
+
+       $raw .= "\tovs_mtu $d->{mtu}\n" if $d->{mtu};
+       $done->{mtu} = 1;
+
     } elsif ($d->{type} eq 'OVSPort' || $d->{type} eq 'OVSIntPort' ||
             $d->{type} eq 'OVSBond') {
 
@@ -1303,10 +1306,18 @@ 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;
        }
+
+       $raw .= "\tovs_mtu $d->{mtu}\n" if $d->{mtu};
+       $done->{mtu} = 1;
     }
 
     if ($first_block) {
@@ -1336,7 +1347,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));
 }
@@ -1374,10 +1385,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};
                }
@@ -1437,7 +1450,7 @@ sub __write_etc_network_interfaces {
            my $bond_primary_is_slave = undef;
            foreach my $p (split (/\s+/, $d->{slaves})) {
                my $n = $ifaces->{$p};
-               
+
                die "bond '$iface' - unable to find slave '$p'\n"
                    if !$n;
                die "bond '$iface' - wrong interface type on slave '$p' " .
@@ -1477,10 +1490,31 @@ sub __write_etc_network_interfaces {
     # check vlan
     foreach my $iface (keys %$ifaces) {
        my $d = $ifaces->{$iface};
-       if ($d->{type} eq 'vlan' && $iface =~ m/^(\S+)\.\d+$/) {
-           my $p = $1;
+       if ($d->{type} eq 'vlan') {
+
+           my $p = undef;
+           my $vlanid = undef;
+
+           if ($iface =~ m/^(\S+)\.(\d+)$/) {
+               $p = $1;
+               $vlanid = $2;
+               delete $d->{'vlan-raw-device'} if $d->{'vlan-raw-device'};
+           } else {
+               die "missing vlan-raw-device option" if !$d->{'vlan-raw-device'};
+               $p = $d->{'vlan-raw-device'};
+
+               if ($iface =~ m/^vlan(\d+)$/) {
+                   $vlanid = $1;
+                   delete $d->{'vlan-id'} if $d->{'vlan-id'};
+               } else {
+                   die "custom vlan interface name need ifupdown2" if !$ifupdown2;
+                   die "missing vlan-id option" if !$d->{'vlan-id'};
+                   $vlanid = $d->{'vlan-id'};
+               }
+           }
            my $n = $ifaces->{$p};
 
+           die "vlan '$iface' - vlan-id $vlanid should be <= 4094\n" if $vlanid > 4094;
            die "vlan '$iface' - unable to find parent '$p'\n"
                if !$n;
 
@@ -1512,19 +1546,26 @@ sub __write_etc_network_interfaces {
     # check bridgeport option
     my $bridgeports = {};
     my $bridges = {};
-    foreach my $iface (keys %$ifaces) {
-       my $d = $ifaces->{$iface};
+    my $ifaces_copy = { %$ifaces };
+    foreach my $iface (keys %$ifaces_copy) {
+       my $d = $ifaces_copy->{$iface};
        if ($d->{type} eq 'bridge') {
            foreach my $p (split (/\s+/, $d->{bridge_ports})) {
-               $p =~ s/\.\d+$//;
-               my $n = $ifaces->{$p};
-               die "bridge '$iface' - unable to find bridge port '$p'\n"
-                   if !$n;
-               die "iface $p - ip address can't be set on interface if bridged in $iface\n" 
-                   if ($n->{method} eq 'static' && $n->{address} ne '0.0.0.0') || 
-                       ($n->{method6} eq 'static' && $n->{address} ne "\:\:");
-
-               &$check_mtu($ifaces, $iface, $p);
+               if($p =~ m/(\S+)\.(\d+)$/) {
+                   my $vlanparent = $1;
+                   if (!defined($ifaces_copy->{$p})) {
+                       $ifaces_copy->{$p}->{type} = 'vlan';
+                       $ifaces_copy->{$p}->{method} = 'manual';
+                       $ifaces_copy->{$p}->{method6} = 'manual';
+                       $ifaces_copy->{$p}->{mtu} = $ifaces_copy->{$vlanparent}->{mtu} if defined($ifaces_copy->{$1}->{mtu});
+                   }
+               }
+               my $n = $ifaces_copy->{$p};
+               die "bridge '$iface' - unable to find bridge port '$p'\n" if !$n;
+               die "iface $p - ip address can't be set on interface if bridged in $iface\n"
+                   if ($n->{method} && $n->{method} eq 'static' && $n->{address} ne '0.0.0.0') ||
+                      ($n->{method6} && $n->{method6} eq 'static' && $n->{address} ne '::');
+               &$check_mtu($ifaces_copy, $p, $iface);
                $bridgeports->{$p} = $iface;
            }
            $bridges->{$iface} = $d;
@@ -1564,11 +1605,13 @@ NETWORKDOC
        loopback => 100000,
        eth => 200000,
        OVSPort => 200000,
-       OVSIntPort => 200000,
-       bond => 300000,
-       bridge => 400000,
-       OVSBridge => 400000,
-       vxlan => 500000,
+       OVSIntPort => 300000,
+       OVSBond => 400000,
+       bond => 400000,
+       bridge => 500000,
+       OVSBridge => 500000,
+       vlan => 600000,
+       vxlan => 600000,
    };
 
     my $lookup_type_prio = sub {
@@ -1613,7 +1656,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 {