]> git.proxmox.com Git - pve-installer.git/blobdiff - proxinstall
minor coding style cleanups
[pve-installer.git] / proxinstall
index 74b76f10814e8e63005fadf90115bf456f369635..de1980909d0757af25ef238e72727bdfc6f60eb3 100755 (executable)
@@ -13,11 +13,12 @@ use IO::File;
 use IO::Select;
 use Cwd 'abs_path';
 use Gtk3 '-init';
-use Gtk3::WebKit;
+use Gtk3::WebKit2;
 use Encode;
 use String::ShellQuote;
 use Data::Dumper;
 use File::Basename;
+use File::Path;
 use Time::HiRes;
 
 use ProxmoxInstallerSetup;
@@ -96,9 +97,7 @@ my $proxmox_libdir = $opt_testmode ?
 my $proxmox_cddir = $opt_testmode ? "../pve-cd-builder/tmp/data-gz/" : "/cdrom";
 my $proxmox_pkgdir = "${proxmox_cddir}/proxmox/packages/";
 
-my $grub_plattform = "pc"; # pc, efi-amd64 or efi-ia32
-
-$grub_plattform = "efi-amd64" if -d "/sys/firmware/efi";
+my $boot_type = -d '/sys/firmware/efi' ? 'efi' : 'bios';
 
 my $IPV4OCTET = "(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])";
 my $IPV4RE = "(?:(?:$IPV4OCTET\\.){3}$IPV4OCTET)";
