package PVE::INotify;
# todo: maybe we do not need update_file() ?
-
use strict;
use warnings;
# 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};
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,
$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;
}
# 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};
+ 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, $p, $iface);
+ &$check_mtu($ifaces_copy, $p, $iface);
$bridgeports->{$p} = $iface;
}
$bridges->{$iface} = $d;
$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 {