diff options
-rwxr-xr-x | draklive | 79 |
1 files changed, 78 insertions, 1 deletions
@@ -159,6 +159,7 @@ my %storage = ( create => \&create_disk_master, record => \&record_harddisk_master, image => \&create_disk_image, + replicator => \&create_disk_replicator_usb, }, ); @@ -1666,6 +1667,80 @@ sub create_image { } } +sub get_disk_replicator_path { + my ($live) = @_; + get_builddir($live) . $live->{prefix}{build}{dist} . '/' . get_live_name($live) . '.rest.img'; +} + +sub get_disk_replicator_media() { + { storage => 'usb', bootloader => 'grub' }; +} + +sub get_disk_replicator_files { + my ($live) = @_; + my $media = get_disk_replicator_media(); + my $media_boot = get_media_prefix($live, 'boot'); + my $initrd = $media_boot . get_initrd_path($media); + ( + '/usr/lib/drakx-installer-images/isolinux/alt0/vmlinuz' => $media_boot . '/vmlinuz', + '/usr/lib/drakx-installer-images/isolinux/alt0/all.rdz' => $initrd, + '/usr/lib/drakx-installer-rescue/rescue.sqfs' => '/install/stage2/', + get_disk_image_path($live) => '/images/', + ); +} + +sub create_disk_replicator_usb { + my ($live) = @_; + my $dest = get_disk_replicator_path($live); + my %files = get_disk_replicator_files($live); + my $size = fold_left { $::a + $::b } map { directory_usage($_) } keys(%files); + my $loop = allocate_master($dest, 3000000 + $size, 'vfat'); + my $opts = { device => $loop, disk_device => $dest }; + record_disk_replicator_usb($live, $opts); + run_('losetup', '-d', $loop); +} + +sub record_disk_replicator_usb { + my ($live, $opts) = @_; + my $media = get_disk_replicator_media(); + my $media_boot = get_media_prefix($live, 'boot'); + my $device = get_media_device($live, $opts) + or die "unable to find recording device (missing label? try with --device <device>)\n"; + mkdir_p($live->{mnt}); + run_('mount', if_(-f $device, '-o', 'loop'), $device, $live->{mnt}) + or die "unable to mount $device\n"; + rm_rf($live->{mnt} . $media_boot) if -e $live->{mnt} . $media_boot; + install_usb_bootloader($live, $media, $opts); + + my $failed; + foreach (group_by2(get_disk_replicator_files($live))) { + my ($src, $dest) = @$_; + $dest = $live->{mnt} . $dest; + mkdir_p($dest =~ m!/$! ? $dest : dirname($dest)); + if (!run_('rsync', '-vdP', '--inplace', $src, $dest)) { + $failed = 1; + last; + } + } + if ($failed) { + run_('umount', $live->{mnt}); + maybe_umount_device($device); + die "unable to copy replicator files\n"; + } + run_('umount', $live->{mnt}); + maybe_umount_device($device); +} + +sub create_replicator { + my ($live) = @_; + + if (my $create = get_boot_setting($live->{media}, 'replicator')) { + $create->($live); + } else { + warn "not implemented yet\n"; + } +} + sub copy_wizard { my ($live) = @_; @@ -1887,11 +1962,12 @@ my @actions = ( { name => 'loop', do => \&create_loopback_files }, { name => 'master', do => \&create_master }, { name => 'image', do => \&create_image }, + { name => 'replicator', do => \&create_replicator }, { name => 'format', do => \&format_device }, { name => 'record', do => \&record_master }, { name => 'record-onthefly', do => \&record_onthefly }, ); -my @all = qw(install boot loop master image); +my @all = qw(install boot loop master image replicator); die "you must be root to run this program\n" if $>; @@ -1951,6 +2027,7 @@ draklive [options] --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 |