[!
use strict;
use PVE::pvecfg;
use PVE::I18N;
use PVE::ConfigServer;
use PVE::HTMLTable;
use PVE::Config;
use PVE::Cluster;
use PVE::HTMLForm;
use PVE::HTMLUtils;
!]
[-
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 create_iflist {
my ($ifaces) = @_;
my $iflist = '';
foreach my $ifname (sort keys %$ifaces) {
$iflist .= ';' if $iflist;
$iflist .= "ifname=$ifname";
$iflist .= ",bridge=$ifaces->{$ifname}->{bridge}"
if $ifaces->{$ifname}->{bridge};
$iflist .= ",mac=$ifaces->{$ifname}->{mac}"
if $ifaces->{$ifname}->{mac};
$iflist .= ",host_ifname=$ifaces->{$ifname}->{host_ifname}"
if $ifaces->{$ifname}->{host_ifname};
$iflist .= ",host_mac=$ifaces->{$ifname}->{host_mac}"
if $ifaces->{$ifname}->{host_mac};
}
return $iflist;
}
my $form = PVE::HTMLForm->new (\%fdat);
my $ipform = PVE::HTMLForm->new (\%fdat, 'ipform');
my $brform = PVE::HTMLForm->new (\%fdat, 'brform');
my $cinfo = $fdat{__cinfo};
my $veid = $fdat{veid};
my $cid = $fdat{cid};
my $vzinfo = PVE::Cluster::load_vmconfig ($cinfo, $cid, $veid, 'openvz');
my $status = $vzinfo->{vzlist}->{"VEID_$veid"}->{status};
my $veconf = $vzinfo->{config};
my $ni = $vzinfo->{ni};
my $dns1 = '0.0.0.0';
my $dns2 = '0.0.0.0';
if ($veconf->{nameserver} && $veconf->{nameserver}->{value}) {
my @ns = split (/\s+/, $veconf->{nameserver}->{value});
$dns1 = $ns[0] if $ns[0];
$dns2 = $ns[1] if $ns[1];
}
my $dnsdomain = '';
if ($veconf->{searchdomain} && $veconf->{searchdomain}->{value}) {
$dnsdomain = $veconf->{searchdomain}->{value};
}
my $hostname = '';
if ($veconf->{hostname} && $veconf->{hostname}->{value}) {
$hostname = $veconf->{hostname}->{value};
}
my $iplist = '';
if (defined ($veconf->{ip_address}) && $veconf->{ip_address}->{value}) {
foreach my $ip (sort split (/\s+/, $veconf->{ip_address}->{value})) {
$iplist .= $iplist ? ", $ip" : $ip;
}
}
my $bridges = PVE::Utils::get_bridges ();
my $ifaces = {};
if (defined ($veconf->{netif}) && $veconf->{netif}->{value}) {
$ifaces = PVE::Config::parse_netif ($veconf->{netif}->{value});
}
if ($brform->action eq 'save') {
my $conn = PVE::ConfigClient::connect ();
eval {
check_write_mode ($udat{AM});
my $iflist;
if ($fdat{eth0bridge} eq 'disabled') {
if (defined ($ifaces->{'eth0'})) {
delete $ifaces->{'eth0'};
$iflist = create_iflist ($ifaces);
}
} elsif ($fdat{eth0bridge}) {
$ifaces->{'eth0'}->{create} = 1;
$ifaces->{'eth0'}->{bridge} = $fdat{eth0bridge};
$iflist = create_iflist ($ifaces);
}
if (defined ($iflist)) {
my $settings = { netif => $iflist };
$conn->vmconfig_set ($udat{auth_username}, $cid, $veid, 'openvz', $settings)->result;
}
};
$udat{popup_error} = $@ if $@;
}
if ($ipform->action eq 'save') {
my $conn = PVE::ConfigClient::connect ();
eval {
check_write_mode ($udat{AM});
my $newlist = '';
foreach my $ip (sort split (/\s*[,;\s]\s*/, $fdat{iplist})) {
next if !$ip;
if ($ip !~ m/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) {
die sprintf (__("Invalid IP address '%s'") . "\n", $ip);
}
$newlist .= $newlist ? ", $ip" : $ip;
}
$iplist = $fdat{iplist} = $newlist;
my $settings = { ipset => $fdat{iplist} };
$conn->vmconfig_set ($udat{auth_username}, $cid, $veid, 'openvz', $settings)->result;
};
$udat{popup_error} = $@ if $@;
}
if ($form->action eq 'save') {
my $conn = PVE::ConfigClient::connect ();
eval {
check_write_mode ($udat{AM});
check_field (__("Hostname"), $fdat{hostname}, 'NOTEMPTY', 'NOWHITESPACES');
check_field (__("DNS Domain"), $fdat{dnsdomain}, 'NOTEMPTY', 'NOWHITESPACES');
my $settings = {};
my $ns;
push @$ns, $fdat{dnsserver1} if $fdat{dnsserver1} && ($fdat{dnsserver1} ne '0.0.0.0');
push @$ns, $fdat{dnsserver2} if $fdat{dnsserver2} && ($fdat{dnsserver2} ne '0.0.0.0');
die __("Please specify at least one DNS server.") . "\n" if !$ns;
$settings->{nameserver} = $ns;
if ($dnsdomain ne $fdat{dnsdomain}) {
$settings->{searchdomain} = $fdat{dnsdomain};
}
if ($hostname ne $fdat{hostname}) {
# always use fqdn for hostname
if (($fdat{hostname} !~ m/\./) && $fdat{dnsdomain}) {
$fdat{hostname} = "$fdat{hostname}.$fdat{dnsdomain}";
}
$settings->{hostname} = $fdat{hostname};
}
if (scalar (keys %$settings) > 0) {
$conn->vmconfig_set ($udat{auth_username}, $cid, $veid, 'openvz', $settings)->result;
}
};
$udat{popup_error} = $@ if $@;
}
my $out = '';
$out .= $form->create_header();
my $html = '';
$dns1 = $fdat{dnsserver1} if defined ($fdat{dnsserver1});
$dns2 = $fdat{dnsserver2} if defined ($fdat{dnsserver2});
$dnsdomain = $fdat{dnsdomain} if defined ($fdat{dnsdomain});
$hostname = $fdat{hostname} if defined ($fdat{hostname});
$html .= html_table_line (__("Hostname") . ':',
$form->create_element ('hostname', 'text', $hostname),
__("First DNS Server") . ':',
$form->create_element ('dnsserver1', 'ip', $fdat{dnsserver1} || $dns1)
);
$html .= html_table_line (__("DNS Domain") . ':',
$form->create_element ('dnsdomain', 'text', $fdat{dnsdomain} || $dnsdomain),
__("Second DNS Server") . ':',
$form->create_element ('dnsserver2', 'ip', $fdat{dnsserver2} || $dns2));
$html .= '
';
$html .= "
";
$html .= $form->create_cmdbutton ('save');
$out .= PVE::HTMLUtils::create_statusframe (undef, "DNS Settings", undef, $html);
$out .= "
";
$out .= $form->create_footer();
if ($iplist || !defined ($ifaces->{'eth0'})) {
$out .= $ipform->create_header();
$html = '';
$html .= html_table_line (__("IP Address") . ':',
$form->create_element ('iplist', 'text', $fdat{iplist} || $iplist));
$html .= '
';
$html .= $ipform->create_cmdbutton ('save');
$out .= PVE::HTMLUtils::create_statusframe (undef, __("Network Addresses (venet)"), undef, $html, undef, 0);
$out .= '
';
$out .= $ipform->create_footer();
}
if (!$iplist || defined ($ifaces->{'eth0'})) {
$out .= $brform->create_header();
my $eth0bridge = defined ($ifaces->{'eth0'}) ? $ifaces->{'eth0'}->{bridge} || 'vmbr0' : 'disabled';
$html = '';
$html .= html_table_line ( 'eth0:',
$brform->create_element ('eth0bridge', 'dropdown',
$fdat{eth0bridge} || $eth0bridge,
[ 'disabled' , @$bridges ]));
$html .= '
';
$html .= $brform->create_cmdbutton ('save');
$out .= PVE::HTMLUtils::create_statusframe (undef, __("Bridged Ethernet Devices"), undef, $html, undef, 0);
$out .= $brform->create_footer();
}
print OUT $out;
-]