summaryrefslogtreecommitdiffstats
path: root/perl-install/install_any.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/install_any.pm')
-rw-r--r--perl-install/install_any.pm860
1 files changed, 0 insertions, 860 deletions
diff --git a/perl-install/install_any.pm b/perl-install/install_any.pm
deleted file mode 100644
index d1fb27060..000000000
--- a/perl-install/install_any.pm
+++ /dev/null
@@ -1,860 +0,0 @@
-package install_any;
-
-use diagnostics;
-use strict;
-use Config;
-
-use vars qw(@ISA %EXPORT_TAGS @EXPORT_OK @needToCopy);
-
-@ISA = qw(Exporter);
-%EXPORT_TAGS = (
- all => [ qw(getNextStep spawnShell addToBeDone) ],
-);
-@EXPORT_OK = map { @$_ } values %EXPORT_TAGS;
-
-#-######################################################################################
-#- misc imports
-#-######################################################################################
-use common qw(:common :system :functional :file);
-use commands;
-use run_program;
-use partition_table qw(:types);
-use partition_table_raw;
-use devices;
-use fsedit;
-use network;
-use modules;
-use detect_devices;
-use fs;
-use log;
-
-#- package that have to be copied for proper installation (just to avoid changing cdrom)
-#- here XFree86 is copied entirey if not already installed, maybe better to copy only server.
-@needToCopy = qw(
-XFree86-8514 XFree86-AGX XFree86-Mach32 XFree86-Mach64 XFree86-Mach8 XFree86-Mono
-XFree86-P9000 XFree86-S3 XFree86-S3V XFree86-SVGA XFree86-W32 XFree86-I128
-XFree86-Sun XFree86-SunMono XFree86-Sun24 XFree86-3DLabs XFree86-FBDev XFree86-server
-XFree86 dhcpcd pump ppp ypbind rhs-printfilters pnm2ppa samba ncpfs kernel-fb
-);
-
-#-######################################################################################
-#- Media change variables&functions
-#-######################################################################################
-my $postinstall_rpms = '';
-my $current_medium = 1;
-my $asked_medium = 1;
-my $cdrom = undef;
-sub useMedium($) {
- #- before ejecting the first CD, there are some files to copy!
- #- does nothing if the function has already been called.
- $_[0] > 1 and $::o->{method} eq 'cdrom' and setup_postinstall_rpms($::o->{prefix}, $::o->{packages});
-
- $asked_medium eq $_[0] or log::l("selecting new medium '$_[0]'");
- $asked_medium = $_[0];
-}
-sub changeMedium($$) {
- my ($method, $medium) = @_;
- log::l("change to medium $medium for method $method (refused by default)");
- 0;
-}
-sub relGetFile($) {
- local $_ = $_[0];
- m,^(Mandrake|lnx4win)/, and return $_;
- /\.img$/ and return "images/$_";
- my $dir = m|/| ? "Mandrake/mdkinst" : /^(?:compss|compssList|compssUsers|filelist|depslist.*|hdlist.*|auto_inst.*)$/ ?
- "Mandrake/base/": "$::o->{packages}[2]{$asked_medium}{rpmsdir}/";
- "$dir$_";
-}
-sub askChangeMedium($$) {
- my ($method, $medium) = @_;
- my $allow;
- do {
- eval { $allow = changeMedium($method, $medium) };
- } while ($@); #- really it is not allowed to die in changeMedium!!! or install will cores with rpmlib!!!
- $allow;
-}
-sub errorOpeningFile($) {
- my ($file) = @_;
- $file eq 'XXX' and return; #- special case to force closing file after rpmlib transaction.
- $current_medium eq $asked_medium and return; #- nothing to do in such case.
- $::o->{packages}[2]{$asked_medium}{selected} or return; #- not selected means no need for worying about.
-
- my $max = 32; #- always refuse after $max tries.
- if ($::o->{method} eq "cdrom") {
- cat_("/proc/mounts") =~ m|(/tmp/\S+)\s+/tmp/rhimage| and $cdrom = $1;
- return unless $cdrom;
- ejectCdrom($cdrom);
- while ($max > 0 && askChangeMedium($::o->{method}, $asked_medium)) {
- $current_medium = $asked_medium;
- eval { fs::mount($cdrom, "/tmp/rhimage", "iso9660", 'readonly') };
- my $getFile = getFile($file); $getFile and return $getFile;
- $current_medium = 'unknown'; #- don't know what CD is inserted now.
- ejectCdrom($cdrom);
- --$max;
- }
- } else {
- while ($max > 0 && askChangeMedium($::o->{method}, $asked_medium)) {
- $current_medium = $asked_medium;
- my $getFile = getFile($file); $getFile and return $getFile;
- $current_medium = 'unknown'; #- don't know what CD image has been copied.
- --$max;
- }
- }
-
- #- keep in mind the asked medium has been refused on this way.
- #- this means it is no more selected.
- $::o->{packages}[2]{$asked_medium}{selected} = undef;
-
- #- on cancel, we can expect the current medium to be undefined too,
- #- this enable remounting if selecting a package back.
- $current_medium = 'unknown';
-
- return;
-}
-sub getFile {
- local $^W = 0;
- if ($::o->{method} && $::o->{method} eq "ftp") {
- require ftp;
- *install_any::getFile = sub { ftp::getFile($_[0]) or errorOpeningFile($_[0]) };
- } elsif ($::o->{method} && $::o->{method} eq "http") {
- require http;
- *install_any::getFile = sub { http::getFile($_[0]) or errorOpeningFile($_[0]) };
- } else {
- *install_any::getFile = sub {
- #- try to open the file, but examine if it is present in the repository, this allow
- #- handling changing a media when some of the file on the first CD has been copied
- #- to other to avoid media change...
- open getFile, "/tmp/rhimage/" . relGetFile($_[0]) or
- $postinstall_rpms and open getFile, "$postinstall_rpms/$_[0]" or return errorOpeningFile($_[0]);
- *getFile;
- };
- }
- goto &getFile;
-}
-sub getAndSaveFile {
- my ($file, $local) = @_;
- local *F; open F, ">$local" or return;
- local $/ = \ (16 * 1024);
- my $f = getFile($file) or return;
- syswrite F, $_ foreach <$f>;
- 1;
-}
-
-
-#-######################################################################################
-#- Post installation RPMS from cdrom only, functions
-#-######################################################################################
-sub setup_postinstall_rpms($$) {
- my ($prefix, $packages) = @_;
-
- $postinstall_rpms and return;
- $postinstall_rpms = "$prefix/usr/postinstall-rpm";
-
- log::l("postinstall rpms directory set to $postinstall_rpms");
- commands::mkdir_('-p', $postinstall_rpms);
-
- require pkgs;
-
- #- compute closure of unselected package that may be copied,
- #- don't complain if package does not exists as it may happen
- #- for the various architecture taken into account (X servers).
- my %toCopy;
- foreach (@needToCopy) {
- my $pkg = pkgs::packageByName($packages, $_);
- pkgs::selectPackage($packages, $pkg, 0, \%toCopy) if $pkg;
- }
-
- my @toCopy; push @toCopy, map { pkgs::packageByName($packages, $_) } keys %toCopy;
-
- #- extract headers of package, this is necessary for getting
- #- the complete filename of each package.
- #- copy the package files in the postinstall RPMS directory.
- #- last arg is default medium '' known as the CD#1.
- pkgs::extractHeaders($prefix, \@toCopy, $packages->[2]{1});
- commands::cp((map { "/tmp/rhimage/" . relGetFile(pkgs::packageFile($_)) } @toCopy), $postinstall_rpms);
-}
-sub clean_postinstall_rpms() {
- $postinstall_rpms and -d $postinstall_rpms and commands::rm('-rf', $postinstall_rpms);
-}
-
-#-######################################################################################
-#- Functions
-#-######################################################################################
-sub kernelVersion {
- my ($o) = @_;
- local $_ = readlink("$::o->{prefix}/boot/vmlinuz") and return first(/vmlinuz-(.*)/);
-
- my $p = pkgs::packageByName($o->{packages}, "kernel") or die "I couldn't find the kernel package!";
- pkgs::packageVersion($p) . "-" . pkgs::packageRelease($p);
-}
-
-
-sub getNextStep {
- my ($s) = $::o->{steps}{first};
- $s = $::o->{steps}{$s}{next} while $::o->{steps}{$s}{done} || !$::o->{steps}{$s}{reachable};
- $s;
-}
-
-sub spawnShell {
- return if $::o->{localInstall} || $::testing;
-
- -x "/bin/sh" or die "cannot open shell - /usr/bin/sh doesn't exist";
-
- fork and return;
-
- local *F;
- sysopen F, "/dev/tty2", 2 or die "cannot open /dev/tty2 -- no shell will be provided";
-
- open STDIN, "<&F" or die '';
- open STDOUT, ">&F" or die '';
- open STDERR, ">&F" or die '';
- close F;
-
- c::setsid();
-
- ioctl(STDIN, c::TIOCSCTTY(), 0) or warn "could not set new controlling tty: $!";
-
- exec {"/bin/sh"} "-/bin/sh" or log::l("exec of /bin/sh failed: $!");
-}
-
-sub shells($) {
- my ($o) = @_;
- my @l = grep { -x "$o->{prefix}$_" } @{$o->{shells}};
- @l ? @l : "/bin/bash";
-}
-
-sub getAvailableSpace {
- my ($o) = @_;
-
- #- make sure of this place to be available for installation, this could help a lot.
- #- currently doing a very small install use 36Mb of postinstall-rpm, but installing
- #- these packages may eat up to 90Mb (of course not all the server may be installed!).
- #- 50mb may be a good choice to avoid almost all problem of insuficient space left...
- my $minAvailableSize = 50 * sqr(1024);
-
- int ((getAvailableSpace_mounted($o->{prefix}) || getAvailableSpace_raw($o->{fstab}) * 512 / 1.07) - $minAvailableSize);
-}
-
-sub getAvailableSpace_mounted {
- my ($prefix) = @_;
- my $buf = ' ' x 20000;
- my $dir = -d "$prefix/usr" ? "$prefix/usr" : "$prefix";
- syscall_('statfs', $dir, $buf) or return;
- my (undef, $blocksize, $size, undef, $free, undef) = unpack "L2L4", $buf;
- log::l("space free on $dir is $free blocks of $blocksize bytes");
- $free * $blocksize || 1;
-}
-sub getAvailableSpace_raw {
- my ($fstab) = @_;
-
- do { $_->{mntpoint} eq '/usr' and return $_->{size} } foreach @$fstab;
- do { $_->{mntpoint} eq '/' and return $_->{size} } foreach @$fstab;
-
- if ($::testing) {
- my $nb = 650;
- log::l("taking ${nb}MB for testing");
- return $nb << 11;
- }
- die "missing root partition";
-}
-
-sub setPackages($) {
- my ($o) = @_;
-
- require pkgs;
- if (!$o->{packages} || is_empty_hash_ref($o->{packages}[0])) {
- $o->{packages} = pkgs::psUsingHdlists($o->{prefix}, $o->{method});
-
- push @{$o->{default_packages}}, "nfs-utils-clients" if $o->{method} eq "nfs";
- push @{$o->{default_packages}}, "numlock" if $o->{miscellaneous}{numlock};
- push @{$o->{default_packages}}, "kernel-secure" if $o->{security} > 3;
- push @{$o->{default_packages}}, "kernel-smp" if $o->{security} <= 3 && detect_devices::hasSMP(); #- no need for kernel-smp if we have kernel-secure which is smp
- push @{$o->{default_packages}}, "kernel-pcmcia-cs" if $o->{pcmcia};
- push @{$o->{default_packages}}, "apmd" if $o->{pcmcia};
- push @{$o->{default_packages}}, "raidtools" if $o->{raid} && !is_empty_array_ref($o->{raid}{raid});
- push @{$o->{default_packages}}, "reiserfs-utils" if grep { isReiserfs($_) } @{$o->{fstab}};
- push @{$o->{default_packages}}, "cdrecord" if detect_devices::getIDEBurners();
- push @{$o->{default_packages}}, "alsa", "alsa-utils" if modules::get_alias("sound") =~ /^snd-card-/;
-
- pkgs::getDeps($o->{prefix}, $o->{packages});
- pkgs::selectPackage($o->{packages}, pkgs::packageByName($o->{packages}, 'basesystem') || die("missing basesystem package"), 1);
-
- #- must be done after selecting base packages (to save memory)
- pkgs::getProvides($o->{packages});
-
- $o->{compss} = pkgs::readCompss($o->{packages});
- #- must be done after getProvides
- $o->{compssListLevels} = pkgs::readCompssList($o->{packages});
- ($o->{compssUsers}, $o->{compssUsersSorted}) = pkgs::readCompssUsers($o->{packages}, $o->{compss});
-
- my @l = ();
- push @l, "kapm", "kcmlaptop" if $o->{pcmcia};
- require pci_probing::main;
- push @l, "Device3Dfx", "Glide_V3", "XFree86-glide-module" if pci_probing::main::matching_desc('Voodoo');
- require timezone;
- require lang;
- push @l, "isdn4k-utils" if ($o->{timezone}{timezone} || timezone::bestTimezone(lang::lang2text($o->{lang}))) =~ /Europe/;
- $_->{values} = [ map { $_ + 50 } @{$_->{values}} ] foreach grep {$_} map { pkgs::packageByName($o->{packages}, $_) } @l;
-
- } else {
- #- remove upgrade flag with selection one.
- pkgs::unselectAllPackagesIncludingUpgradable($o->{packages});
- }
-}
-
-sub selectPackagesToUpgrade($) {
- my ($o) = @_;
-
- require pkgs;
- pkgs::selectPackagesToUpgrade($o->{packages}, $o->{prefix}, $o->{base}, $o->{toRemove}, $o->{toSave});
-}
-
-sub addToBeDone(&$) {
- my ($f, $step) = @_;
-
- return &$f() if $::o->{steps}{$step}{done};
-
- push @{$::o->{steps}{$step}{toBeDone}}, $f;
-}
-
-sub getHds {
- my ($o) = @_;
- my ($ok, $ok2) = 1;
-
- my @drives = detect_devices::hds();
-# add2hash_($o->{partitioning}, { readonly => 1 }) if partition_table_raw::typeOfMBR($drives[0]{device}) eq 'system_commander';
-
- getHds:
- $o->{hds} = catch_cdie { fsedit::hds(\@drives, $o->{partitioning}) }
- sub {
- log::l("error reading partition table: $@");
- my ($err) = $@ =~ /(.*) at /;
- $@ =~ /overlapping/ and $o->ask_warn('', $@), return 1;
- $o->ask_okcancel(_("Error"),
-[_("I can't read your partition table, it's too corrupted for me :(
-I'll try to go on blanking bad partitions"), $err]) unless $o->{partitioning}{readonly};
- $ok = 0; 1
- };
-
- if (is_empty_array_ref($o->{hds}) && $o->{autoSCSI}) {
- $o->setupSCSI; #- ask for an unautodetected scsi card
- goto getHds;
- }
-
- ($o->{hds}, $o->{fstab}, $ok2) = fsedit::verifyHds($o->{hds}, $o->{partitioning}{readonly}, $ok);
-
- fs::check_mounted($o->{fstab});
- fs::merge_fstabs($o->{fstab}, $o->{manualFstab});
-
- $o->{partitioning}{clearall} and return 1;
- $o->ask_warn('',
-_("DiskDrake failed to read correctly the partition table.
-Continue at your own risk!")) if !$ok2 && $ok && !$o->{partitioning}{readonly};
-
- my @win = grep { isFat($_) && isFat({ type => fsedit::typeOfPart($_->{device}) }) } @{$o->{fstab}};
-# my @nt = grep { isNT($_) && isNT( { type => fsedit::typeOfPart($_->{device}) }) } @{$o->{fstab}};
- log::l("win parts: ", join ",", map { $_->{device} } @win) if @win;
-# log::l("nt parts: ", join ",", map { $_->{device} } @nt) if @nt;
- if (@win == 1) {
- $win[0]{mntpoint} = "/mnt/windows";
- } else {
- my %w; foreach (@win) {
- my $v = $w{$_->{device_windobe}}++;
- $_->{mntpoint} = "/mnt/win_" . lc($_->{device_windobe}) . ($v ? $v+1 : ''); #- lc cuz of StartOffice(!) cf dadou
- }
- }
- $ok2;
-}
-
-sub searchAndMount4Upgrade {
- my ($o) = @_;
- my ($root, $found);
-
- my $w = $::beginner && $o->wait_message('', _("Searching root partition."));
-
- #- try to find the partition where the system is installed if beginner
- #- else ask the user the right partition, and test it after.
- getHds($o);
-
- #- get all ext2 partition that may be root partition.
- my %Parts = my %parts = map { $_->{device} => $_ } grep { isTrueFS($_) } @{$o->{fstab}};
- while (keys(%parts) > 0) {
- $root = $::beginner ? first(%parts) : $o->selectRootPartition(keys %parts);
- $root = delete $parts{$root};
-
- my $r; unless ($r = $root->{realMntpoint}) {
- $r = $o->{prefix};
- $root->{mntpoint} = "/";
- log::l("trying to mount partition $root->{device}");
- eval { fs::mount_part($root, $o->{prefix}, 'readonly') };
- $r = "/*ERROR*" if $@;
- }
- $found = -d "$r/etc/sysconfig" && [ fs::read_fstab("$r/etc/fstab") ];
-
- unless ($root->{realMntpoint}) {
- log::l("umounting partition $root->{device}");
- eval { fs::umount_part($root, $o->{prefix}) };
- }
-
- last if !is_empty_array_ref($found);
-
- delete $root->{mntpoint};
- $o->ask_warn(_("Information"),
- _("%s: This is not a root partition, please select another one.", $root->{device})) unless $::beginner;
- }
- is_empty_array_ref($found) and die _("No root partition found");
-
- log::l("found root partition : $root->{device}");
-
- #- test if the partition has to be fsck'ed and remounted rw.
- if ($root->{realMntpoint}) {
- ($o->{prefix}, $root->{mntpoint}) = ($root->{realMntpoint}, '/');
- } else {
- delete $root->{mntpoint};
- ($Parts{$_->{device}} || {})->{mntpoint} = $_->{mntpoint} foreach @$found;
- map { $_->{mntpoint} = 'swap_upgrade' } grep { isSwap($_) } @{$o->{fstab}}; #- use all available swap.
-
- #- TODO fsck, create check_mount_all ?
- fs::mount_all([ grep { isTrueFS($_) || isSwap($_) } @{$o->{fstab}} ], $o->{prefix});
- }
-}
-
-sub write_ldsoconf {
- my ($prefix) = @_;
- my $file = "$prefix/etc/ld.so.conf";
-
- #- write a minimal ld.so.conf file unless it already exists.
- unless (-s "$file") {
- local *F;
- open F, ">$file" or die "unable to open for writing $file";
- print F "/usr/lib\n";
- }
-}
-
-sub setAuthentication {
- my ($o) = @_;
- my ($shadow, $md5, $nis) = @{$o->{authentication} || {}}{qw(shadow md5 NIS)};
- my $p = $o->{prefix};
- enableMD5Shadow($p, $shadow, $md5);
- enableShadow() if $shadow;
- if ($nis) {
- $o->pkg_install("ypbind");
- my $domain = $o->{netc}{NISDOMAIN};
- $domain || $nis ne "broadcast" or die _("Can't use broadcast with no NIS domain");
- my $t = $domain ? "domain $domain" . ($nis ne "broadcast" && " server")
- : "ypserver";
- substInFile {
- $_ = "#~$_" unless /^#/;
- $_ .= "$t $nis\n" if eof;
- } "$p/etc/yp.conf";
- network::write_conf("$p/etc/sysconfig/network", $o->{netc});
- }
-}
-
-sub enableShadow() {
- my $p = $::o->{prefix};
- run_program::rooted($p, "pwconv") or log::l("pwconv failed");
- run_program::rooted($p, "grpconv") or log::l("grpconv failed");
-
-#- my $chpasswd = sub {
-#- my ($name, $password) = @_;
-#- $password =~ s/"/\\"/;
-#-
-#- local *log::l = sub {}; #- disable the logging (otherwise password visible in the log)
-#- run_program::rooted($p, qq((echo "$password" ; sleep 1 ; echo "$password") | passwd $name));
-#-#- run_program::rooted($p, "echo $name:$password | chpasswd");
-#- };
-#- &$chpasswd("root", $::o->{superuser}{password});
-#- &$chpasswd($_->{name}, $_->{password}) foreach @{$::o->{users} || []};
-}
-
-sub enableMD5Shadow($$$) {
- my ($prefix, $shadow, $md5) = @_;
- substInFile {
- if (/^password.*pam_pwdb.so/) {
- s/\s*shadow//; s/\s*md5//;
- s/$/ shadow/ if $shadow;
- s/$/ md5/ if $md5;
- }
- } grep { -r $_ } map { "$prefix/etc/pam.d/$_" } qw(login rlogin passwd);
-}
-
-sub crypt($) {
- my ($password) = @_;
-
- $::o->{authentication}{md5} ?
- c::crypt_md5($password, salt(8)) :
- crypt ($password, salt(2));
-}
-
-sub killCardServices {
- my $pid = chop_(cat_("/tmp/cardmgr.pid"));
- $pid and kill(15, $pid); #- send SIGTERM
-}
-
-sub hdInstallPath() {
- cat_("/proc/mounts") =~ m|/tmp/(\S+)\s+/tmp/hdimage| or return;
- my ($part) = grep { $_->{device} eq $1 } @{$::o->{fstab}};
- $part->{mntpoint} or grep { $_->{mntpoint} eq "/mnt/hd" } @{$::o->{fstab}} and return;
- $part->{mntpoint} ||= "/mnt/hd";
- $part->{mntpoint} . first(readlink("/tmp/rhimage") =~ m|^/tmp/hdimage/(.*)|);
-}
-
-sub unlockCdrom(;$) {
- my ($cdrom) = @_;
- $cdrom or cat_("/proc/mounts") =~ m|(/tmp/\S+)\s+/tmp/rhimage| and $cdrom = $1;
- eval { $cdrom and ioctl detect_devices::tryOpen($1), c::CDROM_LOCKDOOR(), 0 };
-}
-sub ejectCdrom(;$) {
- my ($cdrom) = @_;
- $cdrom or cat_("/proc/mounts") =~ m|(/tmp/\S+)\s+/tmp/rhimage| and $cdrom = $1;
- my $f = eval { $cdrom && detect_devices::tryOpen($cdrom) } or return;
- getFile("XXX"); #- close still opened filehandle
- eval { fs::umount("/tmp/rhimage") };
- ioctl $f, c::CDROMEJECT(), 1;
-}
-
-sub setupFB {
- my ($o, $vga) = @_;
-
- #- install needed packages for frame buffer.
- $o->pkg_install(qw(kernel-fb XFree86-FBDev));
-
- $vga ||= 785; #- assume at least 640x480x16.
-
- require lilo;
- #- update lilo entries with a new fb label. a bit hack unless
- #- a frame buffer kernel is used, in such case we use it instead
- #- with the right mode, nothing more to do.
- foreach (qw(secure smp)) {
- if (my $e = lilo::get("/boot/vmlinuz-$_", $o->{bootloader})) {
- if ($_ eq 'secure') {
- log::l("warning: kernel-secure is not fb, using a kernel-fb instead");
- #- nothing done, fall through linux-fb.
- } else {
- $e->{vga} = $vga;
- lilo::install($o->{prefix}, $o->{bootloader}, $o->{fstab}, $o->{hds});
- return 1;
- }
- }
- }
- if (lilo::add_kernel($o->{prefix}, $o->{bootloader}, kernelVersion($o), 'fb',
- {
- label => 'linux-fb',
- root => lilo::get("/boot/vmlinuz", $o->{bootloader})->{root},
- vga => $vga,
- })) {
- $o->{bootloader}{default} = 'linux-fb';
- lilo::install($o->{prefix}, $o->{bootloader}, $o->{fstab}, $o->{hds});
- } else {
- log::l("unable to install kernel with frame buffer support, disabling");
- return 0;
- }
- 1;
-}
-
-sub auto_inst_file() { ($::g_auto_install ? "/tmp" : "$::o->{prefix}/root") . "/auto_inst.cfg.pl" }
-
-sub g_auto_install(;$) {
- my ($f) = @_; $f ||= auto_inst_file;
- my $o = {};
-
- $o->{default_packages} = [ map { pkgs::packageName($_) } grep { pkgs::packageFlagSelected($_) && !pkgs::packageFlagBase($_) } values %{$::o->{packages}[0]} ];
-
- my @fields = qw(mntpoint type size);
- $o->{partitions} = [ map { my %l; @l{@fields} = @$_{@fields}; \%l } grep { $_->{mntpoint} } @{$::o->{fstab}} ];
-
- exists $::o->{$_} and $o->{$_} = $::o->{$_} foreach qw(lang autoSCSI authentication printer mouse wacom netc timezone superuser intf keyboard mkbootdisk users installClass partitioning isUpgrade manualFstab nomouseprobe crypto security modem useSupermount autoExitInstall); #- TODO modules bootloader
-
- if (my $card = $::o->{X}{card}) {
- $o->{X}{$_} = $::o->{X}{$_} foreach qw(default_depth resolution_wanted);
- if ($o->{X}{default_depth} and my $depth = $card->{depth}{$o->{X}{default_depth}}) {
- $depth ||= [];
- $o->{X}{resolution_wanted} ||= join "x", @{$depth->[0]} unless is_empty_array_ref($depth->[0]);
- }
- }
-
- local $o->{partitioning}{auto_allocate} = 1;
- local $o->{autoExitInstall} = 1;
-
- $_ = { %{$_ || {}} }, delete @$_{qw(oldu oldg password password2)} foreach $o->{superuser}, @{$o->{users} || []};
-
- local *F;
- open F, ">$f" or log::l("can't output the auto_install script in $f"), return;
- print F Data::Dumper->Dump([$o], ['$o']), "\0";
-}
-
-sub loadO {
- my ($O, $f) = @_; $f ||= auto_inst_file;
- my $o;
- if ($f =~ /^(floppy|patch)$/) {
- my $f = $f eq "floppy" ? "auto_inst.cfg" : "patch";
- unless ($::testing) {
- fs::mount(devices::make("fd0"), "/mnt", "vfat", 'readonly');
- $f = "/mnt/$f";
- }
- -e $f or $f .= ".pl";
-
- my $b = before_leaving {
- fs::umount("/mnt") unless $::testing;
- modules::unload($_) foreach qw(vfat fat);
- };
- $o = loadO($O, $f);
- } else {
- -e "$f.pl" and $f .= ".pl" unless -e $f;
-
- my $fh = -e $f ? do { local *F; open F, $f; *F } : getFile($f) or die _("Error reading file $f");
- {
- local $/ = "\0";
- no strict;
- eval <$fh>;
- close $fh;
- $@ and log::l("Bad kickstart file $f (failed $@)");
- }
- add2hash_($o ||= {}, $O);
- }
- bless $o, ref $O;
-}
-
-sub fsck_option() {
- my $y = $::o->{security} < 3 && $::beginner ? "-y " : "";
- substInFile { s/^(\s*fsckoptions="?)(-y )?/$1$y/ } "$::o->{prefix}/etc/rc.d/rc.sysinit";
-}
-
-sub install_urpmi {
- my ($prefix, $method, $mediums) = @_;
-
- my @cfg = map_index {
- my $name = $_->{fakemedium};
-
- local *LIST;
- open LIST, ">$prefix/var/lib/urpmi/list.$name" or log::l("failed to write list.$name"), return;
-
- my $dir = ${{ nfs => "file://mnt/nfs",
- hd => "file:/" . hdInstallPath(),
- ftp => $ENV{URLPREFIX},
- http => $ENV{URLPREFIX},
- cdrom => "removable_cdrom_$::i://mnt/cdrom" }}{$method} . "/$_->{rpmsdir}";
-
- local *FILES; open FILES, "bzip2 -dc /tmp/$_->{hdlist} 2>/dev/null | hdlist2names - |";
- chop, print LIST "$dir/$_\n" foreach <FILES>;
- close FILES or log::l("hdlist2names failed"), return;
- close LIST;
-
- $dir .= " with ../base/$_->{hdlist}" if $method =~ /ftp|http/;
- "$name $dir\n";
- } values %$mediums;
- eval { output "$prefix/etc/urpmi/urpmi.cfg", @cfg };
-}
-
-sub list_passwd() {
- my ($e, @l);
-
- setpwent();
- while (@{$e = [ getpwent() ]}) { push @l, $e }
- endpwent();
-
- @l;
-}
-
-sub list_home() {
- map { $_->[7] } grep { $_->[2] >= 500 } list_passwd();
-}
-sub list_skels() { "/etc/skel", "/root", list_home() }
-
-sub template2userfile($$$$%) {
- my ($prefix, $inputfile, $outputrelfile, $force, %toreplace) = @_;
-
- foreach (list_skels()) {
- my $outputfile = "$prefix/$_/$outputrelfile";
- if (-d dirname($outputfile) && ($force || ! -e $outputfile)) {
- log::l("generating $outputfile from template $inputfile");
- template2file($inputfile, $outputfile, %toreplace);
- m|/home/(.*)| and commands::chown_($1, $outputfile);
- }
- }
-}
-
-sub update_userkderc($$$) {
- my ($prefix, $cat, $subst) = @_;
-
- foreach (list_skels()) {
- my ($inputfile, $outputfile) = ("$prefix$_/.kderc", "$prefix$_/.kderc.new");
- my %tosubst = (%$subst);
- local *INFILE; local *OUTFILE;
- open INFILE, $inputfile or return;
- open OUTFILE, ">$outputfile" or return;
-
- print OUTFILE map {
- if (my $i = /^\s*\[$cat\]/i ... /^\s*\[/) {
- if (/^\s*(\w*)=/ && $tosubst{lc($1)}) {
- delete $tosubst{lc($1)};
- } else {
- ($i > 1 && /^\s*\[/ && join '', map { delete $tosubst{$_} } keys %tosubst). $_;
- }
- } else {
- $_;
- }
- } <INFILE>;
- print OUTFILE "[$cat]\n", values %tosubst if values %tosubst; #- if categorie has not been found above.
-
- my @l = (stat $inputfile)[4, 5];
- unlink $inputfile;
- rename $outputfile, $inputfile;
- chown @l, $inputfile;
- }
-}
-
-sub kderc_largedisplay($) {
- my ($prefix) = @_;
-
- update_userkderc($prefix, 'KDE', {
- contrast => "Contrast=7\n",
- kfmiconstyle => "kfmIconStyle=Large\n",
- kpaneliconstyle => "kpanelIconStyle=Normal\n", #- to change to Large when icons looks better
- kdeiconstyle => "KDEIconStyle=Large\n",
- });
- foreach (list_skels()) {
- substInFile {
- s/^(GridWidth)=85/$1=100/;
- s/^(GridHeight)=70/$1=75/;
- } "$prefix$_/.kde/share/config/kfmrc"
- }
-}
-
-sub kdelang_postinstall($) {
- my ($prefix) = @_;
- my %i18n = getVarsFromSh("$prefix/etc/sysconfig/i18n");
-
- #- remove existing reference to $lang.
- update_userkderc($prefix, 'Locale', { language => "Language=\n" });
-}
-
-sub kdeicons_postinstall($) {
- my ($prefix) = @_;
-
- #- parse etc/fstab file to search for dos/win, floppy, zip, cdroms icons.
- #- handle both supermount and fsdev usage.
- local *F;
- open F, "$prefix/etc/fstab" or log::l("failed to read $prefix/etc/fstab"), return;
-
- foreach (<F>) {
- if (m|^/dev/(\S+)\s+/mnt/cdrom(\d*)\s+|) {
- my %toreplace = ( device => $1, id => $2 );
- template2userfile($prefix, "$ENV{SHARE_PATH}/cdrom.fsdev.kdelnk.in", "Desktop/Cd-Rom". ($2 && " $2") .".kdelnk",
- 1, %toreplace);
- } elsif (m|^/dev/(\S+)\s+/mnt/zip(\d*)\s+|) {
- my %toreplace = ( device => $1, id => $2 );
- template2userfile($prefix, "$ENV{SHARE_PATH}/zip.fsdev.kdelnk.in", "Desktop/Zip". ($2 && " $2") .".kdelnk",
- 1, %toreplace);
- } elsif (m|^/dev/(\S+)\s+/mnt/floppy-ls(\d*)\s+|) {
- my %toreplace = ( device => $1, id => $2 );
- template2userfile($prefix, "$ENV{SHARE_PATH}/floppy.fsdev.kdelnk.in", "Desktop/LS-120". ($2 && " $2") .".kdelnk",
- 1, %toreplace);
- } elsif (m|^/dev/(\S+)\s+/mnt/floppy(\d*)\s+|) {
- my %toreplace = ( device => $1, id => $2 );
- template2userfile($prefix, "$ENV{SHARE_PATH}/floppy.fsdev.kdelnk.in", "Desktop/Floppy". ($2 && " $2") .".kdelnk",
- 1, %toreplace);
- } elsif (m|^/mnt/cdrom(\d*)\s+/mnt/cdrom\d*\s+supermount|) {
- my %toreplace = ( id => $1 );
- template2userfile($prefix, "$ENV{SHARE_PATH}/cdrom.kdelnk.in", "Desktop/Cd-Rom". ($1 && " $1") .".kdelnk",
- 1, %toreplace);
- } elsif (m|^/mnt/zip(\d*)\s+/mnt/zip\d*\s+supermount|) {
- my %toreplace = ( id => $1 );
- template2userfile($prefix, "$ENV{SHARE_PATH}/zip.kdelnk.in", "Desktop/Zip". ($1 && " $1") .".kdelnk",
- 1, %toreplace);
- } elsif (m|^/mnt/floppy-ls(\d*)\s+/mnt/floppy-ls\d*\s+supermount|) {
- my %toreplace = ( id => $1 );
- template2userfile($prefix, "$ENV{SHARE_PATH}/floppy.kdelnk.in", "Desktop/LS-120". ($1 && " $1") .".kdelnk",
- 1, %toreplace);
- } elsif (m|^/mnt/floppy(\d*)\s+/mnt/floppy\d*\s+supermount|) {
- my %toreplace = ( id => $1 );
- template2userfile($prefix, "$ENV{SHARE_PATH}/floppy.kdelnk.in", "Desktop/Floppy". ($1 && " $1") .".kdelnk",
- 1, %toreplace);
- } elsif (m|^/dev/(\S+)\s+(/mnt/DOS_\S*)\s+|) {
- my %toreplace = ( device => $1, id => $1, mntpoint => $2 );
- template2userfile($prefix, "$ENV{SHARE_PATH}/Dos_.kdelnk.in", "Desktop/Dos_$1.kdelnk", 1, %toreplace);
- symlink "hd_umount.xpm", "$prefix/usr/share/icons/hd_unmount.xpm";
- symlink "hd_umount.xpm", "$prefix/usr/share/icons/large/hd_unmount.xpm";
- } elsif (m|^/dev/(\S+)\s+/mnt/([^\/]*)\s+vfat\s+|) {
- my %toreplace = ( device => $1, id => $1, mntpoint => "/mnt/$2" );
- template2userfile($prefix, "$ENV{SHARE_PATH}/Dos_.kdelnk.in", "Desktop/$2.kdelnk", 1, %toreplace);
- symlink "hd_umount.xpm", "$prefix/usr/share/icons/hd_unmount.xpm";
- symlink "hd_umount.xpm", "$prefix/usr/share/icons/large/hd_unmount.xpm";
- } elsif (m|^/dev/(\S+)\s+(\S*)\s+vfat\s+|) {
- my %toreplace = ( device => $1, id => $1, mntpoint => $2 );
- template2userfile($prefix, "$ENV{SHARE_PATH}/Dos_.kdelnk.in", "Desktop/Dos_$1.kdelnk", 1, %toreplace);
- symlink "hd_umount.xpm", "$prefix/usr/share/icons/hd_unmount.xpm";
- symlink "hd_umount.xpm", "$prefix/usr/share/icons/large/hd_unmount.xpm";
- }
- }
-
- my @l = map { "$prefix$_/Desktop/Doc.kdelnk" } list_skels();
- if (my ($lang) = eval { all("$prefix/usr/doc/mandrake") }) {
- substInFile { s|^(URL=.*?)/?$|$1/$lang/index.html| } @l;
- substInFile { s|^(url=/usr/doc/mandrake/)$|$1$lang/index.html| } "$prefix/usr/lib/desktop-links/mandrake.links";
- } else {
- unlink @l;
- substInFile { $_ = '' if /^\[MDKsupport\]$/ .. /^\s*$/ } "$prefix/usr/lib/desktop-links/mandrake.links";
- }
-
- my $lang = quotemeta $ENV{LANG};
- foreach my $dir (map { "$prefix$_/Desktop" } list_skels()) {
- -d $dir or next;
- foreach (grep { /\.kdelnk$/ } all($dir)) {
- cat_("$dir/$_") =~ /^Name\[$lang\]=(.{2,14})$/m
- and rename "$dir/$_", "$dir/$1.kdelnk";
- }
- }
-}
-
-sub move_desktop_file($) {
- my ($prefix) = @_;
- my @toMove = qw(doc.kdelnk news.kdelnk updates.kdelnk home.kdelnk printer.kdelnk floppy.kdelnk cdrom.kdelnk FLOPPY.kdelnk CDROM.kdelnk);
-
- foreach (list_skels()) {
- my $dir = "$prefix$_";
- if (-d "$dir/Desktop") {
- my @toSubst = glob_("$dir/Desktop/*rpmorig");
-
- push @toSubst, "$dir/Desktop/$_" foreach @toMove;
-
- #- remove any existing save in Trash of each user and
- #- move appropriate file there after an upgrade.
- foreach (@toSubst) {
- if (-e $_) {
- my $basename = basename($_);
-
- unlink "$dir/Desktop/Trash/$basename";
- rename $_, "$dir/Desktop/Trash/$basename";
- }
- }
- }
- }
-}
-
-sub generate_ks_cfg {
- my ($o) = @_;
-
- return if $o->{method} =~ /hd|cdrom/;
-
- my $ks;
- if ($o->{method} =~ /ftp|http/) {
- $ks .= "url --url $ENV{URLPREFIX}\n";
- } elsif ($o->{method} =~ /nfs/) {
- cat_("/proc/mounts") =~ m|(\S+):(\S+)\s+/tmp/rhimage nfs| or die;
- $ks .= "nfs --server $1 --dir $2\n";
- }
- my %intf = %{$o->{intf}[0]};
- if ($intf{BOOTPROTO} =~ /^(dhcp|bootp)$/) {
- $ks .= "network --bootproto $intf{BOOTPROTO}\n";
- } else {
- my %l = (ip => $intf{IPADDR}, netmask => $intf{NETMASK}, gateway => $o->{netc}{GATEWAY});
- $ks .= "network " . join(" ", map_each { $::b && "--$::a $::b" } %l);
- $ks .= " --nameserver $_" foreach network::dnsServers($o->{netc});
- $ks .= "\n";
- }
- $ks;
-}
-
-1;