diff options
-rwxr-xr-x | draklive2 | 883 |
1 files changed, 2 insertions, 881 deletions
@@ -1,9 +1,8 @@ #!/usr/bin/perl -# draklive $Id: draklive 150793 2007-04-05 12:08:47Z blino $ - # Copyright (C) 2005 Mandriva # Olivier Blin <oblin@mandriva.com> +# Copyright (C) 2017 Mageia # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -685,32 +684,11 @@ sub create_classical_bootloader { output_p($live->get_system_root . '/boot/grub/menu.lst', build_grub_cfg_raw($live, $live->{media}, -e $initrd && $initrd_prefix, { oem_rescue_idx => $oem_rescue_idx }, $part_idx)); } -sub create_tarball { - my ($live) = @_; - run_("tar", "cjf", get_disk_master_prefix($live) . ".tar.bz2", $live->get_system_root); -} - -sub set_device_label { - my ($device, $type, $label) = @_; - if ($type eq 'vfat') { - MDV::Draklive::Utils::mtools_run_('mlabel', '-i', $device, '::' . $label); - } elsif (member($type, 'ext2', 'ext3')) { - run_('e2label', $device, $label); - } else { - die "unable to set label for unsupported media type $type\n"; - } -} - sub get_cdrom_master_path { my ($live, $opts) = @_; $live->get_builddir . $live->{prefix}{build}{dist} . '/' . $live->get_name . ($opts->{boot} && "-boot-$opts->{boot}") . '.iso'; } -sub get_cdrom_replicator_path { - my ($live) = @_; - get_disk_replicator_prefix($live) . ".iso"; -} - sub create_cdrom_master { my ($live, $opts) = @_; my $label = $live->{media}->get_media_label or die "the source device must be described by a label\n"; @@ -800,142 +778,6 @@ sub build_iso_image { } } -sub get_disk_master_prefix { - my ($live) = @_; - $live->get_builddir . $live->{prefix}{build}{dist} . '/' . $live->get_name; -} - -sub get_disk_master_path { - my ($live) = @_; - get_disk_master_prefix($live) . '.img'; -} - -sub get_partition_loop { - my ($hd, $part) = @_; - require devices; - my $loop = devices::find_free_loop(); - run_('losetup', '-o', $part->{start} * $common::SECTORSIZE, '-s', $part->{size} * $common::SECTORSIZE, $loop, $hd->{file}) - or die "unable to setup loop device"; - return $loop; -} - -sub get_harddisk_geometry { - my ($media) = @_; - $media->{geom} || { - heads => 16, - sectors => 63, # sectors per track - }; -} - -sub get_hd_from_layout { - my ($media, $dest) = @_; - my $geom = get_harddisk_geometry($media); - my $required_sectors = fold_left { $::a + $::b } map { $_->{size} } @{$media->{partitions}}; - $required_sectors += $geom->{sectors}; # keep one more track - $geom->{cylinders} = POSIX::ceil($required_sectors / ($geom->{sectors} * $geom->{heads})); - my $total_sectors = $geom->{cylinders} * $geom->{heads} * $geom->{sectors}; - bless { - totalsectors => $total_sectors, - geom => $geom, - file => $dest, - }, 'partition_table::dos'; -} - -sub get_hd_from_file { - my ($media, $file) = @_; - my $hd = bless { - geom => get_harddisk_geometry($media), - file => $file, - }, 'partition_table::dos'; - partition_table::read($hd); - return $hd; -} - -sub supplement_media_partitions { - my ($media, $hd) = @_; - #- try to find additional partition details (start, device) - #- by matching actual partition table and partitions list - my @all_parts = partition_table::get_normal_parts($hd); - foreach my $idx (0 .. $#all_parts) { - $media->{partitions}[$idx]{$_} = $all_parts[$idx]{$_} foreach qw(start device); - } -} - -sub set_part_real_device { - my ($hd, $part) = @_; - #- FIXME: find a better way to compute mmcblk device path - my $ext = $hd->{file} =~ m!^/dev/mmcblk! ? 'p' : ''; - $part->{real_device} = -f $hd->{file} ? get_partition_loop($hd, $part) : ($hd->{file} . $ext . $part->{device}); -} - -sub allocate_master { - my ($media, $opts) = @_; - - $media->supplement_slash_size($opts->{slash_size}) if $opts->{slash_size}; - my $hd = get_hd_from_layout($media, $opts->{device}); - - mkdir_p(dirname($opts->{device})); - MDV::Draklive::Utils::device_allocate_file($opts->{device}, $hd->{totalsectors} * $common::SECTORSIZE); -} - -sub format_master { - my ($media, $opts) = @_; - - $media->supplement_slash_size($opts->{slash_size}) if $opts->{slash_size}; - - my $hd = get_hd_from_layout($media, $opts->{device}); - partition_table::raw::zero_MBR($hd); - - #- FIXME: maybe use fsedit::allocatePartitions to factorize even more? - foreach my $part (@{$media->{partitions}}) { - my $hole = find { fs::type::isEmpty($_) && $_->{size} >= $part->{size} } partition_table::get_normal_parts_and_holes($hd) - or die "not enough room for $part->{mntpoint}"; - $part->{start} = $hole->{start}; - fs::type::set_fs_type($part, $part->{fs_type}); - partition_table::add($hd, $part, 'Primary'); - } - - print "writing partition table\n"; - partition_table::write($hd); - #- FIXME: move out from diskdrake::interactive::write_partitions to partition_table::write ? - run_program::run('udevadm', 'settle'); - - my $inode_size = $media->get_media_setting('inode_size'); - foreach my $part (@{$media->{partitions}}) { - set_part_real_device($hd, $part); - MDV::Draklive::Utils::device_mkfs($part->{real_device}, $part->{fs_type}, $part->{device_LABEL}, $inode_size) - or die "unable to format $part->{real_device} in $hd->{file}\n"; - devices::del_loop($part->{real_device}) if -f $hd->{file}; - } -} - -sub format_disk { - my ($live, $opts) = @_; - local $opts->{slash_size} = guess_disk_master_size($live); - format_master($live->{media}, $opts); -} - -sub guess_disk_master_size { - my ($live) = @_; - - # slash_size: - @{$live->{mount}{dirs} || []} ? - (directory_usage($live->get_builddir . $live->{prefix}{build}{loopbacks}, 'apparent') + - directory_usage($live->get_builddir . $live->{prefix}{build}{boot}) + - directory_usage($live->get_builddir . $live->{prefix}{build}{files}) - ) : - directory_usage($live->get_system_root); -} - -sub create_disk_master { - my ($live, $opts) = @_; - local $opts->{slash_size} = guess_disk_master_size($live); - local $opts->{device} = get_disk_master_path($live); - allocate_master($live->{media}, $opts); - format_master($live->{media}, $opts); - record_master($live, $opts); -} - #- $opts: #- media: alternate media #- onthefly : if true, the create function must output to stdout @@ -954,690 +796,6 @@ sub maybe_umount_device { run_('umount', $device) if cat_('/proc/mounts') =~ m!^$device\s+!m; } -sub format_cdrom_device { - my ($live, $opts) = @_; - run_('wodim', '-v', 'dev=' . get_media_device($live, $opts), "blank=fast"); -} - -#- $opts: -#- media: alternate media -sub format_device { - my ($live, $opts) = @_; - - get_media_device($live, $opts) or die "no device defined in media configuration\n"; - if (my $format = $live->{media}->get_boot_setting('format', $opts)) { - $format->($live, $opts); - } else { - warn "not implemented yet\n"; - } -} - -sub record_cdrom_path { - my ($live, $path, $opts) = @_; - my $device = get_media_device($live, $opts) - or die "no device defined in media configuration\n"; - - #- CD-Rom images can be hybrid, thus handle recording on both CD-Rom and disks - $device = basename(expand_symlinks($device)); - my $sysfs_device = "/sys/block/$device/capability"; - #- GENHD_FL_CD is 8 (include/linux/genhd.h) - my $is_cdrom = !-e $sysfs_device || hex(cat_($sysfs_device)) & 8; - - if ($is_cdrom) { - my $src = $opts->{onthefly} ? '-' : $path; - run_('wodim', '-v', 'dev=' . $device, $src); - } else { - run_('dd', if_(!$opts->{onthefly}, "if=$path"), "of=$device", "bs=2M"); - } -} - -sub record_cdrom_master { - my ($live, $opts) = @_; - record_cdrom_path($live, get_cdrom_master_path($live, $opts), $opts); -} - -sub record_cdrom_replicator { - my ($live, $opts) = @_; - record_cdrom_path($live, get_cdrom_replicator_path($live), $opts); -} - -sub rsync_delete_options { - my ($opts) = @_; - $opts->{keep_files} ? () : '--delete'; -} - -sub install_grub_to_image { - my ($live, $media, $img, $opts) = @_; - my $media_boot = $live->get_media_prefix('boot', $opts->{boot}); - my $grub_dir = "$media_boot/grub"; - my $grub_script = $grub_dir . "/install.sh"; - my $grub_src = first(glob_($live->get_system_root . "/lib/grub/*-mageia")); - mkdir_p($live->{mnt} . $grub_dir); - cp_af(glob_("$grub_src/*"), $live->{mnt} . $grub_dir); - - my $part_idx = $media->find_boot_partition_index; - my $grub_prefix = $media->find_partition_index('/boot') ? "/grub" : $grub_dir; - - open(my $grub, "| /sbin/grub --batch --no-floppy"); - # using disk loopback fails, have to use image path - print $grub <<EOF; -device (hd0) $img -root (hd0,$part_idx) -setup --prefix=$grub_prefix (hd0) -quit -EOF - close($grub) or die "unable to run grub\n"; - - output($live->{mnt} . $grub_script, <<EOG); -grub --device-map=$media_boot/grub/device.map --batch <<EOF -root (hd0,$part_idx) -setup --stage2=$media_boot/grub/stage2 (hd0) -quit -EOF -EOG - - chmod 0755, $live->{mnt} . $grub_script; -} - -sub install_disk_bootloader { - my ($live, $media, $boot_device, $opts) = @_; - - return if $live->{system}{skip_bootloader_install}; - - my $media_boot = $live->get_media_prefix('boot', $opts->{boot}); - my $device = get_media_device($live, $opts); - my $bootloader = $media->get_boot_setting('bootloader', $opts); - - member($bootloader, 'grub', 'syslinux') or die "no bootloader defined in media configuration\n"; - if ($bootloader eq 'syslinux') { - cp_f($live->get_builddir . $_, $live->{mnt}) foreach map { - $live->{prefix}{boot} . $_; - } get_syslinux_path($media, $opts), $media->get_initrd_path, @syslinux_boot_files; - } elsif ($bootloader eq 'grub') { - if (need_media_specific_boot($live) || $opts->{force_bootloader_config}) { - #- FIXME: add get_grub_path (when building boot configuration files) - # and get_bootloader_path (when copying) - mkdir_p($live->{mnt} . $media_boot . '/grub'); - cp_f($live->get_builddir . $live->{prefix}{build}{boot} . '/gfxmenu', $live->{mnt} . $media_boot) if $live->{system}{gfxboot}; - output_p($live->{mnt} . $media_boot . '/grub/menu.lst', build_grub_cfg($live, $media, $opts, $boot_device)); - } - } - - if (-b $boot_device) { - if ($bootloader eq 'syslinux') { - #- use syslinux -s, "safe, slow and stupid" version of SYSLINUX, unless specified otherwise - run_('syslinux', if_(!$media->{fast_syslinux}, '-s'), $boot_device) - or die "unable to run syslinux on $device\n"; - } elsif ($bootloader eq 'grub') { - install_grub_to_image($live, $media, $device, $opts); - } - } else { - warn "not running $bootloader on non block device $device\n"; - } -} - -sub record_usb_master { - my ($live, $opts) = @_; - my $media = $live->{media}; - my $media_boot = $live->get_media_prefix('boot', $opts->{boot}); - my $media_loopbacks = $live->get_media_prefix('loopbacks', $opts->{boot}); - - my $main_device = get_media_device($live, $opts) - or die "unable to find recording device (missing label? try with --device <device>)\n"; - - my $hd = get_hd_from_file($media, $main_device); - supplement_media_partitions($media, $hd); - - my $slash_idx = $media->find_partition_index('/'); - my $slash = $media->{partitions}[$slash_idx]; - set_part_real_device($hd, $slash); - - if (my $label = !$opts->{boot_only} && $media->get_media_label) { - set_device_label($slash->{real_device}, $media->get_media_setting('fs'), $label); - } - - mkdir_p($live->{mnt}); - run_('mount', $slash->{real_device}, $live->{mnt}) - or die "unable to mount $slash->{real_device}\n"; - - rm_rf($live->{mnt} . $media_boot) if -e $live->{mnt} . $media_boot; - cp_af($live->get_builddir . $live->{prefix}{build}{boot}, $live->{mnt} . $media_boot); - - install_disk_bootloader($live, $media, $slash->{real_device}, $opts); - - do { - my $loopbacks_source = $live->get_builddir . $live->{prefix}{build}{loopbacks} . '/'; - my $total = directory_usage($loopbacks_source); - my $list_file = tmpnam(); - output_p($list_file, map { ".$_\n" } list_selected_loopbacks($live)); - local $/ = "\r"; - my $r = run_foreach(update_progress_rsync($live, $total), - 'rsync', '-vdP', '--inplace', '--files-from=' . $list_file, rsync_delete_options($opts), - $loopbacks_source, $live->{mnt} . $media_loopbacks, - ); - unlink $list_file; - if (!$r) { - run_('umount', $slash->{real_device}); - maybe_umount_device($slash->{real_device}); - devices::del_loop($slash->{real_device}) if -f $hd->{file}; - die "unable to copy loopback files\n"; - } - - cp_af(glob_($live->get_builddir . $live->{prefix}{build}{files} . '/*'), $live->{mnt}); - } unless $opts->{boot_only}; - - my @hidden_files = map { basename($_) } glob_($live->{mnt} . "/.*"), glob_($live->{mnt} . "/autorun.*"); - - run_('umount', $slash->{real_device}); - maybe_umount_device($slash->{real_device}); - - if ($media->get_media_setting('fs') eq 'vfat') { - MDV::Draklive::Utils::mtools_run_('mattrib', '+h', '-i', $slash->{real_device}, '::' . $_) foreach @hidden_files; - MDV::Draklive::Utils::mtools_run_('mattrib', '+r', '+s', '-/', '-i', $slash->{real_device}, '::' . $_) - foreach $media_boot, $media_loopbacks; - } - - devices::del_loop($slash->{real_device}) if -f $hd->{file}; -} - -sub record_harddisk_master { - my ($live, $opts) = @_; - - my $media = $live->{media}; - - my $main_device = get_media_device($live, $opts) - or die "unable to find recording device (missing label? try with --device <device>)\n"; - - my $hd = get_hd_from_file($media, $main_device); - supplement_media_partitions($media, $hd); - my @partitions = grep { $_->{mntpoint} =~ m!^/! } @{$media->{partitions}}; - - mkdir_p($live->{mnt}); - foreach my $part (sort { $a->{mntpoint} cmp $b->{mntpoint} } @partitions) { - set_part_real_device($hd, $part); - my $mnt = $live->{mnt} . $part->{mntpoint}; - mkdir_p($mnt); - run_('mount', $part->{real_device}, $mnt) - or die "unable to mount $part->{real_device}\n"; - } - - my $r = 1; - do { - my $source = $live->get_system_root; - my $total = directory_usage($source); - local $/ = "\r"; - $r = run_foreach(update_progress_rsync($live, $total), 'rsync', rsync_delete_options($opts), '-a', $source . '/', $live->{mnt}) - or last; - } unless $opts->{boot_only}; - - my $boot_idx = $media->find_boot_partition_index; - my $boot_part = $media->{partitions}[$boot_idx]; - install_disk_bootloader($live, $media, $boot_part->{real_device}, $opts); - - foreach my $part (sort { $b->{mntpoint} cmp $a->{mntpoint} } @partitions) { - run_('umount', $part->{real_device}); - maybe_umount_device($part->{real_device}); - devices::del_loop($part->{real_device}) if -f $hd->{file}; - } - - $r or die "unable to copy system files\n"; - - record_oem_rescue($live, $opts) if $live->{oem_rescue}; -} - -#- $opts: -#- onthefly : if true, the record function must read from stdin -sub record_master { - my ($live, $opts) = @_; - - if (my $record = $live->{media}->get_boot_setting('record', $opts)) { - $record->($live, $opts); - } else { - warn "not implemented yet\n"; - } -} - -#- $opts: -#- onthefly : if true, the record function must read from stdin -sub record_replicator { - my ($live, $opts) = @_; - - my $replicator_media = $live->{replicator}{media} or die "no replicator media"; - if (my $record_replicator = $replicator_media->get_boot_setting('record_replicator', $opts)) { - $record_replicator->($live, $opts); - } else { - warn "not implemented yet\n"; - } -} - -sub pipe_subs { - my ($writer, $reader) = @_; - my ($r, $w) = POSIX::pipe; - if (my $pid = fork()) { - POSIX::close($w) or die "couldn't close: $!\n"; - my $stdin = POSIX::dup(0) or die "couldn't dup: $!\n"; - POSIX::dup2($r, 0) or die "couldn't dup2: $!\n"; - POSIX::close($r); - $reader->(); - POSIX::close(0) or warn "writer exited $?\n"; - POSIX::dup2($stdin, 0) or die "couldn't dup2: $!\n"; - waitpid($pid, 0); - } else { - POSIX::close($r) or die "couldn't close: $!\n"; - #- don't screw up reader - POSIX::dup2(POSIX::open('/dev/null', &POSIX::O_WRONLY), 2) or die "couldn't dup2: $!\n"; - POSIX::dup2($w, 1) or die "couldn't dup2: $!\n"; - POSIX::close($w); - $| = 1; #- autoflush write - exit !$writer->(); - } -} - -sub record_onthefly { - my ($live, $opts) = @_; - - my $record = $live->{media}->get_storage_setting('record'); - unless ($record) { - warn "not implemented yet\n"; - return; - } - if (my $create = $live->{media}->get_storage_setting('record_needs_master') && $live->{media}->get_storage_setting('create')) { - local $opts->{onthefly} = 1; - #- pipe creation step to recording step - pipe_subs(sub { $create->($live, $opts) }, - sub { $record->($live, $opts) }); - } else { - #- no creation step, record directly - $record->($live, $opts); - } -} - -sub need_compressed_image { - my ($live) = @_; - #- compress image if not having loopbacks already - !to_bool(list_selected_loopbacks($live)); -} - -sub get_disk_image_path { - my ($live) = @_; - if ($live->{settings}{compression_method} eq 'gzip') { - get_disk_master_path($live) . if_(need_compressed_image($live), '.gz'); - } - else { - get_disk_master_path($live) . if_(need_compressed_image($live), '.bz2'); - } -} - -sub create_disk_image { - my ($live) = @_; - if (!need_compressed_image($live)) { - warn "already using loopback: skipping image creation\n"; - return; - } - my $master = get_disk_master_path($live); - my $dest = get_disk_image_path($live); - mkdir_p(dirname($dest)); - - if ($live->{settings}{compression_method} eq 'gzip') { - run_('gzip', '>', $dest, '-f', '-c', '--fast', $master); - } - else { - run_('bzip2', '>', $dest, '-f', '-k', '-c', $master); - } -} - -sub create_image { - my ($live) = @_; - - if (my $create = $live->{media}->get_media_setting('image')) { - $create->($live); - } else { - warn "not implemented yet\n"; - } -} - -sub create_vm_image { - my ($live) = @_; - - my $vm_type = $live->{settings}{vm_type}; - if (!$vm_type) { - warn "no vm_type has been set in settings, skipping"; - return; - } - - if (!$live->{media}->get_media_setting('image')) { - warn "not implemented yet\n"; - return; - } - - my $master = get_disk_master_path($live); - if (!-f $master) { - warn "no master image, skipping\n"; - } - - my $vm_image = get_disk_master_prefix($live) . ".$vm_type"; - run_("qemu-img", "convert", "-O", $vm_type, $master, $vm_image); -} - -sub get_rescue_files { - my ($live, $rescue_opts, $o_extra_files) = @_; - my $media_boot = $live->get_media_prefix('boot'); - my $initrd = $media_boot . $rescue_opts->{media}->get_initrd_path; - my @stage2_files = $live->{settings}{replicator_type} eq 'drakx' ? ( - '/usr/lib/drakx-installer-stage2/install/stage2/mdkinst.sqfs', - $live->get_system_root . '/bin/dd', - ) : '/usr/lib/drakx-installer-rescue/rescue.sqfs'; - ( - '/usr/lib/drakx-installer-images/isolinux/alt0/vmlinuz' => $media_boot . '/vmlinuz', - '/usr/lib/drakx-installer-images/isolinux/alt0/all.rdz' => $initrd, - (map { $_ => '/install/stage2/' } @stage2_files), - @{$o_extra_files || []}, - #- FIXME: factorize with copy_files_to to handle glob - (map { $live->{settings}{config_root} . '/' . $_->[0] => '/' . $_->[1] } @{$rescue_opts->{files} || []}), - ); -} - -sub record_rescue_files { - my ($mnt, $device, $rescue_files) = @_; - my $failed; - foreach (group_by2(@$rescue_files)) { - my ($src, $dest) = @$_; - $dest = $mnt . $dest; - mkdir_p($dest =~ m!/$! ? $dest : dirname($dest)); - if (!run_('rsync', '-vdP', '--inplace', $src, $dest)) { - $failed = 1; - last; - } - } - - #- FIXME - chmod 0755, $mnt . '/' . 'oem-rescue.sh'; - - if ($failed) { - run_('umount', $mnt); - maybe_umount_device($device); - die "unable to copy rescue files\n"; - } -} - -sub record_oem_rescue { - my ($live, $opts) = @_; - - my $media = $live->{media}; - my $oem_rescue_idx = $media->find_partition_index('OEM_RESCUE'); - defined $oem_rescue_idx or die "no OEM_RESCUE partition"; - - my $main_device = get_media_device($live, $opts) - or die "unable to find recording device (missing label? try with --device <device>)\n"; - - my $hd = get_hd_from_file($media, $main_device); - supplement_media_partitions($media, $hd); - - my $oem_rescue = $media->{partitions}[$oem_rescue_idx]; - set_part_real_device($hd, $oem_rescue); - - mkdir_p($live->{mnt}); - run_('mount', $oem_rescue->{real_device}, $live->{mnt}) - or die "unable to mount $oem_rescue->{real_device}\n"; - - record_rescue_files($live->{mnt}, $oem_rescue->{real_device}, [ get_rescue_files($live, $live->{oem_rescue}) ]); - - run_('umount', $oem_rescue->{real_device}); - maybe_umount_device($oem_rescue->{real_device}); - devices::del_loop($oem_rescue->{real_device}) if -f $hd->{file}; -} - -sub get_disk_replicator_prefix { - my ($live) = @_; - $live->get_builddir . $live->{prefix}{build}{dist} . '/' . $live->get_name . '.rest'; -} - -sub get_disk_replicator_path { - my ($live) = @_; - get_disk_replicator_prefix($live) . ".img"; -} - -sub get_disk_replicator_files { - my ($live) = @_; - get_rescue_files($live, $live->{replicator}, [ get_disk_image_path($live) => '/images/' ]); -} - -sub get_disk_replicator_images_list { - my ($live) = @_; - my $master_path = get_disk_master_path($live); - my $master_size = (stat($master_path))[7]; - "EN,English," . basename(get_disk_image_path($live)) . ",on,$master_size\n"; -} - -sub create_usb_replicator { - my ($live, $opts) = @_; - my %files = get_disk_replicator_files($live); - local $opts->{slash_size} = fold_left { $::a + $::b } map { directory_usage($_, 'apparent') } keys(%files); - local $opts->{device} = get_disk_replicator_path($live); - allocate_master($live->{replicator}{media}, $opts); - format_master($live->{replicator}{media}, $opts); - record_usb_replicator($live, $opts); -} - -sub record_usb_replicator { - my ($live, $opts) = @_; - - my $media = $live->{replicator}{media}; - my $media_boot = $live->get_media_prefix('boot'); - - $opts->{append} ||= $live->{replicator}{append}; - my $main_device = get_media_device($live, $opts) - or die "unable to find recording device (missing label? try with --device <device>)\n"; - - my $hd = get_hd_from_file($media, $main_device); - supplement_media_partitions($media, $hd); - - my $slash_idx = $media->find_partition_index('/'); - my $slash = $media->{partitions}[$slash_idx]; - set_part_real_device($hd, $slash); - - mkdir_p($live->{mnt}); - run_('mount', $slash->{real_device}, $live->{mnt}) - or die "unable to mount $slash->{real_device}\n"; - rm_rf($live->{mnt} . $media_boot) if -e $live->{mnt} . $media_boot; - { - local $opts->{force_bootloader_config} = 1; - install_disk_bootloader($live, $media, $slash->{real_device}, $opts); - } - - record_rescue_files($live->{mnt}, $slash->{real_device}, [ get_disk_replicator_files($live) ]); - output_p($live->{mnt} . "/images/list", get_disk_replicator_images_list($live)); - - run_('umount', $slash->{real_device}); - maybe_umount_device($slash->{real_device}); - devices::del_loop($slash->{real_device}) if -f $hd->{file}; -} - -sub create_cdrom_replicator { - my ($live, $opts) = @_; - - # FIXME: factorize with usb replicator, write in builddir/replicator/images-list - my $images_list = "/tmp/images-replicator.list"; - output_p($images_list, get_disk_replicator_images_list($live)); - - # FIXME: write in builddir/replicator/syslinux.cfg - my $syslinux_cfg = "/tmp/syslinux-replicator.cfg"; - local $opts->{append} = $live->{replicator}{append}; - output_p($syslinux_cfg, build_syslinux_cfg($live, $live->{replicator}{media}, $opts)); - - my $label = $live->{replicator}{media}->get_media_label or die "the source device must be described by a label\n"; - my $dest = get_cdrom_replicator_path($live); - build_iso_image( - $live, - $dest, - $syslinux_cfg, - $label, - $live->get_media_prefix('boot', $opts->{boot}) . '/syslinux=' . $live->get_builddir . $live->{prefix}{build}{boot} . '/syslinux', - "/images/list=$images_list", - (map { - my ($src, $dest) = @$_; - my $dest_file = $dest =~ m!/$! ? $dest . basename($src) : $dest; - $dest_file . "=" . $src; - } group_by2(get_disk_replicator_files($live))), - ); -} - -sub create_replicator { - my ($live, $opts) = @_; - - if (my $create = $live->{replicator}{media} && $live->{replicator}{media}->get_media_setting('replicator')) { - $create->($live, $opts); - } else { - warn "not implemented yet\n"; - } -} - -sub update_progress_rsync { - my ($live, $total) = @_; - my $all_files = 0; - my $current_file = 0; - $live->{update_progress} ? sub { - if (/^\s*(\d+)\s+\d+%\s+/) { - $current_file = $1; - $live->{update_progress}->(undef, $all_files + $current_file, $total); - } - if (/(?:^|\n)\S+/) { - $all_files += $current_file; - $current_file = 0; - } - } : sub { print }; -} - -sub copy_wizard { - my ($live) = @_; - - MDV::Draklive::Config::complete_config($live); - $live->{system}{vga_mode} = 788 if !defined $live->{system}{vga_mode}; - my $live_media = $live->{prefix}{live}{mnt} . $live->{prefix}{media}{mnt}; - - require interactive; - require wizards; - my $in = 'interactive'->vnew('su'); - my (@available_storage, @available_devices); - my ($storage, $device, $format); - my %source_types = ( - live => N("Use current live system"), - file => N("Select a file"), - ); - my ($source_type, $source_path); - my $media_boot = $live->get_media_prefix('boot'); - my $media_loopbacks = $live->get_media_prefix('loopbacks'); - my $source_is_mounted = sub { -d ($live->{settings}{builddir} . $media_boot) }; - my $umount_source = sub { - if ($source_type ne 'live' && $source_is_mounted->()) { - run_('umount', $live->{settings}{builddir}); - rmdir($live->{settings}{builddir}); - } - }; - my $w; - $w = wizards->new({ - name => N("Live system copy wizard"), - pages => { - welcome => { - name => N("Welcome to the live system copy wizard"), - no_back => 1, - next => 'source', - }, - source => { - name => N("Which live system do you want to copy?"), - data => [ if_(-d ($live_media . $media_loopbacks), - { type => 'list', val => \$source_type, - list => sort(keys(%source_types)), - format => sub { $source_types{$_[0]} } }), - { type => 'file', val => \$source_path, - disabled => sub { $source_type eq 'live' } } ], - pre => $umount_source, - complete => sub { - if ($source_type eq 'live') { - $live->{settings}{builddir} = $live_media; - } else { - $live->{settings}{builddir} = File::Temp::tempdir(); - if (!run_('mount', '-o', 'loop', $source_path, $live->{settings}{builddir})) { - $in->ask_warn(N("Error"), N("Unable to use selected file")); - return 1; - } - } - 0; - }, - post => sub { - my $boot = $live->{settings}{builddir} . $media_boot; - @available_storage = sort(grep { -d "$boot/$_" && exists $MDV::Draklive::Storage::storage_types{$_}{detect} } all($boot)); - if (@available_storage == 1) { - $storage = $available_storage[0]; - return 'device'; - } - return 'storage'; - } - }, - storage => { - name => N("Please select the medium type"), - data => [ { type => 'list', allow_empty_list => 1, - val => \$storage, list => \@available_storage } ], - next => 'device', - }, - device => { - name => N("Please select the device that will contain the new live system"), - pre => sub { - my %devices = map { $_->{device} => $_ } $MDV::Draklive::Storage::storage_types{$storage}{detect}->(); - $_->{formatted_name} = $_->{usb_description} || $_->{info} || $_->{device} foreach values %devices; - @available_devices = (); - require fs::proc_partitions; - foreach (fs::proc_partitions::read([ values %devices ])) { - if ($_->{rootDevice} && exists $devices{$_->{rootDevice}}) { - my $description = $devices{$_->{rootDevice}}{usb_description} || $devices{$_->{rootDevice}}{info}; - $_->{formatted_name} = $description ? "$description ($_->{device})" : $_->{device}; - push @available_devices, $_; - } - } - delete $devices{$_->{rootDevice}} foreach @available_devices; - unshift @available_devices, map { $devices{$_} } sort keys %devices; - undef $device; - }, - data => [ { type => 'list', allow_empty_list => 1, - val => \$device, , list => \@available_devices, - format => sub { $_[0]{formatted_name} } }, - { text => N("Format selected device"), val => \$format, type => 'bool' } ], - complete => sub { - return 0 if defined $device; - $in->ask_warn(N("Error"), N("You must select a device!")); - 1; - }, - post => sub { - (my $_wait, $live->{update_progress}) = $in->wait_message_with_progress_bar; - do { - local $::isInstall = 1; # quick hack to embed the wait message - $live->{update_progress}->(N("Copying in progress")); - }; - eval { - my $opts = { media => { storage => $storage, device => '/dev/' . $device->{device} } }; - format_device($live, $opts) if $format; - record_onthefly($live, $opts); - }; - delete $live->{update_progress}; - if (my $error = $@) { - $in->ask_warn(N("Error"), $error); - $w->{pages}{device}{end} = 1; - } - return "end"; - }, - }, - end => { - name => N("Congratulations") . "\n\n" . N("Your live system is now copied."), - no_back => 1, - end => 1, - }, - } - }); - $w->process($in); - $umount_source->(); - $in->exit; -} - sub clean { my ($live) = @_; # umount filesystem in the live before cleaning @@ -1653,18 +811,10 @@ my @actions = ( { name => 'post-install', do => \&post_install_system }, { name => 'initrd', do => \&create_initrd }, { name => 'boot', do => \&prepare_bootloader }, - { name => 'tarball', do => \&create_tarball }, { name => 'loop', do => \&create_loopback_files }, { name => 'master', do => \&create_master }, - { name => 'image', do => \&create_image }, - { name => 'vm-image', do => \&create_vm_image }, - { name => 'replicator', do => \&create_replicator }, - { name => 'format', do => \&format_device }, - { name => 'record', do => \&record_master }, - { name => 'record-onthefly', do => \&record_onthefly }, - { name => 'record-replicator', do => \&record_replicator }, ); -my @all = qw(install boot loop master image vm-image replicator); +my @all = qw(install boot loop master); die "you must be root to run this program\n" if $>; @@ -1675,13 +825,9 @@ my $config_path = $MDV::Draklive::Config::default_config_path; my $settings_path = $MDV::Draklive::Config::default_settings_path; GetOptions( "help" => sub { Pod::Usage::pod2usage('-verbose' => 1) }, - "copy-wizard" => \$live_object->{copy_wizard}, - "keep-files" => \$opts{keep_files}, "boot-only" => \$opts{boot_only}, - "boot-image=s" => sub { $opts{boot} = $_[1]; $opts{boot_only} = 1 }, "all" => sub { $_->{to_run} = 1 foreach grep { member($_->{name}, @all) } @actions }, (map { $_->{name} => \$_->{to_run} } @actions), - "device=s" => sub { $opts{device} = $_[1] }, "all-regions" => sub { $live_object->{all_regions} = 1 }, "config-root=s" => \$config_root, "config=s" => \$config_path, @@ -1690,9 +836,6 @@ GetOptions( ) or Pod::Usage::pod2usage(); require standalone; -if ($live_object->{copy_wizard}) { - copy_wizard($live_object); -} else { every { !$_->{to_run} } @actions and Pod::Usage::pod2usage(); MDV::Draklive::Config::read_config($live_object, $config_root, $config_path, $settings_path); MDV::Draklive::Config::check_config($live_object); @@ -1706,7 +849,6 @@ if ($live_object->{copy_wizard}) { print qq(* step "$_->{name}" done\n); } } -} __END__ @@ -1723,26 +865,13 @@ draklive [options] --install install selected distribution in chroot --boot prepare initrd and bootloader files - --tarball build chroot tarball --loop build compressed loopback files --master build master image - --image build compressed master image - --replicator build replicator image (to dump master on systems) --all run all steps, from installation to mastering --clean clean installation chroot and work directory - --device <dev> use this device for live recording (not needed - if the device already has the required label) - --format format selected device - --record record live on selected media - --record-onthefly record live by creating master from loopback files - on the fly - --keep-files keep existing files on media when recording - --record-replicator - record replicator on selected media - --initrd build initrd only --post-install run post install only (rpms and patches installation) @@ -1762,23 +891,15 @@ draklive [options] --all-regions proceed with all configured regions - --copy-wizard run the copy wizard - --boot-only copy only boot files (affects master/record steps) - --boot-image <method> - create a boot image for the selected method - (affects master/record steps, implies --boot-only) - Examples: draklive --clean draklive --all - draklive --record --device /dev/sdb1 - draklive --config config/live.cfg --install =head1 OPTIONS |