diff options
-rw-r--r-- | perl-install/Makefile | 40 | ||||
-rw-r--r-- | perl-install/c/Makefile.PL | 1 | ||||
-rw-r--r-- | perl-install/install2.pm | 20 | ||||
-rw-r--r-- | perl-install/install_steps.pm | 11 | ||||
-rw-r--r-- | perl-install/install_steps_stdio.pm | 196 | ||||
-rw-r--r-- | perl-install/partition_table.pm | 15 | ||||
-rw-r--r-- | perl-install/share/list | 37 |
7 files changed, 289 insertions, 31 deletions
diff --git a/perl-install/Makefile b/perl-install/Makefile index d05997e96..220488b25 100644 --- a/perl-install/Makefile +++ b/perl-install/Makefile @@ -1,13 +1,13 @@ SO_FILES = c/blib/arch/auto/c/c.so PMS = *.pm c/*.pm resize_fat/*.pm commands diskdrake -DEST = /tmp/t +DEST = /tmp/t/Mandrake/instimage DESTREP4PMS = $(DEST)/usr/bin/perl-install PERL = perl LOCALFILES = $(PERL) mouseconfig fr.map .PHONY: all tags install clean verify_c -all: $(SO_FILES) +all: $(SO_FILES) install1_hd tags: etags -o - $(PMS) | perl2etags > TAGS @@ -21,10 +21,10 @@ tar: clean cd .. ; tar cfy perl-install.tar.bz2 $(LOCALFILES:%=--exclude %) perl-install tar-diskdrake: clean - cd .. ; cp -af perl-install diskdrake + cd .. ; rm -rf diskdrake ; cp -af perl-install diskdrake l=`perl2fcalls -uses -excludec diskdrake | sort | uniq | sed -e 's/::/\//' -e 's/^/diskdrake\//' -e 's/$$/.pm/'` ; \ - cd .. ; tar cfvy diskdrake.tar.bz2 diskdrake/diskdrake $$l + cd .. ; tar cfz diskdrake.tgz --exclude CVS diskdrake/c diskdrake/diskdrake* $$l c/c.xs: c/c.xs.pm rm -f $@ @@ -35,6 +35,9 @@ $(SO_FILES): c/c.xs test -e c/Makefile || (cd c; perl Makefile.PL) $(MAKE) -C c +install1_hd: install1_hd.c + $(CC) -static -Wall -o $@ $< + test_pms: verify_c perl2fcalls -excludec install2.pm (for i in $(PMS); do perl -cw -I. -Ic -Ic/blib/arch $$i || exit 1 ; done) @@ -64,20 +67,21 @@ install_pms: $(SO_FILES) get_needed_files: $(SO_FILES) # export PERL_INSTALL_TEST=1 ; strace -f -e trace=file -o '| grep -v "(No such file or directory)" | sed -e "s/[^\"]*\"//" -e "s/\".*//" | grep "^/" | grep -v -e "^/tmp" -e "^/home" -e "^/proc" -e "^/var" -e "^/dev" -e "^/etc" -e "^/usr/lib/rpm" > /tmp/list ' $(PERL) -d install2.pm < /dev/null cp -f list /tmp/list - for i in $(LOCALFILES) `cat /tmp/list` ; do \ + for i in c/blib/arch/auto/c/c.so $(LOCALFILES) `cat /tmp/list` ; do \ ldd $$i 2>/dev/null | sed -e 's/.*=> //' -e 's/ .*//' | uniq | sort >> /tmp/list; \ done install -d $(DEST)/lib install -d $(DEST)/bin install -d $(DEST)/usr/bin + install -d $(DEST)/usr/lib install -s $(LOCALFILES) $(DEST)/usr/bin for i in `cat /tmp/list`; do \ if (echo $$i | grep "lib/[^/]*\.so"); then \ install -s $$i $(DEST)/lib; \ else \ - d=`echo $(DEST)/$$i | sed -e 's/\/usr\/local\//\/usr\//' -e 's/\/sbin\//\/bin\//'`; \ + d=`echo $(DEST)/$$i | sed 's/\/usr\/local\//\/usr\//'`; \ install -d `dirname $$d` && \ if (echo $$i | grep "\.pm"); then \ perl -pe '$$_ eq "__END__" and exit(0);' $$i > $$d; \ @@ -88,14 +92,13 @@ get_needed_files: $(SO_FILES) fi; \ done - ln -sf ../usr/bin/tr $(DEST)/bin/tr - ln -sf sh $(DEST)/bin/bash - ln -sf ash $(DEST)/bin/sh - ln -sf ../../bin/sh $(DEST)/usr/bin/sh - ln -sf ../../bin/mke2fs $(DEST)/usr/bin/mke2fs + mv -f $(DEST)/bin/* $(DEST)/sbin/* $(DEST)/usr/bin + rmdir $(DEST)/bin $(DEST)/sbin + + ln -s ash $(DEST)/usr/bin/sh - install -d $(DEST)/lib/fonts - cp -a /usr/lib/X11/fonts/misc $(DEST)/lib/fonts + install -d $(DEST)/usr/X11R6/lib/X11/fonts/ + cp -a /usr/X11R6/lib/X11/fonts/misc $(DEST)/usr/X11R6/lib/X11/fonts/ echo -e "#!/usr/bin/perl\n\nsymlink '/tmp/rhimage/usr/lib/perl5', '/usr/lib/perl5';\nexec '/usr/bin/sh'" > $(DEST)/usr/bin/runinstall2 chmod a+x $(DEST)/usr/bin/runinstall2 @@ -108,15 +111,14 @@ as_root: chmod a+w /mnt/initrd full_stage2: - rm -rf $(DEST)/[^M]* - rm -f $(DEST)/Mandrake/instimage ; ln -s .. $(DEST)/Mandrake/instimage - @#mkdir -p $(DEST)/Mandrake/base - @#ln -s .. $(DEST)/Mandrake/instimage + rm -rf $(DEST) + mkdir $(DEST) $(MAKE) get_needed_files $(MAKE) stage2 stage2: $(MAKE) install_pms + cd $(DEST) ; tar cfz $(DEST).tgz [^M]* ; mv $(DEST).tgz /tmp/t.tgz @#rm -rf /mnt/initrd/* @#cp -a $(DEST)/* /mnt/initrd @@ -125,3 +127,7 @@ stage2: # function f() { grep "$*" /usr/include/*.h /usr/include/*/*.h; } + +# dd if=/dev/zero of=/tmp/initrd bs=1k count=2000 ; echo y | mke2fs /tmp/initrd ; mount /tmp/initrd /mnt/disk/ -o loop ; cp -a /tmp/disk/* /mnt/disk/ ; umount /mnt/disk ; gzip -c /tmp/initrd > /tmp/initrd.img ; mcopy -o /tmp/initrd.img a: +# mount /tmp/initrd /mnt/disk/ -o loop ; ; umount /mnt/disk ; gzip -c /tmp/initrd > /tmp/initrd.img ; mcopy -o /tmp/initrd.img a: + diff --git a/perl-install/c/Makefile.PL b/perl-install/c/Makefile.PL index 0562ec1a3..f9d2309f8 100644 --- a/perl-install/c/Makefile.PL +++ b/perl-install/c/Makefile.PL @@ -5,7 +5,6 @@ WriteMakefile( 'NAME' => 'c', 'VERSION_FROM' => 'c.pm', # finds $VERSION 'LIBS' => ['-lrpm -ldb1 -lz -L/usr/X11R6/lib -lX11 -lgdk'], # e.g., '-lm' -# 'OBJECT' => 'c.o librpm.a', 'DEFINE' => '', # e.g., '-DHAVE_SOMETHING' 'INC' => '-Wall `gtk-config --cflags`', # e.g., '-I/usr/include/other' ); diff --git a/perl-install/install2.pm b/perl-install/install2.pm index fc75182e5..4ae7c89b8 100644 --- a/perl-install/install2.pm +++ b/perl-install/install2.pm @@ -84,7 +84,7 @@ my @serverPartitioning = ( ); my $default = { -# display => "192.168.1.8:0", +# display => "jaba:1", user => { name => 'foo', password => 'foo', shell => '/bin/bash', realname => 'really, it is foo' }, rootPassword => 'toto', lang => 'us', @@ -94,13 +94,14 @@ my $default = { mkbootdisk => 0, comps => [ qw() ], packages => [ qw() ], - partitionning => { clearall => 1, eraseBadPartitions => 1, autoformat => 1 }, + partitionning => { clearall => 0, eraseBadPartitions => 1, autoformat => 1 }, partitions => [ { mntpoint => "/boot", size => 16 << 11, type => 0x83 }, { mntpoint => "/", size => 300 << 11, type => 0x83 }, { mntpoint => "swap", size => 64 << 11, type => 0x82 }, # { mntpoint => "/usr", size => 400 << 11, type => 0x83, growable => 1 }, ], + shells => [ map { "/bin/$_" } qw(bash tcsh zsh ash) ], }; $o = { default => $default }; @@ -113,6 +114,8 @@ sub selectPath { sub selectInstallClass { $o->{installClass} = $o->selectInstallClass; + $testing and $o->{default}->{partitionning}->{clearall} = 1; + if ($o->{installClass} eq 'Server') { #TODO } @@ -138,7 +141,12 @@ sub partitionDisks { unless ($testing) { # Write partitions to disk - foreach (@{$o->{hds}}) { partition_table::write($_); } + my $need_reboot = 0; + foreach (@{$o->{hds}}) { + eval { partition_table::write($_); }; + $need_reboot ||= $@; + } + $need_reboot and $o->rebootNeeded; } } @@ -164,6 +172,12 @@ sub findInstallFiles { sub choosePackages { $o->choosePackages($o->{packages}, $o->{comps}); + + $o->{comps}->{Base}->{selected} = 1; + + foreach (grep { $_->{selected} } values %{$o->{comps}}) { + foreach (@{$_->{packages}}) { $_->{selected} = 1 } + } smp::detect() and $o->{packages}->{"kernel-smp"}->{selected} = 1; } diff --git a/perl-install/install_steps.pm b/perl-install/install_steps.pm index ad993b590..779a3bbc4 100644 --- a/perl-install/install_steps.pm +++ b/perl-install/install_steps.pm @@ -46,6 +46,12 @@ sub doPartitionDisks($$) { my ($o, $hds) = @_; fsedit::auto_allocate($hds, $o->{default}->{partitions}); } +sub rebootNeeded($) { + my ($o) = @_; + log::l("Rebooting..."); + exit(0); +} + sub choosePartitionsToFormat($$) { my ($o, $fstab) = @_; @@ -58,10 +64,7 @@ sub choosePartitionsToFormat($$) { sub choosePackages($$$) { my ($o, $packages, $comps) = @_; - foreach ('Base', @{$o->{default}->{comps}}) { - $comps->{$_}->{selected} = 1; - foreach (@{$comps->{$_}->{packages}}) { $_->{selected} = 1; } - } + foreach (@{$o->{default}->{comps}}) { $comps->{$_}->{selected} = 1; } foreach (@{$o->{default}->{packages}}) { $packages->{$_}->{selected} = 1; } } diff --git a/perl-install/install_steps_stdio.pm b/perl-install/install_steps_stdio.pm new file mode 100644 index 000000000..c752e62df --- /dev/null +++ b/perl-install/install_steps_stdio.pm @@ -0,0 +1,196 @@ +package install_steps_stdio; + +use diagnostics; +use strict; +use vars qw(@ISA); + +@ISA = qw(install_steps); + +use common qw(:common); +use partition_table qw(:types); +use devices; +use run_program; +use install_steps; +use install_any; +use diskdrake; +use lang; +use log; + +1; + +sub chooseLanguage($) { + my $lang = ask_from_list('Language', 'Which language do you want?', [ lang::list() ]); + run_program::run('xmodmap', "/usr/bin/$lang.map"); + $lang; +} + +sub selectInstallOrUpgrade($) { + ask_yesorno('Install/Upgrade', 'Do you want to upgrade an already installed Mandrake?'); +} + +sub rebootNeeded($) { + my ($o) = @_; + ask_warn('', "You need to reboot for the partition table modifications to take place"); + $o->SUPER::rebootNeeded; +} + +sub choosePartitionsToFormat($$) { + my ($o, $fstab) = @_; + my @l = grep { $_->{mntpoint} && (isExt2($_) || isSwap($_)) } @$fstab; + my @r = ask_many_from_list('', "Choose the partitions you want to format", + [ map { $_->{mntpoint} } @l ], + [ map { $_->{notFormatted} } @l ]); + for (my $i = 0; $i < @l; $i++) { + $l[$i]->{toFormat} = $r[$i]; + } +} + +sub choosePackages($$$) { + my ($o, $packages, $comps) = @_; + my @comps = values %$comps; + my @r = ask_many_from_list('', + "Choose the packages you want to install", + [ map { $_->{name} } @comps ], + [ map { $_->{selected} } @comps ]); + + for (my $i = 0; $i < @comps; $i++) { + $comps[$i]->{selected} = $r[$i]; + } +} + +sub installPackages { + my $o = shift; + + $::testing and exit 0; + + my $old = \&log::ld; + local *log::ld = sub { + my $m = shift; + if ($m =~ /^starting installing/) { + my $name = first($_[0] =~ m|([^/]*)-.+?-|); + print("installing package $name"); + } else { goto $old } + }; + $o->SUPER::installPackages(@_); +} + + +sub setRootPassword($) { + my ($o) = @_; + + my (%w); + do { + $w{password} and print "You must enter the same password, please try again\n"; + print "Password: "; $w{password} = readln(); + print "Password (again for confirmation): "; + } until ($w{password} eq readln()); + + $o->{default}->{rootPassword} = $w{password}; + $o->SUPER::setRootPassword; +} + +sub addUser($) { + my ($o) = @_; + my %w; + print "\nCreating a normal user account:\n"; + print "Name: "; $w{name} = readln() or return; + do { + $w{password} and print "You must enter the same password, please try again\n"; + print "Password: "; $w{password} = readln(); + print "Password (again for confirmation): "; + } until ($w{password} eq readln()); + print "Real name: "; $w{realname} = readln(); + + $w{shell} = ask_from_list('', 'Shell', $o->{default}->{shells}); + + $o->{default}->{user} = { map { $_ => $w{$_}->get_text } qw(name password realname shell) }; + $o->SUPER::addUser; +} + +sub createBootdisk($) { + my ($o) = @_; + + $o->SUPER::createBootdisk if + $o->{default}->{mkbootdisk} = ask_yesorno('', +"A custom bootdisk provides a way of booting into your Linux system without +depending on the normal bootloader. This is useful if you don't want to install +lilo on your system, or another operating system removes lilo, or lilo doesn't +work with your hardware configuration. A custom bootdisk can also be used with +the Mandrake rescue image, making it much easier to recover from severe system +failures. Would you like to create a bootdisk for your system?"); +} + +sub exitInstall { + ask_warn('', +"Congratulations, installation is complete. +Remove the boot media and press return to reboot. +For information on fixes which are available for this release of Linux Mandrake, +consult the Errata available from http://www.linux-mandrake.com/. +Information on configuring your system is available in the post +install chapter of the Official Linux Mandrake User's Guide."); +} + + + +sub readln { + my $l = <STDIN>; + chomp $l; + $l; +} + +sub ask_warn { + my ($title, @msgs) = @_; + print "----------\n", map { "$_\n" } @_; + print "Press enter"; readln(); +} + +sub ask_yesorno { + my ($title, @msgs) = @_; + print "----------\n", join("\n", @_); + print " (yes/No) "; readln() =~ /y/i; + +} + +sub check_it { + my ($i, $n) = @_; + $i =~ /^\s*\d+\s*$/ && 1 <= $i && $i <= $n +} + +sub ask_from_list { + my ($title, @msgs) = @_; + my $list = pop @msgs; + print "----------\n", map { "$_\n" } @msgs; + my $n = 0; foreach (@$list) { $n++; print "$n: $_\n"; } + my $i; + do { + defined $i and print "Bad choice, try again\n"; + print "Your choice? (1/$n) "; + $i = readln(); + } until (check_it($i, $n)); + $list->[$i - 1]; +} + +sub ask_many_from_list { + my ($title, @msgs) = @_; + my $default = pop @msgs; + my $list = pop @msgs; + my @defaults; + print "----------\n", map { "$_\n" } @msgs; + my $n = 0; foreach (@$list) { + $n++; + print "$n: $_\n"; + push @defaults, $n if $default->[$n - 1]; + } + my $i; + TRY_AGAIN: + defined $i and print "Bad choice, try again\n"; + print "Your choice? (default ", join(',', @defaults), " enter `none' for none) "; + $i = readln(); + my @t = split ',', $i; + foreach (@t) { check_it($_, $n) or goto TRY_AGAIN } + + my @rr = (0) x @$list; + foreach (@t) { $rr[$_ - 1] = 1; } + @rr; +} + diff --git a/perl-install/partition_table.pm b/perl-install/partition_table.pm index d4c8b2484..3ebd47122 100644 --- a/perl-install/partition_table.pm +++ b/perl-install/partition_table.pm @@ -168,7 +168,7 @@ sub read($;$) { $hd->{primary} = $pt; $hd->{extended} = undef; - $clearall and return $hd->{isDirty} = 1; + $clearall and return $hd->{isDirty} = $hd->{needKernelReread} = 1; my @l = (@{$pt->{normal}}, $pt->{extended}); foreach my $i (@l) { foreach (@l) { @@ -226,8 +226,11 @@ sub write($) { $hd->{isDirty} = 0; # now sync disk and re-read the partition table - sync(); - partition_table_raw::kernel_read($hd); + if ($hd->{needKernelReread}) { + sync(); + partition_table_raw::kernel_read($hd); + $hd->{needKernelReread} = 0; + } } sub active($$) { @@ -249,7 +252,7 @@ sub remove($$) { splice(@{$hd->{primary}->{normal}}, $i, 1); %$_ = (); - return $hd->{isDirty} = 1; + return $hd->{isDirty} = $hd->{needKernelReread} = 1; } $i++; } @@ -260,7 +263,7 @@ sub remove($$) { %{$last->{extended}} = $_->{extended} ? %{$_->{extended}} : (); splice(@{$hd->{extended}}, $i, 1); - return $hd->{isDirty} = 1; + return $hd->{isDirty} = $hd->{needKernelReread} = 1; } $last = $_; $i++; @@ -276,7 +279,7 @@ sub add($$) { $part->{notFormatted} = 1; $part->{isFormatted} = 0; $part->{rootDevice} = $hd->{device}; - $hd->{isDirty} = 1; + $hd->{isDirty} = $hd->{needKernelReread} = 1; adjustStartAndEnd($hd, $part); if (is_empty_array_ref($hd->{primary}->{normal})) { diff --git a/perl-install/share/list b/perl-install/share/list new file mode 100644 index 000000000..83ca02797 --- /dev/null +++ b/perl-install/share/list @@ -0,0 +1,37 @@ +/bin/ash +/sbin/mke2fs +/usr/lib/rpm/rpmrc +/usr/X11R6/bin/xmodmap +/usr/X11R6/bin/XF86_VGA16 +/usr/X11R6/lib/X11/locale/compose.dir +/usr/X11R6/lib/X11/locale/iso8859-1/Compose +/usr/X11R6/lib/X11/locale/iso8859-1/XLC_LOCALE +/usr/X11R6/lib/X11/locale/locale.alias +/usr/X11R6/lib/X11/locale/locale.dir +/usr/lib/perl5/5.00503/AutoLoader.pm +/usr/lib/perl5/5.00503/Carp.pm +/usr/lib/perl5/5.00503/Exporter.pm +/usr/lib/perl5/5.00503/SelfLoader.pm +/usr/lib/perl5/5.00503/Term/Cap.pm +/usr/lib/perl5/5.00503/Term/ReadLine.pm +/usr/lib/perl5/5.00503/diagnostics.pm +/usr/lib/perl5/5.00503/dumpvar.pl +/usr/lib/perl5/5.00503/i386-linux/Config.pm +/usr/lib/perl5/5.00503/i386-linux/DynaLoader.pm +/usr/lib/perl5/5.00503/i386-linux/Socket.pm +/usr/lib/perl5/5.00503/i386-linux/auto/Socket/Socket.bs +/usr/lib/perl5/5.00503/i386-linux/auto/Socket/Socket.so +/usr/lib/perl5/5.00503/i386-linux/bits/syscall.ph +/usr/lib/perl5/5.00503/i386-linux/sys/syscall.ph +/usr/lib/perl5/5.00503/i386-linux/syscall.ph +/usr/lib/perl5/5.00503/i386-linux/_h2ph_pre.ph +/usr/lib/perl5/5.00503/i386-linux/asm/unistd.ph +/usr/lib/perl5/5.00503/lib.pm +/usr/lib/perl5/5.00503/perl5db.pl +/usr/lib/perl5/5.00503/pod/perldiag.pod +/usr/lib/perl5/5.00503/strict.pm +/usr/lib/perl5/5.00503/vars.pm +/usr/lib/perl5/site_perl/5.005/i386-linux/Gtk.pm +/usr/lib/perl5/site_perl/5.005/i386-linux/Gtk/Types.pm +/usr/lib/perl5/site_perl/5.005/i386-linux/auto/Gtk/Gtk.bs +/usr/lib/perl5/site_perl/5.005/i386-linux/auto/Gtk/Gtk.so |