diff options
Diffstat (limited to 'perl-install/install2.pm')
-rw-r--r-- | perl-install/install2.pm | 992 |
1 files changed, 621 insertions, 371 deletions
diff --git a/perl-install/install2.pm b/perl-install/install2.pm index 5d2bd900b..a0b3f06c7 100644 --- a/perl-install/install2.pm +++ b/perl-install/install2.pm @@ -1,469 +1,719 @@ -#!/usr/bin/perl -# $o->{hints}->{component} *was* 'Workstation' or 'Server' or NULL +package install2; # $Id$ use diagnostics; use strict; -use vars qw($testing $error $cancel $INSTALL_VERSION); +use Data::Dumper; -use lib qw(/usr/bin/perl-install . c/blib/arch); -use c; -use common qw(:common :file :system); -use devices; -use log; -use net; +use vars qw($o $version); + +#-###################################################################################### +#- misc imports +#-###################################################################################### +use common qw(:common :file :system :functional); +use install_any qw(:all); +use install_steps; +use commands; +use lang; use keyboard; -use pkgs; -use smp; -use fs; -use setup; +use mouse; use fsedit; -use install_methods; -use lilo; -use swap; -use install_steps_graphical; -use modules; +use devices; use partition_table qw(:types); +use modules; use detect_devices; -use commands; - -$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' ], -); +use run_program; +use log; +use fs; -# 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' ], +$::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, '', "selectInstallClass" ], + selectKeyboard => [ __("Choose your keyboard"), 1, 1, '', "selectInstallClass" ], + miscellaneous => [ __("Miscellaneous"), 1, 1, '$::beginner' ], + doPartitionDisks => [ __("Setup filesystems"), 1, 0, '', "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, '', "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, '', "installPackages" ], + addUser => [ __("Add a user"), 1, 1, '', "installPackages" ], +arch() !~ /alpha/ ? ( + createBootdisk => [ __("Create a bootdisk"), 1, 0, '', "installPackages" ], +) : (), + setupBootloader => [ __("Install bootloader"), 1, 1, '', "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 && !$::live' ], ); - -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; -} -$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; + 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]; } -$upgradeSteps{first} = $upgradeSteps[0]; - - -# 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 } +#-##################################################################################### +#-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 => 500 << 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, + }, +#- 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 => { eth0 => { 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) -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 } - ], }; +#-###################################################################################### +#- 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 +#-###################################################################################### +#------------------------------------------------------------------------------ +sub selectLanguage { + $o->selectLanguage($_[1] == 1); -sub selectPath { - $o->{steps} = $o->{isUpgrade} ? \%upgradeSteps : \%installSteps; + addToBeDone { + lang::write($o->{prefix}); + keyboard::write($o->{prefix}, $o->{keyboard}, lang::lang2charset($o->{lang})); + } 'installPackages' unless $::g_auto_install; } -sub selectInstallClass { -# my @choices = qw(Workstation Server Custom); - - $o->{installClass} eq 'Custom' and return; +#------------------------------------------------------------------------------ +sub selectMouse { + require pkgs; + my ($first_time) = $_[1] == 1; - $o->{bootloader}->{onmbr} = 1; - $o->{bootloader}->{uselinear} = 1; + add2hash($o->{mouse} ||= {}, mouse::read($o->{prefix})) if $o->{isUpgrade} && $first_time; - foreach (qw(skipntsysv autoformat nologmessage auth autoswap skipbootloader forceddruid)) { - $o->{hints}->{flags}->{$_} = 1; - } - $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; - } + $o->selectMouse(!$first_time); + addToBeDone { mouse::write($o->{prefix}, $o->{mouse}) } 'installPackages'; } +#------------------------------------------------------------------------------ sub setupSCSI { - $o->{direction} < 0 && detect_devices::hasSCSI() and return cancel(); + my ($clicked) = @_; + $o->{autoSCSI} ||= $::beginner; - # 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}); + $o->setupSCSI($o->{autoSCSI} && !$clicked, $clicked); } -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"; +#------------------------------------------------------------------------------ +sub selectKeyboard { + my ($clicked) = @_; - unless ($o->{isUpgrade}) { - $o->{install}->doPartitionDisks($o->{hds}, $o->{fstab_wanted}); + return if !$o->{isUpgrade} && $::beginner && !$clicked; - # Write partitions to disk - foreach (@{$o->{hds}}) { partition_table::write($_); } - } - - $o->{fstab} = [ fsedit::get_fstab(@{$o->{hds}}) ]; + $o->{keyboard} = keyboard::read($o->{prefix}) if $o->{isUpgrade} && !$clicked && $o->{keyboard_unsafe}; + $o->selectKeyboard; - my $root_fs; map { $_->{mntpoint} eq '/' and $root_fs = $_ } @{$o->{fstab}}; - $root_fs or die "partitionning failed: no root filesystem"; + #- 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; +} - if ($o->{hints}->{flags}->{autoformat}) { - log::l("formatting all filesystems"); +#------------------------------------------------------------------------------ +sub selectInstallClass { + $o->selectInstallClass(@install_classes); + + $o->{partitions} ||= $suggestedPartitions{$o->{installClass}}; - foreach (@{$o->{fstab}}) { - fs::format_part($_) if $_->{mntpoint} && isExt2($_) || isSwap($_); + if ($o->{steps}{choosePackages}{entered} >= 1 && !$o->{steps}{installPackages}{done}) { + $o->setPackages(\@install_classes); + $o->selectPackagesToUpgrade if $o->{isUpgrade}; + } + if ($o->{isUpgrade}) { + @{$o->{orderedSteps}} = map { /setupSCSI/ ? ($_, "doPartitionDisks") : $_ } + grep { !/doPartitionDisks/ } @{$o->{orderedSteps}}; + my $s; foreach (@{$o->{orderedSteps}}) { + $s->{next} = $_ if $s; + $s = $o->{steps}{$_}; } } - fs::mount_all($o->{fstab}, '/mnt'); } -sub findInstallFiles { - $o->{packages} = $o->{method}->getPackageSet() and - $o->{comps} = $o->{method}->getComponentSet($o->{packages}); +#------------------------------------------------------------------------------ +sub doPartitionDisks { + $o->{steps}{formatPartitions}{done} = 0; + $o->doPartitionDisksBefore; + $o->doPartitionDisks; + $o->doPartitionDisksAfter; } - -sub choosePackages { -# $o->{hints}->{component} && $o->{direction} < 0 and return cancel(); - $o->{install}->choosePackages($o->{packages}, $o->{comps}, $o->{isUpgrade}); -} +sub formatPartitions { + $o->{steps}{choosePackages}{done} = 0; + $o->choosePartitionsToFormat($o->{fstab}) unless $o->{isUpgrade}; + $o->formatMountPartitions($o->{fstab}) unless $::testing; -sub doInstallStep { - $testing and return 0; + 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 root/tmp); - $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}); -} + require raid; + raid::prepare_prefixed($o->{raid}, $o->{prefix}); + + 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); + } -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; +#- 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 configureTimezone { setup::timeConfig($o->{rootPath}) } -sub configureServices { setup::servicesConfig($o->{rootPath}) } +#------------------------------------------------------------------------------ +sub choosePackages { + require pkgs; -sub setRootPassword { - $testing and return 0; + #- always setPackages as it may have to copy hdlist files and depslist file. + $o->setPackages; - $o->{install}->setRootPassword($o->{rootPath}); -} + #- 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}; -sub addUser { - $o->{install}->addUser($o->{rootPath}); + $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 + } + + $o->choosePackages($o->{packages}, $o->{compss}, $o->{compssUsers}, $_[1] == 1); + + #- check pre-condition where base backage has to be selected. + pkgs::packageFlagSelected(pkgs::packageByName($o->{packages}, 'basesystem')) or die "basesystem package not selected"; + + #- check if there are package that need installation. + $o->{steps}{installPackages}{done} = 0 if $o->{steps}{installPackages}{done} && pkgs::packagesToInstall($o->{packages}) > 0; } -sub createBootdisk { - $o->{isUpgrade} or fs::write('mnt', $o->{fstab}); - modules::write_conf("/mnt/etc/conf.modules", 'append'); +#------------------------------------------------------------------------------ +sub installPackages { + $o->readBootloaderConfigBeforeInstall if $_[1] == 1; - $o->{mkbootdisk} and lilo::mkbootdisk("/mnt", versionString()); + $o->beforeInstallPackages; + $o->installPackages; + $o->afterInstallPackages; +} +#------------------------------------------------------------------------------ +sub miscellaneous { + $o->miscellaneousBefore($_[0]); + $o->miscellaneous($_[0]); + + addToBeDone { + setVarsInSh("$o->{prefix}/etc/sysconfig/system", { + CLEAN_TMP => $o->{miscellaneous}{CLEAN_TMP}, + CLASS => $::expert && "expert" || $::beginner && "beginner" || "medium", + TYPE => $o->{installClass}, + SECURITY => $o->{security}, + META_CLASS => $o->{meta_class} || 'PowerPack', + }); + + my $f = "$o->{prefix}/etc/sysconfig/usb"; + output $f, +"USB=yes +MOUSE=" . bool2yesno(detect_devices::hasUsbMouse()) . " +KEYBOARD=" . bool2yesno(detect_devices::hasUsbKeyboard()) . " +STORAGE=" . bool2yesno(detect_devices::hasUsbZip()) . " +VISOR=no +" if modules::get_alias("usb-interface") && ! -e $f; + + install_any::fsck_option($o); + } 'installPackages'; } -sub setupBootloader { - 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 configureNetwork { + #- get current configuration of network device. + require network; + eval { network::read_all_conf($o->{prefix}, $o->{netc} ||= {}, $o->{intf} ||= {}) }; + $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}; -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; + $o->setRootPassword($_[0]); + addToBeDone { install_any::setAuthentication($o) } 'installPackages'; } +#------------------------------------------------------------------------------ +sub addUser { + return if $o->{isUpgrade} && !$_[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); + $o->addUser($_[0]); + install_any::setAuthentication($o); } +#------------------------------------------------------------------------------ +sub createBootdisk { + modules::write_conf($o->{prefix}); + $o->createBootdisk($_[1] == 1); +} + +#------------------------------------------------------------------------------ +sub setupBootloader { + return if $::g_auto_install; + + modules::write_conf($o->{prefix}); -sub versionString { - my $kernel = $o->{packages}->{kernel} or die "I couldn't find the kernel package!"; + $o->setupBootloaderBefore if $_[1] == 1; + $o->setupBootloader($_[1] - 1); - c::headerGetEntry($kernel->{header}, 'version') . "-" . - c::headerGetEntry($kernel->{header}, 'release'); + local $ENV{DRAKX_PASSWORD} = $o->{bootloader}{password}; + run_program::rooted($o->{prefix}, "/usr/sbin/msec", $o->{security}); } +#------------------------------------------------------------------------------ +sub configureX { + my ($clicked) = @_; -sub getNextStep { - my ($lastStep) = @_; + #- 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}); - $error and die "an error occured in step $lastStep"; - $cancel and die "cancel called in step $lastStep"; + $o->configureX($clicked) if pkgs::packageFlagInstalled(pkgs::packageByName($o->{packages}, 'XFree86')) && !$o->{X}{disabled} || $clicked; +} +#------------------------------------------------------------------------------ +sub generateAutoInstFloppy { $o->generateAutoInstFloppy } - $o->{direction} = 1; +#------------------------------------------------------------------------------ +sub exitInstall { $o->exitInstall(getNextStep() eq "exitInstall") } - return $o->{lastChoice} = $o->{steps}->{$lastStep}->{next}; -} -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; +#-###################################################################################### +#- 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; + + $::isInstall = 1; + $::beginner = $::expert = $::g_auto_install = 0; + +#- c::unlimit_core() unless $::testing; + + my ($cfg, $patch, @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 }, + vga => sub { $o->{vga} = $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' }, + desktop => sub { $o->{meta_class} = 'desktop' }, + lnx4win => sub { $o->{lnx4win} = 1 }, + readonly => sub { $o->{partitioning}{readonly} = $v ne "0" }, + display => sub { $o->{display} = $v }, + security => sub { $o->{security} = $v }, + live => sub { $::live = 1 }, + noauto => sub { $::noauto = 1 }, + test => sub { $::testing = 1 }, + nopci => sub { $::nopci = 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 }, + useless_thing_accepted => sub { $o->{useless_thing_accepted} = 1 }, + alawindows => sub { $o->{security} = 0; $o->{partitioning}{clearall} = 1; $o->{bootloader}{crushMbr} = 1 }, + fdisk => sub { $o->{partitioning}{fdisk} = 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 || $::live) { + 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", + ); } -} - -sub spawnShell { - $testing and 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"); - -x "/bin/sh" or log::l("cannot open shell - /usr/bin/sh doesn't exist"), return; + eval { spawnShell() }; - fork and return; + $o->{prefix} = $::testing ? "/tmp/test-perl-install" : $::live ? "" : "/mnt"; + $o->{root} = $::testing ? "/tmp/root-perl-install" : "/"; + if ($::live) { + $o->{isUpgrade} = 1; + #$::beginner = 0; #- use custom by default. + } + mkdir $o->{prefix}, 0755; + mkdir $o->{root}, 0755; - local *F; - sysopen F, "/dev/tty2", 2 or log::l("cannot open /dev/tty2 -- no shell will be provided"), return; + #- make sure we don't pick up any gunk from the outside world + my $remote_path = "$o->{prefix}/sbin:$o->{prefix}/bin:$o->{prefix}/usr/sbin:$o->{prefix}/usr/bin:$o->{prefix}/usr/X11R6/bin"; + $ENV{PATH} = "/usr/bin:/bin:/sbin:/usr/sbin:/usr/X11R6/bin:$remote_path" unless $::g_auto_install; - open STDIN, "<&F" or die; - open STDOUT, ">&F" or die; - open STDERR, ">&F" or die; - close F; + $o->{interactive} ||= 'gtk'; + if ($o->{interactive} eq "gtk" && availableMemory < 22 * 1024) { + log::l("switching to newt install cuz not enough memory"); + $o->{interactive} = "newt"; + } - c::setsid(); + 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 ($::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; - ioctl(STDIN, c::TIOCSCTTY(), 0) or warn "could not set new controlling tty: $!"; + $o->{prefix} = $::testing ? "/tmp/test-perl-install" : $::live ? "" : "/mnt"; + mkdir $o->{prefix}, 0755; - exec {"/bin/sh"} "-/bin/sh" or log::l("exec of /bin/sh failed: $!"); -} + 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(); -sub main { + eval { modules::load("af_packet") }; - # if this fails, it's okay -- it might help with free space though - unlink "/sbin/install"; + map_index { + modules::add_alias("sound-slot-$::i", $_->{driver}); + } modules::get_that_type('sound'); - print STDERR "in second stage install\n"; + #- needed very early for install_steps_gtk + modules::load_thiskind("usb"); + eval { ($o->{mouse}, $o->{wacom}) = mouse::detect() } unless $o->{nomouseprobe} || $o->{mouse}; - $o->{rootPath} = "/mnt"; + lang::set($o->{lang}); #- mainly for defcfg - $o->{method} = install_methods->new('cdrom'); - $o->{install} = install_steps_graphical->new($o); + $o->{allowFB} = listlength(cat_("/proc/fb")); - unless ($testing || $o->{localInstall}) { - if (fork == 0) { - while (1) { sleep(30); sync(); } - } + my $VERSION = cat__(install_any::getFile("VERSION")); + $o->{lnx4win} = 1 if $VERSION =~ /lnx4win/i; + $o->{meta_class} = 'desktop' if $VERSION =~ /desktop/i; + if ($o->{meta_class} eq 'desktop') { + $o->{installClass} = 'normal'; + } + if ($::oem) { + $o->{partitioning}{use_existing_root} = 1; + $o->{partitioning}{auto_allocate} = 1; + $o->{compssListLevel} = 50; + push @auto, 'selectInstallClass', 'selectMouse', 'doPartitionDisks', 'choosePackages', 'configureTimezone', 'configureX', 'exitInstall'; } - $o->{exitOnSuspend} = $o->{localInstall} || $testing; - - log::openLog(($testing || $o->{localInstall}) && 'debug.log'); - log::l("second stage install running (version $INSTALL_VERSION)"); + foreach (@auto) { + eval "undef *" . (!/::/ && "install_steps_interactive::") . $_; + my $s = $o->{steps}{/::(.*)/ ? $1 : $_} or next; + $s->{hidden} = 1; + } - log::ld("extra log messages are enabled"); + 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; + } + $::o = $o = $o_; + + if (-e "/tmp/network") { + require network; + #- 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); + } + } - $o->{rootPath} eq '/mnt' and spawnShell(); + #-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; + if (/^setstep (.*)/) { + $o->{step} = $1; + $o->{steps}{$1}{done} = 0; + $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}); -# chooseLanguage('fr'); + last if $o->{step} eq 'exitInstall'; + } + install_any::clean_postinstall_rpms(); + install_any::log_sizes($o); + install_any::ejectCdrom(); - $o->{netc} = net::readNetConfig("/tmp"); + $::live or fs::write($o->{prefix}, $o->{fstab}, $o->{manualFstab}, $o->{useSupermount}); + modules::write_conf($o->{prefix}); - if (my ($file) = glob_('/tmp/ifcfg-*')) { - log::l("found network config file $file"); - $o->{intf} = net::readNetInterfaceConfig($file); + #- to ensure linuxconf doesn't cry against those files being in the future + foreach ('/etc/modules.conf', '/etc/crontab', '/etc/sysconfig/mouse', '/etc/sysconfig/network', '/etc/X11/fs/config') { + my $now = time - 24 * 60 * 60; + utime $now, $now, "$o->{prefix}/$_"; } + $::live or install_any::killCardServices(); - log::l("reading /usr/lib/rpm/rpmrc"); - c::rpmReadConfigFiles_(); - log::l("\tdone"); + #- make sure failed upgrade will not hurt too much. + install_steps::cleanIfFailedUpgrade($o); - modules::load_deps("/modules/modules.dep"); - modules::read_conf("/tmp/conf.modules"); + -e "$o->{prefix}/usr/bin/urpmi" or eval { commands::rm("-rf", "$o->{prefix}/var/lib/urpmi") }; - # 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} = ""; + #- mainly for auto_install's + run_program::rooted($o->{prefix}, "sh", "-c", $o->{postInstall}) if $o->{postInstall}; + do { local $ENV{PATH} = $remote_path; + run_program::run("bash", "-c", $o->{postInstallNonRooted}) } if $o->{postInstallNonRooted}; - $o->{keyboard} = keyboard::read("/tmp/keyboard") || $default->{keyboard}; + #- have the really bleeding edge ddebug.log + eval { commands::cp('-f', "/tmp/ddebug.log", "$o->{prefix}/root") }; - 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(); + #- ala pixel? :-) [fpons] + sync(); sync(); log::l("installation complete, leaving"); - - <STDIN> unless $testing; -} - -sub killCardServices { - my $pid = cat_("/tmp/cardmgr.pid"); - $pid and kill(15, chop_($pid)); # send SIGTERM + print "\n" x 80; } -main(@ARGV); +#-###################################################################################### +#- Wonderful perl :( +#-###################################################################################### +1; |