[!
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::Utils;
use PVE::HTMLUtils;
use PVE::QemuServer;
!]
[-
use strict;
my $out = '';
sub selectdev {
my ($list, $bootdisk, $boot) = @_;
if ($boot eq 'a') {
return $list->{floppy} ? 'floppy' : 'none';
} elsif ($boot eq 'd') {
return $list->{cdrom} ? 'cdrom' : 'none';
} elsif ($boot eq 'n') {
return $list->{net} ? 'net' : 'none';
} elsif ($boot eq 'c') {
if ($bootdisk && defined ($list->{"hdd-$bootdisk"})) {
return "hdd-$bootdisk";
} else {
foreach my $ds (sort keys %$list) {
next if $ds !~ m/^hdd-/;
return "hdd-$ds";
}
}
}
return 'none';
}
sub append_bootdev {
my ($bootref, $bootdiskref, $dev) = @_;
if ($dev eq 'floppy') {
$$bootref .= 'a';
} elsif ($dev eq 'cdrom') {
$$bootref .= 'd';
} elsif ($dev eq 'net') {
$$bootref .= 'n';
} elsif ($dev =~ m/^hdd-(\S+)$/) {
if (!$$bootdiskref) {
$$bootref .= 'c';
$$bootdiskref = $1;
}
}
}
sub html_table_line {
my ($v1, $v2) = @_;
$v1 = " " if !$v1;
$v2 = " " if !$v2;
my $html = '
';
$html .= "$v1 | $v2 | |
\n";
return $html;
}
my $form = PVE::HTMLForm->new (\%fdat);
my $html;
my $cinfo = $fdat{__cinfo};
my $veid = $fdat{veid};
my $cid = $fdat{cid};
if ($form->action eq 'save') {
eval {
check_write_mode ($udat{AM});
my $conn = PVE::ConfigClient::connect ();
my $boot = '';
my $bootdisk = '';
append_bootdev (\$boot, \$bootdisk, $fdat{bootdev1});
append_bootdev (\$boot, \$bootdisk, $fdat{bootdev2});
append_bootdev (\$boot, \$bootdisk, $fdat{bootdev3});
my $settings = {};
$settings->{boot} = $boot;
$settings->{bootdisk} = $bootdisk;
$settings->{localtime} = $fdat{localtime};
$settings->{acpi} = $fdat{noacpi} ? 0 : 1;
$settings->{kvm} = $fdat{nokvm} ? 0 : 1;
$settings->{freeze} = $fdat{freeze} ? 1 : 0;
$settings->{vga} = $fdat{vga};
$settings->{cpuunits} = $fdat{cpuunits};
$fdat{startdate} = PVE::Utils::trim ($fdat{startdate});
if ($fdat{startdate}) {
if (($fdat{startdate} ne 'now') &&
($fdat{startdate} !~ m/^\d{4}-\d{1,2}-\d{1,2}(T\d{1,2}-\d{1,2}-\d{1,2})?$/)) {
die __("invalid format for start date\n");
}
}
$settings->{startdate} = $fdat{startdate} || '';
check_range (__("CPU Units"), $fdat{cpuunits}, 8, 500000);
$conn->vmconfig_set ($udat{auth_username}, $cid, $veid, 'qemu', $settings)->result;
};
$udat{popup_error} = $@ if $@;
}
my $vminfo = PVE::Cluster::load_vmconfig ($cinfo, $cid, $veid, 'qemu');
my $status = $vminfo->{vzlist}->{"VEID_$veid"}->{status};
my $vmconf = $vminfo->{config};
my $ni = $vminfo->{ni};
my $disklist = [];
my $di = $vmconf->{diskinfo} || {};
foreach my $ds (keys %$di) {
next if $ds =~ m/^unused\d+$/;
next if !defined ($vmconf->{$ds});
my $disk = PVE::QemuServer::parse_drive ($ds, $vmconf->{$ds});
next if !$disk || PVE::QemuServer::drive_is_cdrom ($disk);
my $devinfo = PVE::QemuServer::disk_devive_info ($ds);
my $size = $di->{$ds}->{disksize} || 0;
push @$disklist, ["hdd-$ds", "HDD $devinfo->{desc} (${size}GB)"];
}
my $order = $vmconf->{boot} || 'cad';
my $dl1;
foreach my $dsk (@$disklist) {
my ($ds, $desc) = @$dsk;
$dl1->{$ds} = $desc;
}
$dl1->{cdrom} = 'CD-ROM';
$dl1->{floppy} = 'Floppy';
$dl1->{net} = 'Network';
$fdat{bootdev1} = $fdat{bootdev1} ? $fdat{bootdev1} :
selectdev ($dl1, $vmconf->{bootdisk}, substr ($order, 0, 1, 'c'));
my $dl2;
if ($fdat{bootdev1} !~ m/^hdd-/) {
foreach my $dsk (@$disklist) {
my ($ds, $desc) = @$dsk;
$dl2->{$ds} = $desc;
}
}
$dl2->{cdrom} = 'CD-ROM' if $fdat{bootdev1} ne 'cdrom';
$dl2->{floppy} = 'Floppy' if $fdat{bootdev1} ne 'floppy';
$dl2->{net} = 'Network' if $fdat{bootdev1} ne 'net';
$dl2->{none} = 'None';
$fdat{bootdev2} = $fdat{bootdev2} && defined ($dl2->{$fdat{bootdev2}}) ? $fdat{bootdev2} :
selectdev ($dl2, $vmconf->{bootdisk}, substr ($order, 1, 1, 'a'));
my $dl3;
if (($fdat{bootdev1} !~ m/^hdd-/) && ($fdat{bootdev2} !~ m/^hdd-/)) {
foreach my $dsk (@$disklist) {
my ($ds, $desc) = @$dsk;
$dl3->{$ds} = $desc;
}
}
$dl3->{cdrom} = 'CD-ROM' if $fdat{bootdev1} ne 'cdrom' && $fdat{bootdev2} ne 'cdrom';
$dl3->{floppy} = 'Floppy' if $fdat{bootdev1} ne 'floppy' && $fdat{bootdev2} ne 'floppy';
$dl3->{net} = 'Network' if $fdat{bootdev1} ne 'net' && $fdat{bootdev2} ne 'net';
$dl3->{none} = 'None';
$fdat{bootdev3} = $fdat{bootdev3} && defined ($dl3->{$fdat{bootdev3}}) ? $fdat{bootdev3} :
selectdev ($dl3, $vmconf->{bootdisk}, substr ($order, 2, 1, 'd'));
$html = "";
$html .= html_table_line (__("First boot device") . ':',
$form->create_element ('bootdev1', 'dynamicdropdown', $fdat{bootdev1},
[map { [$_, $dl1->{$_}] } sort keys %$dl1]));
$html .= html_table_line (__("Second boot device") . ':',
$form->create_element ('bootdev2', 'dynamicdropdown', $fdat{bootdev2},
[map { [$_, $dl2->{$_}] } sort keys %$dl2]));
$html .= html_table_line (__("Third boot device") . ':',
$form->create_element ('bootdev3', 'dynamicdropdown', $fdat{bootdev3},
[map { [$_, $dl3->{$_}] } sort keys %$dl3]));
$html .= html_table_line ();
my $cpuunits = defined ($fdat{cpuunits}) ? $fdat{cpuunits} : $vmconf->{cpuunits} || 1000;
$html .= html_table_line (__("CPU Units") . ':',
$form->create_element ('cpuunits', 'number', $cpuunits));
$html .= html_table_line (__("Real Time Clock") . ':',
$form->create_element ('localtime', 'dropdown', $vmconf->{localtime},
[['', 'default'], ['0', 'use UTC'],
['1', 'use local time']]));
$html .= html_table_line (__("Video Graphics Adapter") . ':',
$form->create_element ('vga', 'dropdown', $vmconf->{vga},
[['', 'default'],
['std', 'Standard VGA'],
['cirrus', 'Cirrus Logic GD5446']]));
my $nokvm = defined ($vmconf->{kvm}) && ($vmconf->{kvm} == 0);
$html .= html_table_line ("Disable KVM:", $form->create_element ('nokvm', 'bool', $nokvm));
my $noacpi = defined ($vmconf->{acpi}) && ($vmconf->{acpi} == 0);
$html .= html_table_line ("Disable ACPI:", $form->create_element ('noacpi', 'bool', $noacpi));
$html .= html_table_line (__("Freeze CPU at startup") . ':',
$form->create_element ('freeze', 'bool', $vmconf->{freeze}));
my $startdate = $fdat{startdate} || $vmconf->{startdate};
$html .= html_table_line (__("Start date") . ':',
$form->create_element ('startdate', 'text', $startdate));
$html .= '
';
$html .= $form->create_cmdbutton ('save');
$out .= $form->create_header();
$out .= $html;
#$out .= PVE::HTMLUtils::create_statusframe (undef, __("Options"), undef, $html);
$out .= $form->create_footer();
print OUT $out;
-]