summaryrefslogtreecommitdiffstats
path: root/rescue/tree/etc/oem-all
diff options
context:
space:
mode:
Diffstat (limited to 'rescue/tree/etc/oem-all')
-rwxr-xr-xrescue/tree/etc/oem-all606
1 files changed, 606 insertions, 0 deletions
diff --git a/rescue/tree/etc/oem-all b/rescue/tree/etc/oem-all
new file mode 100755
index 000000000..7af7e70ab
--- /dev/null
+++ b/rescue/tree/etc/oem-all
@@ -0,0 +1,606 @@
+#!/usr/bin/perl
+
+if (shift(@ARGV) ne '-f') {
+ print "Call it with option -f, but don't fear loosing all your data, this command is dangerous!";
+ print "
+usage: /etc/oem -f [options]
+where [options] are:
+ server : allow server installalation
+ boot_entries=entry1,...,entryN : set boot entries to use,
+ the first one is the default one
+ no<option> : disable options <option>
+";
+ exit 1;
+}
+my (%options, $yes, $hd, $hdp, $cd, $fs);
+
+#- avoid globing as it is not available in rescue ramdisk.
+foreach my $device (split ' ', `/bin/ls -d /proc/ide/hd*`) {
+ open F, "$device/media" or next;
+ foreach (<F>) {
+ /disk/ and do { $hd ||= $device; $hd =~ s,/proc/ide/,,; };
+ /cdrom/ and do { $cd ||= $device; $cd =~ s,/proc/ide/,,; };
+ }
+ close F;
+}
+#- examine available SCSI devices (avoid SCSI floppies like LS-120 or ZIP disk or generic floppies).
+eval {
+ system "/usr/bin/drvinst"; #- load scsi drivers else it wont do anything.
+
+ my ($driveNum, $cdromNum) = (0, 0);
+ open F, "/proc/scsi/scsi" or die "no scsi available";
+ local $_ = <F>; /^Attached devices:/ or die "to attached devices found";
+ while ($_ = <F>) {
+ my ($id) = /^Host:.*?Id: (\d+)/ or die "no host found";
+ $_ = <F>; my ($vendor, $model) = /^\s*Vendor:\s*(.*?)\s+Model:\s*(.*?)\s+Rev:/ or die "no vendor nor model found";
+ $_ = <F>; my ($type) = /^\s*Type:\s*(.*)/;
+ if ($type =~ /Direct-Access/ && $model !~ /ZIP\s+\d+|LS-?120|144MB|[Ff]loppy/) {
+ $hd ||= "sd" . chr($driveNum++ + ord('a'));
+ } elsif ($type =~ /CD-ROM/) {
+ $cd ||= "scd" . $cdromNum++;
+ }
+ }
+ close F;
+};
+#- examine DAC960 device.
+#- there is a problem as there is no more than 7 partitions available, this means no /home and no /var.
+unless ($hd) {
+ local $_;
+ open F, "dmesg |";
+ while (<F>) {
+ m|/dev/(rd/.*?): .*?,| and $hd ||= $1, last;
+ }
+ close F;
+ if ($hd) {
+ my ($c_id, $d_id) = $hd =~ m|rd/c(\d+)d(\d+)|;
+ -d "/dev/rd" or mkdir "/dev/rd";
+ system "mknod", "/dev/$hd", "b", 48+$c_id, 8*$d_id;
+ foreach (1..7) {
+ system "mknod", "/dev/${hd}p$_", "b", 48+$c_id, 8*$d_id+$_;
+ }
+ $hdp = $hd . 'p';
+ }
+}
+#- examine Compaq Smart Array device.
+unless ($hd) {
+ foreach ('array/ida', 'cpqarray/ida', 'cciss/cciss') {
+ my $prefix = "/proc/driver/$_"; #- kernel 2.4 places it here
+ $prefix = "/proc/$_" if !-e "${prefix}0"; #- kernel 2.2
+
+ my ($name) = m|/(.*)|;
+ for (my $i = 0; -r ($f = "${prefix}$i"); $i++) {
+ local $_;
+ open F, $f;
+ while (<F>) {
+ if (m|^\s*($name/.*?):|) {
+ $hd ||= $1;
+ }
+ }
+ close F;
+ }
+ }
+ if ($hd) {
+ my ($type, $c_id, $d_id) = $hd =~ m,(ida|cciss)/c(\d+)d(\d+),;
+ -d "/dev/$type" or mkdir "/dev/$type";
+ system "mknod", "/dev/$hd", "b", ($type eq 'ida' ? 72 : 104)+$c_id, 16*$d_id;
+ foreach (1..15) {
+ system "mknod", "/dev/${hd}p$_", "b", ($type eq 'ida' ? 72 : 104)+$c_id, 16*$d_id+$_;
+ }
+ $hdp = $hd . 'p';
+ }
+}
+$hd && -e "/dev/$hd" or die "unable to access hard disk";
+print "hd: $hd\ncd: $cd\n";
+$hdp ||= $hd;
+
+#- try to free any reference to hard disk which will be used (as in rescue mode it has already loaded
+#- existing partition in /mnt.
+open F, "/proc/mounts";
+while (<F>) {
+ /$hdp(\d*)\s+(\S+)/ and $already_mounted{$2} = "$hdp$1";
+}
+foreach (sort { $b cmp $a } keys %already_mounted) {
+ print "umounting $already_mounted{$_} from $_\n";
+ system "umount", $_;
+}
+
+#- find a cdrom (like) image, normally a true cdrom but if nfs install is running, use it instead.
+mkdir "/cdrom";
+open F, "/proc/cmdline";
+while (<F>) {
+ /automatic=method:nfs,.*server:([^\s,]*),.*directory:([^\s,]*)/
+ and system "mount", "-r", "-t", "nfs", "$1:$2", "/cdrom", "-o", "nolock";
+}
+close F;
+unless (-e "/cdrom/VERSION") {
+ -e "/dev/$cd" or die "unable to access local cdrom";
+ system "mount", "-r", "-t", "iso9660", "/dev/$cd", "/cdrom";
+}
+
+open F, "/cdrom/VERSION" or die "no installation cdrom found on $cd";
+while (<F>) {
+ /\[boot_entries[=:]([^]]*)\]/ and $options{boot_entries} = $1;
+ /\[ext2\]/ and $options{fs} = "ext2";
+ /\[ext3\]/ and $options{fs} = "ext3";
+}
+close F;
+foreach (@ARGV) { /^([^=:]*)[=:]?(.*)/ and $options{$1} = $2; /^no([^=:]*)/ and delete $options{$1} }
+
+foreach (keys %options) {
+ print "Using option [$_" . ($options{$_} && "=$options{$_}") . "]\n";
+}
+
+#- filesystem to use.
+$fs ||= $options{fs} || "ext3";
+$fs eq "ext3" and system "modprobe", "ext3";
+print "Using filesystem of type $fs\n";
+
+#- check for already existing partition table, if none are found
+#- create 3 partitions (one for install, one for swap and one for root).
+#- if only a fat partition is found, resize it do include the above partition.
+#- other combination are really dangerous and are not supported, ask
+#- the user that all data on the disk will be erased and go on.
+my ($heads, $sectors, $cylinders, $hd_size, @hd_parts);
+sub correct_start_end {
+ my ($rstart, $end, $keep_start) = @_;
+ my ($cylinder_size, $c_start, $c_end) = ($sectors*$heads*512/1024/1024, undef, undef);
+ if (abs($cylinder_size*$cylinders-$hd_size)/$hd_size < 0.01) {
+ $c_start = $$rstart+($keep_start ? 0 : $cylinder_size/$heads);
+ $c_end = $cylinder_size*int(1/2+$end/$cylinder_size);
+ $c_end > $hd_size and $c_end = $hd_size;
+ $$rstart = $c_end;
+ } else {
+ $c_start = $$rstart;
+ $c_end = $end;
+ $c_end > $hd_size and $c_end = $hd_size;
+ $$rstart = $c_end+5; #- fall back to use a problable safe method.
+ }
+ $c_start >= $c_end and die "no space left for partitionning\n";
+ ($c_start, $c_end);
+}
+open F, "fdisk -l /dev/$hd |";
+while (<F>) {
+ /(\d+)\s*heads/ and $heads = $1;
+ /(\d+)\s*sectors/ and $sectors = $1;
+ /(\d+)\s*cylinders/ and $cylinders = $1;
+}
+if ($heads == 1 && $cylinders == 1) {
+ $cylinders = $sectors / 255 / 63;
+ $heads = 255;
+ $sectors = 63;
+}
+close F;
+for (1..2) {
+ open F, "parted /dev/$hd -s print |";
+ while (<F>) {
+ /^Disk geometry [^:]*:\s*([\d\.]+)-([\d\.]+)/ and do { $hd_size = $2 - $1 - 1 };
+ #/^Disk label type:\s*msdos/ and do { $hd_type = 'msdos' };
+ /^(\d+)\s+([\d\.]+)\s+([\d\.]+)\s+(primary|logical|extended)\s*(\S*)/ and do {
+ #- this automatically drops extended partition here!
+ push @hd_parts, { minor => $1, start => $2, end => $3, type => $4, fstype => $5 };
+ };
+ }
+ close F;
+ $hd_size and last;
+ print "Unable to detect partition on disk, trying with new label\n";
+ do {
+ print "
+
+I'm going to install the OEM version on your hard drive
+!!ALL DATA WILL BE LOST!!
+
+Type \`\`yes'' and [enter] to go on\n"
+ } while (($yes = <STDIN>) !~ /^\s*yes\s*$/i);
+ system "parted", "/dev/$hd", "mklabel", "msdos";
+}
+my ($min_size, $def_size, $trigger_size, $inst_size, $swap_size) = (4000, 3500, 4000, 1500, 128);
+$hd_size > $min_size or die "hard disk is too small to contain oem install (${hd_size}MB found, need $min_size at least)";
+
+my ($fat_pos, $resize_fat_size, $root_size);
+if (@hd_parts == 1 && $hd_parts[$fat_pos = 0]{fstype} eq 'FAT' ||
+ @hd_parts == 2 && $hd_parts[0]{type} eq 'primary' && $hd_parts[$fat_pos = 1]{fstype} eq 'FAT' ||
+ @hd_parts == 3 && $hd_parts[0]{type} eq 'primary' && $hd_parts[1]{type} eq 'primary' && $hd_parts[$fat_pos = 2]{fstype} eq 'FAT' ||
+ @hd_parts == 2 && $hd_parts[0]{type} eq 'extended' && $hd_parts[$fat_pos = 1]{fstype} eq 'FAT' ||
+ @hd_parts == 3 && $hd_parts[0]{type} eq 'extended' && $hd_parts[1]{type} eq 'primary' && $hd_parts[$fat_pos = 5]{fstype} eq 'FAT') {
+ if ($hd_size - $hd_parts[$fat_pos]{end} > $min_size) {
+ #- check first if there are some available space left on the disk.
+ #- so we are using it, root_size is fixed to match hard disk size.
+ $resize_fat_size = 0;
+ $root_size = $hd_size - $hd_parts[$fat_pos]{end} - $inst_size - $swap_size;
+ $root_size > $trigger_size and $root_size = $def_size;
+ } elsif ($hd_size > 2*$min_size) {
+ #- resize this fat partition.
+ $resize_fat_size = 0.5 * $hd_size;
+ $root_size = $hd_size - $resize_fat_size - $inst_size - $swap_size;
+ $root_size > $trigger_size and $root_size = $def_size;
+ }
+}
+unless ($root_size) {
+ #- there have not been defined above, so remove everything and start from
+ #- a blank partition.
+ $resize_fat_size = undef;
+ $root_size = $hd_size - $resize_fat_size - $inst_size - $swap_size;
+ $root_size > $trigger_size and $root_size = $def_size;
+}
+
+#- launch parted to edit partition table, start at minor.
+#- point define where we start.
+my $minor = defined $resize_fat_size && $hd_parts[0]{type} eq 'extended' ? 6 : 5;
+my $point = 0.0;
+
+if (defined $resize_fat_size) {
+ do {
+ print "
+
+!!An existing Windows partition has been found and will be kept.
+Additional Linux partitions will be created!!
+
+Type \`\`yes'' and [enter] to go on\n"
+ } while (($yes = <STDIN>) !~ /^\s*yes\s*$/i);
+ #- keep the current partition table, and try to resize the fat partition
+ #- if the size is not 0.
+ #- KEEP IN MIND there is only one partition defined.
+ open F, "| parted -s /dev/$hd";
+ if ($resize_fat_size) {
+ $point = $hd_parts[$fat_pos]{start};
+ printf F "resize %d %s %s\n", $hd_parts[$fat_pos]{minor}, correct_start_end(\$point, $point+$resize_fat_size, 'keepstart');
+ } else {
+ $point = $hd_parts[$fat_pos]{end};
+ }
+ $point+=9; #- keep blank space between partitions if parted cannot handle partition table correctly.
+} else {
+ unless (defined $yes) {
+ do {
+ print "
+
+I'm going to install the OEM version on your hard drive
+!!ALL DATA WILL BE LOST!!
+
+Type \`\`yes'' and [enter] to go on\n"
+ } while (($yes = <STDIN>) !~ /^\s*yes\s*$/i);
+ }
+ #- build a new disk label here.
+ open F, "| parted -s /dev/$hd";
+ print F "mklabel msdos\n";
+}
+
+#- at this point, the partition are created.
+my ($instz, $inst, $swap, $root, $var, $home) = ($minor-1, $minor, $minor+1, $minor+2, undef, undef);
+
+#- all linux partition are stored inside an extended partition, this is easier to manipulate after.
+if ($minor == 5) {
+ print F "mkpart extended $point $hd_size\n";
+} else {
+ $hd_parts[0]{type} eq 'extended' or die "first partition assumed to be extended";
+ $point = $hd_parts[0]{start};
+ print F "resize $hd_parts[0]{minor} $point $hd_size\n";
+}
+printf F "mkpart logical ext2 %s %s\n", correct_start_end(\$point, $point+$inst_size);
+printf F "mkpart logical linux-swap %s %s\n", correct_start_end(\$point, $point+$swap_size);
+printf F "mkpart logical %s %s %s\n", $fs, correct_start_end(\$point, $point+$root_size);
+if (exists $options{server} && $hd !~ /^rd\//) {
+ my $var_size = ($hd_size - $point) / 2;
+ if ($var_size > 1500) {
+ $var = $root+1;
+ printf F "mkpart logical %s %s %s\n", $fs, correct_start_end(\$point, $point+$var_size);
+ }
+}
+if ($hd_size - $point > 100 && $hd !~ /^rd\//) {
+ $home = ($var || $root) + 1;
+ printf F "mkpart logical %s %s %s\n", $fs, correct_start_end(\$point, $hd_size);
+}
+print F "quit\n";
+close F or die "unable to partition the disk $hd";
+
+#- we have to build swap and mount it.
+print "Setting swap\n";
+system "mkswap", "/dev/$hdp$swap";
+system "swapon", "/dev/$hdp$swap";
+
+#- we have to format using right fs.
+print "Formatting /dev/$hdp$inst partition\n";
+mkfs("ext2", "/dev/$hdp$inst");
+print "Formatting /dev/$hdp$root partition\n";
+mkfs($fs, "/dev/$hdp$root");
+if ($var) {
+ print "Formatting /dev/$hdp$var partition\n";
+ mkfs($fs, "/dev/$hdp$var");
+}
+if ($home) {
+ print "Formatting /dev/$hdp$home partition\n";
+ mkfs($fs, "/dev/$hdp$home");
+}
+
+print "Mounting partitions\n";
+mkdir "/hd";
+system "mount", "-t", "ext2", "/dev/$hdp$inst", "/hd";
+mkdir "/mnt";
+system "mount", "-t", $fs, "/dev/$hdp$root", "/mnt";
+if ($var) {
+ mkdir "/mnt/var";
+ system "mount", "-t", $fs, "/dev/$hdp$var", "/mnt/var";
+}
+if ($home) {
+ mkdir "/mnt/home";
+ system "mount", "-t", $fs, "/dev/$hdp$home", "/mnt/home";
+}
+
+print "Copying installation on hard drive\n";
+mkdir "/hd/boot";
+if (-e "/cdrom/oem/vmlinuz" && -e "/cdrom/oem/all.rdz") {
+ system "cp", "-a", "/cdrom/oem/vmlinuz", "/hd/boot/vmlinuz";
+ system "cp", "-a", "/cdrom/oem/all.rdz", "/hd/boot/all.rdz";
+} elsif (-e "/cdrom/boot/vmlinuz" && -e "/cdrom/boot/hd.rdz") {
+ system "cp", "-a", "/cdrom/boot/vmlinuz", "/hd/boot/vmlinuz";
+ system "cp", "-a", "/cdrom/boot/hd.rdz", "/hd/boot/all.rdz";
+} elsif (-e "/cdrom/images/hd.img") {
+ mkdir "/tmp/hd";
+ system "modprobe", "loop";
+ system "modprobe", "vfat";
+ system "mount", "-t", "vfat", "/cdrom/images/hd.img", "/tmp/hd", "-o", "loop";
+ system "cp", "-a", "/tmp/hd/vmlinuz", "/hd/boot/vmlinuz";
+ system "cp", "-a", "/tmp/hd/hd.rdz", "/hd/boot/all.rdz";
+ system "umount", "/tmp/hd";
+} else {
+ die "no installation stage1 found";
+}
+
+mkdir "/hd/Mandrake";
+mkdir "/hd/Mandrake/RPMS";
+system "cp", "-a", "/cdrom/VERSION", "/hd";
+system "cp", "-a", "/cdrom/Mandrake/base", "/cdrom/Mandrake/mdkinst", "/hd/Mandrake";
+
+if (open F, ">/hd/Mandrake/oem_patch.pl") {
+ print "Setting OEM specific extension to DrakX\n";
+ if (exists $options{server}) {
+ print F q{
+ use install_steps;
+ package install_steps;
+ undef *choosePackages;
+ *choosePackages = sub {
+ my ($o, $packages, $compssUsers, $first_time) = @_;
+
+ #- make sure we kept some space left for available else the system may
+ #- not be able to start (xfs at least).
+ my $available = install_any::getAvailableSpace($o);
+ my $availableCorrected = pkgs::invCorrectSize($available / sqr(1024)) * sqr(1024);
+
+ #- avoid destroying user selection of packages but only
+ #- for expert, as they may have done individual selection before.
+ install_any::unselectMostPackages($o);
+
+ #- use specific OEM packages selection, go to level 5
+ #- and disable some extension.
+ $o->{compssUsersChoice}{$_} = 0 foreach 'GNOME';
+ $o->{compssUsersChoice}{$_} = 0
+ foreach map { @{$o->{compssUsers}{$_}{flags}} } 'Workstation|Office Workstation', 'Workstation|Internet station';
+ $o->{compssListLevel} = 5;
+ pkgs::setSelectedFromCompssList($packages, $o->{compssUsersChoice}, $o->{compssListLevel}, $availableCorrected);
+
+ $availableCorrected;
+ };
+ };
+ } else {
+ print F q{
+ use install_steps;
+ package install_steps;
+ undef *choosePackages;
+ *choosePackages = sub {
+ my ($o, $packages, $compssUsers, $first_time) = @_;
+
+ #- make sure we kept some space left for available else the system may
+ #- not be able to start (xfs at least).
+ my $available = install_any::getAvailableSpace($o);
+ my $availableCorrected = pkgs::invCorrectSize($available / sqr(1024)) * sqr(1024);
+
+ #- avoid destroying user selection of packages but only
+ #- for expert, as they may have done individual selection before.
+ install_any::unselectMostPackages($o);
+
+ #- use specific OEM packages selection, go to level 4.
+ #- and select at least GAMES group, everything else has
+ #- already be selected during master preparation.
+ $o->{compssListLevel} = 4;
+ $o->{compssUsersChoice}{GAMES} = 1;
+ pkgs::setSelectedFromCompssList($packages, $o->{compssUsersChoice}, $o->{compssListLevel}, $availableCorrected);
+
+ $availableCorrected;
+ };
+ };
+ }
+ if ($options{boot_entries}) {
+ print "Setting OEM specific extension for boot entries\n";
+ print F q{
+ my $sorted_entries = q(} . $options{boot_entries} . q{); #- insert boot_entries options here as string q(...).
+ my $old_setupBootloaderBefore = \&setupBootloaderBefore;
+ undef *setupBootloaderBefore;
+ *setupBootloaderBefore = sub {
+ $old_setupBootloaderBefore->(@_);
+ my @entries = split ',', $sorted_entries;
+ my @result_entries;
+ foreach my $p (@entries) {
+ foreach (@{$_[0]{bootloader}{entries}}) {
+ $_->{label} eq $p and push @result_entries, $_;
+ }
+ }
+ if (@result_entries) {
+ $_[0]{bootloader}{entries} = \@result_entries;
+ $_[0]{bootloader}{default} = $result_entries[0]{label}; #- first image is default.
+ }
+ };
+ };
+ }
+ close F;
+}
+
+print "Setting bootloader\n";
+mkdir "/hd/boot/grub";
+foreach (1..2) {
+ -e "/hd/boot/grub/stage$_" or system "cp", "-a", "/boot/grub/stage$_", "/hd/boot/grub";
+}
+open F, ">/hd/boot/grub/menu.lst";
+if (defined $resize_fat_size) {
+ print F "timeout 5\n";
+ print F "color black/cyan yellow/cyan\n\n";
+ print F "title linux\n";
+} else {
+ print F "timeout 0\n\n";
+ print F "title oem\n";
+}
+print F "kernel (hd0,$instz)/boot/vmlinuz ramdisk_size=32000 automatic=method:disk,disk:$hd,partition:$hdp$inst,directory:/ hd vga=788 fbeginner oem defcfg=/tmp/hdimage/Mandrake/oem_patch.pl\n";
+print F "initrd (hd0,$instz)/boot/all.rdz\n";
+#- if a windows partition is available, add an entrie for it.
+if (defined $resize_fat_size) {
+ print F "\ntitle windows\n";
+ printf F "rootnoverify (hd0,%s)\n", $hd_parts[$fat_pos]{minor}-1;
+ print F "makeactive\n";
+ print F "chainloader +1\n";
+}
+close F;
+open F, ">/hd/boot/grub/device.map";
+print F "(hd0) /dev/$hd\n";
+close F;
+open F, "| grub --device-map=/hd/boot/grub/device.map --batch";
+print F "install (hd0,$instz)/boot/grub/stage1 d (hd0) (hd0,$instz)/boot/grub/stage2 p (hd0,$instz)/boot/grub/menu.lst\n";
+print F "quit\n";
+close F or die "error while executing grub";
+
+my $packages = read_depslist("/cdrom/Mandrake/base/depslist.ordered");
+
+my @media;
+open F, "/cdrom/Mandrake/base/hdlists";
+foreach (<F>) {
+ chomp;
+ s/\s*#.*$//;
+ /^\s*$/ and next;
+ m/^\s*(hdlist\S*\.cz2?)\s+(\S+)\s*(.*)$/ or die "invalid hdlist description \"$_\" in hdlists file";
+
+ push @media, { hdlist => $1, rpmsdir => $2, descr => $3 };
+}
+close F;
+
+#- initialize installation.
+foreach (qw(/etc /etc/sysconfig /etc/rpm /var /var/lib /var/lib/rpm /var/log /proc)) {
+ mkdir "/mnt/$_";
+}
+system "mount", "-t", "proc", "proc", "/mnt/proc";
+open F, ">/mnt/etc/fstab";
+print F "/dev/$hdp$root / $fs defaults 1 1\n";
+if ($var) {
+ print F "/dev/$hdp$var /var $fs defaults 1 2\n";
+}
+if ($home) {
+ print F "/dev/$hdp$home /home $fs defaults 1 2\n";
+}
+close F;
+
+#- keep in mind all the rpm files available (according to hdlists).
+my (%files, %rpms);
+
+require packdrake;
+foreach my $medium (@media) {
+ my $packer = new packdrake("/cdrom/Mandrake/base/$medium->{hdlist}");
+ foreach (@{$packer->{files}}) {
+ $packer->{data}{$_}[0] eq 'f' or next;
+ my ($fullname, $file) = /([^:]*):(.*)/ ? ($1, "$2.rpm") : ($_, "$_.rpm");
+ $files{$fullname} = $file;
+ $rpms{$file} = $medium->{rpmsdir};
+ }
+}
+
+#- copy and install from each cd image.
+foreach my $medium (@media) {
+ while ($cd && ! -d "/cdrom/$medium->{rpmsdir}") {
+ system "unmount", "/dev/$cd";
+ system "eject", "/dev/$cd";
+ print "Please insert the cdrom labeled \"$medium->{descr}\"\n and press [enter] when done\n";
+ $yes = <STDIN>;
+ system "mount", "-r", "-t", "iso9660", "/dev/$cd", "/cdrom";
+ }
+
+ print "Copying packages from medium labeled \"$medium->{descr}\" to hard disk\n";
+ system "mkdir", "-p", "/hd/$medium->{rpmsdir}";
+ foreach my $pkg (@{$packages->{depslist}}) {
+ $files{rpm_fullname($pkg)} or next;
+ my $file = "/cdrom/$medium->{rpmsdir}/" . $files{rpm_fullname($pkg)};
+ if (-e $file) {
+ print " copying " . rpm_fullname($pkg) . "\n";
+ system "cp", "-a", $file, "/hd/$medium->{rpmsdir}";
+ }
+ }
+}
+
+#- try to figure out if a oem-message-graphic already exists.
+#- if this is the case, rename it to /mnt/boot/message-graphic
+if (-e "/cdrom/Mandrake/base/oem-message-graphic") {
+ print "Using specific oem graphic image\n";
+ if (-e "/mnt/boot/message-graphic") {
+ rename "/mnt/boot/message-graphic", "/mnt/boot/message-graphic.old";
+ system "cp", "-a", "/cdrom/Mandrake/base/oem-message-graphic", "/mnt/boot/message-graphic";
+ } elsif (-e "/mnt/boot/lilo-graphic/message") {
+ rename "/mnt/boot/lilo-graphic/message", "/mnt/boot/lilo-graphic/message.old";
+ system "cp", "-a", "/cdrom/Mandrake/base/oem-message-graphic", "/mnt/boot/lilo-graphic/message";
+ }
+}
+
+#- clean all initrd image which may have been built.
+system "rm -f /mnt/boot/initrd*";
+
+system "umount", "/mnt/proc";
+$home and system "umount", "/mnt/home";
+$var and system "umount", "/mnt/var";
+system "umount", "/mnt";
+system "umount", "/hd";
+system "umount", "/cdrom";
+
+$cd and system "eject", "/dev/$cd";
+
+print "
+Done. OEM hard drive ready!
+The hard drive is now ready for a customer.
+System is now halted.\n\n";
+
+system "halt";
+
+#- gives way to format partition (simpler approach)
+sub mkfs {
+ my ($fs, $dev) = @_;
+ for ($fs) {
+ /ext2/ and do { system "mkfs.ext2", $dev;
+ next };
+ /ext3/ and do { system "mkfs.ext2", "-j", $dev;
+ system "tune2fs", "-c0", "-i0", $dev;
+ next };
+ die "unknown fs: $_\n";
+ }
+}
+
+sub chop_version {
+ ($_[0] =~ /^([^:\s]*)-[^:\-\s]+-[^:\-\s]+\.[^:\.\-\s]*(?::\S*)?/)[0] || die "unable to parse $_[0]";
+}
+sub rpm_fullname {
+ ($_[0]{name} =~ /^([^:\s]*-[^:\-\s]+-[^:\-\s]+\.[^:\.\-\s]*)(?::\S*)?/)[0] || die "unable to parse $_[0]";
+}
+
+sub read_depslist {
+ my ($file) = @_;
+ my $packages = { depslist => [], names => {} };
+
+ #- read depslist.oredered file.
+ my $id = 0;
+
+ open F, "$file" or die "unable to open ordered dependencies list file";
+ while (<F>) {
+ my ($name, $size, @deps) = split;
+ push @{$packages->{depslist}}, { id => $id++, name => $name, size => $size, deps => \@deps };
+ }
+ close F;
+
+ foreach (@{$packages->{depslist}}) {
+ $packages->{names}{chop_version($_->{name})} = $_;
+ }
+
+ print "read " . scalar(@{$packages->{depslist}}) . " package dependancies\n";
+ $packages;
+}
+