diff options
author | Pascal Rigaux <pixel@mandriva.com> | 2000-08-17 00:39:01 +0000 |
---|---|---|
committer | Pascal Rigaux <pixel@mandriva.com> | 2000-08-17 00:39:01 +0000 |
commit | 11b0b944ddde76b4982fa2f9e2118dcee5035f80 (patch) | |
tree | a873f848dcf1eda96b89a0319f8923e10bbc5b4a /perl-install/install_any.pm | |
parent | d77799bb5ce63ecac4de72e1b27f56d7d22fd048 (diff) | |
download | drakx-11b0b944ddde76b4982fa2f9e2118dcee5035f80.tar drakx-11b0b944ddde76b4982fa2f9e2118dcee5035f80.tar.gz drakx-11b0b944ddde76b4982fa2f9e2118dcee5035f80.tar.bz2 drakx-11b0b944ddde76b4982fa2f9e2118dcee5035f80.tar.xz drakx-11b0b944ddde76b4982fa2f9e2118dcee5035f80.zip |
no_comment
Diffstat (limited to 'perl-install/install_any.pm')
-rw-r--r-- | perl-install/install_any.pm | 653 |
1 files changed, 117 insertions, 536 deletions
diff --git a/perl-install/install_any.pm b/perl-install/install_any.pm index 6e9984f2a..25fbdbf79 100644 --- a/perl-install/install_any.pm +++ b/perl-install/install_any.pm @@ -2,7 +2,6 @@ package install_any; use diagnostics; use strict; -use Config; use vars qw(@ISA %EXPORT_TAGS @EXPORT_OK @needToCopy); @@ -26,6 +25,7 @@ use network; use modules; use detect_devices; use fs; +use any; use log; #- package that have to be copied for proper installation (just to avoid changing cdrom) @@ -220,10 +220,10 @@ sub spawnShell { exec {"/bin/sh"} "-/bin/sh" or log::l("exec of /bin/sh failed: $!"); } -sub shells($) { +sub fsck_option() { my ($o) = @_; - my @l = grep { -x "$o->{prefix}$_" } @{$o->{shells}}; - @l ? @l : "/bin/bash"; + my $y = $o->{security} < 3 && $::beginner ? "-y " : ""; + substInFile { s/^(\s*fsckoptions="?)(-y )?/$1$y/ } "$o->{prefix}/etc/rc.d/rc.sysinit"; } sub getAvailableSpace { @@ -307,13 +307,6 @@ sub setPackages($) { } } -sub selectPackagesToUpgrade($) { - my ($o) = @_; - - require pkgs; - pkgs::selectPackagesToUpgrade($o->{packages}, $o->{prefix}, $o->{base}, $o->{toRemove}, $o->{toSave}); -} - sub addToBeDone(&$) { my ($f, $step) = @_; @@ -322,134 +315,12 @@ sub addToBeDone(&$) { push @{$::o->{steps}{$step}{toBeDone}}, $f; } -sub getHds { - my ($o) = @_; - my ($ok, $ok2) = (1, 1); - my $flags = $o->{partitioning}; - - 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, $flags) } - 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 $flags->{readonly}; - $ok = 0; 1 - }; - - if (is_empty_array_ref($o->{hds}) && $o->{autoSCSI}) { - $o->setupSCSI; #- ask for an unautodetected scsi card - goto getHds; - } - - $ok2 = fsedit::verifyHds($o->{hds}, $flags->{readonly}, $ok) - unless $flags->{clearall} || $flags->{clear}; - - $o->{fstab} = [ fsedit::get_fstab(@{$o->{hds}}) ]; - fs::check_mounted($o->{fstab}); - fs::merge_fstabs($o->{fstab}, $o->{manualFstab}); - - $o->ask_warn('', -_("DiskDrake failed to read correctly the partition table. -Continue at your own risk!")) if !$ok2 && $ok && !$flags->{readonly}; - - my @win = grep { isFat($_) && isFat({ type => fsedit::typeOfPart($_->{device}) }) } @{$o->{fstab}}; - log::l("win parts: ", join ",", map { $_->{device} } @win) if @win; - 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 - } - } - - my @sunos = grep { isSunOS($_) && type2name($_->{type}) =~ /root/i } @{$o->{fstab}}; #- take only into account root partitions. - if (@sunos) { - my $v = ''; - map { $_->{mntpoint} = "/mnt/sunos" . ($v && ++$v) } @sunos; - } - #- a good job is to mount SunOS root partition, and to use mount point described here in /etc/vfstab. - - $ok2; -} - -sub searchAndMount4Upgrade { - my ($o) = @_; - my ($root, $found); - - my $w = !$::expert && $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; + any::enableMD5Shadow($p, $shadow, $md5); + any::enableShadow($p) if $shadow; if ($nis) { $o->pkg_install("ypbind"); my $domain = $o->{netc}{NISDOMAIN}; @@ -464,42 +335,6 @@ sub setAuthentication { } } -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 @@ -546,8 +381,7 @@ sub setupFB { #- nothing done, fall through linux-fb. } else { $e->{vga} = $vga; - bootloader::install($o->{prefix}, $o->{bootloader}, $o->{fstab}, $o->{hds}); - return 1; + goto ok; } } } @@ -558,14 +392,122 @@ sub setupFB { vga => $vga, })) { $o->{bootloader}{default} = 'linux-fb'; - bootloader::install($o->{prefix}, $o->{bootloader}, $o->{fstab}, $o->{hds}); } else { log::l("unable to install kernel with frame buffer support, disabling"); return 0; } + ok: + bootloader::install($o->{prefix}, $o->{bootloader}, $o->{fstab}, $o->{hds}); 1; } +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 }; +} + + +#-############################################################################### +#- kde stuff +#-############################################################################### +sub kderc_largedisplay { + my ($prefix) = @_; + + update_userkderc($prefix, 'KDE', + Contrast => 7, + kfmIconStyle => "Large", + kpanelIconStyle => "Normal", #- to change to Large when icons looks better + KDEIconStyle => "Large"); + substInFile { + s/^(GridWidth)=85/$1=100/; + s/^(GridHeight)=70/$1=75/; + } $_ foreach list_skels($prefix, '.kde/share/config/kfmrc'); +} + +sub kdeicons_postinstall { + my ($prefix) = @_; + + #- parse etc/fstab file to search for dos/win, floppy, zip, cdroms icons. + #- handle both supermount and fsdev usage. + my %l = ( + 'cdrom' => [ 'cdrom', 'Cd-Rom' ], + 'zip' => [ 'zip', 'Zip' ], + 'floppy-ls' => [ 'floppy', 'LS-120' ], + 'floppy' => [ 'floppy', 'Floppy' ], + ); + foreach (fs::read_fstab("$prefix/etc/fstab")) { + + my ($name_, $nb) = $_->{mntpoint} =~ m|.*/(\S+?)(\d*)$/|; + my ($name, $text) = @{$l{$name_} || []}; + + my $f = ${{ + supermount => sub { $name .= '.fsdev' if $name }, + vfat => sub { $name = 'Dos_'; $text = $name_ }, + }}{$_->{type}}; + &$f if $f; + + template2userfile($prefix, + "$ENV{SHARE_PATH}/$name.kdelnk.in", + "Desktop/$text" . ($nb && " $nb"). ".kdelnk", + 1, %$_) if $name; + } + + my @l = list_skels($prefix, 'Desktop/Doc.kdelnk'); + 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"; + } + + # rename the .kdelnk to the name found in the .kdelnk as kde doesn't use it + # for displaying + foreach my $dir (grep { -d $_ } list_skels($prefix, 'Desktop')) { + foreach (grep { /\.kdelnk$/ } all($dir)) { + cat_("$dir/$_") =~ /^Name\[\Q$ENV{LANG}\E\]=(.{2,14})$/m + and rename "$dir/$_", "$dir/$1.kdelnk"; + } + } +} + +sub kdemove_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); + + #- remove any existing save in Trash of each user and + #- move appropriate file there after an upgrade. + foreach my $dir (grep { -d $_ } list_skels($prefix, 'Desktop')) { + unlink("$dir/Trash/$_") && rename("$dir/$_", "$dir/Trash/$_") + foreach grep { -e "$dir/$_" } @toMove, grep { /\.rpmorig$/ } all($dir) + } +} + + +#-############################################################################### +#- auto_install stuff +#-############################################################################### sub auto_inst_file() { ($::g_auto_install ? "/tmp" : "$::o->{prefix}/root") . "/auto_inst.cfg.pl" } sub g_auto_install(;$) { @@ -608,7 +550,7 @@ sub loadO { fs::mount(devices::make("fd0"), "/mnt", (arch() =~ /sparc/ ? "romfs" : "vfat"), 'readonly'); $f = "/mnt/$f"; } - -e $f or $f .= ".pl"; + -e $f or $f .= '.pl'; my $b = before_leaving { fs::umount("/mnt") unless $::testing; @@ -631,223 +573,6 @@ sub loadO { 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) = @_; @@ -872,148 +597,4 @@ sub generate_ks_cfg { $ks; } -sub partitionWizard { - my ($o, $hds, $fstab, $readonly) = @_; - my @wizlog; - my (@solutions, %solutions); - - my $min_linux = 500 << 11; - my $max_linux = 2500 << 11; - my $min_swap = 50 << 11; - my $max_swap = 300 << 11; - my $min_freewin = 100 << 11; - - # each solution is a [ score, text, function ], where the function retunrs true if succeeded - - if (fsedit::free_space(@$hds) > $min_linux and !$readonly) { - $solutions{free_space} = [ 20, _("Use free space"), sub { fsedit::auto_allocate($hds, $o->{partitions}); 1 } ] - } else { - push @wizlog, _("Not enough free space to allocate new partitions"); - } - - if (@$fstab) { - my $truefs = grep { isTrueFS($_) } @$fstab; - #- value twice the ext2 partitions - $solutions{existing_part} = [ 6 + $truefs + @$fstab, _("Use existing partition"), sub { $o->ask_mntpoint_s($fstab) } ] - } else { - push @wizlog, _("There is no existing partition to use"); - } - - my @fats = grep { isFat($_) } @$fstab; - fs::df($_) foreach @fats; - if (my @ok_forloopback = sort { $b->{free} <=> $a->{free} } grep { $_->{free} > $min_linux + $min_freewin } @fats) { - $solutions{loopback} = - [ 5 - @fats, _("Use the FAT partition for loopback"), - sub { - my ($s_root, $s_swap); - my $part = $o->ask_from_listf('', _("Which partition do you want to use to put Linux4Win?"), \&partition_table_raw::description, \@ok_forloopback) or return; - $o->ask_from_entries_refH('', _("Choose the sizes"), [ - _("Root partition size in MB: ") => { val => \$s_root, min => 1 + ($min_linux >> 11), max => min($part->{free} - 2 * $max_swap - $min_freewin, $max_linux) >> 11, type => 'range' }, - _("Swap partition size in MB: ") => { val => \$s_swap, min => 1 + ($min_swap >> 11), max => 2 * $max_swap >> 11, type => 'range' }, - ]) or return; - push @{$part->{loopback}}, - { type => 0x83, loopback_file => '/lnx4win/linuxsys.img', mntpoint => '/', size => $s_root << 11, device => $part, notFormatted => 1 }, - { type => 0x82, loopback_file => '/lnx4win/swapfile', mntpoint => 'swap', size => $s_swap << 11, device => $part, notFormatted => 1 }; - 1; - } ]; - $solutions{resize_fat} = - [ 6 - @fats, _("Use the free space on the FAT partition"), - sub { - my $part = $o->ask_from_listf('', _("Which partition do you want to resize?"), \&partition_table_raw::description, \@ok_forloopback) or return; - my $w = $o->wait_message(_("Resizing"), _("Computing FAT filesystem bounds")); - my $resize_fat = eval { resize_fat::main->new($part->{device}, devices::make($part->{device})) }; - $@ and die _("The FAT resizer is unable to handle your partition, -the following error occured: %s", $@); - my $min_win = $resize_fat->min_size; - $part->{size} > $min_linux + $min_freewin + $min_win or die _("Your windows partition is too fragmented, please run ``defrag'' first"); - $o->ask_okcancel('', _("WARNING! - -DrakX will now resize your Windows partition. Be careful: this operation is -dangerous. If you have not already done so, you should first exit the -installation, run scandisk under Windows (and optionally run defrag), then -restart the installation. You should also backup your data. -When sure, press Ok.")) or return; - - my $size = $part->{size}; - $o->ask_from_entries_refH('', _("Which size do you want to keep for windows on"), [ - _("partition %s", partition_table_raw::description($part)) => { val => \$size, min => 1 + ($min_win >> 11), max => ($part->{size} - $min_linux) >> 11, type => 'range' }, - ]) or return; - $size <<= 11; - - local *log::l = sub { $w->set(join(' ', @_)) }; - eval { $resize_fat->resize($size) }; - $@ and die _("FAT resizing failed: %s", $@); - - $part->{size} = $size; - $part->{isFormatted} = 1; - - my ($hd) = grep { $_->{device} eq $part->{rootDevice} } @$hds; - $hd->{isDirty} = $hd->{needKernelReread} = 1; - $hd->adjustEnd($part); - partition_table::adjust_local_extended($hd, $part); - partition_table::adjust_main_extended($hd); - - fsedit::auto_allocate($hds, $o->{partitions}); - 1; - } ] if !$readonly; - } else { - push @wizlog, _("There is no FAT partitions to resize or to use as loopback (or not enough space left)"); - } - - if (@$fstab && !$readonly) { - require diskdrake; - $solutions{wipe_drive} = - [ 10, fsedit::is_one_big_fat($hds) ? _("Remove Windows(TM)") : _("Take over the hard drive"), - sub { - my $hd = $o->ask_from_listf('', _("You have more than one hard drive, which one do you install linux on?"), - \&partition_table_raw::description, $hds) or return; - $o->ask_okcancel('', _("All existing partitions and their data will be lost on drive %s", $hd->{device})) or return; - partition_table_raw::zero_MBR($hd); - fsedit::auto_allocate($hds, $o->{partitions}); - 1; - } ]; - } - - if (!$readonly && ref($o) =~ /gtk/) { #- diskdrake only available in gtk for now - $solutions{diskdrake} = - [ 0, _("Use diskdrake"), sub { - my $ok = 1; - do { - diskdrake::main($hds, $o->{raid}, interactive_gtk->new, $o->{partitions}); - my @fstab = fsedit::get_fstab(@$hds); - - unless (fsedit::get_root(\@fstab)) { - $ok = 0; - $o->ask_okcancel('', _("You must have a root partition. -For this, create a partition (or click on an existing one). -Then choose action ``Mount point'' and set it to `/'"), 1) or return; - } - if (!grep { isSwap($_) } @fstab) { - $o->ask_warn('', _("You must have a swap partition")), $ok=0 if $::beginner; - $ok &&= $::expert || $o->ask_okcancel('', _("You don't have a swap partition\n\nContinue anyway?")); - } - } until $ok; - 1; - } ]; - } - - if (!$readonly) { #- diskdrake only available in gtk for now - $solutions{fdisk} = - [ -10, _("Use fdisk"), sub { - $o->suspend; - foreach (@$hds) { - print "\n" x 10, _("You can now partition %s. -When you are done, don't forget to save using `w'", partition_table_raw::description($_)); - print "\n\n"; - my $pid = fork or exec "fdisk", devices::make($_->{device}); - waitpid($pid, 0); - } - $o->resume; - 0; - } ]; - } - log::l("partitioning wizard log:\n", (map { ">>wizlog>>$_\n" } @wizlog)); - %solutions; -} - 1; |