[!
use strict;
use PVE::pvecfg;
use PVE::I18N;
use PVE::ConfigServer;
use PVE::HTMLTable;
use PVE::HTMLControls;
use PVE::Config;
use PVE::HTMLForm;
use PVE::HTMLUtils;
use HTML::Entities;
!]
[-
use strict;
sub html_table_line {
my ($v1, $v2, $v3, $v4) = @_;
$v1 = " " if !$v1;
$v2 = " " if !$v2;
$v3 = " " if !$v3;
$v4 = " " if !$v4;
my $html = '
';
$html .= "
$v1
$v2
";
$html .= "
$v3
$v4
\n";
return $html;
}
sub merge_ifdata {
my ($oldif, $newif) = @_;
my $res;
if ($oldif->{type} eq $newif->{type}) {
foreach my $k (keys %$oldif) {
$res->{$k} = $oldif->{$k};
}
foreach my $k (keys %$newif) {
$res->{$k} = $newif->{$k};
}
} else {
foreach my $k (keys %$newif) {
$res->{$k} = $newif->{$k};
}
}
return $res;
}
sub device_is_used {
my ($ifl, $port) = @_;
foreach my $if (keys %$ifl) {
if ($ifl->{$if}->{'bridge_ports'} && $ifl->{$if}->{'bridge_ports'}->{$port}) {
return $if;
}
if ($ifl->{$if}->{'slaves'} && $ifl->{$if}->{'slaves'}->{$port}) {
return $if;
}
}
return undef;
}
my $cinfo = $fdat{__cinfo};
my $out = '';
my $form = PVE::HTMLForm->new (\%fdat);
my $conn = PVE::ConfigClient::connect ();
my $cdata = $conn->get_config_data ('interfaces', 1)->result;
my $ifaces = $cdata->{data};
my $changes = $cdata->{changes};
my $bridge_avail;
for (my $i = 0; $i < 10; $i++) {
if (!defined ($ifaces->{"vmbr$i"})) {
push @$bridge_avail, "vmbr$i";
}
}
my $bond_avail;
for (my $i = 0; $i < 10; $i++) {
if (!defined ($ifaces->{"bond$i"})) {
push @$bond_avail, "bond$i";
}
}
my $bond_modes = PVE::Config::get_bond_modes();
my $bmodes = [ sort { $bond_modes->{$a} <=> $bond_modes->{$b} } keys %$bond_modes ];
if ($udat{action}) {
my $iface = $fdat{aa};
if ($udat{action} eq 'delete') {
eval {
check_write_mode ($udat{AM});
if (my $use = device_is_used ($ifaces, $iface)) {
die "device is in use ($use) - unable to delete '$iface'\n";
}
delete $ifaces->{$iface};
$cdata = $conn->set_config_data ('interfaces', $ifaces, 1)->result;
$ifaces = $cdata->{data};
$changes = $cdata->{changes};
};
if ($@) {
$udat{popup_error} = $@;
}
} elsif ($udat{action} eq 'discard') {
eval {
check_write_mode ($udat{AM});
$cdata = $conn->discard_config_changes ('interfaces', 1)->result;
$ifaces = $cdata->{data};
$changes = $cdata->{changes};
};
if ($@) {
$udat{popup_error} = $@;
}
}
print OUT $out;
return;
}
if ($form->action eq 'save') {
my $iface = $fdat{iface};
eval {
check_write_mode ($udat{AM});
my $newif;
if (!($fdat{address} && $fdat{address} ne '127.0.0.1' &&
$fdat{address} ne '0.0.0.0' && $fdat{netmask})) {
$newif = { type => 'manual' };
} else {
$newif = {
type => 'static',
address => $fdat{address},
netmask => $fdat{netmask},
gateway => $fdat{gateway},
};
}
if (device_is_used ($ifaces, $iface) && ($iface =~ m/^bond[0-9]$/)) {
$newif->{autostart} = 1;
} else {
$newif->{autostart} = $fdat{autostart};
}
$ifaces->{$iface} = merge_ifdata ($ifaces->{$iface}, $newif);
if ($iface =~ m/^vmbr[0-9]$/) {
#$ifaces->{$iface}->{autostart} = 1;
$ifaces->{$iface}->{'bridge_ports'} = {};
$fdat{ports} =~ s/,;/ /g;
foreach my $port (split (/\s+/, $fdat{ports})) {
if (my $use = device_is_used ($ifaces, $port)) {
die "unable to bridge device '$port' - device is already in use ($use)\n";
}
if ($port =~ m/^eth\d+$/ && defined ($ifaces->{$port})) {
$ifaces->{$iface}->{'bridge_ports'}->{$port} = 1;
my $nif = { type => 'manual', autostart => 0 };
$ifaces->{$port} = merge_ifdata ($ifaces->{$port}, $nif);
} elsif ($port =~ m/^(eth\d+)\.\d+$/ && defined ($ifaces->{$1})) {
$ifaces->{$iface}->{'bridge_ports'}->{$port} = 1;
} elsif ($port =~ m/^bond\d+$/ && defined ($ifaces->{$port})) {
$ifaces->{$iface}->{'bridge_ports'}->{$port} = 1;
my $nif = { type => 'manual', autostart => 1 };
$ifaces->{$port} = merge_ifdata ($ifaces->{$port}, $nif);
} else {
die "unable to bridge device '$port'\n";
}
}
} elsif ($iface =~ m/^bond[0-9]$/) {
#$ifaces->{$iface}->{autostart} = 1;
$ifaces->{$iface}->{'bond_mode'} = $fdat{bond_mode};
$ifaces->{$iface}->{'slaves'} = {};
$fdat{slaves} =~ s/,;/ /g;
foreach my $slave (split (/\s+/, $fdat{slaves})) {
if (my $use = device_is_used ($ifaces, $slave)) {
die "unable to add slave device '$slave' - device is already in use ($use)\n";
}
if ($slave =~ m/^eth\d+$/ && defined ($ifaces->{$slave})) {
$ifaces->{$iface}->{'slaves'}->{$slave} = 1;
my $nif = { type => 'manual', autostart => 0 };
$ifaces->{$slave} = merge_ifdata ($ifaces->{$slave}, $nif);
} else {
die "unable to add slave device '$slave'\n";
}
}
}
$cdata = $conn->set_config_data ('interfaces', $ifaces, 1)->result;
$ifaces = $cdata->{data};
$changes = $cdata->{changes};
};
if ($@) {
$udat{popup_error} = $@;
$udat{redirect} = $fdat{__uri};
return;
}
$fdat{edit} = undef;
}
if ($fdat{edit}) {
$out .= $form->create_header($fdat{__uri});
my $html = '