summaryrefslogtreecommitdiffstats
path: root/perl-install/install/install2.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/install/install2.pm')
-rw-r--r--perl-install/install/install2.pm321
1 files changed, 224 insertions, 97 deletions
diff --git a/perl-install/install/install2.pm b/perl-install/install/install2.pm
index d9b80db32..7f6cbd6fe 100644
--- a/perl-install/install/install2.pm
+++ b/perl-install/install/install2.pm
@@ -1,11 +1,18 @@
-package install::install2; # $Id: install2.pm 255825 2009-04-08 11:54:23Z tv $
+package install::install2;
use diagnostics;
use strict;
use vars qw($o);
+use Getopt::Long qw(GetOptionsFromArray :config no_auto_abbrev no_getopt_compat pass_through);
BEGIN { $::isInstall = 1 }
+=head1 SYNOPSYS
+
+The installer stage2 real entry point
+
+=cut
+
#-######################################################################################
#- misc imports
#-######################################################################################
@@ -30,16 +37,32 @@ use fs::mount;
use messages;
#-#######################################################################################
-#-$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)
+=head1 Data Structure
+
+=head2 $O;
+
+$o (or $::o in other modules) is the big struct which contain, well everything:
+
+=over 4
+
+=item * globals
+
+=item * the interactive methods
+
+=item * ...
+
+=back
+
+if you want to do a kickstart file, you just have to add all the required fields (see for example
+the variable $default)
+
+=cut
#-#######################################################################################
$o = $::o = {
# bootloader => { linear => 0, message => 1, timeout => 5, restricted => 0 },
#- packages => [ qw() ],
partitioning => { clearall => 0, eraseBadPartitions => 0, auto_allocate => 0 }, #-, readonly => 0 },
- authentication => { blowfish => 1, shadow => 1 },
+ authentication => { sha512 => 1, shadow => 1 },
locale => { lang => 'en_US' },
#- isUpgrade => 0,
toRemove => [],
@@ -77,21 +100,40 @@ $o = $::o = {
};
+=head1 Steps Navigation
+
+=over
+
+=cut
sub installStepsCall {
my ($o, $auto, $fun, @args) = @_;
$fun = "install::steps::$fun" if $auto;
$o->$fun(@args);
}
+
+=item getNextStep($o)
+
+Returns next step
+
+=cut
+
sub getNextStep {
my ($o) = @_;
find { !$o->{steps}{$_}{done} && $o->{steps}{$_}{reachable} } @{$o->{orderedSteps}};
}
#-######################################################################################
-#- 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
+
+=back
+
+=head1 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
+
+=cut
+
#-######################################################################################
#------------------------------------------------------------------------------
@@ -117,7 +159,7 @@ sub selectMouse {
sub setupSCSI {
my ($auto) = @_;
- installStepsCall($o, $auto, 'setupSCSI');
+ installStepsCall($o, $auto, 'setupSCSI') if !$::local_install;
}
#------------------------------------------------------------------------------
@@ -152,6 +194,15 @@ sub selectInstallClass {
sub doPartitionDisks {
my ($auto) = @_;
$o->{steps}{formatPartitions}{done} = 0;
+ if ($o->{method} eq 'cdrom') {
+ #- Exclude the installer medium from the devices we can install onto.
+ #- This is needed when the installer medium is a USB Flash drive, to
+ #- prevent the user inadvertently overwriting the installer and to
+ #- prevent the installer ESP being used as the installed system ESP
+ # (mga#26714).
+ my $installer_device = $o->{stage2_phys_medium}{device};
+ @{$o->{all_hds}{hds}} = grep { $_->{device} ne $installer_device } @{$o->{all_hds}{hds}};
+ }
installStepsCall($o, $auto, 'doPartitionDisksBefore');
installStepsCall($o, $auto, 'doPartitionDisks');
installStepsCall($o, $auto, 'doPartitionDisksAfter');
@@ -171,6 +222,13 @@ sub formatPartitions {
}
installStepsCall($o, $auto, 'formatMountPartitions') if !$::testing;
+ # Workaround for mga#22059. Because stage2 does not include the udev 60-blocks.rule,
+ # udev does not automatically update the soft links in /dev/disk/by-uuid after we
+ # write the partition table and format the partitions. We need these links to be
+ # updated before we create the initrd. It would be cleaner to fix this with a udev
+ # rule, but for now, use brute force.
+ run_program::run('udevadm', 'trigger', '--type=devices', '--subsystem-match=block');
+
if ($want_root_formated) {
#- we formatted /, ensure /var/lib/rpm is cleaned otherwise bad things can happen
#- (especially when /var is *not* formatted)
@@ -200,7 +258,8 @@ sub choosePackages {
log::l("rpmsrate_flags_chosen's: ", join(' ', sort @flags));
#- check pre-condition that basesystem package must be selected.
- install::pkgs::packageByName($o->{packages}, 'basesystem')->flag_available or die "basesystem package not selected";
+ my $base_pkg = install::pkgs::packageByName($o->{packages}, 'basesystem');
+ $base_pkg->flag_available or $base_pkg->flag_installed or die "basesystem package not selected";
#- check if there are packages that need installation.
$o->{steps}{installPackages}{done} = 0 if $o->{steps}{installPackages}{done} && install::pkgs::packagesToInstall($o->{packages}) > 0;
@@ -289,20 +348,21 @@ sub exitInstall {
}
#-######################################################################################
-#- Udev Functions
+
+=head1 Udev Functions
+
+=over
+
+=cut
+
#-######################################################################################
-sub start_udev() {
- return if fuzzy_pidofs('udevd');
+=item start_udev()
- # Ensure /run is mounted
- mkdir("/run", 0755);
- run_program::run("mount -t tmpfs -o mode=0755,nosuid,nodev tmpfs /run");
+=cut
- # Fake dracut boot (due to checks employed when running dracut during install)
- # as we know that we'll have the needed metadata in udevadm db due to us
- # starting udev nice and early here.
- mkdir_p("/run/initramfs");
+sub start_udev() {
+ return if fuzzy_pidofs('udevd');
# Start up udev:
mkdir_p("/run/udev/rules.d");
@@ -313,14 +373,26 @@ sub start_udev() {
run_program::run("udevadm", "trigger", "--type=devices", "--action=add");
}
+=item stop_udev()
+
+=cut
+
sub stop_udev() {
kill 15, fuzzy_pidofs('udevd');
sleep(2);
- fs::mount::umount($_) foreach '/dev/pts', '/dev/shm', '/run';
+ fs::mount::umount($_) foreach '/dev/pts', '/dev/shm';
}
#-######################################################################################
-#- Other Functions
+
+=back
+
+=head1 Other Functions
+
+=over
+
+=cut
+
#-######################################################################################
sub init_local_install {
@@ -328,7 +400,7 @@ sub init_local_install {
push @::auto_steps,
# 'selectLanguage', 'selectKeyboard', 'miscellaneous', 'selectInstallClass',
'doPartitionDisks', 'formatPartitions';
- fs::mount::sys_kernel_debug(''); #- do it now so that when_load doesn't do it
+ eval { fs::mount::sys_kernel_debug('') }; #- do it now so that when_load doesn't do it
$o->{nomouseprobe} = 1;
$o->{mouse} = mouse::fullname2mouse('Universal|Any PS/2 & USB mice');
}
@@ -419,12 +491,18 @@ sub sig_segv_handler() {
install::steps_auto_install_non_interactive::errorInStep($o, $msg);
}
+=item read_stage1_net_conf() {
+
+Reads back netork configuration done by stage1 (see L<stages>).
+
+=cut
+
sub read_stage1_net_conf() {
require network::network;
#- get stage1 network configuration if any.
log::l('found /tmp/network');
add2hash($o->{net}{network} ||= {}, network::network::read_conf('/tmp/network'));
- if (my ($file) = glob_('/tmp/ifcfg-*')) {
+ if (my ($file) = grep { -f $_ } glob_('/tmp/ifcfg-*')) {
log::l("found network config file $file");
my $l = network::network::read_interface_conf($file);
$o->{net}{ifcfg}{$l->{DEVICE}} ||= $l;
@@ -447,90 +525,81 @@ sub read_stage1_net_conf() {
}
}
+=item parse_args($cfg, $patch)
+
+Parse arguments (which came from either the boot loader command line or its configuration file).
+
+=cut
+
sub parse_args {
my ($cfg, $patch);
- my %cmdline = map {
- my ($n, $v) = split /=/;
- $n => defined($v) ? $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;
+ my @cmdline = (@_, map { "--$_" } split ' ', cat_("/proc/cmdline"));
#- from stage1
put_in_hash(\%ENV, { getVarsFromSh('/tmp/env') });
- exists $ENV{$_} and $cmdline{lc($_)} = $ENV{$_} foreach qw(METHOD PCMCIA KICKSTART);
-
- map_each {
- my ($n, $v) = @_;
- my $f = ${{
- keyboard => sub { $o->{keyboard} = $v; push @::auto_steps, 'selectKeyboard' },
- lang => sub { $o->{lang} = $v },
- flang => sub { $o->{lang} = $v; push @::auto_steps, 'selectLanguage' },
- langs => sub { $o->{locale}{langs} = +{ map { $_ => 1 } split(':', $v) } },
- method => sub { $o->{method} = $v },
- pcmcia => sub { $o->{pcmcia} = $v },
- step => sub { $o->{steps}{first} = $v },
- meta_class => sub { $o->{meta_class} = $v },
- freedriver => sub { $o->{freedriver} = $v },
+ exists $ENV{$_} and push @cmdline, sprintf("--%s=%s", lc($_), $ENV{$_}) foreach qw(METHOD PCMCIA KICKSTART);
+
+ GetOptionsFromArray(\@cmdline,
+ $o, # must be 2nd parameter (see http://perldoc.perl.org/Getopt/Long.html#Storing-options-values-in-a-hash)
+ 'keyboard=s' => sub { $o->{keyboard} = $_[1]; push @::auto_steps, 'selectKeyboard' },
+ 'lang=s',
+ 'flang=s' => sub { $o->{lang} = $_[1]; push @::auto_steps, 'selectLanguage' },
+ 'langs=s' => sub { $o->{locale}{langs} = +{ map { $_ => 1 } split(':', $_[1]) } },
+ 'method=s',
+ 'pcmcia=s',
+ 'step=s' => \$o->{steps}{first},
+ 'meta_class=s',
+ 'freedriver=s',
# fs/block options:
- no_bad_drives => sub { $o->{partitioning}{no_bad_drives} = 1 },
- nodmraid => sub { $o->{partitioning}{nodmraid} = 1 },
- readonly => sub { $o->{partitioning}{readonly} = $v ne "0" },
- use_uuid => sub { $::no_uuid_by_default = !$v },
+ no_bad_drives => \$o->{partitioning}{no_bad_drives},
+ nodmraid => \$o->{partitioning}{nodmraid},
+ 'readonly=s' => sub { $o->{partitioning}{readonly} = $_[1] ne "0" },
+ 'use_uuid=s' => sub { $::no_uuid_by_default = !$_[1] },
# urpmi options:
- debug_urpmi => sub { $o->{debug_urpmi} = 1 },
- justdb => sub { $o->{justdb} = 1 },
- 'tune-rpm' => sub { $o->{'tune-rpm'} = 'all' },
+ 'debug_urpmi',
+ 'deploops',
+ 'justdb',
+ 'tune-rpm' => sub { $o->{'tune-rpm'} = 'all' },
+ 'downloader=s' => sub { $o->{options}{downloader} = $_[1] },
# GUI options:
- vga16 => sub { $o->{vga16} = $v },
- vga => sub { $o->{vga} = $v =~ /0x/ ? hex($v) : $v },
- display => sub { $o->{display} = $v },
- askdisplay => sub { print "Please enter the X11 display to perform the install on ? "; $o->{display} = chomp_(scalar(<STDIN>)) },
- text => sub { $o->{interactive} = "curses" },
- stdio => sub { $o->{interactive} = "stdio" },
- newt => sub { $o->{interactive} = "curses" },
- simple_themes => sub { $o->{simple_themes} = 1 },
- theme => sub { $o->{theme} = $v },
- doc => sub { $o->{doc} = 1 }, #- will be used to know that we're running for the doc team,
- #- e.g. we want screenshots with a good B&W contrast
-
- security => sub { $o->{security} = $v },
+ 'vga16=s',
+ 'vga=s' => sub { $o->{vga} = $_[1] =~ /0x/ ? hex($_[1]) : $_[1] },
+ 'display=s',
+ askdisplay => sub { print "Please enter the X11 display to perform the install on ? "; $o->{display} = chomp_(scalar(<STDIN>)) },
+ 'newt|text' => sub { $o->{interactive} = "curses" },
+ stdio => sub { $o->{interactive} = "stdio" },
+ 'simple_themes',
+ 'theme=s',
+ 'doc', #- will be used to know that we're running for the doc team,
+ #- e.g. we want screenshots with a good B&W contrast
+
+ 'security=s',
# auto install options:
- noauto => sub { $::noauto = 1 },
- testing => sub { $::testing = 1 },
- patch => sub { $patch = 1 },
- defcfg => sub { $cfg = $v },
- kickstart => sub { $::auto_install = $v },
+ noauto => \$::noauto,
+ testing => \$::testing,
+ patch => \$patch,
+ 'defcfg=s' => \$cfg,
+ 'auto_install|kickstart=s' => \$::auto_install,
- local_install => sub { $::local_install = 1 },
- uml_install => sub { $::uml_install = $::local_install = 1 },
- auto_install => sub { $::auto_install = $v },
+ local_install => \$::local_install,
+ uml_install => sub { $::uml_install = $::local_install = 1 },
# debugging options:
- useless_thing_accepted => sub { $o->{useless_thing_accepted} = 1 },
+ 'useless_thing_accepted',
alawindows => sub { $o->{security} = 0; $o->{partitioning}{clearall} = 1; $o->{bootloader}{crushMbr} = 1 },
- fdisk => sub { $o->{partitioning}{fdisk} = 1 },
- nomouseprobe => sub { $o->{nomouseprobe} = $v },
- updatemodules => sub { $o->{updatemodules} = 1 },
+ fdisk => \$o->{partitioning}{fdisk},
+ 'nomouseprobe=s',
+ 'updatemodules',
- suppl => sub { $o->{supplmedia} = $v },
- askmedia => sub { $o->{askmedia} = 1 },
- restore => sub { $::isRestore = 1 },
- compsslistlevel => sub { $o->{compssListLevel} = $v },
- }}{lc $n}; &$f if $f;
- } %cmdline;
+ 'suppl=s' => \$o->{supplmedia},
+ 'askmedia',
+ restore => \$::isRestore,
+ 'compssListLevel=s' # case is important!
+ );
($cfg, $patch);
}
@@ -574,17 +643,46 @@ sub process_auto_steps() {
}
}
+=item process_patch($cfg, $patch)
+
+Handle installer live patches:
+
+=over 4
+
+=item * OEM patch (C<install/patch-oem.pl>)
+
+=item * defcfg (the file indicated by the defcfg option)
+
+=item * patch (C<patch> file)
+
+=back
+
+=cut
+
sub process_patch {
my ($cfg, $patch) = @_;
#- oem patch should be read before to still allow patch or defcfg.
eval { $o = $::o = install::any::loadO($o, "install/patch-oem.pl"); log::l("successfully read oem patch") };
- #- patch should be read after defcfg in order to take precedance.
+ #- patch should be read after defcfg in order to take precedence.
eval { $o = $::o = install::any::loadO($o, $cfg); log::l("successfully read default configuration: $cfg") } if $cfg;
eval { $o = $::o = install::any::loadO($o, "patch"); log::l("successfully read patch") } if $patch;
}
#-######################################################################################
-#- MAIN
+
+=item main()
+
+This is the main function, the installer entry point called by runinstall2:
+
+=over 4
+
+=item * initialization
+
+=item * steps
+
+=back
+
+=cut
#-######################################################################################
sub main {
$SIG{SEGV} = \&sig_segv_handler;
@@ -605,7 +703,14 @@ sub main {
$o->{stage2_phys_medium} = install::media::stage2_phys_medium($o->{method});
- log::l("second stage install running (", install::any::drakx_version($o), ")");
+ if (-e '/tmp/media/DATE.txt') {
+ my @mount_entry = grep { m,/tmp/media, } cat_('/proc/mounts');
+ my @mount_fields = split(/ /, $mount_entry[0]);
+ log::l(run_program::get_stdout('blkid', '-s', 'LABEL', $mount_fields[0]));
+ log::l('ISO date: ' . cat_('/tmp/media/DATE.txt'));
+ }
+
+ install::any::log_system_info($o);
eval { touch('/root/non-chrooted-marker.DrakX') }; #- helps distinguishing /root and /mnt/root when we don't know if we are chrooted
@@ -618,7 +723,7 @@ sub main {
}
$o->{prefix} = $::prefix = $::testing ? "/tmp/test-perl-install" : "/mnt";
- mkdir $::prefix, 0755;
+ mkdir $::prefix, 0755 if ! -d $::prefix;
init_path();
@@ -648,6 +753,12 @@ sub main {
# perl_checker: require install::steps_stdio
require "install/steps_$o->{interactive}.pm" if $o->{interactive};
+ # psmouse is now modular:
+ eval { modules::load("psmouse") };
+
+ #- FIXME loading evdev should prevent crash of following line
+ eval { modules::load("evdev") };
+
#- needed before accessing floppy (in case of usb floppy)
modules::load_category($o->{modules_conf}, 'bus/usb');
@@ -692,8 +803,13 @@ sub main {
finish_install();
}
+=item real_main() {
+
+Go through the steps cycle
+
+=cut
+
sub real_main() {
- #-the main cycle
MAIN: for ($o->{step} = $o->{steps}{first};; $o->{step} = getNextStep($o)) {
$o->{steps}{$o->{step}}{entered}++;
$o->enteringStep($o->{step});
@@ -705,6 +821,7 @@ sub real_main() {
log::l("step \"$o->{step}\" took: ", formatTimeRaw(time() - $time));
$o->kill_action;
if ($err) {
+ log::l("step \"$o->{step}\" failed with error: $err");
local $_ = $err;
$o->kill_action;
if (!/^already displayed/) {
@@ -724,6 +841,12 @@ sub real_main() {
}
}
+=item finish_install() {
+
+Clean up the installer before the final reboot.
+
+=cut
+
sub finish_install() {
unlink $install::any::compressed_image_on_disk;
install::media::clean_postinstall_rpms();
@@ -739,7 +862,7 @@ sub finish_install() {
install::steps::cleanIfFailedUpgrade($o);
#- drop urpmi DB if urpmi is not installed:
- -e "$::prefix/usr/sbin/urpmi.update" or eval { rm_rf("$::prefix/var/lib/urpmi") };
+ -e "$::prefix/usr/sbin/urpmi" or eval { rm_rf("$::prefix/var/lib/urpmi") };
system("chroot", $::prefix, "bash", "-c", $o->{postInstallBeforeReboot}) if $o->{postInstallBeforeReboot};
@@ -755,4 +878,8 @@ sub finish_install() {
print "\n" x 80 if !$::local_install;
}
+=back
+
+=cut
+
1;