home *** CD-ROM | disk | FTP | other *** search
/ Inter.Net 55-2 / Inter.Net 55-2.iso / Mandrake / mdkinst / usr / bin / perl-install / install_steps.pm < prev    next >
Encoding:
Perl POD Document  |  2000-01-12  |  19.0 KB  |  719 lines

  1. package install_steps;
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9. use common qw(:file :system :common :functional);
  10. use install_any qw(:all);
  11. use partition_table qw(:types);
  12. use detect_devices;
  13. use modules;
  14. use run_program;
  15. use lang;
  16. use raid;
  17. use keyboard;
  18. use log;
  19. use fsedit;
  20. use commands;
  21. use network;
  22. use fs;
  23.  
  24. my @filesToSaveForUpgrade = qw(
  25. /etc/ld.so.conf /etc/fstab /etc/hosts /etc/conf.modules
  26. );
  27.  
  28.  
  29.  
  30.  
  31.  
  32. sub new($$) {
  33.     my ($type, $o) = @_;
  34.  
  35.     bless $o, ref $type || $type;
  36.     return $o;
  37. }
  38.  
  39.  
  40.  
  41.  
  42. sub enteringStep {
  43.     my ($o, $step) = @_;
  44.     log::l("starting step `$step'");
  45. }
  46. sub leavingStep {
  47.     my ($o, $step) = @_;
  48.     log::l("step `$step' finished");
  49.  
  50.     if (-d "$o->{prefix}/root") {
  51.     eval { commands::cp('-f', "/tmp/ddebug.log", "$o->{prefix}/root") };
  52.     install_any::g_auto_install();
  53.     }
  54.  
  55.     for (my $s = $o->{steps}{first}; $s; $s = $o->{steps}{$s}{next}) {
  56.     
  57.     
  58.     next if $o->{steps}{$s}{done} && !$o->{steps}{$s}{redoable};
  59.  
  60.     my $reachable = 1;
  61.     if (my $needs = $o->{steps}{$s}{needs}) {
  62.         my @l = ref $needs ? @$needs : $needs;
  63.         $reachable = min(map { $o->{steps}{$_}{done} || 0 } @l);
  64.     }
  65.     $o->{steps}{$s}{reachable} = 1 if $reachable;
  66.     }
  67.     $o->{steps}{$step}{reachable} = $o->{steps}{$step}{redoable};
  68.  
  69.     while (my $f = shift @{$o->{steps}{$step}{toBeDone} || []}) {
  70.     eval { &$f() };
  71.     $o->ask_warn(_("Error"), [
  72. _("An error occurred, but I don't know how to handle it nicely.
  73. Continue at your own risk."), $@ ]) if $@;
  74.     }
  75. }
  76.  
  77. sub errorInStep($$) { print "error :(\n"; exit 1 }
  78. sub kill_action {}
  79. sub set_help { 1 }
  80.  
  81.  
  82.  
  83.  
  84.  
  85. sub selectLanguage {
  86.     my ($o) = @_;
  87.     lang::set($o->{lang});
  88.  
  89.     if ($o->{keyboard_unsafe} || !$o->{keyboard}) {
  90.     $o->{keyboard_unsafe} = 1;
  91.     $o->{keyboard} = keyboard::lang2keyboard($o->{lang});
  92.     selectKeyboard($o);
  93.     }
  94. }
  95.  
  96. sub selectKeyboard {
  97.     my ($o) = @_;
  98.     keyboard::setup($o->{keyboard})
  99. }
  100.  
  101. sub selectPath {}
  102.  
  103. sub selectInstallClass($@) {
  104.     my ($o) = @_;
  105.     $o->{installClass} ||= "normal";
  106.     $o->{security} ||= ${{
  107.     normal    => 2,
  108.     developer => 3,
  109.     server    => 4,
  110.     }}{$o->{installClass}};
  111. }
  112.  
  113. sub setupSCSI { modules::load_thiskind('scsi') }
  114.  
  115. sub doPartitionDisks($$) {
  116.     my ($o, $hds) = @_;
  117.     return if $::testing;
  118.     partition_table::write($_) foreach @$hds;
  119. }
  120.  
  121.  
  122.  
  123. sub ask_mntpoint_s {
  124.     my ($o, $fstab) = @_;
  125.  
  126.     
  127.  
  128.     
  129.     (fsedit::get_root($fstab) || {})->{type} = 0x83;
  130.  
  131.     my %m; foreach (@$fstab) {
  132.     my $m = $_->{mntpoint};
  133.  
  134.     next unless $m && $m ne 'swap'; 
  135.  
  136.     $m{$m} and die _("Duplicate mount point %s", $m);
  137.     $m{$m} = 1;
  138.  
  139.     
  140.     $_->{type} = 0x83 if $m =~ m|^/| && !isFat($_);
  141.     }
  142. }
  143.  
  144.  
  145. sub rebootNeeded($) {
  146.     my ($o) = @_;
  147.     log::l("Rebooting...");
  148.     c::_exit(0);
  149. }
  150.  
  151. sub choosePartitionsToFormat($$) {
  152.     my ($o, $fstab) = @_;
  153.  
  154.     foreach (@$fstab) {
  155.     $_->{mntpoint} = "swap" if isSwap($_);
  156.     $_->{mntpoint} or next;
  157.  
  158.     unless ($_->{toFormat} = $_->{notFormatted} || $o->{partitioning}{autoformat}) {
  159.         my $t = fsedit::typeOfPart($_->{device});
  160.         $_->{toFormatUnsure} = $_->{mntpoint} eq "/" ||
  161.           
  162.           (isFat({ type => $t }) ? !isFat($_) : $t != $_->{type});
  163.     }
  164.     }
  165. }
  166.  
  167. sub formatPartitions {
  168.     my $o = shift;
  169.     foreach (@_) {
  170.     raid::format_part($o->{raid}, $_) if $_->{toFormat};
  171.     }
  172. }
  173.  
  174.  
  175. sub setPackages {
  176.     my ($o) = @_;
  177.     install_any::setPackages($o);
  178. }
  179. sub selectPackagesToUpgrade {
  180.     my ($o) = @_;
  181.     install_any::selectPackagesToUpgrade($o);
  182. }
  183.  
  184. sub choosePackages($$$$) {
  185.     my ($o, $packages, $compss, $compssUsers) = @_;
  186. }
  187.  
  188. sub beforeInstallPackages {
  189.     my ($o) = @_;
  190.  
  191.     
  192.     if ($o->{isUpgrade}) {
  193.     foreach (@filesToSaveForUpgrade) {
  194.         unlink "$o->{prefix}/$_.mdkgisave";
  195.         if (-e "$o->{prefix}/$_") {
  196.         eval { commands::cp("$o->{prefix}/$_", "$o->{prefix}/$_.mdkgisave") };
  197.         }
  198.     }
  199.     }
  200.  
  201.     
  202.     install_any::write_ldsoconf($o->{prefix});
  203.     fs::write($o->{prefix}, $o->{fstab}, $o->{manualFstab}, $o->{useSupermount});
  204.  
  205.     network::add2hosts("$o->{prefix}/etc/hosts", "localhost.localdomain", "127.0.0.1");
  206.     require pkgs;
  207.     pkgs::init_db($o->{prefix}, $o->{isUpgrade});
  208. }
  209.  
  210. sub installPackages($$) {
  211.     my ($o, $packages) = @_;
  212.  
  213.     if (@{$o->{toRemove} || []}) {
  214.     
  215.     
  216.     
  217.     foreach (@{$o->{toSave} || []}) {
  218.         if (-e "$o->{prefix}/$_") {
  219.         unlink "$o->{prefix}/$_.mdkgisave"; eval { commands::cp("$o->{prefix}/$_", "$o->{prefix}/$_.mdkgisave") };
  220.         }
  221.     }
  222.     pkgs::remove($o->{prefix}, $o->{toRemove});
  223.     foreach (@{$o->{toSave} || []}) {
  224.         if (-e "$o->{prefix}/$_.mdkgisave") {
  225.         unlink "$o->{prefix}/$_"; rename "$o->{prefix}/$_.mdkgisave", "$o->{prefix}/$_";
  226.         }
  227.     }
  228.     $o->{toSave} = [];
  229.  
  230.     
  231.     if ($packages->{'compat-glibc'}{selected}) {
  232.         rename "$o->{prefix}/usr/i386-glibc20-linux", "$o->{prefix}/usr/i386-glibc20-linux.mdkgisave";
  233.     }
  234.     }
  235.  
  236.     
  237.     my @firstToInstall = qw(setup basesystem chkconfig sed ldconfig grep XFree86-libs freetype XFree86-xfs chkfontpath XFree86);
  238.     my %firstInstalled;
  239.     my @toInstall;
  240.     foreach (@firstToInstall) {
  241.     if ($packages->{$_}{selected} && !$packages->{$_}{installed}) {
  242.         push @toInstall, $packages->{$_};
  243.         $firstInstalled{$_} = 1; 
  244.     }
  245.     }
  246.     push @toInstall, grep { $_->{base} && $_->{selected} && !$_->{installed} && !$firstInstalled{$_->{name}} } values %$packages;
  247.     push @toInstall, grep { !$_->{base} && $_->{selected} && !$_->{installed} && !$firstInstalled{$_->{name}} } values %$packages;
  248.     pkgs::install($o->{prefix}, $o->{isUpgrade}, \@toInstall);
  249. }
  250.  
  251. sub afterInstallPackages($) {
  252.     my ($o) = @_;
  253.  
  254.     pkgs::done_db();
  255.  
  256.     
  257.     sync(); sync();
  258.  
  259.     $o->pcmciaConfig();
  260.  
  261.     
  262.     run_program::rooted($o->{prefix}, "chkconfig", "--del", "acon") unless $ENV{LANGUAGE} =~ /ar/;
  263.  
  264.     
  265.     my $f = "$o->{prefix}/etc/sysconfig/desktop";
  266.     if ($o->{compssUsersChoice}{KDE} && -x "$o->{prefix}/usr/bin/kdm") {
  267.     output($f, "KDE\n");
  268.     } elsif ($o->{compssUsersChoice}{Gnome} && -x "$o->{prefix}/usr/bin/gdm") {
  269.     output($f, "GNOME\n");
  270.     }
  271.  
  272.     if ($o->{pcmcia}) {
  273.     substInFile { s/.*(TaskBarShowAPMStatus).*/$1=1/ } "$o->{prefix}/usr/lib/X11/icewm/preferences";
  274.     eval { commands::cp("$o->{prefix}/usr/share/applnk/System/kapm.kdelnk", 
  275.                 "$o->{prefix}/etc/skel/Desktop/Autostart/kapm.kdelnk") };
  276.     }
  277.  
  278.     my $msec = "$o->{prefix}/etc/security/msec";
  279.     substInFile { s/^audio\n//; $_ .= "audio\n" if eof } "$msec/group.conf" if -d $msec;
  280.     substInFile { s/^cdrom\n//; $_ .= "cdrom\n" if eof } "$msec/group.conf" if -d $msec;
  281.     substInFile { s/^xgrp\n//; $_ .= "xgrp\n" if eof } "$msec/group.conf" if -d $msec;
  282.  
  283.     my $p = $o->{packages}{urpmi};
  284.     if ($p && $p->{selected}) {
  285.     install_any::install_urpmi($o->{prefix}, $o->{method});
  286.     substInFile { s/^urpmi\n//; $_ .= "urpmi\n" if eof } "$msec/group.conf" if -d $msec;
  287.     }
  288.  
  289.     
  290.     log::l("updating language for kde");
  291.     install_any::kdelang_postinstall($o->{prefix});
  292.     log::l("updating kde icons according to available devices");
  293.     install_any::kdeicons_postinstall($o->{prefix});
  294.  
  295.     my $welcome = _("Welcome to %s", "[HOSTNAME]");
  296.     substInFile { s/^(GreetString)=.*/$1=$welcome/ } "$o->{prefix}/usr/share/config/kdmrc";
  297.     substInFile { s/^(UserView)=false/$1=true/ } "$o->{prefix}/usr/share/config/kdmrc" if $o->{security} < 3;
  298.     run_program::rooted($o->{prefix}, "kdeDesktopCleanup");
  299.  
  300.     
  301.     if ($o->{lang} =~ /ja|ko|zh/) {
  302.     foreach ("konsole", "gnome-terminal") {
  303.         my $f = "$o->{prefix}/usr/bin/$_";
  304.         symlinkf("X11/rxvt.sh", $f) if -e $f;
  305.     }
  306.     }
  307.  
  308.     foreach (install_any::list_skels()) {
  309.     my $found;
  310.     substInFile {
  311.         $found ||= /KFM Misc Defaults/;
  312.         $_ .= 
  313. "[KFM Misc Defaults]
  314. GridWidth=85
  315. GridHeight=70
  316. " if eof && !$found;
  317.     } "$o->{prefix}$_/.kde/share/config/kfmrc" 
  318.     }
  319.  
  320.     
  321.     if ($o->{isUpgrade}) {
  322.     log::l("moving previous desktop files that have been updated to Trash of each user");
  323.     install_any::move_desktop_file($o->{prefix});
  324.     }
  325.  
  326.     
  327.     if ($o->{isUpgrade}) {
  328.     foreach (@filesToSaveForUpgrade) {
  329.         if (-e "$o->{prefix}$_.mdkgisave") {
  330.         unlink "$o->{prefix}$_.mdkgiorig"; rename "$o->{prefix}/$_.mdkgisave", "$o->{prefix}/$_.mdkgiorig";
  331.         }
  332.     }
  333.     }
  334. }
  335.  
  336.  
  337. sub selectMouse($) {
  338.     my ($o) = @_;
  339. }
  340.  
  341.  
  342. sub configureNetwork($) {
  343.     my ($o) = @_;
  344.     my $etc = "$o->{prefix}/etc";
  345.  
  346.     network::write_conf("$etc/sysconfig/network", $o->{netc});
  347.     network::write_resolv_conf("$etc/resolv.conf", $o->{netc});
  348.     network::write_interface_conf("$etc/sysconfig/network-scripts/ifcfg-$_->{DEVICE}", $_) foreach @{$o->{intf}};
  349.     network::add2hosts("$etc/hosts", $o->{netc}{HOSTNAME}, map { $_->{IPADDR} } @{$o->{intf}});
  350.     network::sethostname($o->{netc}) unless $::testing;
  351.     network::addDefaultRoute($o->{netc}) unless $::testing;
  352.  
  353.     install_any::pkg_install($o, "dhcpcd") if grep { $_->{BOOTPROTO} =~ /^(dhcp|bootp)$/ } @{$o->{intf}};
  354.     # Handle also pump (this is still in initscripts no?)
  355.     install_any::pkg_install($o, "pump") if grep { $_->{BOOTPROTO} =~ /^(pump)$/ } @{$o->{intf}};
  356.     
  357.  
  358.     miscellaneousNetwork($o);
  359. }
  360.  
  361.  
  362. sub pppConfig {
  363.     my ($o) = @_;
  364.     $o->{modem} or return;
  365.  
  366.     symlinkf($o->{modem}{device}, "$o->{prefix}/dev/modem") or log::l("creation of $o->{prefix}/dev/modem failed");
  367.     install_any::pkg_install($o, "ppp");
  368.  
  369.     my %toreplace;
  370.     $toreplace{$_} = $o->{modem}{$_} foreach qw(connection phone login passwd auth domain);
  371.     $toreplace{kpppauth} = ${{ 'Script-based' => 0, PAP => 1, 'Terminal-based' => 2, CHAP => 3, }}{$o->{modem}{auth}}; #'
  372.     $toreplace{phone} =~ s/[^\d]//g;
  373.     $toreplace{dnsserver} = join '', map { "$o->{modem}{$_}," } "dns1", "dns2";
  374.  
  375.     $toreplace{connection} ||= 'DialupConnection';
  376.     $toreplace{domain} ||= 'localdomain';
  377.     $toreplace{intf} ||= 'ppp0';
  378.  
  379.     if ($o->{modem}{auth} eq 'PAP') {
  380.     template2file("/usr/share/ifcfg-ppp.pap.in", "$o->{prefix}/etc/sysconfig/network-scripts/ifcfg-ppp0", %toreplace);
  381.     template2file("/usr/share/chat-ppp.pap.in", "$o->{prefix}/etc/sysconfig/network-scripts/chat-ppp0", %toreplace);
  382.  
  383.     my @l = cat_("$o->{prefix}/etc/ppp/pap-secrets");
  384.     my $replaced = 0;
  385.     do { $replaced ||= 1
  386.            if s/^\s*$toreplace{login}\s+ppp0\s+(\S+)/$toreplace{login}  ppp0  $toreplace{passwd}/; } foreach @l;
  387.     if ($replaced) {
  388.         open F, ">$o->{prefix}/etc/ppp/pap-secrets" or die "Can't open $o->{prefix}/etc/ppp/pap-secrets $!";
  389.         print F @l;
  390.     } else {
  391.         open F, ">>$o->{prefix}/etc/ppp/pap-secrets" or die "Can't open $o->{prefix}/etc/ppp/pap-secrets $!";
  392.         print F "$toreplace{login}  ppp0  $toreplace{passwd}\n";
  393.     }
  394.     } elsif ($o->{modem}{auth} eq 'Terminal-based' || $o->{modem}{auth} eq 'Script-based') {
  395.     template2file("/usr/share/ifcfg-ppp.script.in", "$o->{prefix}/etc/sysconfig/network-scripts/ifcfg-ppp0", %toreplace);
  396.     template2file("/usr/share/chat-ppp.script.in", "$o->{prefix}/etc/sysconfig/network-scripts/chat-ppp0", %toreplace);
  397.     } 
  398.  
  399.     
  400.     open F, ">$o->{prefix}/etc/resolv.conf" or die "Can't open $o->{prefix}/etc/resolv.conf $!";
  401.     print F "domain $o->{modem}{domain}\n";
  402.     print F "nameserver $o->{modem}{dns1}\n" if $o->{modem}{dns1};
  403.     print F "nameserver $o->{modem}{dns2}\n" if $o->{modem}{dns2};
  404.     close F;
  405.  
  406.     install_any::template2userfile($o->{prefix}, "/usr/share/kppprc.in", ".kde/share/config/kppprc", 1, %toreplace);
  407.  
  408.     miscellaneousNetwork($o);
  409. }
  410.  
  411.  
  412. sub installCrypto {
  413.     my ($o) = @_;
  414.     my $u = $o->{crypto} or return; $u->{mirror} or return;
  415.     my ($packages, %done);
  416.     my $dir = "$o->{prefix}/tmp";
  417.     modules::write_conf("$o->{prefix}/etc/conf.modules", 'append');
  418.     network::up_it($o->{prefix}, $o->{intf}) if $o->{intf};
  419.  
  420.     local *install_any::getFile = sub {
  421.     local *F;
  422.     open F, "$dir/$_[0]" or return;
  423.     *F;
  424.     };
  425.     require crypto;
  426.     require pkgs;
  427.     while (crypto::get($u->{mirror}, $dir, 
  428.                grep { !$done{$_} && ($done{$_} = $u->{packages}{$_}) } %{$u->{packages}})) {
  429.     $packages = pkgs::psUsingDirectory($dir);
  430.     foreach (values %$packages) {
  431.         foreach (c::headerGetEntry(pkgs::getHeader($_), 'requires')) {
  432.         my $r = quotemeta crypto::require2package($_);
  433.         /^$r-\d/ and $u->{packages}{$_} = 1 foreach keys %{$u->{packages}};
  434.         }
  435.     }
  436.     }
  437.     pkgs::install($o->{prefix}, $o->{isUpgrade}, [ values %$packages ]);
  438. }
  439.  
  440.  
  441. sub pcmciaConfig($) {
  442.     my ($o) = @_;
  443.     my $t = $o->{pcmcia};
  444.  
  445.     
  446.     setVarsInSh("$o->{prefix}/etc/sysconfig/pcmcia", {
  447.     PCMCIA    => $t ? "yes" : "no",
  448.     PCIC      => $t,
  449.     PCIC_OPTS => "",
  450.         CORE_OPTS => "",
  451.     });
  452. }
  453.  
  454.  
  455. sub timeConfig {
  456.     my ($o, $f) = @_;
  457.     require timezone;
  458.     timezone::write($o->{prefix}, $o->{timezone}, $f);
  459. }
  460.  
  461.  
  462. sub servicesConfig {}
  463.  
  464. sub printerConfig {
  465.     my($o) = @_;
  466.     if ($o->{printer}{complete}) {
  467.     require printer;
  468.     require pkgs;
  469.     pkgs::select($o->{packages}, $o->{packages}{'rhs-printfilters'});
  470.     $o->installPackages($o->{packages});
  471.  
  472.     printer::configure_queue($o->{printer});
  473.     }
  474. }
  475.  
  476.  
  477. my @etc_pass_fields = qw(name pw uid gid realname home shell);
  478. sub setRootPassword($) {
  479.     my ($o) = @_;
  480.     my $p = $o->{prefix};
  481.     my $u = $o->{superuser} ||= {};
  482.  
  483.     $u->{pw} ||= $u->{password} && install_any::crypt($u->{password});
  484.  
  485.     my @lines = cat_(my $f = "$p/etc/passwd") or log::l("missing passwd file"), return;
  486.  
  487.     local *F;
  488.     open F, "> $f" or die "failed to write file $f: $!\n";
  489.     foreach (@lines) {
  490.     if (/^root:/) {
  491.         chomp;
  492.         my %l; @l{@etc_pass_fields} = split ':';
  493.         add2hash($u, \%l);
  494.         $_ = join(':', @$u{@etc_pass_fields}) . "\n";
  495.     }
  496.     print F $_;
  497.     }
  498. }
  499.  
  500.  
  501.  
  502. sub addUser($) {
  503.     my ($o) = @_;
  504.     my $p = $o->{prefix};
  505.  
  506.     my (%uids, %gids); 
  507.     foreach (glob_("$p/home")) { my ($u, $g) = (stat($_))[4,5]; $uids{$u} = 1; $gids{$g} = 1; }
  508.  
  509.     my %done;
  510.     my @l = grep {
  511.     if (!$_->{name} || getpwnam($_->{name}) || $done{$_->{name}}) { 
  512.         0;
  513.     } else {
  514.         $_->{home} ||= "/home/$_->{name}";
  515.  
  516.         my $u = $_->{uid} || ($_->{oldu} = (stat("$p$_->{home}"))[4]);
  517.         my $g = $_->{gid} || ($_->{oldg} = (stat("$p$_->{home}"))[5]);
  518.         
  519.         if (!$u || getpwuid($u)) { for ($u = 501; getpwuid($u) || $uids{$u}; $u++) {} }
  520.         if (!$g || getgrgid($g)) { for ($g = 501; getgrgid($g) || $gids{$g}; $g++) {} }
  521.  
  522.         $_->{uid} = $u; $uids{$u} = 1;
  523.         $_->{gid} = $g; $gids{$g} = 1;
  524.         $_->{pw} ||= $_->{password} && install_any::crypt($_->{password});
  525.         $done{$_->{name}} = 1;
  526.     }
  527.     } @{$o->{users} || []};
  528.     my @passwd = cat_("$p/etc/passwd");;
  529.  
  530.     local *F;
  531.     open F, ">> $p/etc/passwd" or die "can't append to passwd file: $!";
  532.     print F join(':', @$_{@etc_pass_fields}), "\n" foreach @l;
  533.  
  534.     open F, ">> $p/etc/group" or die "can't append to group file: $!";
  535.     print F "$_->{name}:x:$_->{gid}:\n" foreach @l;
  536.  
  537.     foreach my $u (@l) {
  538.     if (! -d "$p$u->{home}") {
  539.         my $mode = $o->{security} < 2 ? 0755 : 0750;
  540.         eval { commands::cp("-f", "$p/etc/skel", "$p$u->{home}") };
  541.         if ($@) {
  542.         log::l("copying of skel failed: $@"); mkdir("$p$u->{home}", $mode); 
  543.         } else {
  544.         chmod $mode, "$p$u->{home}";
  545.         }
  546.     }
  547.     eval { commands::chown_("-r", "$u->{uid}.$u->{gid}", "$p$u->{home}") }
  548.         if $u->{uid} != $u->{oldu} || $u->{gid} != $u->{oldg};
  549.  
  550.     }
  551.     require any;
  552.     any::addUsers($o->{prefix}, map { $_->{name} } @l);
  553. }
  554.  
  555.  
  556. sub createBootdisk($) {
  557.     my ($o) = @_;
  558.     my $dev = $o->{mkbootdisk} or return;
  559.  
  560.     my @l = detect_devices::floppies();
  561.  
  562.     $dev = shift @l || die _("No floppy drive available")
  563.       if $dev eq "1"; 
  564.  
  565.     return if $::testing;
  566.  
  567.     require lilo;
  568.     lilo::mkbootdisk($o->{prefix}, install_any::kernelVersion(), $dev, $o->{bootloader}{perImageAppend});
  569.     $o->{mkbootdisk} = $dev;
  570. }
  571.  
  572.  
  573. sub readBootloaderConfigBeforeInstall {
  574.     my ($o) = @_;
  575.     my ($image, $v);
  576.     require lilo;
  577.     add2hash($o->{bootloader} ||= {}, lilo::read($o->{prefix}, "/etc/lilo.conf"));
  578.  
  579.     
  580.     
  581.     
  582.     my %ofpkgs = (
  583.           'vmlinuz' => 'kernel',
  584.           'vmlinuz-smp' => 'kernel-smp',
  585.          );
  586.  
  587.     
  588.     foreach $image (keys %ofpkgs) {
  589.     if ($o->{bootloader}{entries}{"/boot/$image"} && $o->{packages}{$ofpkgs{$image}}{selected}) {
  590.         $v = readlink "$o->{prefix}/boot/$image";
  591.         if ($v) {
  592.         $v = "/boot/$v" if $v !~ m|^/|;
  593.         if (-e "$o->{prefix}$v") {
  594.             $o->{bootloader}{entries}{$v} = $o->{bootloader}{entries}{"/boot/$image"};
  595.             delete $o->{bootloader}{entries}{"/boot/$image"};
  596.             log::l("renaming /boot/$image entry by $v");
  597.         }
  598.         }
  599.     }
  600.     }
  601. }
  602.  
  603. sub setupBootloaderBefore {
  604.     my ($o) = @_;
  605.     require lilo;
  606.     lilo::suggest($o->{prefix}, $o->{bootloader}, $o->{hds}, $o->{fstab}, install_any::kernelVersion());
  607.     $o->{bootloader}{keytable} ||= keyboard::keyboard2kmap($o->{keyboard});
  608. }
  609.  
  610. sub setupBootloader($) {
  611.     my ($o) = @_;
  612.     return if $::g_auto_install;
  613.     lilo::install($o->{prefix}, $o->{bootloader});
  614. }
  615.  
  616.  
  617. sub setupXfreeBefore {
  618.     my ($o) = @_;
  619.     my $xkb = $o->{X}{keyboard}{xkb_keymap} || keyboard::keyboard2xkb($o->{keyboard});
  620.     unless (-e "$o->{prefix}/usr/X11R6/lib/X11/xkb/symbols/$xkb") {
  621.     commands::cp("-f", keyboard::xmodmap_file($o->{keyboard}), "$o->{prefix}/etc/X11/xinit/Xmodmap");    
  622.     $xkb = '';
  623.     }
  624.     $o->{X}{keyboard}{xkb_keymap} = $xkb;
  625.     $o->{X}{mouse} = $o->{mouse};
  626.     $o->{X}{wacom} = $o->{wacom};
  627.  
  628.     require Xconfig;
  629.     Xconfig::getinfoFromDDC($o->{X});
  630.  
  631.     
  632.     install_any::pkg_install($o, "XFree86");
  633. }
  634. sub setupXfree {
  635.     my ($o) = @_;
  636.     $o->setupXfreeBefore;
  637.  
  638.     require Xconfigurator;
  639.     require class_discard;
  640.     { local $::testing = 0; 
  641.       local $::auto = 1;
  642.       local $::skiptest = 1;
  643.       Xconfigurator::main($o->{prefix}, $o->{X}, class_discard->new, $o->{allowFB}, bool($o->{pcmcia}), sub {
  644.          install_any::pkg_install($o, "XFree86-$_[0]");
  645.       });
  646.     }
  647.     $o->setupXfreeAfter;
  648. }
  649. sub setupXfreeAfter {
  650.     my ($o) = @_;
  651.     if ($o->{X}{card}{server} eq 'FBDev') {
  652.     unless (install_any::setupFB($o, Xconfigurator::getVGAMode($o->{X}))) {
  653.         log::l("disabling automatic start-up of X11 if any as setup framebuffer failed");
  654.         Xconfigurator::rewriteInittab(3) unless $::testing; 
  655.     }
  656.     }
  657.     if ($o->{X}{card}{default_depth} >= 16 && $o->{X}{card}{default_wres} >= 1024) {
  658.     log::l("setting large icon style for kde");
  659.     install_any::kderc_largedisplay($o->{prefix});
  660.     }
  661. }
  662.  
  663.  
  664. sub miscellaneousNetwork {
  665.     my ($o) = @_;
  666.     setVarsInSh ("$o->{prefix}/etc/profile.d/proxy.sh",  $o->{miscellaneous}, qw(http_proxy ftp_proxy));
  667.     setVarsInCsh("$o->{prefix}/etc/profile.d/proxy.csh", $o->{miscellaneous}, qw(http_proxy ftp_proxy));
  668. }
  669.  
  670.  
  671. sub miscellaneous {
  672.     my ($o) = @_;
  673.  
  674.     my %s = getVarsFromSh("$o->{prefix}/etc/sysconfig/system");
  675.     $o->{miscellaneous}{HDPARM} ||= $s{HDPARM} if exists $s{HDPARM};
  676.     $o->{security} ||= $s{SECURITY} if exists $s{SECURITY};
  677.  
  678.     $ENV{SECURE_LEVEL} = $o->{security};
  679.     add2hash_ $o, { useSupermount => $o->{security} < 4 };
  680.  
  681.     cat_("/proc/cmdline") =~ /mem=(\S+)/;
  682.     add2hash_($o->{miscellaneous} ||= {}, { numlock => !$o->{pcmcia}, $1 ? (memsize => $1) : () });
  683.  
  684.     local $_ = $o->{bootloader}{perImageAppend};
  685.     if (my $ramsize = $o->{miscellaneous}{memsize} and !/mem=/) {
  686.     $_ .= " mem=$ramsize";
  687.     }
  688.     if (my @l = detect_devices::getIDEBurners() and !/ide-scsi/) {
  689.     $_ .= " " . join(" ", map { "$_=ide-scsi" } @l);
  690.     }
  691.     
  692.     $_ .= " " . join(" ", grep { /^ide/ } split ' ', cat_("/proc/cmdline")) unless /ide.=/;
  693.  
  694.     $o->{bootloader}{perImageAppend} = $_;
  695. }
  696.  
  697.  
  698. sub cleanIfFailedUpgrade($) {
  699.     my ($o) = @_;
  700.  
  701.     
  702.     if ($o->{isUpgrade}) {
  703.     foreach (@filesToSaveForUpgrade) {
  704.         if (-e "$o->{prefix}/$_" && -e "$o->{prefix}/$_.mdkgisave") {
  705.         rename "$o->{prefix}/$_", "$o->{prefix}/$_.mdkginew"; 
  706.         rename "$o->{prefix}/$_.mdkgisave", "$o->{prefix}/$_";
  707.         }
  708.     }
  709.     }
  710. }
  711.  
  712.  
  713. sub exitInstall { install_any::ejectCdrom; }
  714.  
  715.  
  716.  
  717.  
  718. 1;
  719.