summaryrefslogtreecommitdiffstats
path: root/perl-install/install/steps.pm
diff options
context:
space:
mode:
authorPascal Rigaux <pixel@mandriva.com>2007-04-25 12:26:16 +0000
committerPascal Rigaux <pixel@mandriva.com>2007-04-25 12:26:16 +0000
commit126777bc019a54afb4ec51299f2cf9d2841698aa (patch)
tree97f76e571902ead55ba138f1156a4b4f00b9b779 /perl-install/install/steps.pm
parentf1f67448efc714873378dfeb8279fae68054a90a (diff)
downloaddrakx-126777bc019a54afb4ec51299f2cf9d2841698aa.tar
drakx-126777bc019a54afb4ec51299f2cf9d2841698aa.tar.gz
drakx-126777bc019a54afb4ec51299f2cf9d2841698aa.tar.bz2
drakx-126777bc019a54afb4ec51299f2cf9d2841698aa.tar.xz
drakx-126777bc019a54afb4ec51299f2cf9d2841698aa.zip
re-sync after the big svn loss
Diffstat (limited to 'perl-install/install/steps.pm')
-rw-r--r--perl-install/install/steps.pm961
1 files changed, 961 insertions, 0 deletions
diff --git a/perl-install/install/steps.pm b/perl-install/install/steps.pm
new file mode 100644
index 000000000..dfd91646e
--- /dev/null
+++ b/perl-install/install/steps.pm
@@ -0,0 +1,961 @@
+package install::steps; # $Id$
+
+use diagnostics;
+use strict;
+use vars qw(@filesToSaveForUpgrade @filesNewerToUseAfterUpgrade);
+
+#-######################################################################################
+#- misc imports
+#-######################################################################################
+use common;
+use install::any 'addToBeDone';
+use partition_table;
+use detect_devices;
+use fs::any;
+use fs::type;
+use fs::partitioning;
+use modules;
+use run_program;
+use lang;
+use keyboard;
+use fsedit;
+use do_pkgs;
+use install::pkgs;
+use any;
+use log;
+
+our @ISA = qw(do_pkgs);
+
+@filesToSaveForUpgrade = qw(
+/etc/ld.so.conf /etc/fstab /etc/hosts /etc/conf.modules /etc/modules.conf
+);
+
+@filesNewerToUseAfterUpgrade = qw(
+/etc/profile
+);
+
+#-######################################################################################
+#- OO Stuff
+#-######################################################################################
+sub new($$) {
+ my ($type, $o) = @_;
+
+ bless $o, ref($type) || $type;
+ return $o;
+}
+
+sub charsetChanged {
+ my ($_o) = @_;
+}
+
+#-######################################################################################
+#- In/Out Steps Functions
+#-######################################################################################
+sub enteringStep {
+ my ($_o, $step) = @_;
+ log::l("starting step `$step'");
+}
+sub leavingStep {
+ my ($o, $step) = @_;
+ log::l("step `$step' finished");
+
+ if (-d "$::prefix/root/drakx") {
+ eval { cp_af("/tmp/ddebug.log", "$::prefix/root/drakx") };
+ output(install::any::auto_inst_file(), install::any::g_auto_install(1));
+ }
+
+ foreach my $s (@{$o->{orderedSteps}}) {
+ #- the reachability property must be recomputed each time to take
+ #- into account failed step.
+ next if $o->{steps}{$s}{done} && !$o->{steps}{$s}{redoable};
+
+ my $reachable = 1;
+ if (my $needs = $o->{steps}{$s}{needs}) {
+ my @l = ref($needs) ? @$needs : $needs;
+ $reachable = min(map { $o->{steps}{$_}{done} || 0 } @l);
+ }
+ $o->{steps}{$s}{reachable} = 1 if $reachable;
+ }
+ $o->{steps}{$step}{reachable} = $o->{steps}{$step}{redoable};
+
+ while (my $f = shift @{$o->{steps}{$step}{toBeDone} || []}) {
+ eval { &$f() };
+ if (my $err = $@) {
+ $o->ask_warn(N("Error"), [
+N("An error occurred, but I do not know how to handle it nicely.
+Continue at your own risk."), formatError($err) || $err ]);
+ }
+ }
+}
+
+sub errorInStep {
+ my ($_o, $err) = @_;
+ print "error :(\n";
+ print "$err\n\n";
+ c::_exit(1);
+}
+sub kill_action {}
+
+#-######################################################################################
+#- Steps Functions
+#-######################################################################################
+#------------------------------------------------------------------------------
+sub selectLanguage {
+ my ($o) = @_;
+
+ #- for auto_install compatibility with old $o->{lang}
+ $o->{locale} = lang::system_locales_to_ourlocale($o->{lang}, $o->{lang}) if $o->{lang};
+ $o->{locale}{langs} ||= { $o->{locale}{lang} => 1 };
+
+ if (!exists $o->{locale}{country}) {
+ lang::lang_changed($o->{locale});
+ }
+
+ add2hash_($o->{locale}, { utf8 => lang::utf8_should_be_needed($o->{locale}) });
+ lang::set($o->{locale}, !$o->isa('interactive::gtk'));
+
+ log::l("selectLanguage: pack_langs: ", lang::pack_langs($o->{locale}{langs}), " utf8-flag: ", to_bool($o->{locale}{utf8}));
+
+ #- for auto_install compatibility with old $o->{keyboard} containing directly $o->{keyboard}{KEYBOARD}
+ $o->{keyboard} = { KEYBOARD => $o->{keyboard} } if $o->{keyboard} && !ref($o->{keyboard});
+
+ if (!$o->{keyboard} || $o->{keyboard}{unsafe}) {
+ $o->{keyboard} = keyboard::default($o->{locale});
+ $o->{keyboard}{unsafe} = 1;
+ keyboard::setup_install($o->{keyboard});
+ }
+
+ $o->charsetChanged;
+
+ addToBeDone {
+ lang::write_langs($o->{locale}{langs});
+ } 'formatPartitions';
+ addToBeDone {
+ lang::write_and_install($o->{locale}, $o->do_pkgs);
+ } 'installPackages';
+}
+#------------------------------------------------------------------------------
+sub selectKeyboard {
+ my ($o) = @_;
+ keyboard::setup_install($o->{keyboard});
+
+ addToBeDone {
+ keyboard::write($o->{keyboard});
+ } 'installPackages' if !$o->{isUpgrade} || !$o->{keyboard}{unsafe};
+
+ if ($o->{raw_X}) {
+ require Xconfig::default;
+ Xconfig::default::config_keyboard($o->{raw_X}, $o->{keyboard});
+ $o->{raw_X}->write;
+ }
+}
+#------------------------------------------------------------------------------
+sub acceptLicense {}
+
+#------------------------------------------------------------------------------
+sub setupSCSI {
+ my ($o) = @_;
+ install::any::configure_pcmcia($o);
+ modules::load(modules::category2modules('disk/cdrom'));
+ modules::load_category($o->{modules_conf}, 'bus/firewire');
+ modules::load_category($o->{modules_conf}, 'disk/ide|scsi|hardware_raid|sata|firewire');
+
+ install::any::getHds($o);
+}
+
+#------------------------------------------------------------------------------
+sub selectInstallClass {
+ my ($o) = @_;
+
+ if ($o->{partitioning}{use_existing_root} || $o->{isUpgrade}) {
+ # either one root is defined (and all is ok), or we take the first one we find
+ my $p = fs::get::root_($o->{fstab}) || (first(install::any::find_root_parts($o->{fstab}, $::prefix)) || die)->{part};
+ $o->{migrate_device_names} = install::any::use_root_part($o->{all_hds}, $p);
+ }
+}
+
+#------------------------------------------------------------------------------
+sub doPartitionDisksBefore {
+ my ($o) = @_;
+ eval {
+ eval { fs::mount::umount("$::prefix/sys") };
+ eval { fs::mount::umount("$::prefix/proc/bus/usb") };
+ eval { fs::mount::umount("$::prefix/proc") };
+ eval { fs::mount::umount_all($o->{fstab}) };
+ eval { sleep 1; fs::mount::umount_all($o->{fstab}) } if $@; #- HACK
+ } if $o->{fstab} && !$::testing;
+}
+
+#------------------------------------------------------------------------------
+sub doPartitionDisksAfter {
+ my ($o) = @_;
+
+ fs::any::write_hds($o->{all_hds}, $o->{fstab}, !$o->{isUpgrade}, sub { $o->rebootNeeded }, $o);
+
+ if ($::local_install) {
+ my $p = fs::get::mntpoint2part($::prefix, [ fs::read_fstab('', '/proc/mounts') ]);
+ my $part = find { fs::get::is_same_hd($p, $_) } @{$o->{fstab}};
+ $part ||= $o->{fstab}[0];
+ $part->{mntpoint} = '/';
+ $part->{isMounted} = 1;
+ }
+
+ fs::any::check_hds_boot_and_root($o->{all_hds}, $o->{fstab});
+
+ if ($o->{partitioning}{use_existing_root}) {
+ #- ensure those partitions are mounted so that they are not proposed in choosePartitionsToFormat
+ fs::mount::part($_) foreach sort { $a->{mntpoint} cmp $b->{mntpoint} }
+ grep { $_->{mntpoint} && maybeFormatted($_) } @{$o->{fstab}};
+ }
+}
+
+#------------------------------------------------------------------------------
+sub doPartitionDisks {
+ my ($o) = @_;
+
+ if ($o->{partitioning}{auto_allocate}) {
+ catch_cdie { fsedit::auto_allocate($o->{all_hds}, $o->{partitions}) } sub { 1 };
+ }
+}
+
+#------------------------------------------------------------------------------
+
+sub rebootNeeded($) {
+ my ($_o) = @_;
+ log::l("Rebooting...");
+ c::_exit(0);
+}
+
+sub choosePartitionsToFormat {
+ my ($o) = @_;
+ fs::partitioning::guess_partitions_to_format($o->{fstab});
+}
+
+sub formatMountPartitions {
+ my ($o) = @_;
+ fs::format::formatMount_all($o->{all_hds}, $o->{fstab}, undef);
+}
+
+#------------------------------------------------------------------------------
+sub setPackages {
+ my ($o) = @_;
+
+ install::any::setPackages($o);
+}
+
+sub ask_deselect_media__copy_on_disk {
+ my (undef, $_hdlists, $_copy_rpms_on_disk) = @_;
+ 0;
+}
+
+sub ask_change_cd {
+ my (undef, $phys_m, $_o_rel_file) = @_;
+ log::l("change to medium " . install::media::phys_medium_to_string($phys_m) . " refused (it can't be done automatically)");
+ 0;
+}
+
+sub selectSupplMedia { '' }
+
+sub choosePackages {
+ my ($o) = @_;
+
+ #- now for upgrade, package that must be upgraded are
+ #- selected first, after is used the same scheme as install.
+
+ #- make sure we kept some space left for available else the system may
+ #- not be able to start (xfs at least).
+ my $available = install::any::getAvailableSpace($o);
+ my $availableCorrected = install::pkgs::invCorrectSize($available / sqr(1024)) * sqr(1024);
+ log::l(sprintf "available size %s (corrected %s)", formatXiB($available), formatXiB($availableCorrected));
+
+ add2hash_($o, { compssListLevel => 5 }) if !$::auto_install;
+
+ #- !! destroying user selection of packages (they may have done individual selection before)
+ exists $o->{compssListLevel}
+ and install::pkgs::setSelectedFromCompssList($o->{packages}, $o->{rpmsrate_flags_chosen}, $o->{compssListLevel}, $availableCorrected);
+
+ $availableCorrected;
+}
+
+sub upgrading_redhat() {
+ #- remove weird config files that bother Xconfig::* too much
+ unlink "$::prefix/etc/X11/XF86Config";
+ unlink "$::prefix/etc/X11/XF86Config-4";
+
+ sub prefering_mdk {
+ my ($lpkg, $rpkg_ver, $c) = @_;
+ my $lpkg_ver = $lpkg->version . '-' . $lpkg->release;
+ log::l($lpkg->name . ' ' . ': prefering ' . ($c == 1 ? "$lpkg_ver over $rpkg_ver" : "$rpkg_ver over $lpkg_ver"));
+ }
+
+ my $old_compare_pkg = \&URPM::Package::compare_pkg;
+ undef *URPM::Package::compare_pkg;
+ *URPM::Package::compare_pkg = sub {
+ my ($lpkg, $rpkg) = @_;
+ my $c = ($lpkg->release =~ /mdk$/ ? 1 : 0) - ($rpkg->release =~ /mdk$/ ? 1 : 0);
+ if ($c) {
+ prefering_mdk($lpkg, $rpkg->version . '-' . $rpkg->release, $c);
+ $c;
+ } else {
+ &$old_compare_pkg;
+ }
+ };
+
+ my $old_compare = \&URPM::Package::compare;
+ undef *URPM::Package::compare;
+ *URPM::Package::compare = sub {
+ my ($lpkg, $rpkg_ver) = @_;
+ my $c = ($lpkg->release =~ /mdk$/ ? 1 : 0) - ($rpkg_ver =~ /mdk$/ ? 1 : 0);
+ if ($c) {
+ prefering_mdk($lpkg, $rpkg_ver, $c);
+ return $c;
+ }
+ &$old_compare;
+ };
+}
+
+sub beforeInstallPackages {
+ my ($o) = @_;
+
+ read_bootloader_config($o);
+
+ if ($o->{isUpgrade}) {
+ $o->{modules_conf}->merge_into(modules::any_conf->read);
+ }
+
+ #- save these files in case of upgrade failure.
+ if ($o->{isUpgrade}) {
+ foreach (@filesToSaveForUpgrade) {
+ unlink "$::prefix/$_.mdkgisave";
+ if (-e "$::prefix/$_") {
+ eval { cp_af("$::prefix/$_", "$::prefix/$_.mdkgisave") };
+ }
+ }
+ foreach (@filesNewerToUseAfterUpgrade) {
+ unlink "$::prefix/$_.rpmnew";
+ }
+ }
+
+ #- mainly for upgrading redhat packages, but it can help other
+ my @should_not_be_dirs = qw(/usr/share/locale/zh_TW/LC_TIME /usr/include/GL);
+ my @should_be_dirs = qw(/etc/X11/xkb);
+ my @to_remove = (
+ (grep { !-l $_ && -d $_ } map { "$::prefix$_" } @should_not_be_dirs),
+ (grep { -l $_ || !-d $_ && -e $_ } map { "$::prefix$_" } @should_be_dirs),
+ );
+ rm_rf(@to_remove);
+
+ if ($o->{isUpgrade} eq 'redhat') {
+ upgrading_redhat();
+ }
+
+ if ($o->{isUpgrade} =~ /redhat|conectiva/) {
+ #- to ensure supermount is removed for cds
+ fs::mount_options::set_all_default($o->{all_hds}, %$o, lang::fs_options($o->{locale}));
+ }
+
+
+ #- some packages need such files for proper installation.
+ install::any::write_fstab($o);
+
+ require network::network;
+ network::network::add2hosts("localhost", "127.0.0.1");
+
+ log::l("setting excludedocs to $o->{excludedocs}");
+ substInFile { s/%_excludedocs.*//; $_ .= "%_excludedocs yes\n" if eof && $o->{excludedocs} } "$::prefix/etc/rpm/macros";
+
+ #- add oem theme if the files exists.
+ mkdir_p("$::prefix/usr/share");
+ install::media::getAndSaveFile_($o->{stage2_phys_medium}, "install/oem-theme.rpm", "$::prefix/usr/share/oem-theme.rpm");
+
+ system("sh", "-c", $o->{preInstallNonRooted}) if $o->{preInstallNonRooted};
+}
+
+#- returns number of packages installed, 0 if none were selected.
+sub pkg_install {
+ my ($o, @l) = @_;
+ log::l("selecting packages " . join(" ", @l));
+
+ install::pkgs::select_by_package_names($o->{packages}, \@l);
+
+ my @toInstall = install::pkgs::packagesToInstall($o->{packages});
+ if (@toInstall) {
+ log::l("installing packages");
+ $o->installPackages;
+ } else {
+ log::l("all packages selected are already installed, nothing to do");
+ 0;
+ }
+}
+
+sub installCallback {
+# my (undef, $msg, @para) = @_;
+# log::l("$msg: " . join(',', @para));
+}
+
+sub installPackages { #- complete REWORK, TODO and TOCHECK!
+ my ($o) = @_;
+ my $packages = $o->{packages};
+
+ install::pkgs::remove_marked_ask_remove($packages, \&installCallback);
+
+ #- small transaction will be built based on this selection and depslist.
+ my @toInstall = install::pkgs::packagesToInstall($packages);
+
+ my $time = time();
+ {
+ local $ENV{DURING_INSTALL} = 1;
+ local $ENV{TMPDIR} = '/tmp';
+ local $ENV{TMP} = '/tmp';
+ install::pkgs::install($o->{isUpgrade}, \@toInstall, $packages, \&installCallback);
+ }
+ any::writeandclean_ldsoconf($::prefix);
+
+ run_program::rooted_or_die($::prefix, 'ldconfig');
+
+ log::l("Install took: ", formatTimeRaw(time() - $time));
+ install::media::log_sizes();
+ scalar(@toInstall); #- return number of packages installed.
+}
+
+sub afterInstallPackages($) {
+ my ($o) = @_;
+
+ read_bootloader_config($o) if $o->{isUpgrade} && is_empty_hash_ref($o->{bootloader});
+
+ die N("Some important packages did not get installed properly.
+Either your cdrom drive or your cdrom is defective.
+Check the cdrom on an installed computer using \"rpm -qpl media/main/*.rpm\"
+") if any { m|read failed: Input/output error| } cat_("$::prefix/root/drakx/install.log");
+
+ if (arch() !~ /^sparc/) { #- TODO restore it as may be needed for sparc
+ -x "$::prefix/usr/bin/dumpkeys" or $::testing or die
+"Some important packages did not get installed properly.
+
+Please switch to console 2 (using ctrl-alt-f2)
+and look at the log file /tmp/ddebug.log
+
+Consoles 1,3,4,7 may also contain interesting information";
+ }
+
+ #- why not? cuz weather is nice today :-) [pixel]
+ common::sync(); common::sync();
+
+ #- generate /etc/lvmtab needed for rc.sysinit
+ run_program::rooted($::prefix, 'lvm2', 'vgscan') if -e '/etc/lvmtab';
+
+ require harddrake::autoconf;
+ #- configure PCMCIA services if needed.
+ harddrake::autoconf::pcmcia($o->{pcmcia});
+ #- configure CPU frequency modules
+ harddrake::autoconf::cpufreq();
+
+ #- for mandrake_firstime
+ touch "$::prefix/var/lock/TMP_1ST";
+
+ any::config_dvd($::prefix);
+ any::config_mtools($::prefix);
+
+ #- make sure wins is disabled in /etc/nsswitch.conf
+ #- else if eth0 is not existing, glibc segfaults.
+ substInFile { s/\s*wins// if /^\s*hosts\s*:/ } "$::prefix/etc/nsswitch.conf";
+
+ #- make sure some services have been enabled (or a catastrophic restart will occur).
+ #- these are normally base package post install scripts or important services to start.
+ run_program::rooted($::prefix, "chkconfig", "--add", $_) foreach
+ qw(netfs network rawdevices sound kheader keytable syslog crond portmap);
+
+ if ($o->{mouse}{device} =~ /ttyS/) {
+ log::l("disabling gpm for serial mice (does not get along nicely with X)");
+ run_program::rooted($::prefix, "chkconfig", "--del", "gpm");
+ }
+
+ #- install urpmi before as rpmdb will be opened, this will cause problem with update-menus.
+ $o->install_urpmi;
+
+ #- update menu scheme before calling update menus if desktop mode.
+ if ($o->{meta_class} eq 'desktop') {
+ run_program::rooted($::prefix, "touch", "/etc/menu/do-not-create-menu-link");
+ run_program::rooted($::prefix, "touch", "/etc/menu/enable_simplified");
+ } elsif (!$o->{isUpgrade}) {
+ run_program::rooted($::prefix, "touch", "/etc/menu/do-not-create-menu-link");
+ }
+
+ if ($o->{pcmcia}) {
+ substInFile { s/.*(TaskBarShowAPMStatus).*/$1=1/ } "$::prefix/usr/lib/X11/icewm/preferences";
+ eval { cp_af("$::prefix/usr/share/applnk/System/kapm.kdelnk",
+ "$::prefix/etc/skel/Desktop/Autostart/kapm.kdelnk") };
+ }
+
+ if ($o->{brltty}) {
+ output("$::prefix/etc/brltty.conf", <<EOF);
+braille-driver $o->{brltty}{driver}
+braille-device $o->{brltty}{device}
+text-table $o->{brltty}{table}
+EOF
+ }
+
+
+ install::any::disable_user_view() if $o->{security} >= 3 || $o->{authentication}{NIS};
+ run_program::rooted($::prefix, "kdeDesktopCleanup");
+
+ #- move some file after an upgrade that may be seriously annoying.
+ #- and rename saved files to .mdkgiorig.
+ if ($o->{isUpgrade}) {
+ my $pkg = install::pkgs::packageByName($o->{packages}, 'rpm');
+ $pkg && ($pkg->flag_selected || $pkg->flag_installed) && $pkg->compare(">= 4.0") and install::pkgs::cleanOldRpmDb();
+
+ log::l("moving previous desktop files that have been updated to Trash of each user");
+ install::any::kdemove_desktop_file($::prefix);
+
+ foreach (@filesToSaveForUpgrade) {
+ renamef("$::prefix/$_.mdkgisave", "$::prefix/$_.mdkgiorig")
+ if -e "$::prefix$_.mdkgisave";
+ }
+
+ foreach (@filesNewerToUseAfterUpgrade) {
+ if (-e "$::prefix/$_.rpmnew" && -e "$::prefix/$_") {
+ renamef("$::prefix/$_", "$::prefix/$_.mdkgiorig");
+ renamef("$::prefix/$_.rpmnew", "$::prefix/$_");
+ }
+ }
+ }
+
+ renamef(install::pkgs::removed_pkgs_to_upgrade_file(), install::pkgs::removed_pkgs_to_upgrade_file() . '.done');
+ unlink(glob("$::prefix/root/drakx/*.upgrading"));
+
+ if ($o->{upgrade_by_removing_pkgs_matching}) {
+ if (cat_("$::prefix/etc/inittab.rpmsave") =~ /^id:5:initdefault:\s*$/m) {
+ $o->{X}{xdm} = 1;
+ require Xconfig::various;
+ Xconfig::various::runlevel(5);
+ }
+ }
+
+ any::fix_broken_alternatives($o->{isUpgrade} eq 'redhat');
+
+ #- update theme directly from a package (simplest).
+ if (-s "$::prefix/usr/share/oem-theme.rpm") {
+ run_program::rooted($::prefix, "rpm", "-U", "/usr/share/oem-theme.rpm");
+ unlink "/usr/share/oem-theme.rpm";
+ }
+
+ #- call update-menus at the end of package installation
+ push @{$o->{waitpids}}, run_program::raw({ root => $::prefix, detach => 1 }, "update-menus", "-n");
+
+ $o->install_hardware_packages;
+
+ if ($o->{updatemodules}) {
+ $o->updatemodules($ENV{THIRDPARTY_DEVICE}, $ENV{THIRDPARTY_DIR});
+ }
+}
+
+sub install_urpmi {
+ my ($o) = @_;
+
+ my $pkg = install::pkgs::packageByName($o->{packages}, 'urpmi');
+ if ($pkg && ($pkg->flag_selected || $pkg->flag_installed)
+ #- this is a workaround. if many urpmi packages are found in the
+ #- provides of all media, packagesProviding() might return the wrong
+ #- one. This probably needs to be fixed in URPM
+ || run_program::rooted_get_stdout($::prefix, '/bin/rpm', '-q', 'urpmi') =~ /urpmi/
+ ) {
+ install::media::install_urpmi($o->{method}, $o->{packages});
+ install::pkgs::saveCompssUsers($o->{packages}, $o->{compssUsers});
+ } else {
+ log::l("skipping install_urpmi, urpmi not installed");
+ }
+}
+
+sub install_hardware_packages {
+ my ($o) = @_;
+ if ($o->{match_all_hardware}) {
+ my @l;
+
+ require Xconfig::card;
+ require Xconfig::proprietary;
+ my $cards = Xconfig::card::readCardsDB("$ENV{SHARE_PATH}/ldetect-lst/Cards+");
+ my @drivers = uniq(map { exists $_->{Driver2} ? Xconfig::proprietary::pkg_name_for_Driver2($_) : () } values %$cards);
+ push @l, map { $_, @{$o->do_pkgs->check_kernel_module_packages($_) || []} } @drivers;
+
+ require network::connection;
+ require network::thirdparty;
+ foreach my $type (network::connection->get_types) {
+ $type->can('get_thirdparty_settings') or next;
+ foreach my $settings (@{$type->get_thirdparty_settings || []}) {
+ foreach (@network::thirdparty::thirdparty_types) {
+ my @packages = network::thirdparty::get_required_packages($_, $settings);
+ push @l, network::thirdparty::get_available_packages($_, $o, @packages);
+ }
+ }
+ }
+
+ $o->do_pkgs->install(@l) if @l;
+ }
+}
+
+sub updatemodules {
+ my ($_o, $dev, $rel_dir) = @_;
+ return if $::testing;
+
+ $dev = devices::make($dev) or log::l("updatemodules: bad device $dev"), return;
+
+ my $mount_dir = '/updatemodules';
+ find {
+ eval { fs::mount::mount($dev, $mount_dir, $_, 0); 1 };
+ } 'ext2', 'vfat' or log::l("updatemodules: can't mount $dev"), return;
+
+ my $dir = "$mount_dir$rel_dir";
+ foreach my $kernel_version (all("$::prefix/lib/modules")) {
+ log::l("examining updated modules for kernel $kernel_version");
+ -d "$dir/$kernel_version" or next;
+ log::l("found updatable modules");
+ run_program::run("cd $dir/$kernel_version ; find -type f | cpio -pdu $::prefix/lib/modules/$kernel_version");
+ run_program::rooted($::prefix, 'depmod', '-a', '-F', "/boot/System.map-$kernel_version", $kernel_version);
+ }
+
+ my $category;
+ foreach (cat_("$dir/to_load")) {
+ chomp;
+ if (/^#/) {
+ ($category) = $1 if /\[list_modules: (.*?)\]/;
+ } elsif ($category) {
+ log::l("adding $_ to $category\n");
+ my $r = \%list_modules::l;
+ $r = $r->{$_} foreach split('/', $category);
+ push @$r, $_;
+
+ $category = '';
+ }
+ }
+
+ fs::mount::umount($mount_dir);
+}
+
+#------------------------------------------------------------------------------
+sub selectMouse($) {
+ my ($_o) = @_;
+}
+
+#------------------------------------------------------------------------------
+sub configureNetwork {
+ my ($o) = @_;
+ require network::network;
+ network::network::configure_network($o->{net}, $o, $o->{modules_conf});
+ configure_firewall($o) if !$o->{isUpgrade};
+
+ #- only a http proxy can be used by stage1
+ #- the method is http even for ftp connections through a http proxy
+ #- use this http proxy for both http and ftp connections
+ if ($o->{method} eq "http" && $ENV{PROXY}) {
+ my $proxy = "http://$ENV{PROXY}" . ($ENV{PROXYPORT} && ":$ENV{PROXYPORT}");
+ add2hash($o->{miscellaneous} ||= {}, {
+ http_proxy => $proxy,
+ ftp_proxy => $proxy,
+ });
+ network::network::proxy_configure($o->{miscellaneous});
+ }
+}
+
+sub configure_firewall {
+ my ($o) = @_;
+
+ #- set up a firewall if ports have been specified or if the security level is high enough
+ $o->{firewall_ports} ||= '' if $o->{security} >= 3 && !exists $o->{firewall_ports};
+
+ if (defined $o->{firewall_ports}) {
+ require network::drakfirewall;
+ $o->{firewall_ports} ||= ''; #- don't open any port by default
+ network::drakfirewall::set_ports($o->do_pkgs, 0, $o->{firewall_ports}, 'log_net_drop');
+ network::drakfirewall::set_ifw($o->do_pkgs, 1, [ 'psd' ], '');
+ }
+}
+
+#------------------------------------------------------------------------------
+sub installUpdates {
+ my ($o) = @_;
+ my $u = $o->{updates} or return;
+ $u->{url} or return;
+
+ upNetwork($o);
+ require mirror;
+
+ my $phys_medium = install::media::url2mounted_phys_medium($o, $u->{url} . '/media/main/updates');
+
+ my $update_medium = { name => "Updates for Mandriva Linux " . $o->{product_id}{version}, update => 1 };
+ install::media::get_standalone_medium($o, $phys_medium, $o->{packages}, $update_medium);
+
+ $o->pkg_install(@{$u->{packages} || []});
+
+ #- re-install urpmi with update security medium.
+ install_urpmi($o);
+}
+
+sub summaryBefore {}
+
+sub summary {
+ my ($o) = @_;
+ configureTimezone($o);
+}
+
+sub summaryAfter {
+ my ($_o) = @_;
+}
+
+#------------------------------------------------------------------------------
+sub configureTimezone {
+ my ($o) = @_;
+ install::any::preConfigureTimezone($o);
+
+ $o->pkg_install('ntp') if $o->{timezone}{ntp};
+
+ require timezone;
+ timezone::write($o->{timezone});
+}
+
+#------------------------------------------------------------------------------
+sub configureServices {
+ my ($o) = @_;
+ if ($o->{services}) {
+ require services;
+ services::doit($o, $o->{services});
+ }
+}
+
+#------------------------------------------------------------------------------
+sub setRootPassword {
+ my ($o) = @_;
+ $o->{superuser} ||= {};
+ require authentication;
+ authentication::set_root_passwd($o->{superuser}, $o->{authentication});
+ install::any::set_authentication($o);
+}
+
+#------------------------------------------------------------------------------
+
+sub addUser {
+ my ($o) = @_;
+ my $users = $o->{users} ||= [];
+
+ if ($::prefix) {
+ #- getpwnam, getgrnam, getgrid works
+ symlinkf("$::prefix/etc/passwd", '/etc/passwd');
+ symlinkf("$::prefix/etc/group", '/etc/group');
+ }
+
+ any::add_users($users, $o->{authentication});
+
+ if ($o->{autologin}) {
+ $o->{desktop} ||= first(any::sessions());
+ $o->pkg_install("autologin") if !member($o->{desktop}, 'KDE', 'GNOME');
+ }
+ any::set_autologin($o->do_pkgs, $o->{autologin}, $o->{desktop});
+
+ install::any::disable_user_view() if @$users == ();
+}
+
+#------------------------------------------------------------------------------
+sub read_bootloader_config {
+ my ($o) = @_;
+
+ require bootloader;
+ eval { add2hash($o->{bootloader} ||= {}, bootloader::read($o->{all_hds})) };
+ $@ && $o->{isUpgrade} and log::l("read_bootloader_config failed: $@");
+
+ $o->{bootloader}{bootUnsafe} = 0 if $o->{bootloader}{boot}; #- when upgrading, do not ask where to install the bootloader (mbr vs boot partition)
+}
+
+sub setupBootloaderBefore {
+ my ($o) = @_;
+ any::setupBootloaderBefore($o->do_pkgs, $o->{bootloader}, $o->{all_hds}, $o->{fstab}, $o->{keyboard},
+ $o->{allowFB}, $o->{vga}, $o->{meta_class} ne 'server');
+}
+
+sub setupBootloader {
+ my ($o) = @_;
+
+ any::install_acpi_pkgs($o->do_pkgs, $o->{bootloader});
+
+ require bootloader;
+ bootloader::install($o->{bootloader}, $o->{all_hds});
+}
+
+#------------------------------------------------------------------------------
+sub configureXBefore {
+ my ($o) = @_;
+
+ #- keep this here if the package has to be updated.
+ $o->pkg_install("task-x11");
+}
+sub configureX {
+ my ($o) = @_;
+ configureXBefore($o);
+
+ require Xconfig::default;
+ $o->{raw_X} = Xconfig::default::configure($o->do_pkgs, $o->{keyboard}, $o->{mouse});
+
+ require Xconfig::main;
+ Xconfig::main::configure_everything_auto_install($o->{raw_X}, $o->do_pkgs, $o->{X}, install::any::X_options_from_o($o));
+ configureXAfter($o);
+}
+sub configureXAfter {
+ my ($_o) = @_;
+}
+
+#------------------------------------------------------------------------------
+sub miscellaneousBefore {
+ my ($o) = @_;
+
+ require security::level;
+ require security::various;
+ $o->{security} ||= security::level::get();
+ $o->{security_user} ||= security::various::config_security_user($::prefix);
+ $o->{libsafe} ||= security::various::config_libsafe($::prefix);
+
+ log::l("security $o->{security}");
+}
+sub miscellaneous {
+ my ($_o) = @_;
+ #- keep some given parameters
+ #-TODO
+}
+sub miscellaneousAfter {
+ my ($o) = @_;
+ add2hash_ $o, { useSupermount => $o->{security} < 4 ? 'magicdev' : 0 };
+
+ $ENV{SECURE_LEVEL} = $o->{security}; #- deprecated with chkconfig 1.3.4-2mdk, uses /etc/sysconfig/msec
+
+ addToBeDone {
+ addVarsInSh("$::prefix/etc/sysconfig/system", { META_CLASS => $o->{meta_class} });
+ substInFile { s/KEYBOARD_AT_BOOT=.*/KEYBOARD_AT_BOOT=yes/ } "$::prefix/etc/sysconfig/usb" if detect_devices::usbKeyboards();
+
+ eval { install::any::set_security($o) };
+
+ } 'installPackages';
+}
+
+#------------------------------------------------------------------------------
+sub exitInstall {
+ my ($o) = @_;
+
+ install::any::deploy_server_notify($o) if exists $o->{deploy_server};
+
+ #- mainly for auto_install's
+ #- do not use run_program::xxx because it does not leave stdin/stdout unchanged
+ system("bash", "-c", $o->{postInstallNonRooted}) if $o->{postInstallNonRooted};
+ system("chroot", $::prefix, "bash", "-c", $o->{postInstall}) if $o->{postInstall};
+
+ eval {
+ my $report = '/root/drakx/report.bug';
+ unlink "$::prefix$report", "$::prefix$report.gz";
+ output "$::prefix$report", install::any::report_bug();
+ run_program::rooted($::prefix, 'gzip', $report);
+ };
+ eval { install::any::getAndSaveAutoInstallFloppies($o, 1) } if arch() !~ /^ppc/;
+ eval { output "$::prefix/root/drakx/README", "This directory contains several installation-related files,
+mostly log files (very useful if you ever report a bug!).
+
+Beware that some Mandriva Linux tools rely on the contents of some
+of these files... so remove any file from here at your own
+risk!
+" };
+ #- wait for remaining processes.
+ foreach (@{$o->{waitpids}}) {
+ waitpid $_, 0;
+ log::l("pid $_ returned $?");
+ }
+ install::media::umount_media($o->{packages});
+ install::media::openCdromTray(install::media::first_medium($o->{packages})->{phys_medium}{device}) if !detect_devices::is_xbox() && $o->{method} eq 'cdrom';
+ install::media::log_sizes();
+}
+
+#------------------------------------------------------------------------------
+sub hasNetwork {
+ my ($o) = @_;
+ $o->{net}{type} && $o->{net}{network}{NETWORKING} ne 'no' and return 1;
+ log::l("no network seems to be configured for internet ($o->{net}{type},$o->{net}{network}{NETWORKING})");
+ 0;
+}
+
+sub network_is_cheap {
+ my ($o) = @_;
+ member($o->{net}{type}, qw(adsl lan cable));
+}
+
+sub start_network_interface {
+ my ($o) = @_;
+ require network::tools;
+ network::tools::start_net_interface($o->{net}, 0);
+}
+
+sub stop_network_interface {
+ my ($o) = @_;
+ require network::tools;
+ network::tools::stop_net_interface($o->{net}, 0);
+}
+
+#------------------------------------------------------------------------------
+sub upNetwork {
+ my ($o, $b_pppAvoided) = @_;
+
+ install::any::is_network_install($o) || $::local_install and return 1;
+ $o->{modules_conf}->write;
+ if (! -e "/etc/resolv.conf") {
+ #- symlink resolv.conf in install root too so that updates and suppl media can be added
+ symlink "$::prefix/etc/resolv.conf", "/etc/resolv.conf";
+ }
+ if (hasNetwork($o)) {
+ if (network_is_cheap($o)) {
+ log::l("starting network ($o->{net}{type})");
+ start_network_interface($o);
+ return 1;
+ } elsif (!$b_pppAvoided) {
+ log::l("starting network (ppp: $o->{net}{type})");
+ eval { modules::load(qw(serial ppp bsd_comp ppp_deflate)) };
+ run_program::rooted($::prefix, "/etc/rc.d/init.d/syslog", "start");
+ start_network_interface($o);
+ return 1;
+ } else {
+ log::l(qq(not starting network (b/c ppp avoided and type is "$o->{net}{type})"));
+ }
+ }
+ $::testing;
+}
+
+#------------------------------------------------------------------------------
+sub downNetwork {
+ my ($o, $costlyOnly) = @_;
+
+ install::any::is_network_install($o) || $::local_install and return 1;
+ $o->{modules_conf}->write;
+ if (hasNetwork($o)) {
+ if (!$costlyOnly) {
+ stop_network_interface($o);
+ return 1;
+ } elsif (!network_is_cheap($o)) {
+ stop_network_interface($o);
+ run_program::rooted($::prefix, "/etc/rc.d/init.d/syslog", "stop");
+ eval { modules::unload(qw(ppp_deflate bsd_comp ppp serial)) };
+ return 1;
+ }
+ }
+ $::testing;
+}
+
+#------------------------------------------------------------------------------
+sub cleanIfFailedUpgrade($) {
+ my ($o) = @_;
+
+ #- if an upgrade has failed, there should be .mdkgisave files around.
+ if ($o->{isUpgrade}) {
+ foreach (@filesToSaveForUpgrade) {
+ if (-e "$::prefix/$_" && -e "$::prefix/$_.mdkgisave") {
+ rename "$::prefix/$_", "$::prefix/$_.mdkginew"; #- keep new files around in case !
+ rename "$::prefix/$_.mdkgisave", "$::prefix/$_";
+ }
+ }
+ }
+}
+
+
+1;