summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlivier Blin <oblin@mandriva.com>2007-11-05 19:07:43 +0000
committerOlivier Blin <oblin@mandriva.com>2007-11-05 19:07:43 +0000
commitb03e57801b01b455e24fb63c8608637453723296 (patch)
treea6ee1065d27a34d6146a357de9997551996c2660
parent7fb9052ca741c2e51c1db56d62b28ec796d13dea (diff)
downloaddraklive-b03e57801b01b455e24fb63c8608637453723296.tar
draklive-b03e57801b01b455e24fb63c8608637453723296.tar.gz
draklive-b03e57801b01b455e24fb63c8608637453723296.tar.bz2
draklive-b03e57801b01b455e24fb63c8608637453723296.tar.xz
draklive-b03e57801b01b455e24fb63c8608637453723296.zip
compute media dirs on the fly instead of hardcoding at start (to support CD-Rom boot images with non-hidden media directories)
-rwxr-xr-xdraklive73
1 files changed, 47 insertions, 26 deletions
diff --git a/draklive b/draklive
index e647149..0832b85 100755
--- a/draklive
+++ b/draklive
@@ -129,6 +129,7 @@ my %storage = (
modules => 'bus/usb disk/hardware_raid|ide|sata|scsi|usb',
media_modules => 'disk/cdrom',
fs => 'iso9660',
+ can_hide => 0,
source => 'LABEL=MDVCDROOT',
read_only => 1,
detect => \&detect_devices::burners,
@@ -141,6 +142,7 @@ my %storage = (
modules => 'bus/usb disk/usb',
media_modules => 'disk/raw',
fs => 'vfat',
+ can_hide => 1,
bootloader => 'grub',
source => 'LABEL=MDVUSBROOT',
detect => sub { grep { detect_devices::isKeyUsb($_) } detect_devices::get() },
@@ -235,8 +237,9 @@ my %loop = (
mount => sub {
my ($live, $dir) = @_;
$dir->{loop} = "/dev/loop" . $loop_number++;
+ my $media_loopbacks = get_media_prefix($live, 'loopbacks');
(
- "/bin/losetup $dir->{loop} $live->{prefix}{live}{mnt}$live->{prefix}{media}{mnt}$live->{prefix}{media}{loopbacks}$dir->{path}",
+ "/bin/losetup $dir->{loop} $live->{prefix}{live}{mnt}$live->{prefix}{media}{mnt}${media_loopbacks}$dir->{path}",
"mount -o ro -t squashfs $dir->{loop} $live->{prefix}{live}{mnt}$dir->{mountpoint}",
);
},
@@ -246,7 +249,8 @@ my %loop = (
delay_mount => 1,
mount => sub {
my ($live, $dir) = @_;
- "sh -c 'modules=; for m in $live->{prefix}{live}{mnt}$live->{prefix}{media}{mnt}$live->{prefix}{media}{loopbacks}$dir->{path}/*; do n=\$(basename \$m); n=\${n%.sqfs}; d=$live->{prefix}{live}{mnt}$dir->{mountpoint}/\$n; mkdir -p \$d; mount -n -o loop,ro -t squashfs \$m \$d && modules=\$modules\$d=ro:; done; echo \$modules | sed -e s/:\$// > $dir->{list}'";
+ my $media_loopbacks = get_media_prefix($live, 'loopbacks');
+ "sh -c 'modules=; for m in $live->{prefix}{live}{mnt}$live->{prefix}{media}{mnt}${media_loopbacks}$dir->{path}/*; do n=\$(basename \$m); n=\${n%.sqfs}; d=$live->{prefix}{live}{mnt}$dir->{mountpoint}/\$n; mkdir -p \$d; mount -n -o loop,ro -t squashfs \$m \$d && modules=\$modules\$d=ro:; done; echo \$modules | sed -e s/:\$// > $dir->{list}'";
},
},
loopfs => {
@@ -264,8 +268,9 @@ my %loop = (
my ($live, $dir) = @_;
$dir->{loop} = "/dev/loop" . $loop_number++;
my $fsck = "chroot </dev/tty1 $live->{prefix}{live}{mnt}$dir_distrib_sqfs->{mountpoint} /sbin/fsck $dir->{loop}";
+ my $media_loopbacks = get_media_prefix($live, 'loopbacks');
(
- "losetup $dir->{loop} $live->{prefix}{live}{mnt}$live->{prefix}{media}{mnt}$live->{prefix}{media}{loopbacks}$dir->{path}",
+ "losetup $dir->{loop} $live->{prefix}{live}{mnt}$live->{prefix}{media}{mnt}${media_loopbacks}$dir->{path}",
qq(sh -c "$fsck -a || $fsck -y"),
"mount -t $dir->{fs} $dir->{loop} $live->{prefix}{live}{mnt}$dir->{mountpoint}",
);
@@ -614,8 +619,9 @@ sub build_syslinux_cfg {
my $append = get_default_append($live);
#- syslinux wants files at root (used with vfat fs)
my $to_root = get_boot_setting($media, 'fs', $opts) eq 'vfat';
+ my $boot = get_media_prefix($live, 'boot', $opts->{boot});
my ($initrd, $kernel, $bootlogo, $help) = map { $to_root ? basename($_) : $_ }
- map { $live->{prefix}{media}{boot} . $_ } get_initrd_path($media), @syslinux_boot_files;
+ map { $boot . $_ } get_initrd_path($media), @syslinux_boot_files;
my $has_bootlogo = $live->{system}{gfxboot} &&
-e get_builddir($live) . $live->{prefix}{build}{boot} . '/syslinux/bootlogo';
my $timeout = get_bootloader_timeout($live) * 10;
@@ -640,15 +646,16 @@ sub build_grub_cfg {
#- FIXME: use the bootloader module from drakx
my ($part_nb) = $device =~ /(\d+)$/;
my $grub_part = "(hd0" . (defined $part_nb ? "," . ($part_nb-1) : "") . ")";
+ my $boot = get_media_prefix($live, 'boot'); #- FIXME handle boot media
join("\n",
"timeout " . get_bootloader_timeout($live),
- if_($live->{system}{gfxboot}, "gfxmenu $grub_part" . $live->{prefix}{media}{boot} . "/gfxmenu"),
+ if_($live->{system}{gfxboot}, "gfxmenu $grub_part" . $boot . "/gfxmenu"),
"default 0",
(map {
my ($name, $cmdline) = @$_;
"title " . $live->{media}{title} . if_($name, " ($name)"),
- "kernel $grub_part" . $live->{prefix}{media}{boot} . "/vmlinuz " . get_default_append($live) . if_($cmdline, " $cmdline"),
- "initrd " . $live->{prefix}{media}{boot} . get_initrd_path($media);
+ "kernel $grub_part" . $boot . "/vmlinuz " . get_default_append($live) . if_($cmdline, " $cmdline"),
+ "initrd " . $boot . get_initrd_path($media);
} group_by2('' => '', @{$live->{system}{boot_entries}})),
"",
);
@@ -689,9 +696,10 @@ sub configure_draklive_resize {
my $resizable_loopback = find { $_->{min_size} } @{$live->{mount}{dirs} || []};
if ($resizable_loopback) {
+ my $media_loopbacks = get_media_prefix($live, 'loopbacks');
output(get_system_root($live) . '/etc/sysconfig/draklive-resize', <<EOF);
DRAKLIVE_RESIZE=yes
-LOOPBACK=$live->{prefix}{live}{mnt}$live->{prefix}{media}{mnt}$live->{prefix}{media}{loopbacks}$resizable_loopback->{path}
+LOOPBACK=$live->{prefix}{live}{mnt}$live->{prefix}{media}{mnt}${media_loopbacks}$resizable_loopback->{path}
TYPE=$resizable_loopback->{fs}
MIN_SIZE=$resizable_loopback->{min_size}
MOUNT=$live->{prefix}{live}{mnt}$resizable_loopback->{mountpoint}_resized
@@ -949,6 +957,13 @@ sub get_media_device {
$device;
}
+sub get_media_prefix {
+ my ($live, $setting, $o_boot) = @_;
+ my $hidden = $live->{system}{hide_media_dirs} && get_boot_setting($live->{media}, 'can_hide', { boot => $o_boot });
+ use Data::Dumper; print Dumper($setting, $o_boot, $hidden);
+ $live->{prefix}{media}{$hidden ? "hidden_$setting" : $setting};
+}
+
sub get_media_source_for_nash {
my ($media) = @_;
my $label = get_media_label($media);
@@ -1054,10 +1069,10 @@ sub create_cdrom_master {
'isolinux=' . get_builddir($live) . $live->{prefix}{build}{boot} . '/syslinux',
'isolinux/isolinux.bin=/usr/lib/syslinux/isolinux.bin',
'isolinux/isolinux.cfg=' . get_builddir($live) . $live->{prefix}{build}{boot} . get_syslinux_path($live->{media}, $opts),
- $live->{prefix}{media}{boot} . '=' . get_builddir($live) . $live->{prefix}{build}{boot},
+ get_media_prefix($live, 'boot', $opts->{boot}) . '=' . get_builddir($live) . $live->{prefix}{build}{boot},
if_(!$opts->{boot_only},
(map {
- $live->{prefix}{media}{loopbacks} . $_ .
+ get_media_prefix($live, 'loopbacks', $opts->{boot}) . $_ .
'=' .
get_builddir($live) . $live->{prefix}{build}{loopbacks} . $_;
} list_selected_loopbacks($live)),
@@ -1145,6 +1160,9 @@ sub record_cdrom_master {
sub record_usb_master {
my ($live, $opts) = @_;
my $media = $live->{media};
+ my $media_boot = get_media_prefix($live, 'boot', $opts->{boot});
+ my $media_loopbacks = get_media_prefix($live, 'loopbacks', $opts->{boot});
+
if (my $label = !$opts->{boot_only} && $opts->{device} && get_media_label($media)) {
set_device_label($opts->{device}, get_media_setting($media, 'fs'), $label);
}
@@ -1155,10 +1173,10 @@ sub record_usb_master {
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} . $live->{prefix}{media}{boot}) if -e $live->{mnt} . $live->{prefix}{media}{boot};
- cp_af(get_builddir($live) . $live->{prefix}{build}{boot}, $live->{mnt} . $live->{prefix}{media}{boot});
+ rm_rf($live->{mnt} . $media_boot) if -e $live->{mnt} . $media_boot;
+ cp_af(get_builddir($live) . $live->{prefix}{build}{boot}, $live->{mnt} . $media_boot);
- my $grub_device_map = $live->{mnt} . $live->{prefix}{media}{boot} . "/grub/device.map";
+ my $grub_device_map = $live->{mnt} . $media_boot . "/grub/device.map";
if ($bootloader eq 'syslinux') {
cp_f(get_builddir($live) . $_, $live->{mnt}) foreach map {
$live->{prefix}{boot} . $_;
@@ -1166,9 +1184,9 @@ sub record_usb_master {
} elsif ($bootloader eq 'grub') {
#- FIXME: add get_grub_path (when building boot configuration files)
# and get_bootloader_path (when copying)
- mkdir_p($live->{mnt} . $live->{prefix}{media}{boot} . '/grub');
- cp_f(get_builddir($live) . $live->{prefix}{build}{boot} . '/gfxmenu', $live->{mnt} . $live->{prefix}{media}{boot});
- output_p($live->{mnt} . $live->{prefix}{media}{boot} . '/grub/menu.lst', build_grub_cfg($live, $media, $device));
+ mkdir_p($live->{mnt} . $media_boot . '/grub');
+ cp_f(get_builddir($live) . $live->{prefix}{build}{boot} . '/gfxmenu', $live->{mnt} . $media_boot);
+ output_p($live->{mnt} . $media_boot . '/grub/menu.lst', build_grub_cfg($live, $media, $device));
unlink $grub_device_map;
}
@@ -1184,8 +1202,8 @@ sub record_usb_master {
my $root = get_system_root($live);
substInFile {
s!^\s*exec_prefix=.*!exec_prefix=$root!;
- s!^\s*grub_prefix=/boot/!grub_prefix=$live->{prefix}{media}{boot}/!;
- s!^\s*bootdir=(.*)/boot$!bootdir=$1$live->{prefix}{media}{boot}!;
+ s!^\s*grub_prefix=/boot/!grub_prefix=${media_boot}/!;
+ s!^\s*bootdir=(.*)/boot$!bootdir=$1${media_boot}!;
} $local_grub_install;
my $master_device = $device;
@@ -1220,7 +1238,7 @@ sub record_usb_master {
}
} : sub {},
'rsync', '-vdP', '--inplace', '--files-from=' . $list_file,
- $loopbacks_source, $live->{mnt} . $live->{prefix}{media}{loopbacks},
+ $loopbacks_source, $live->{mnt} . $media_loopbacks,
);
unlink $list_file;
if (!$r) {
@@ -1240,7 +1258,7 @@ sub record_usb_master {
if (get_media_setting($media, 'fs') eq 'vfat') {
mtools_run_('mattrib', '+h', '-i', $device, '::' . $_) foreach @hidden_files;
mtools_run_('mattrib', '+r', '+s', '-/', '-i', $device, '::' . $_)
- foreach $live->{prefix}{media}{boot}, $live->{prefix}{media}{loopbacks};
+ foreach $media_boot, $media_loopbacks;
}
}
@@ -1315,7 +1333,9 @@ sub copy_wizard {
file => N("Select a file"),
);
my ($source_type, $source_path);
- my $source_is_mounted = sub { -d ($live->{settings}{builddir} . $live->{prefix}{media}{boot}) };
+ my $media_boot = get_media_prefix($live, 'boot');
+ my $media_loopbacks = get_media_prefix($live, '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});
@@ -1333,7 +1353,7 @@ sub copy_wizard {
},
source => {
name => N("Which live system do you want to copy?"),
- data => [ if_(-d ($live_media . $live->{prefix}{media}{loopbacks}),
+ data => [ if_(-d ($live_media . $media_loopbacks),
{ type => 'list', val => \$source_type,
list => sort(keys(%source_types)),
format => sub { $source_types{$_[0]} } }),
@@ -1353,7 +1373,7 @@ sub copy_wizard {
0;
},
post => sub {
- my $boot = $live->{settings}{builddir} . $live->{prefix}{media}{boot};
+ my $boot = $live->{settings}{builddir} . $media_boot;
@available_storage = sort(grep { -d "$boot/$_" && exists $storage{$_}{detect} } all($boot));
if (@available_storage == 1) {
$storage = $available_storage[0];
@@ -1469,9 +1489,10 @@ sub complete_config {
scripts => '/scripts',
},
media => {
- # FIXME: CDROM image for USB systems use wrong boot directory
- boot => $live->{system}{hide_media_dirs} ? '/.boot' : '/boot',
- loopbacks => $live->{system}{hide_media_dirs} ? '/.loopbacks' : '/loopbacks',
+ boot => '/boot',
+ hidden_boot => '/.boot',
+ loopbacks => '/loopbacks',
+ hidden_loopbacks => '/.loopbacks',
mnt => '/media',
},
live => {