summaryrefslogtreecommitdiffstats
path: root/perl-install/install2.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/install2.pm')
-rw-r--r--perl-install/install2.pm992
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;