diff options
Diffstat (limited to 'tools/draklive')
-rwxr-xr-x | tools/draklive | 120 |
1 files changed, 83 insertions, 37 deletions
diff --git a/tools/draklive b/tools/draklive index d739701bf..49ead5e2b 100755 --- a/tools/draklive +++ b/tools/draklive @@ -254,7 +254,7 @@ sub moddeps_closure { } sub run_ { - print "running " . join(' ', @_) . "\n"; + print STDERR "running " . join(' ', @_) . "\n"; run_program::run(@_); } @@ -479,27 +479,29 @@ sub prepare_bootloader { } sub create_cdrom_master { - my ($live) = @_; - my $dest = $live->{images_dir} . '/live.iso'; + my ($live, $opts) = @_; my $label = get_media_label($live) or die "the source device must be described by a label"; + my @dest = $opts->{onthefly} ? () : ('-o', $live->{images_dir} . '/live.iso'); run_('mkisofs', '-pad', '-l', '-R', '-J', '-v', '-v', - '-V', $label, #'-A', $application, '-p', $preparer, '-P', $publisher, - '-b', 'isolinux/isolinux.bin', - '-c', 'isolinux/boot.cat', - '-hide-rr-moved', '-no-emul-boot', - '-boot-load-size', 4, '-boot-info-table', - '-o', $dest, - '-graft-points', - 'isolinux/isolinux.bin=/usr/lib/syslinux/isolinux-graphic.bin', - 'isolinux/isolinux.cfg=' . $live->{boot_dir} . '/syslinux.cfg', - (map { 'isolinux/=' . $live->{boot_dir} . '/' . $_ } qw(vmlinuz initrd.gz live.msg)), - (map { $live->{images_dir} . '/' . $_->{source} } grep { $_->{build_from} } @{$live->{mount}{dirs}})); + '-V', $label, #'-A', $application, '-p', $preparer, '-P', $publisher, + '-b', 'isolinux/isolinux.bin', + '-c', 'isolinux/boot.cat', + '-hide-rr-moved', '-no-emul-boot', + '-boot-load-size', 4, '-boot-info-table', + '-graft-points', + 'isolinux/isolinux.bin=/usr/lib/syslinux/isolinux-graphic.bin', + 'isolinux/isolinux.cfg=' . $live->{boot_dir} . '/syslinux.cfg', + (map { 'isolinux/=' . $live->{boot_dir} . '/' . $_ } qw(vmlinuz initrd.gz live.msg)), + (map { $live->{images_dir} . '/' . $_->{source} } grep { $_->{build_from} } @{$live->{mount}{dirs}}), + @dest, + ); } +#- $opts: onthefly : if true, the create function must output to stdout sub create_master { - my ($live) = @_; + my ($live, $opts) = @_; if (my $create = $storage{$live->{media}{storage}}{create}) { - $create->($live); + $create->($live, $opts); } else { warn "not implemented yet"; } @@ -527,15 +529,15 @@ sub format_device { } sub record_cdrom_master { - my ($live, $o_refresh_boot_only) = @_; - $o_refresh_boot_only and die "record boot isn't possible for cdrom master"; + my ($live, $opts) = @_; + $opts->{refresh_boot_only} and die "record boot isn't possible for cdrom master"; $live->{media}{device} or die "no device defined in media configuration"; - my $src = $live->{images_dir} . '/live.iso'; + my $src = $opts->{onthefly} ? '-' : $live->{images_dir} . '/live.iso'; run_('cdrecord', '-v', 'dev=' . $live->{media}{device}, $src); } sub record_usb_master { - my ($live, $o_refresh_boot_only) = @_; + my ($live, $opts) = @_; if (my $label = $live->{media}{device} && get_media_label($live)) { run_('mlabel', '-i', $live->{media}{device}, '::' . $label); } @@ -545,7 +547,7 @@ sub record_usb_master { run_('mount', $device, $live->{mnt}) or die "unable to mount $device"; cp_f(map { $live->{boot_dir} . "/$_" } qw(vmlinuz initrd.gz live.msg), $live->{mnt}); - unless ($o_refresh_boot_only) { + unless ($opts->{refresh_boot_only}) { foreach (grep { $_->{build_from} || $_->{pre_allocate} } @{$live->{mount}{dirs} || []}) { print "copying $_->{source}\n"; cp_f($live->{images_dir} . '/' . $_->{source}, $live->{mnt}); @@ -556,10 +558,11 @@ sub record_usb_master { run_('syslinux', '-s', $device) or die "unable to run syslinux on $device"; } +#- $opts: onthefly : if true, the record function must read from stdin sub record_master { - my ($live, $o_refresh_boot_only) = @_; + my ($live, $opts) = @_; if (my $record = $storage{$live->{media}{storage}}{record}) { - $record->($live, $o_refresh_boot_only); + $record->($live, $opts); } else { warn "not implemented yet"; } @@ -567,7 +570,47 @@ sub record_master { sub record_boot { my ($live) = @_; - record_master($live, 'refresh'); + record_master($live, { refresh => 1 }); +} + +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 $?"; + 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) = @_; + my $record = $storage{$live->{media}{storage}}{record}; + unless ($record) { + warn "not implemented yet"; + return; + } + if (my $create = $storage{$live->{media}{storage}}{create}) { + #- pipe creation step to recording step + pipe_subs(sub { $create->($live, { onthefly => 1 }) }, + sub { $record->($live, { onthefly => 1 }) }); + } else { + #- no creation step, record directly + $record->($live); + } } sub complete_config { @@ -602,6 +645,7 @@ my @actions = ( { name => 'format', do => \&format_device }, { name => 'record', do => \&record_master }, { name => 'record_boot', do => \&record_boot }, + { name => 'record_onthefly', do => \&record_onthefly }, ); my @all = qw(install initrd boot loop master); @@ -644,23 +688,25 @@ draklive - A live distribution mastering tool draklive [options] Options: - --help long help message + --help long help message - --install install selected distribution in chroot - --initrd build initrd - --boot prepare bootloader files - --loop build compressed loopback files - --master build master image + --install install selected distribution in chroot + --initrd build initrd + --boot prepare bootloader files + --loop build compressed loopback files + --master build master image - --all run all steps, from installation to mastering + --all run all steps, from installation to mastering - --clean clean installation chroot and work directory + --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 install live on selected media - --record_boot install bootloader only on selected media + --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_boot record bootloader only on selected media + --record_onthefly record live by creating master from loopback files + on the fly --config <file> use this configuration file as live description |