[! 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; -]