@@ -691,6 +690,9 @@ sub get_partition_dev {
 
     if ($dev =~ m|^/dev/sd([a-h]?[a-z]\|i[a-v])$|) {
        return "${dev}$partnum";
+    } elsif ($dev =~ m|^/dev/xvd[a-z]$|) {
+       # Citrix Hypervisor blockdev
+       return "${dev}$partnum";
     } elsif ($dev =~ m|^/dev/[hxev]d[a-z]$|) {
        return "${dev}$partnum";
     } elsif ($dev =~ m|^/dev/[^/]+/c\d+d\d+$|) {
@@ -1075,6 +1077,30 @@ sub compute_swapsize {
     return $swapsize;
 }
 
+sub prepare_systemd_boot_esp {
+    my ($espdev, $targetdir) = @_;
+
+    my $espuuid = find_dev_by_uuid($espdev);
+    my $espmp = "var/tmp/$espuuid";
+    mkdir "$targetdir/$espmp";
+
+    syscmd("mount -n $espdev -t vfat $targetdir/$espmp") == 0 ||
+       die "unable to mount ESP $espdev\n";
+
+    File::Path::make_path("$targetdir/$espmp/EFI/proxmox") ||
+       die "unable to create directory $targetdir/$espmp/EFI/proxmox\n";
+
+    syscmd("chroot $targetdir bootctl --no-variables --path /$espmp install") == 0 ||
+       die "unable to install systemd-boot loader\n";
+    write_config("timeout 3\ndefault proxmox-*\n",
+       "$targetdir/$espmp/loader/loader.conf");
+    syscmd("chroot $targetdir /etc/kernel/postinst.d/zz-pve-efiboot") == 0 ||
+       die "unable to generate systemd-boot config\n";
+
+    syscmd("umount $targetdir/$espmp") == 0 ||
+       die "unable to umount ESP $targetdir/$espmp\n";
+
+}
 
 sub extract_data {
     my ($basefile, $targetdir) = @_;
@@ -1175,17 +1201,24 @@ sub extract_data {
 
            my ($devlist, $bootdevlist, $vdev) = get_zfs_raid_setup();
 
-           my $disksize;
            foreach my $hd (@$devlist) {
                &$clean_disk(@$hd[1]);
            }
+
+           my $disksize;
            foreach my $hd (@$bootdevlist) {
                my $devname = @$hd[1];
 
-               my ($size, $osdev) =
+               my ($size, $osdev, $efidev) =
                    partition_bootable_disk($devname, $config_options->{hdsize}, 'BF01');
+
                zfs_mirror_size_check($disksize, $size) if $disksize;
-               push @$bootdevinfo, { devname => $devname, osdev => $osdev};
+
+               push @$bootdevinfo, {
+                   esp => $efidev,
+                   devname => $devname,
+                   osdev => $osdev
+               };
                $disksize = $size;
            }
 
@@ -1286,6 +1319,11 @@ sub extract_data {
            }
        }
 
+       mkdir "$targetdir/mnt";
+       mkdir "$targetdir/mnt/hostrun";
+       syscmd("mount --bind /run $targetdir/mnt/hostrun") == 0 ||
+           die "unable to bindmount run on $targetdir/mnt/hostrun\n";
+
        update_progress(1, 0.05, $maxper, "extracting base system");
 
        my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = stat ($basefile);
@@ -1315,6 +1353,8 @@ sub extract_data {
            die "unable to mount proc on $targetdir/proc\n";
        syscmd("mount -n -t sysfs sysfs $targetdir/sys") == 0 ||
            die "unable to mount sysfs on $targetdir/sys\n";
+       syscmd("chroot $targetdir mount --bind /mnt/hostrun /run") == 0 ||
+           die "unable to re-bindmount hostrun on /run in chroot\n";
 
        update_progress(1, $maxper, 0.5, "configuring base system");
 
@@ -1407,9 +1447,10 @@ sub extract_data {
        # Note: this is required by current grub, but really dangerous, because
        # vfat does not have journaling, so it triggers manual fsck after each crash
        # so we only mount /boot/efi if really required (efi systems).
-       if ($grub_plattform =~ m/^efi-/) {
+       if ($boot_type eq 'efi' && !$use_zfs) {
            if (scalar(@$bootdevinfo)) {
                my $di = @$bootdevinfo[0]; # simply use first disk
+
                if ($di->{esp}) {
                    my $efi_boot_uuid = $di->{esp};
                    if (my $uuid = find_dev_by_uuid ($di->{esp})) {
@@ -1473,10 +1514,6 @@ _EOD
            chomp;
            my $path = $_;
            my ($deb) = $path =~ m/${proxmox_pkgdir}\/(.*\.deb)/;
-#          if ($deb =~ m/^grub-efi-/ && $deb !~ m/^grub-${grub_plattform}/) {
-#              $count++;
-#              next;
-#          }
            update_progress($count/$pkg_count, 0.5, 0.75, "extracting $deb");
            print "extracting: $deb\n";
            syscmd("cp $path $targetdir/tmp/$deb") == 0 ||
@@ -1554,6 +1591,10 @@ _EOD
            syscmd("sed -i -e 's/^GRUB_CMDLINE_LINUX=.*/GRUB_CMDLINE_LINUX=\"root=ZFS=$zfspoolname\\/ROOT\\/$zfsrootvolname boot=zfs\"/' $targetdir/etc/default/grub") == 0 ||
                die "unable to update /etc/default/grub\n";
 
+           if ($boot_type eq 'efi') {
+               write_config("root=ZFS=$zfspoolname/ROOT/$zfsrootvolname boot=zfs", "$targetdir/etc/kernel/cmdline");
+           }
+
        }
 
        diversion_remove($targetdir, "/usr/sbin/update-grub");
@@ -1582,7 +1623,9 @@ _EOD
                syscmd("chroot $targetdir /usr/sbin/grub-install --target i386-pc --no-floppy --bootloader-id='proxmox' $dev") == 0 ||
                        die "unable to install the i386-pc boot loader on '$dev'\n";
 
-               if ($di->{esp}) {
+               if ($di->{esp} && $use_zfs) {
+                       prepare_systemd_boot_esp($di->{esp}, $targetdir);
+               } elsif ($di->{esp}) {
                    syscmd("mount -n $di->{esp} -t vfat $targetdir/boot/efi") == 0 ||
                        die "unable to mount $di->{esp}\n";
                    my $rc = syscmd("chroot $targetdir /usr/sbin/grub-install --target x86_64-efi --no-floppy --bootloader-id='proxmox' $dev");
@@ -1611,9 +1654,6 @@ _EOD
 
        # cleanup
 
-       # hack: remove dead.letter from sshd installation
-       syscmd("rm -rf $targetdir/dead.letter");
-
        unlink "$targetdir/usr/sbin/policy-rc.d";
 
        diversion_remove($targetdir, "/sbin/start-stop-daemon");
@@ -1675,6 +1715,8 @@ _EOD
        syscmd("chroot $targetdir /usr/bin/dpkg-query -W --showformat='\${package}\n'> final.pkglist");
     }
 
+    syscmd("umount $targetdir/run");
+    syscmd("umount $targetdir/mnt/hostrun");
     syscmd("umount $targetdir/tmp");
     syscmd("umount $targetdir/proc");
     syscmd("umount $targetdir/sys");
@@ -1739,13 +1781,17 @@ sub display_html {
     my $data = file_get_contents($path);
 
     if ($filename eq 'license.htm') {
-       my $license = decode('utf8', file_get_contents("${proxmox_cddir}/EULA"));
+       my $license = eval { decode('utf8', file_get_contents("${proxmox_cddir}/EULA")) };
+       if (my $err = $@) {
+           die $err if !$opt_testmode;
+           $license = "TESTMODE: Ignore non existent EULA...\n";
+       }
        my $title = "END USER LICENSE AGREEMENT (EULA)";
        $data =~ s/__LICENSE__/$license/;
        $data =~ s/__LICENSE_TITLE__/$title/;
     }
 
-    $htmlview->load_html_string($data, $url);
+    $htmlview->load_html($data, $url);
 
     $last_display_change = time();
 }
@@ -1819,7 +1865,7 @@ sub create_main_window {
     my $vbox2 = Gtk3::VBox->new(0, 0);
     $hbox->add($vbox2);
 
-    $htmlview = Gtk3::WebKit::WebView->new();
+    $htmlview = Gtk3::WebKit2::WebView->new();
     my $scrolls = Gtk3::ScrolledWindow->new();
     $scrolls->add($htmlview);
 
@@ -2023,7 +2069,11 @@ sub create_ipconf_view {
 
     my $device_change_handler = sub {
        my $current = shift;
-       $ipconf->{selected} = $device_active_map->{$current->get_active()};
+
+       my $new = $device_active_map->{$current->get_active()};
+       return if defined($ipconf->{selected}) && $new eq $ipconf->{selected};
+
+       $ipconf->{selected} = $new;
        my $iface = $ipconf->{ifaces}->{$ipconf->{selected}};
        $config->{mngmt_nic} = $iface->{name};
        $ipconf_entry_addr->set_text($iface->{inet}->{addr} || $iface->{inet6}->{addr})
@@ -2776,6 +2826,12 @@ sub create_hdoption_view {
     $grid->attach($sep, 0, $row, 2, 1);
     $row++;
 
+    my $hw_raid_note = Gtk3::Label->new("Note: ZFS is not compatible with disks backed by a hardware RAID controller. For details see the reference documentation.");
+    $hw_raid_note->set_line_wrap(1);
+    $hw_raid_note->set_max_width_chars(30);
+    $hw_raid_note->set_visible(0);
+    $grid->attach($hw_raid_note, 0, $row++, 2, 1);
+
     my $hdsize_labeled_widgets = [];
 
     # size compute
@@ -2843,6 +2899,7 @@ sub create_hdoption_view {
        $target_hd_combo->set_visible(!$raid);
        $options_stack->get_child_by_name("hdsize")->set_visible(!$raid);
        $options_stack->get_child_by_name("raiddisk")->set_visible($raid);
+       $hw_raid_note->set_visible($raid);
        $options_stack_switcher->set_visible($enable_zfs_opts);
        $options_stack->get_child_by_name("raidzfsadvanced")->set_visible($enable_zfs_opts);
        if ($raid) {
@@ -2864,6 +2921,10 @@ sub create_hdoption_view {
        &$switch_view();
     });
 
+    my $sep2 = Gtk3::HSeparator->new();
+    $sep2->set_visible(1);
+    $contarea->pack_end($sep2, 1, 1, 10);
+
     $dialog->show();
 
     $dialog->run();
@@ -3066,7 +3127,7 @@ sub create_hdsel_view {
     $target_hd_combo->signal_connect(changed => sub {
        $a = shift->get_active;
        my ($disk, $devname) = @{@$hds[$a]};
-       $last_hd_selected = 0;
+       $last_hd_selected = $a;
        $target_hd = $devname;
     });