diff options
author | Mystery Man <unknown@mandriva.org> | 2000-11-08 00:01:16 +0000 |
---|---|---|
committer | Mystery Man <unknown@mandriva.org> | 2000-11-08 00:01:16 +0000 |
commit | d5c526273db473a7d87a26000585900fc10dda7d (patch) | |
tree | 0fdaabe7a00921b6cc556601b103d344fc7ac781 /perl-install/install2.pm | |
parent | 9c164312d4bfff6d93e1c4529de6b992f2bebc44 (diff) | |
download | drakx-backup-do-not-use-d5c526273db473a7d87a26000585900fc10dda7d.tar drakx-backup-do-not-use-d5c526273db473a7d87a26000585900fc10dda7d.tar.gz drakx-backup-do-not-use-d5c526273db473a7d87a26000585900fc10dda7d.tar.bz2 drakx-backup-do-not-use-d5c526273db473a7d87a26000585900fc10dda7d.tar.xz drakx-backup-do-not-use-d5c526273db473a7d87a26000585900fc10dda7d.zip |
This commit was manufactured by cvs2svn to create branch
'unlabeled-1.1.1'.
Diffstat (limited to 'perl-install/install2.pm')
-rw-r--r-- | perl-install/install2.pm | 1006 |
1 files changed, 373 insertions, 633 deletions
diff --git a/perl-install/install2.pm b/perl-install/install2.pm index 41824979c..5d2bd900b 100644 --- a/perl-install/install2.pm +++ b/perl-install/install2.pm @@ -1,729 +1,469 @@ +#!/usr/bin/perl -package install2; +# $o->{hints}->{component} *was* 'Workstation' or 'Server' or NULL use diagnostics; use strict; -use Data::Dumper; +use vars qw($testing $error $cancel $INSTALL_VERSION); -use vars qw($o $version); - -#-###################################################################################### -#- misc imports -#-###################################################################################### -use common qw(:common :file :system :functional); -use install_any qw(:all); +use lib qw(/usr/bin/perl-install . c/blib/arch); +use c; +use common qw(:common :file :system); +use devices; use log; -use commands; -use network; -use lang; +use net; use keyboard; -use mouse; +use pkgs; +use smp; use fs; -use raid; +use setup; use fsedit; -use devices; -use partition_table qw(:types); +use install_methods; +use lilo; +use swap; +use install_steps_graphical; use modules; +use partition_table qw(:types); use detect_devices; -use run_program; - -use install_steps; - -$::VERSION = "7.1"; -#-$::corporate=1; - -#-###################################################################################### -#- Steps table -#-###################################################################################### -my (%installSteps, @orderedInstallSteps); -{ - my @installStepsFields = qw(text redoable onError hidden needs); - #entered reachable toBeDone next done; - my @installSteps = ( - selectLanguage => [ __("Choose your language"), 1, 1, '' ], - selectInstallClass => [ __("Select installation class"), 1, 1, '' ], - setupSCSI => [ __("Hard drive detection"), 1, 0, '' ], - selectMouse => [ __("Configure mouse"), 1, 1, '$::beginner', "selectInstallClass" ], - selectKeyboard => [ __("Choose your keyboard"), 1, 1, '', "selectInstallClass" ], - miscellaneous => [ __("Miscellaneous"), 1, 1, '$::beginner' ], - doPartitionDisks => [ __("Setup filesystems"), 1, 0, '$o->{lnx4win}', "selectInstallClass" ], - formatPartitions => [ __("Format partitions"), 1, -1, '', "doPartitionDisks" ], - choosePackages => [ __("Choose packages to install"), 1, -2, '$::beginner', "formatPartitions" ], - installPackages => [ __("Install system"), 1, -1, '', ["formatPartitions", "selectInstallClass"] ], - configureNetwork => [ __("Configure networking"), 1, 1, '$::beginner && !$::corporate', "formatPartitions" ], - installCrypto => [ __("Cryptographic"), 1, 1, '!$::expert', "configureNetwork" ], - configureTimezone => [ __("Configure timezone"), 1, 1, '', "installPackages" ], - configureServices => [ __("Configure services"), 1, 1, '!$::expert', "installPackages" ], - configurePrinter => [ __("Configure printer"), 1, 0, '', "installPackages" ], - setRootPassword => [ __("Set root password"), 1, 1, '', "formatPartitions" ], - addUser => [ __("Add a user"), 1, 1, '' ], -arch() !~ /alpha/ ? ( - createBootdisk => [ __("Create a bootdisk"), 1, 0, '$::o->{lnx4win} && !$::expert', "installPackages" ], -) : (), - setupBootloader => [ __("Install bootloader"), 1, 1, '$::o->{lnx4win} && !$::expert', "installPackages" ], - configureX => [ __("Configure X"), 1, 1, '', ["formatPartitions", "setupBootloader"] ], -arch() !~ /alpha/ ? ( - generateAutoInstFloppy => [ __("Auto install floppy"), 1, 1, '!$::expert || $o->{lnx4win}', "installPackages" ], -) : (), - exitInstall => [ __("Exit install"), 0, 0, '$::beginner' ], -); - for (my $i = 0; $i < @installSteps; $i += 2) { - my %h; @h{@installStepsFields} = @{ $installSteps[$i + 1] }; - $h{next} = $installSteps[$i + 2]; - $h{entered} = 0; - $h{onError} = $installSteps[$i + 2 * $h{onError}]; - $h{reachable} = !$h{needs}; - $installSteps{ $installSteps[$i] } = \%h; - push @orderedInstallSteps, $installSteps[$i]; - } - $installSteps{first} = $installSteps[0]; -} -#-##################################################################################### -#-INTERNAL CONSTANT -#-##################################################################################### - -my @install_classes = qw(normal developer server); - -#-##################################################################################### -#-Default value -#-##################################################################################### -#- partition layout -my %suggestedPartitions = ( -arch() =~ /^sparc/ ? ( - normal => [ - { mntpoint => "/", size => 150 << 11, type => 0x83, ratio => 1, maxsize =>1000 << 11 }, - { mntpoint => "swap", size => 64 << 11, type => 0x82, ratio => 1, maxsize => 250 << 11 }, - { mntpoint => "/usr", size => 300 << 11, type => 0x83, ratio => 4, maxsize =>3000 << 11 }, - { mntpoint => "/home", size => 300 << 11, type => 0x83, ratio => 3 }, - ], -) : ( - normal => [ - { mntpoint => "/", size => 300 << 11, type => 0x83, ratio => 5, maxsize =>3500 << 11 }, - { mntpoint => "swap", size => 64 << 11, type => 0x82, ratio => 1, maxsize => 250 << 11 }, - { mntpoint => "/home", size => 300 << 11, type => 0x83, ratio => 3 }, - ], -), - developer => [ - { mntpoint => "/", size => 150 << 11, type => 0x83, ratio => 1, maxsize => 300 << 11 }, - { mntpoint => "swap", size => 64 << 11, type => 0x82, ratio => 1, maxsize => 250 << 11 }, - { mntpoint => "/usr", size => 300 << 11, type => 0x83, ratio => 4, maxsize =>3000 << 11 }, - { mntpoint => "/home", size => 100 << 11, type => 0x83, ratio => 5 }, - ], - server => [ - { mntpoint => "/", size => 150 << 11, type => 0x83, ratio => 1, maxsize => 250 << 11 }, - { mntpoint => "swap", size => 64 << 11, type => 0x82, ratio => 2, maxsize => 400 << 11 }, - { mntpoint => "/usr", size => 300 << 11, type => 0x83, ratio => 3, maxsize =>3000 << 11 }, - { mntpoint => "/var", size => 100 << 11, type => 0x83, ratio => 4 }, - { mntpoint => "/home", size => 100 << 11, type => 0x83, ratio => 5 }, - ], -); -$suggestedPartitions{corporate} = $suggestedPartitions{server}; - -#-####################################################################################### -#-$O -#-the big struct which contain, well everything (globals + the interactive methods ...) -#-if you want to do a kickstart file, you just have to add all the required fields (see for example -#-the variable $default) -#-####################################################################################### -$o = $::o = { -# bootloader => { linear => 0, lba32 => 1, message => 1, timeout => 5, restricted => 0 }, - autoSCSI => 0, - mkbootdisk => 1, #- no mkbootdisk if 0 or undef, find a floppy with 1, or fd1 -#- packages => [ qw() ], - partitioning => { clearall => 0, eraseBadPartitions => 0, auto_allocate => 0 }, #-, readonly => 0 }, -#- security => 2, -#arch() =~ /^sparc/ ? ( -# partitions => [ -# { mntpoint => "/", size => 600 << 11, type => 0x83, ratio => 5, maxsize =>1000 << 11 }, -# { mntpoint => "swap", size => 128 << 11, type => 0x82, ratio => 1, maxsize => 400 << 11 }, -# { mntpoint => "/usr", size => 300 << 11, type => 0x83, ratio => 3, maxsize =>1500 << 11 }, -# { mntpoint => "/home", size => 300 << 11, type => 0x83, ratio => 5 }, -# ], -#) : ( -# partitions => [ -# { mntpoint => "/boot", size => 10 << 11, type => 0x83, maxsize => 30 << 11 }, -# { mntpoint => "/", size => 300 << 11, type => 0x83, ratio => 5, maxsize => 1500 << 11 }, -# { mntpoint => "swap", size => 64 << 11, type => 0x82, ratio => 1, maxsize => 250 << 11 }, -# { mntpoint => "/home", size => 300 << 11, type => 0x83, ratio => 5 }, -# ], -#), -#- partitions => [ -#- { mntpoint => "/boot", size => 16 << 11, type => 0x83 }, -#- { mntpoint => "/", size => 256 << 11, type => 0x83 }, -#- { mntpoint => "/usr", size => 512 << 11, type => 0x83, growable => 1 }, -#- { mntpoint => "/var", size => 256 << 11, type => 0x83 }, -#- { mntpoint => "/home", size => 512 << 11, type => 0x83, growable => 1 }, -#- { mntpoint => "swap", size => 64 << 11, type => 0x82 } -#- { 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 }, -#- ], - authentication => { md5 => 1, shadow => 1 }, - lang => 'en_US', - isUpgrade => 0, - toRemove => [], - toSave => [], -#- simple_themes => 1, -#- installClass => "normal", - - timezone => { -#- timezone => "Europe/Paris", -#- UTC => 1, - }, - printer => { - want => 0, - complete => 0, - str_type => $printer::printer_type_default, - QUEUE => "lp", - SPOOLDIR => "/var/spool/lpd/lp", - DBENTRY => "PostScript", - PAPERSIZE => "", - CRLF => 0, - AUTOSENDEOF => 1, - - DEVICE => "/dev/lp0", - - REMOTEHOST => "", - REMOTEQUEUE => "", - - NCPHOST => "", #-"printerservername", - NCPQUEUE => "", #-"queuename", - NCPUSER => "", #-"user", - NCPPASSWD => "", #-"pass", - - SMBHOST => "", #-"hostname", - SMBHOSTIP => "", #-"1.2.3.4", - SMBSHARE => "", #-"printername", - SMBUSER => "", #-"user", - SMBPASSWD => "", #-"passowrd", - SMBWORKGROUP => "", #-"AS3", - }, -#- superuser => { password => 'a', shell => '/bin/bash', realname => 'God' }, -#- user => { name => 'foo', password => 'bar', home => '/home/foo', shell => '/bin/bash', realname => 'really, it is foo' }, - -#- keyboard => 'de', -#- display => "192.168.1.19:1", - steps => \%installSteps, - orderedSteps => \@orderedInstallSteps, - -#- for the list of fields available for user and superuser, see @etc_pass_fields in install_steps.pm -#- intf => [ { DEVICE => "eth0", IPADDR => '1.2.3.4', NETMASK => '255.255.255.128' } ], - -#-step : the current one -#-prefix -#-mouse -#-keyboard -#-netc -#-autoSCSI drives hds fstab -#-methods -#-packages compss -#-printer haveone entry(cf printer.pm) - -}; +use commands; -#-###################################################################################### -#- Steps Functions -#- each step function are called with two arguments : clicked(because if you are a -#- beginner you can force the the step) and the entered number -#-###################################################################################### +$error = 0; +$cancel = 0; +$testing = $ENV{PERL_INSTALL_TEST}; +$INSTALL_VERSION = 0; + +my @installStepsFields = qw(text skipOnCancel skipOnLocal prev next); +my @installSteps = ( + selectPath => [ "Select installation path", 0, 0, 'none' ], + selectInstallClass => [ "Select installation class", 0, 0 ], + setupSCSI => [ "Setup SCSI", 0, 1 ], + partitionDisks => [ "Setup filesystems", 0, 1 ], + findInstallFiles => [ "Find installation files", 1, 0 ], + choosePackages => [ "Choose packages to install", 0, 0 ], + doInstallStep => [ "Install system", 0, 0 ], +# configureMouse => [ "Configure mouse", 0, 0 ], + finishNetworking => [ "Configure networking", 0, 0 ], +# configureTimezone => [ "Configure timezone", 0, 0 ], +# configureServices => [ "Configure services", 0, 0 ], +# configurePrinter => [ "Configure printer", 0, 0 ], + setRootPassword => [ "Set root password", 0, 0 ], + addUser => [ "Add a user", 0, 0 ], + configureAuth => [ "Configure authentication", 0, 0 ], + createBootdisk => [ "Create bootdisk", 0, 1 ], + setupBootloader => [ "Install bootloader", 0, 1 ], +# configureX => [ "Configure X", 0, 0 ], + exitInstall => [ "Exit install", 0, 0, undef, 'done' ], +); -#------------------------------------------------------------------------------ -sub selectLanguage { - $o->selectLanguage($_[1] == 1); +# this table is translated at run time +my %upgradeSteps = ( + selectPath => [ "Select installation path", 0, 0 , 'none' ], + setupSCSI => [ "Setup SCSI", 0, 0 ], + upgrFindInstall => [ "Find current installation", 0, 0 ], + findInstallFiles => [ "Find installation files", 1, 0 ], + upgrChoosePackages => [ "Choose packages to upgrade", 0, 0 ], + doInstallStep => [ "Upgrade system", 0, 0 ], + createBootdisk => [ "Create bootdisk", 0, 0 , 'none' ], + setupBootloader => [ "Install bootloader", 0, 0 ], + exitInstall => [ "Exit install", 0, 0 , undef, 'done' ], +); - addToBeDone { - lang::write($o->{prefix}); - keyboard::write($o->{prefix}, $o->{keyboard}, lang::lang2charset($o->{lang})); - } 'installPackages' unless $::g_auto_install; +for (my $i = 0; $i < @installSteps; $i += 2) { + my %h; @h{@installStepsFields} = @{ $installSteps[$i + 1] }; + $h{prev} ||= $installSteps[$i - 2]; + $h{next} ||= $installSteps[$i + 2]; + $installSteps{ $installSteps[$i] } = \%h; } - -#------------------------------------------------------------------------------ -sub selectMouse { - my ($clicked) = $_[0]; - - add2hash($o->{mouse} ||= {}, { mouse::read($o->{prefix}) }) if $o->{isUpgrade} && !$clicked; - - $o->selectMouse($clicked); - addToBeDone { mouse::write($o->{prefix}, $o->{mouse}) } 'installPackages'; +$installSteps{first} = $installSteps[0]; +for (my $i = 0; $i < @upgradeSteps; $i += 2) { + my %h; @h{@installStepsFields} = @{ $upgradeSteps[$i + 1] }; + $h{prev} ||= $upgradeSteps[$i - 2]; + $h{next} ||= $upgradeSteps[$i + 2]; + $upgradeSteps{ $upgradeSteps[$i] } = \%h; } +$upgradeSteps{first} = $upgradeSteps[0]; -#------------------------------------------------------------------------------ -sub setupSCSI { - my ($clicked) = $_[0]; - $o->{autoSCSI} ||= $::beginner; - $o->setupSCSI($o->{autoSCSI} && !$clicked, $clicked); -} +# partition layout for a server +my @serverPartitioning = ( + { mntpoint => "/boot", size => 16 << 11, type => 0x83 }, + { mntpoint => "/", size => 256 << 11, type => 0x83 }, + { mntpoint => "/usr", size => 512 << 11, type => 0x83, growable => 1 }, + { mntpoint => "/var", size => 256 << 11, type => 0x83 }, + { mntpoint => "/home", size => 512 << 11, type => 0x83, growable => 1 }, + { mntpoint => "swap", size => 64 << 11, type => 0x82 } +); -#------------------------------------------------------------------------------ -sub selectKeyboard { - my ($clicked) = $_[0]; +my $o = {}; +my $default = { + display => "129.104.42.9:0", + user => { name => 'foo', password => 'foo', shell => '/bin/bash', realname => 'really, it is foo' }, + rootPassword => 'toto', + keyboard => 'us', + isUpgrade => 0, + installClass => 'Server', + bootloader => { onmbr => 1, + linear => 1, + }, + mkbootdisk => 0, + comps => [ qw() ], + packages => [ qw() ], + partitions => [ + { mntpoint => "/boot", size => 16 << 11, type => 0x83 }, + { mntpoint => "/", size => 300 << 11, type => 0x83 }, + { mntpoint => "/usr", size => 400 << 11, type => 0x83, growable => 1 }, + { mntpoint => "swap", size => 64 << 11, type => 0x82 } + ], +}; - return unless $o->{isUpgrade} || !$::beginner || $clicked; - $o->{keyboard} = (keyboard::read($o->{prefix}))[0] if $o->{isUpgrade} && !$clicked && $o->{keyboard_unsafe}; - $o->selectKeyboard; - #- if we go back to the selectKeyboard, you must rewrite - addToBeDone { - lang::write($o->{prefix}); - keyboard::write($o->{prefix}, $o->{keyboard}, lang::lang2charset($o->{lang})); - } 'installPackages' unless $::g_auto_install; +sub selectPath { + $o->{steps} = $o->{isUpgrade} ? \%upgradeSteps : \%installSteps; } -#------------------------------------------------------------------------------ sub selectInstallClass { - $o->selectInstallClass(@install_classes); - - $o->{partitions} ||= $suggestedPartitions{$o->{installClass}}; +# my @choices = qw(Workstation Server Custom); - if ($o->{steps}{choosePackages}{entered} >= 1 && !$o->{steps}{installPackages}{done}) { - $o->setPackages(\@install_classes); - $o->selectPackagesToUpgrade if $o->{isUpgrade}; + $o->{installClass} eq 'Custom' and return; + + $o->{bootloader}->{onmbr} = 1; + $o->{bootloader}->{uselinear} = 1; + + foreach (qw(skipntsysv autoformat nologmessage auth autoswap skipbootloader forceddruid)) { + $o->{hints}->{flags}->{$_} = 1; } - if ($o->{isUpgrade}) { - @{$o->{orderedSteps}} = map { /setupSCSI/ ? ($_, "doPartitionDisks") : $_ } - grep { !/doPartitionDisks/ } @{$o->{orderedSteps}}; - my $s; foreach (@{$o->{orderedSteps}}) { - $s->{next} = $_ if $s; - $s = $o->{steps}{$_}; - } + $o->{hints}->{auth}->{shadow} = 1; + $o->{hints}->{auth}->{md5} = 1; + + if ($o->{installClass} eq 'Server') { + $o->{hints}->{flags}->{skipprinter} = 1; + $o->{hints}->{flags}->{skipresize} = 1; + $o->{hints}->{partitioning}->{flags}->{clearall} = 1; + $o->{hints}->{partitioning}->{attempts} = 'serverPartitioning'; + } else { # workstation + $o->{hints}->{flags}->{autoscsi} = 1; + $o->{hints}->{partitioning}->{flags}->{clearlinux} = 1; } } -#------------------------------------------------------------------------------ -sub doPartitionDisks { - return $o->searchAndMount4Upgrade if $o->{isUpgrade}; +sub setupSCSI { + $o->{direction} < 0 && detect_devices::hasSCSI() and return cancel(); - $o->{steps}{formatPartitions}{done} = 0; - $o->doPartitionDisksBefore; - $o->doPartitionDisks; - $o->doPartitionDisksAfter; + # If we have any scsi adapters configured from earlier, then don't bother asking again + while (my ($k, $v) = each %modules::loaded) { + $v->{type} eq 'scsi' and return; + } + #setupSCSIInterfaces(0, \%modules::loaded, $o->{hints}->{flags}->{autoscsi}, $o->{direction}); } -sub formatPartitions { - unless ($o->{isUpgrade}) { - $o->choosePartitionsToFormat($o->{fstab}); - $o->formatMountPartitions($o->{fstab}) unless $::testing; - } - mkdir "$o->{prefix}/$_", 0755 foreach - qw(dev etc etc/profile.d etc/sysconfig etc/sysconfig/console etc/sysconfig/network-scripts - home mnt tmp var var/tmp var/lib var/lib/rpm var/lib/urpmi); - mkdir "$o->{prefix}/$_", 0700 foreach qw(root); +sub partitionDisks { + $o->{drives} = [ detect_devices::hds() ]; + $o->{hds} = fsedit::hds($o->{drives}, $o->{hints}->{partitioning}->{flags}); + @{$o->{hds}} > 0 or die "An error has occurred - no valid devices were found on which to create new filesystems. Please check your hardware for the cause of this problem"; - raid::prepare_prefixed($o->{raid}, $o->{prefix}); + unless ($o->{isUpgrade}) { + $o->{install}->doPartitionDisks($o->{hds}, $o->{fstab_wanted}); - my $d = "/initrd/loopfs/lnx4win"; - if (-d $d) { -#- install_any::useMedium(0); - install_any::getAndSaveFile("lnx4win/$_", "$d/$_") foreach qw(ctl3d32.dll loadlin.exe linux.pif lnx4win.exe lnx4win.ico rm.exe uninstall.bat uninstall.pif); + # Write partitions to disk + foreach (@{$o->{hds}}) { partition_table::write($_); } } -#- chdir "$o->{prefix}"; was for core dumps - - #-noatime option for ext2 fs on laptops (do not wake up the hd) - #- Do not update inode access times on this - #- file system (e.g, for faster access on the - #- news spool to speed up news servers). - $o->{pcmcia} and $_->{options} = "noatime" foreach grep { isTrueFS($_) } @{$o->{fstab}}; -} - -#------------------------------------------------------------------------------ -sub choosePackages { - require pkgs; + $o->{fstab} = [ fsedit::get_fstab(@{$o->{hds}}) ]; - #- always setPackages as it may have to copy hdlist files and depslist file. - $o->setPackages; + my $root_fs; map { $_->{mntpoint} eq '/' and $root_fs = $_ } @{$o->{fstab}}; + $root_fs or die "partitionning failed: no root filesystem"; - #- for the first time, select package to upgrade. - #- TOCHECK this may not be the best place for that as package are selected at some other point. - if ($_[1] == 1) { - $o->selectPackagesToUpgrade if $o->{isUpgrade}; + if ($o->{hints}->{flags}->{autoformat}) { + log::l("formatting all filesystems"); - $o->{compssUsersChoice}{$_} = 1 foreach @{$o->{compssUsersSorted}}, 'Miscellaneous'; - # $o->{compssUsersChoice}{KDE} = 0 if $o->{lang} =~ /ja|el|ko|th|vi|zh/; #- gnome handles much this fonts much better + foreach (@{$o->{fstab}}) { + fs::format_part($_) if $_->{mntpoint} && isExt2($_) || isSwap($_); + } } + fs::mount_all($o->{fstab}, '/mnt'); +} - $o->choosePackages($o->{packages}, $o->{compss}, - $o->{compssUsers}, $o->{compssUsersSorted}, $_[1] == 1); - my $pkg = pkgs::packageByName($o->{packages}, 'kdesu'); - pkgs::unselectPackage($o->{packages}, $pkg) if $pkg && $o->{security} > 3; - - #- check pre-condition where base backage has to be selected. - pkgs::packageFlagSelected(pkgs::packageByName($o->{packages}, 'basesystem')) or die "basesystem package not selected"; +sub findInstallFiles { + $o->{packages} = $o->{method}->getPackageSet() and + $o->{comps} = $o->{method}->getComponentSet($o->{packages}); +} + +sub choosePackages { +# $o->{hints}->{component} && $o->{direction} < 0 and return cancel(); - #- check if there are package that need installation. - $o->{steps}{installPackages}{done} = 0 if $o->{steps}{installPackages}{done} && pkgs::packagesToInstall($o->{packages}) > 0; + $o->{install}->choosePackages($o->{packages}, $o->{comps}, $o->{isUpgrade}); } -#------------------------------------------------------------------------------ -sub installPackages { - $o->readBootloaderConfigBeforeInstall if $_[1] == 1; +sub doInstallStep { + $testing and return 0; - $o->beforeInstallPackages; - $o->installPackages; - $o->afterInstallPackages; + $o->{install}->beforeInstallPackages($o->{method}, $o->{fstab}); + $o->{install}->installPackages($o->{rootPath}, $o->{method}, $o->{packages}, $o->{isUpgrade}); + $o->{install}->afterInstallPackages($o->{rootPath}, $o->{keyboard}, $o->{isUpgrade}); } -#------------------------------------------------------------------------------ -sub miscellaneous { - $o->miscellaneous($_[0]); - - addToBeDone { - setVarsInSh("$o->{prefix}/etc/sysconfig/system", { - HDPARM => $o->{miscellaneous}{HDPARM}, - CLEAN_TMP => $o->{miscellaneous}{CLEAN_TMP}, - CLASS => $::expert && "expert" || $::beginner && "beginner" || "medium", - TYPE => $o->{installClass}, - SECURITY => $o->{security}, - }); - - my $f = "$o->{prefix}/etc/sysconfig/usb"; - my %usb = getVarsFromSh($f); - $usb{MOUSE} = $o->{mouse}{device} eq "usbmouse" && "yes"; - $usb{KEYBOARD} = (int grep { /^keybdev\.c: Adding keyboard/ } detect_devices::syslog()) && "yes"; - $usb{ZIP} = bool2yesno(-d "/proc/scsi/usb"); - setVarsInSh($f, \%usb); - - install_any::fsck_option(); - } 'installPackages'; + +sub configureMouse { setup::mouseConfig($o->{rootPath}); } + +sub finishNetworking { +# +# rc = checkNetConfig(&$o->{intf}, &$o->{netc}, &$o->{intfFinal}, +# &$o->{netcFinal}, &$o->{driversLoaded}, $o->{direction}); +# +# if (rc) return rc; +# +# sprintf(path, "%s/etc/sysconfig", $o->{rootPath}); +# writeNetConfig(path, &$o->{netcFinal}, +# &$o->{intfFinal}, 0); +# strcat(path, "/network-scripts"); +# writeNetInterfaceConfig(path, &$o->{intfFinal}); +# sprintf(path, "%s/etc", $o->{rootPath}); +# writeResolvConf(path, &$o->{netcFinal}); +# +# # this is a bit of a hack +# writeHosts(path, &$o->{netcFinal}, +# &$o->{intfFinal}, !$o->{isUpgrade}); +# +# return 0; } -#------------------------------------------------------------------------------ -sub configureNetwork { - #- get current configuration of network device. - log::l("debugging: $o->{netc}{HOSTNAME}"); - eval { - $o->{netc} ||= {}; $o->{intf} ||= []; - add2hash($o->{netc}, network::read_conf("$o->{prefix}/etc/sysconfig/network")) if -r "$o->{prefix}/etc/sysconfig/network"; - add2hash($o->{netc}, network::read_resolv_conf("$o->{prefix}/etc/resolv.conf")) if -r "$o->{prefix}/etc/resolv.conf"; - foreach (all("$o->{prefix}/etc/sysconfig/network-scripts")) { - if (/ifcfg-(\w+)/ && $1 ne 'lo' && $1 !~ /ppp/) { - my $intf = network::findIntf($o->{intf}, $1); - add2hash($intf, { getVarsFromSh("$o->{prefix}/etc/sysconfig/network-scripts/$_") }); - } - } - }; +sub configureTimezone { setup::timeConfig($o->{rootPath}) } +sub configureServices { setup::servicesConfig($o->{rootPath}) } - $o->configureNetwork($_[1] == 1); -} -#------------------------------------------------------------------------------ -sub installCrypto { $o->installCrypto } - -#------------------------------------------------------------------------------ -sub configureTimezone { - my ($clicked) = @_; - my $f = "$o->{prefix}/etc/sysconfig/clock"; - - require timezone; - if ($o->{isUpgrade} && -r $f && -s $f > 0) { - return if $_[1] == 1 && !$clicked; - #- can't be done in install cuz' timeconfig %post creates funny things - add2hash($o->{timezone}, { timezone::read($f) }); - } - $o->{timezone}{timezone} ||= timezone::bestTimezone(lang::lang2text($o->{lang})); - $o->{timezone}{UTC} = !$::beginner && !grep { isFat($_) || isNT($_) } @{$o->{fstab}} unless exists $o->{timezone}{UTC}; - $o->configureTimezone($f, $clicked); -} -#------------------------------------------------------------------------------ -sub configureServices { $::expert and $o->configureServices } -#------------------------------------------------------------------------------ -sub configurePrinter { $o->configurePrinter($_[0]) } -#------------------------------------------------------------------------------ sub setRootPassword { - return if $o->{isUpgrade}; + $testing and return 0; - $o->setRootPassword($_[0]); - addToBeDone { install_any::setAuthentication($o) } 'installPackages'; + $o->{install}->setRootPassword($o->{rootPath}); } -#------------------------------------------------------------------------------ -sub addUser { - return if $o->{isUpgrade}; - $o->addUser($_[0]); - install_any::setAuthentication($o); +sub addUser { + $o->{install}->addUser($o->{rootPath}); } -#------------------------------------------------------------------------------ -#-PADTODO sub createBootdisk { - modules::write_conf($o->{prefix}); + $o->{isUpgrade} or fs::write('mnt', $o->{fstab}); + modules::write_conf("/mnt/etc/conf.modules", 'append'); - $o->createBootdisk($_[1] == 1); + $o->{mkbootdisk} and lilo::mkbootdisk("/mnt", versionString()); } -#------------------------------------------------------------------------------ sub setupBootloader { - return if $::g_auto_install; + my $versionString = versionString(); + log::l("installed kernel version $versionString"); + + $o->{isUpgrade} or modules::read_conf("/mnt/etc/conf.modules"); + + lilo::install("/mnt", $o->{hds}, $o->{fstab}, $versionString, $o->{bootloader}); +} + +sub configureX { $o->{install}->setupXfree($o->{method}, $o->{rootPath}, $o->{packages}); } + +sub exitInstall { 1 } + +sub upgrFindInstall { +# int rc; +# +# if (!$o->{table}.parts) { +# rc = findAllPartitions(NULL, &$o->{table}); +# if (rc) return rc; +# } +# +# umountFilesystems(&$o->{fstab}); +# +# # rootpath upgrade support +# if (strcmp($o->{rootPath} ,"/mnt")) +# return INST_OKAY; +# +# # this also turns on swap for us +# rc = readMountTable($o->{table}, &$o->{fstab}); +# if (rc) return rc; +# +# if (!testing) { +# mountFilesystems(&$o->{fstab}); +# +# if ($o->{method}->prepareMedia) { +# rc = $o->{method}->prepareMedia($o->{method}, &$o->{fstab}); +# if (rc) { +# umountFilesystems(&$o->{fstab}); +# return rc; +# } +# } +# } +# +# return 0; +} + +sub upgrChoosePackages { +# static int firstTime = 1; +# char * rpmconvertbin; +# int rc; +# char * path; +# char * argv[] = { NULL, NULL }; +# char buf[128]; +# +# if (testing) +# path = "/"; +# else +# path = $o->{rootPath}; +# +# if (firstTime) { +# snprintf(buf, sizeof(buf), "%s%s", $o->{rootPath}, +# "/var/lib/rpm/packages.rpm"); +# if (access(buf, R_OK)) { +# snprintf(buf, sizeof(buf), "%s%s", $o->{rootPath}, +# "/var/lib/rpm/packages"); +# if (access(buf, R_OK)) { +# errorWindow("No RPM database exists!"); +# return INST_ERROR; +# } +# +# if ($o->{method}->getFile($o->{method}, "rpmconvert", +# &rpmconvertbin)) { +# return INST_ERROR; +# } +# +# symlink("/mnt/var", "/var"); +# winStatus(35, 3, _("Upgrade"), _("Converting RPM database...")); +# chmod(rpmconvertbin, 0755); +# argv[0] = rpmconvertbin; +# rc = runProgram(RUN_LOG, rpmconvertbin, argv); +# if ($o->{method}->rmFiles) +# unlink(rpmconvertbin); +# +# newtPopWindow(); +# if (rc) return INST_ERROR; +# } +# winStatus(35, 3, "Upgrade", _("Finding packages to upgrade...")); +# rc = ugFindUpgradePackages(&$o->{packages}, path); +# newtPopWindow(); +# if (rc) return rc; +# firstTime = 0; +# psVerifyDependencies(&$o->{packages}, 1); +# } +# +# return psSelectPackages(&$o->{packages}, &$o->{comps}, NULL, 0, 1); +} - modules::write_conf($o->{prefix}); - $o->setupBootloaderBefore if $_[1] == 1; - $o->setupBootloader($_[1] - 1); +sub versionString { + my $kernel = $o->{packages}->{kernel} or die "I couldn't find the kernel package!"; - local $ENV{DRAKX_PASSWORD} = $o->{bootloader}{password}; - run_program::rooted($o->{prefix}, "/usr/sbin/msec", $o->{security}); + c::headerGetEntry($kernel->{header}, 'version') . "-" . + c::headerGetEntry($kernel->{header}, 'release'); } -#------------------------------------------------------------------------------ -sub configureX { - my ($clicked) = $_[0]; - #- done here and also at the end of install2.pm, just in case... - fs::write($o->{prefix}, $o->{fstab}, $o->{manualFstab}, $o->{useSupermount}); - modules::write_conf($o->{prefix}); +sub getNextStep { + my ($lastStep) = @_; + + $error and die "an error occured in step $lastStep"; + $cancel and die "cancel called in step $lastStep"; - $o->configureX if pkgs::packageFlagInstalled(pkgs::packageByName($o->{packages}, 'XFree86')) && !$o->{X}{disabled} || $clicked; + $o->{direction} = 1; + + return $o->{lastChoice} = $o->{steps}->{$lastStep}->{next}; } -#------------------------------------------------------------------------------ -sub generateAutoInstFloppy { - $o->generateAutoInstFloppy; + +sub doSuspend { + $o->{exitOnSuspend} and exit(1); + + if (my $pid = fork) { + waitpid $pid, 0; + } else { + print "\n\nType <exit> to return to the install program.\n\n"; + exec {"/bin/sh"} "-/bin/sh"; + warn "error execing /bin/sh"; + sleep 5; + exit 1; + } } -#------------------------------------------------------------------------------ -sub exitInstall { $o->exitInstall(getNextStep() eq "exitInstall") } +sub spawnShell { + $testing and return; -#-###################################################################################### -#- MAIN -#-###################################################################################### -sub main { - $SIG{__DIE__} = sub { chomp(my $err = $_[0]); log::l("warning: $err") }; - $SIG{SEGV} = sub { my $msg = "segmentation fault: seems like memory is missing as the install crashes"; print "$msg\n"; log::l($msg); - $o->ask_warn('', $msg); - setVirtual(1); - require install_steps_auto_install; - install_steps_auto_install::errorInStep(); - }; - $ENV{SHARE_PATH} ||= "/usr/share"; - $ENV{PERL_BADLANG} = 1; - - $::beginner = $::expert = $::g_auto_install = 0; - -#- c::unlimit_core() unless $::testing; - - my ($cfg, $patch, $oem, @auto); - my %cmdline; map { - my ($n, $v) = split '='; - $cmdline{$n} = $v || 1; - } split ' ', cat_("/proc/cmdline"); - - my $opt; foreach (@_) { - if (/^--?(.*)/) { - $cmdline{$opt} = 1 if $opt; - $opt = $1; - } else { - $cmdline{$opt} = $_ if $opt; - $opt = ''; - } - } $cmdline{$opt} = 1 if $opt; - - $::beginner = 1; - - map_each { - my ($n, $v) = @_; - my $f = ${{ - oem => sub { $oem = $v }, - lang => sub { $o->{lang} = $v }, - flang => sub { $o->{lang} = $v ; push @auto, 'selectLanguage' }, - method => sub { $o->{method} = $v }, - pcmcia => sub { $o->{pcmcia} = $v }, - vga16 => sub { $o->{vga16} = $v }, - step => sub { $o->{steps}{first} = $v }, - expert => sub { $::expert = 1; $::beginner = 0 }, - beginner => sub { $::beginner = $v }, - class => sub { $o->{installClass} = $v }, - fclass => sub { $o->{installClass} = $v; push @auto, "selectInstallClass" }, - lnx4win => sub { $o->{lnx4win} = 1 }, - readonly => sub { $o->{partitioning}{readonly} = $v ne "0" }, - display => sub { $o->{display} = $v }, - security => sub { $o->{security} = $v }, - test => sub { $::testing = 1 }, - patch => sub { $patch = 1 }, - defcfg => sub { $cfg = $v }, - newt => sub { $o->{interactive} = "newt" }, - text => sub { $o->{interactive} = "newt" }, - stdio => sub { $o->{interactive} = "stdio"}, - corporate => sub { $::corporate = 1 }, - kickstart => sub { $::auto_install = $v }, - auto_install => sub { $::auto_install = $v }, - simple_themes => sub { $o->{simple_themes} = 1 }, - alawindows => sub { $o->{security} = 0; $o->{partitioning}{clearall} = 1; $o->{bootloader}{crushMbr} = 1 }, - g_auto_install => sub { $::testing = $::g_auto_install = 1; $o->{partitioning}{auto_allocate} = 1 }, - nomouseprobe => sub { $o->{nomouseprobe} = $v }, - }}{lc $n}; &$f if $f; - } %cmdline; - - undef $::auto_install if $cfg; - if ($::g_auto_install) { - (my $root = `/bin/pwd`) =~ s|(/[^/]*){5}$||; - symlinkf $root, "/tmp/rhimage" or die "unable to create link /tmp/rhimage"; - $o->{method} ||= "cdrom"; - $o->{mkbootdisk} = 0; - } - unless ($::testing) { - unlink $_ foreach ( $o->{pcmcia} ? () : ("/sbin/install"), #- #- install include cardmgr! - "/modules/modules.cgz", - "/sbin/insmod", "/sbin/rmmod", - "/modules/pcmcia_core.o", #- always use module from archive. - "/modules/i82365.o", - "/modules/tcic.o", - "/modules/ds.o", - ); - } + -x "/bin/sh" or log::l("cannot open shell - /usr/bin/sh doesn't exist"), return; - print STDERR "in second stage install\n"; - log::openLog(($::testing || $o->{localInstall}) && 'debug.log'); - log::l("second stage install running"); - log::ld("extra log messages are enabled"); + fork and return; - eval { spawnShell() }; + local *F; + sysopen F, "/dev/tty2", 2 or log::l("cannot open /dev/tty2 -- no shell will be provided"), return; - $o->{prefix} = $::testing ? "/tmp/test-perl-install" : "/mnt"; - $o->{root} = $::testing ? "/tmp/root-perl-install" : "/"; - mkdir $o->{prefix}, 0755; - mkdir $o->{root}, 0755; + open STDIN, "<&F" or die; + open STDOUT, ">&F" or die; + open STDERR, ">&F" or die; + close F; - #- make sure we don't pick up any gunk from the outside world - $ENV{PATH} = "/usr/bin:/bin:/sbin:/usr/sbin:/usr/X11R6/bin:$o->{prefix}/sbin:$o->{prefix}/bin:$o->{prefix}/usr/sbin:$o->{prefix}/usr/bin:$o->{prefix}/usr/X11R6/bin" unless $::g_auto_install; + c::setsid(); - $o->{interactive} ||= 'gtk'; - if ($o->{interactive} eq "gtk" && availableMemory < 22 * 1024) { - log::l("switching to newt install cuz not enough memory"); - $o->{interactive} = "newt"; - } + ioctl(STDIN, c::TIOCSCTTY(), 0) or warn "could not set new controlling tty: $!"; + + exec {"/bin/sh"} "-/bin/sh" or log::l("exec of /bin/sh failed: $!"); +} + +sub main { + + # if this fails, it's okay -- it might help with free space though + unlink "/sbin/install"; + + print STDERR "in second stage install\n"; + + $o->{rootPath} = "/mnt"; + + $o->{method} = install_methods->new('cdrom'); + $o->{install} = install_steps_graphical->new($o); - if ($::auto_install) { - require install_steps_auto_install; - eval { $o = $::o = install_any::loadO($o, $::auto_install) }; - if ($@) { - log::l("error using auto_install, continuing"); - undef $::auto_install; - } else { - log::l("auto install config file loaded successfully"); + unless ($testing || $o->{localInstall}) { + if (fork == 0) { + while (1) { sleep(30); sync(); } } } - unless ($::auto_install) { - $o->{interactive} ||= 'gtk'; - require"install_steps_$o->{interactive}.pm"; - } - eval { $o = $::o = install_any::loadO($o, "patch") } if $patch; - eval { $o = $::o = install_any::loadO($o, $cfg) } if $cfg; - - $o->{prefix} = $::testing ? "/tmp/test-perl-install" : "/mnt"; - mkdir $o->{prefix}, 0755; - - #- needed very early for install_steps_gtk - eval { ($o->{mouse}, $o->{wacom}) = mouse::detect() } unless $o->{nomouseprobe} || $o->{mouse}; - - lang::set($o->{lang}) if $o->{lang} ne 'en'; #- mainly for defcfg - - $o->{allowFB} = listlength(cat_("/proc/fb")); - - my $o_; - while (1) { - require"install_steps_$o->{interactive}.pm"; - $o_ = $::auto_install ? - install_steps_auto_install->new($o) : - $o->{interactive} eq "stdio" ? - install_steps_stdio->new($o) : - $o->{interactive} eq "newt" ? - install_steps_newt->new($o) : - $o->{interactive} eq "gtk" ? - install_steps_gtk->new($o) : - die "unknown install type"; - $o_ and last; - - $o->{interactive} = "newt"; - require install_steps_newt; - } - if ($oem) { - push @auto, 'selectInstallClass', 'selectMouse', 'configureTimezone', 'exitInstall'; - } - foreach (@auto) { - eval "undef *" . (!/::/ && "install_steps_interactive::") . $_; - my $s = $o->{steps}{/::(.*)/ ? $1 : $_} or next; - $s->{hidden} = 1; - } + $o->{exitOnSuspend} = $o->{localInstall} || $testing; - $::o = $o = $o_; + log::openLog(($testing || $o->{localInstall}) && 'debug.log'); - #- get stage1 network configuration if any. - $o->{netc} ||= network::read_conf("/tmp/network"); - if (my ($file) = glob_('/tmp/ifcfg-*')) { - log::l("found network config file $file"); - my $l = network::read_interface_conf($file); - add2hash(network::findIntf($o->{intf} ||= [], $l->{DEVICE}), $l); - } + log::l("second stage install running (version $INSTALL_VERSION)"); - modules::unload($_) foreach qw(vfat msdos fat); - modules::load_deps(($::testing ? ".." : "") . "/modules/modules.dep"); - modules::read_stage1_conf("/tmp/conf.modules"); - modules::read_already_loaded(); - - eval { modules::load("af_packet") }; - - lang::set($o->{lang}); - - #-the main cycle - my $clicked = 0; - MAIN: for ($o->{step} = $o->{steps}{first};; $o->{step} = getNextStep()) { - $o->{steps}{$o->{step}}{entered}++; - $o->enteringStep($o->{step}); - eval { - &{$install2::{$o->{step}}}($clicked, $o->{steps}{$o->{step}}{entered}); - }; - $o->kill_action; - $clicked = 0; - while ($@) { - local $_ = $@; - $o->kill_action; - /^setstep (.*)/ and $o->{step} = $1, $clicked = 1, redo MAIN; - /^theme_changed$/ and redo MAIN; - unless (/^already displayed/ || /^ask_from_list cancel/) { - eval { $o->errorInStep($_) }; - $@ and next; - } - $o->{step} = $o->{steps}{$o->{step}}{onError}; - next MAIN unless $o->{steps}{$o->{step}}{reachable}; #- sanity check: avoid a step not reachable on error. - redo MAIN; - } - $o->{steps}{$o->{step}}{done} = 1; - $o->leavingStep($o->{step}); + log::ld("extra log messages are enabled"); - last if $o->{step} eq 'exitInstall'; - } - install_any::clean_postinstall_rpms(); - install_any::ejectCdrom(); + $o->{rootPath} eq '/mnt' and spawnShell(); + +# chooseLanguage('fr'); - fs::write($o->{prefix}, $o->{fstab}, $o->{manualFstab}, $o->{useSupermount}); - modules::write_conf($o->{prefix}); + $o->{netc} = net::readNetConfig("/tmp"); - #- to ensure linuxconf doesn't cry against those files being in the future - foreach ('/etc/conf.modules', '/etc/crontab', '/etc/sysconfig/mouse', '/etc/X11/fs/config') { - my $now = time - 24 * 60 * 60; - utime $now, $now, "$o->{prefix}/$_"; + if (my ($file) = glob_('/tmp/ifcfg-*')) { + log::l("found network config file $file"); + $o->{intf} = net::readNetInterfaceConfig($file); } - install_any::killCardServices(); - #- make sure failed upgrade will not hurt too much. - install_steps::cleanIfFailedUpgrade($o); + log::l("reading /usr/lib/rpm/rpmrc"); + c::rpmReadConfigFiles_(); + log::l("\tdone"); - -e "$o->{prefix}/usr/bin/urpmi" or eval { commands::rm("-rf", "$o->{prefix}/var/lib/urpmi") }; + modules::load_deps("/modules/modules.dep"); + modules::read_conf("/tmp/conf.modules"); - #- mainly for auto_install's - run_program::rooted($o->{prefix}, "sh", "-c", $o->{postInstall}) if $o->{postInstall}; + # make sure we don't pick up any gunk from the outside world + $ENV{PATH} = "/usr/bin:/bin:/sbin:/usr/sbin"; + $ENV{LD_LIBRARY_PATH} = ""; - #- have the really bleeding edge ddebug.log - eval { commands::cp('-f', "/tmp/ddebug.log", "$o->{prefix}/root") }; + $o->{keyboard} = keyboard::read("/tmp/keyboard") || $default->{keyboard}; - #- ala pixel? :-) [fpons] - sync(); sync(); + for (my $step = $o->{steps}->{first}; $step ne 'done'; $step = getNextStep($step)) { + log::l("entering step $step"); + &{$main::{$step}}() and $o->{steps}->{completed} = 1; + log::l("step $step finished"); + } + killCardServices(); log::l("installation complete, leaving"); - print "\n" x 80; + + <STDIN> unless $testing; +} + +sub killCardServices { + my $pid = cat_("/tmp/cardmgr.pid"); + $pid and kill(15, chop_($pid)); # send SIGTERM } -#-###################################################################################### -#- Wonderful perl :( -#-###################################################################################### -1; +main(@ARGV); |