blob: c0e29450a2bbd9a6cac5f40fef69b3d8f3097a39 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
package lvm; # $Id$
use diagnostics;
use strict;
#-######################################################################################
#- misc imports
#-######################################################################################
use common;
use modules;
use fsedit;
use devices;
use run_program;
#- for partition_table_xxx emulation
sub new {
my ($class, $name) = @_;
$name =~ s/\W/_/g;
$name = substr($name, 0, 63); # max length must be < NAME_LEN / 2 where NAME_LEN is 128
bless { disks => [], VG_name => $name }, $class;
}
sub hasExtended { 0 }
sub adjustStart {}
sub adjustEnd {}
sub write {}
sub cylinder_size {
my ($hd) = @_;
$hd->{extent_size};
}
init();
sub init() {
eval { modules::load('dm-mod') };
devices::make('urandom');
my $control = '/dev/mapper/control';
if (! -e $control) {
my ($major) = cat_('/proc/devices') =~ /(\d+) misc$/m or die "device-mapper error";
my ($minor) = cat_('/proc/misc') =~ /(\d+) device-mapper$/m or die "device-mapper error";
mkdir_p(dirname($control));
syscall_('mknod', $control, c::S_IFCHR() | 0600, makedev($major, $minor)) or die "mknod $control failed: $!";
}
run_program::run('lvm2', 'vgscan') if !-e '/etc/lvmtab';
run_program::run('lvm2', 'vgchange', '-a', 'y');
}
sub lvm_cmd {
if (my $r = run_program::run('lvm2', @_)) {
$r;
} else {
$? >> 8 == 98 or return;
#- sometimes, it needs running vgscan again, doing so:
run_program::run('lvm2', 'vgscan');
run_program::run('lvm2', @_);
}
}
sub lvm_cmd_or_die {
my ($prog, @para) = @_;
lvm_cmd($prog, @para) or die "$prog failed\n";
}
sub check {
my ($in) = @_;
$in->do_pkgs->ensure_is_installed('lvm2', '/sbin/lvm2') or return;
init();
1;
}
sub get_vg {
my ($part) = @_;
my $dev = expand_symlinks(devices::make($part->{device}));
run_program::get_stdout('lvm2', 'pvs', '--noheadings', '-o', 'vg_name', $dev) =~ /(\S+)/ && $1;
}
sub update_size {
my ($lvm) = @_;
$lvm->{extent_size} = to_int(run_program::get_stdout('lvm2', 'vgs', '--noheadings', '--nosuffix', '--units', 's', '-o', 'vg_extent_size', $lvm->{VG_name}));
$lvm->{totalsectors} = to_int(run_program::get_stdout('lvm2', 'vgs', '--noheadings', '--nosuffix', '--units', 's', '-o', 'vg_size', $lvm->{VG_name}));
}
sub get_lv_size {
my ($lvm_device) = @_;
to_int(run_program::get_stdout('lvm2', 'lvs', '--noheadings', '--nosuffix', '--units', 's', '-o', 'lv_size', "/dev/$lvm_device"));
}
sub get_lvs {
my ($lvm) = @_;
my @l = run_program::get_stdout('lvm2', 'lvs', '--noheadings', '--nosuffix', '--units', 's', '-o', 'lv_name', $lvm->{VG_name}) =~ /(\S+)/g;
$lvm->{primary}{normal} =
[
map {
my $device = "$lvm->{VG_name}/$_";
my $type = -e "/dev/$device" && fsedit::typeOfPart($device);
{ device => $device,
type => $type || 0x83,
size => get_lv_size($device) }
} @l
];
}
sub vg_add {
my ($part) = @_;
my $dev = expand_symlinks(devices::make($part->{device}));
lvm_cmd_or_die('pvcreate', '-y', '-ff', $dev);
my $prog = lvm_cmd('vgs', $part->{lvm}) ? 'vgextend' : 'vgcreate';
lvm_cmd_or_die($prog, $part->{lvm}, $dev);
}
sub vg_destroy {
my ($lvm) = @_;
is_empty_array_ref($lvm->{primary}{normal}) or die \N("Remove the logical volumes first\n");
lvm_cmd('vgchange', '-a', 'n', $lvm->{VG_name});
lvm_cmd_or_die('vgremove', $lvm->{VG_name});
foreach (@{$lvm->{disks}}) {
delete $_->{lvm};
$_->{isFormatted} = 0;
$_->{notFormatted} = 1;
}
}
sub lv_delete {
my ($lvm, $lv) = @_;
lvm_cmd_or_die('lvremove', '-f', "/dev/$lv->{device}");
my $list = $lvm->{primary}{normal};
@$list = grep { $_ != $lv } @$list;
}
sub lv_create {
my ($lvm, $lv) = @_;
my $list = $lvm->{primary}{normal} ||= [];
$lv->{lv_name} ||= 1 + max(map { if_($_->{device} =~ /(\d+)$/, $1) } @$list);
$lv->{device} = "$lvm->{VG_name}/$lv->{lv_name}";
lvm_cmd_or_die('lvcreate', '--size', int($lv->{size} / 2) . 'k', '-n', $lv->{lv_name}, $lvm->{VG_name});
$lv->{size} = get_lv_size($lv->{device}); #- the created size is smaller than asked size
$lv->{notFormatted} = 1;
$lv->{isFormatted} = 0;
push @$list, $lv;
}
sub lv_resize {
my ($lv, $oldsize) = @_;
lvm_cmd_or_die($oldsize > $lv->{size} ? ('lvreduce', '-f') : 'lvextend',
'--size', int($lv->{size} / 2) . 'k', "/dev/$lv->{device}");
$lv->{size} = get_lv_size($lv->{device}); #- the resized partition may not be the exact asked size
}
1;
|
f='#n918'>918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
package install_steps; # $Id$
use diagnostics;
use strict;
use vars qw(@filesToSaveForUpgrade);
#-######################################################################################
#- misc imports
#-######################################################################################
use common;
use install_any qw(:all);
use partition_table qw(:types);
use detect_devices;
use modules;
use run_program;
use lang;
use keyboard;
use fsedit;
use loopback;
use pkgs;
use any;
use log;
use fs;
@filesToSaveForUpgrade = qw(
/etc/ld.so.conf /etc/fstab /etc/hosts /etc/conf.modules /etc/modules.conf
);
#-######################################################################################
#- OO Stuff
#-######################################################################################
sub new($$) {
my ($type, $o) = @_;
bless $o, ref $type || $type;
return $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 "$o->{prefix}/root") {
eval { commands::cp('-f', "/tmp/ddebug.log", "$o->{prefix}/root") };
output(install_any::auto_inst_file(), install_any::g_auto_install());
}
for (my $s = $o->{steps}{first}; $s; $s = $o->{steps}{$s}{next}) {
#- 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() };
$o->ask_warn(_("Error"), [
_("An error occurred, but I don't know how to handle it nicely.
Continue at your own risk."), $@ ]) if $@;
}
}
sub errorInStep($$) { print "error :(\n"; c::_exit(1) }
sub kill_action {}
sub set_help { 1 }
#-######################################################################################
#- Steps Functions
#-######################################################################################
#------------------------------------------------------------------------------
sub selectLanguage {
my ($o) = @_;
lang::set($o->{lang});
$o->{langs} ||= { $o->{lang} => 1 };
log::l("selectLanguage: pack_langs ", lang::pack_langs($o->{langs}));
if ($o->{keyboard_unsafe} || !$o->{keyboard}) {
$o->{keyboard_unsafe} = 1;
$o->{keyboard} = keyboard::lang2keyboard($o->{lang});
selectKeyboard($o) if !$::live;
}
}
#------------------------------------------------------------------------------
sub selectKeyboard {
my ($o) = @_;
keyboard::setup($o->{keyboard});
#- if we go back to the selectKeyboard, you must rewrite
addToBeDone {
lang::write_langs($o->{prefix}, $o->{langs});
} 'formatPartitions' unless $::g_auto_install;
addToBeDone {
lang::write($o->{prefix}, $o->{lang});
keyboard::write($o->{prefix}, $o->{keyboard}, lang::lang2charset($o->{lang}));
} 'installPackages' unless $::g_auto_install;
}
#------------------------------------------------------------------------------
sub selectPath {}
#------------------------------------------------------------------------------
sub selectInstallClass {}
#------------------------------------------------------------------------------
sub setupSCSI {
my ($o) = @_;
modules::configure_pcmcia($o->{pcmcia}) if $o->{pcmcia};
modules::load_ide();
modules::load_thiskind('scsi|disk');
}
#------------------------------------------------------------------------------
sub doPartitionDisksBefore {
my ($o) = @_;
if (cat_("/proc/mounts") =~ m|/\w+/(\S+)\s+/tmp/hdimage\s+(\S+)| && !$o->{partitioning}{readonly}) {
$o->{stage1_hd} = { device => $1, type => $2 };
install_any::getFile("XXX"); #- close still opened filehandle
eval { fs::umount("/tmp/hdimage") };
}
eval {
close *pkgs::LOG;
eval { fs::umount("$o->{prefix}/proc") };
eval { fs::umount_all($o->{fstab}, $o->{prefix}) };
eval { sleep 1; fs::umount_all($o->{fstab}, $o->{prefix}) } if $@; #- HACK
} if $o->{fstab} && !$::testing && !$::live;
$o->{raid} ||= {};
}
#------------------------------------------------------------------------------
sub doPartitionDisksAfter {
my ($o) = @_;
unless ($::testing) {
partition_table::write($_) foreach @{$o->{hds}};
$_->{rebootNeeded} and $o->rebootNeeded foreach @{$o->{hds}};
}
$o->{fstab} = [ fsedit::get_fstab(@{$o->{hds}}, @{$o->{lvms}}, $o->{raid}) ];
fsedit::get_root_($o->{fstab}) or die "Oops, no root partition";
if (arch() =~ /ppc/ && detect_devices::get_mac_generation =~ /NewWorld/) {
die "Need bootstrap partition to boot system!" if !(defined $partition_table_mac::bootstrap_part);
}
if (arch() =~ /ia64/ && !fsedit::has_mntpoint("/boot/efi", $o->{hds})) {
die _("You must have a FAT partition mounted in /boot/efi");
}
if ($o->{partitioning}{use_existing_root}) {
#- ensure those partitions are mounted so that they are not proposed in choosePartitionsToFormat
fs::mount_part($_, $o->{prefix}) foreach grep { $_->{mntpoint} && !$_->{notFormatted} } @{$o->{fstab}};
}
if (my $s = delete $o->{stage1_hd}) {
my ($part) = grep { $_->{device} eq $s->{device} } @{$o->{fstab}};
$part->{isMounted} ?
do { rmdir "/tmp/hdimage" ; symlinkf("$o->{prefix}$part->{mntpoint}", "/tmp/hdimage") } :
eval {
fs::mount($s->{device}, "/tmp/hdimage", $s->{type});
$part->{isMounted} = 1;
};
}
cat_("/proc/mounts") =~ m|(\S+)\s+/tmp/image nfs| &&
!grep { $_->{mntpoint} eq "/mnt/nfs" } @{$o->{manualFstab} || []} and
push @{$o->{manualFstab}}, { type => "nfs", mntpoint => "/mnt/nfs", device => $1, options => "noauto,ro,nosuid,rsize=8192,wsize=8192" };
}
#------------------------------------------------------------------------------
sub doPartitionDisks {
my ($o) = @_;
install_any::getHds($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 = fsedit::get_root_($o->{fstab}) || first(install_any::find_root_parts($o->{fstab}, $o->{prefix})) or die;
install_any::use_root_part($o->{fstab}, $p, $o->{prefix});
}
if ($o->{partitioning}{auto_allocate}) {
fsedit::auto_allocate($o->{hds}, $o->{partitions});
}
}
#------------------------------------------------------------------------------
sub ask_mntpoint_s {
my ($o, $fstab) = @_;
#- TODO: set the mntpoints
my %m; foreach (@$fstab) {
my $m = $_->{mntpoint};
next unless $m && $m ne 'swap'; #- there may be a lot of swap.
$m{$m} and die _("Duplicate mount point %s", $m);
$m{$m} = 1;
#- in case the type does not correspond, force it to ext2
$_->{type} = 0x83 if $m =~ m|^/| && !isFat($_) && !isTrueFS($_);
}
1;
}
sub rebootNeeded($) {
my ($o) = @_;
log::l("Rebooting...");
c::_exit(0);
}
sub choosePartitionsToFormat($$) {
my ($o, $fstab) = @_;
foreach (@$fstab) {
$_->{mntpoint} = "swap" if isSwap($_);
$_->{mntpoint} or next;
add2hash_($_, { toFormat => $_->{notFormatted} });
if (!$_->{toFormat}) {
my $t = isLoopback($_) ?
eval { fsedit::typeOfPart($o->{prefix} . loopback::file($_)) } :
fsedit::typeOfPart($_->{device});
$_->{toFormatUnsure} = $_->{mntpoint} eq "/" ||
#- if detected dos/win, it's not precise enough to just compare the types (too many of them)
(!$t || isOtherAvailableFS({ type => $t }) ? !isOtherAvailableFS($_) : $t != $_->{type});
}
}
}
sub formatMountPartitions {
my ($o) = @_;
fs::formatMount_all($o->{raid}, $o->{fstab}, $o->{prefix});
}
#------------------------------------------------------------------------------
sub setPackages {
my ($o) = @_;
install_any::setPackages($o);
pkgs::selectPackagesAlreadyInstalled($o->{packages}, $o->{prefix})
if !$o->{isUpgrade} && (-r "$o->{prefix}/var/lib/rpm/packages.rpm" || -r "$o->{prefix}/var/lib/rpm/Packages");
}
sub selectPackagesToUpgrade {
my ($o) = @_;
pkgs::selectPackagesToUpgrade($o->{packages}, $o->{prefix}, $o->{base}, $o->{toRemove}, $o->{toSave});
}
sub choosePackages {
my ($o, $packages, $compssUsers, $first_time) = @_;
#- 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 = pkgs::invCorrectSize($available / sqr(1024)) * sqr(1024);
log::l(sprintf "available size %s (corrected %s)", formatXiB($available), formatXiB($availableCorrected));
#- avoid destroying user selection of packages but only
#- for expert, as they may have done individual selection before.
if ($first_time || !$::expert) {
install_any::unselectMostPackages($o);
unless ($::expert) {
add2hash_($o, { compssListLevel => 5 }) unless $::auto_install;
exists $o->{compssListLevel}
and pkgs::setSelectedFromCompssList($packages, $o->{compssUsersChoice}, $o->{compssListLevel}, $availableCorrected);
}
}
$availableCorrected;
}
sub beforeInstallPackages {
my ($o) = @_;
#- save these files in case of upgrade failure.
if ($o->{isUpgrade}) {
foreach (@filesToSaveForUpgrade) {
unlink "$o->{prefix}/$_.mdkgisave";
if (-e "$o->{prefix}/$_") {
eval { commands::cp("$o->{prefix}/$_", "$o->{prefix}/$_.mdkgisave") };
}
}
}
#- some packages need such files for proper installation.
install_any::write_fstab($o);
require network;
network::add2hosts("$o->{prefix}/etc/hosts", "localhost.localdomain", "127.0.0.1");
require pkgs;
pkgs::init_db($o->{prefix});
}
sub pkg_install {
my ($o, @l) = @_;
log::l("selecting packages");
require pkgs;
if ($::testing) {
log::l("selecting package \"$_\"") foreach @l;
} else {
pkgs::selectPackage($o->{packages}, pkgs::packageByName($o->{packages}, $_) || die "$_ rpm not found") foreach @l;
}
my @toInstall = pkgs::packagesToInstall($o->{packages});
if (@toInstall) {
log::l("installing packages");
$o->installPackages;
} else {
log::l("all packages selected are already installed, nothing to do")
}
}
sub pkg_install_if_requires_satisfied {
my ($o, @l) = @_;
require pkgs;
foreach (@l) {
my %newSelection;
my $pkg = pkgs::packageByName($o->{packages}, $_) || die "$_ rpm not found";
pkgs::selectPackage($o->{packages}, $pkg, 0, \%newSelection);
if (scalar(keys %newSelection) == 1) {
pkgs::selectPackage($o->{packages}, $pkg);
} else {
log::l("pkg_install_if_requires_satisfied: not selecting $_ because of ", join(", ", keys %newSelection));
}
}
$o->installPackages;
}
sub installPackages($$) { #- complete REWORK, TODO and TOCHECK!
my ($o) = @_;
my $packages = $o->{packages};
if (@{$o->{toRemove} || []}) {
#- hack to ensure proper upgrade of packages from other distribution,
#- as release number are not mandrake based. this causes save of
#- important files and restore them after.
foreach (@{$o->{toSave} || []}) {
if (-e "$o->{prefix}/$_") {
eval { commands::cp("-f", "$o->{prefix}/$_", "$o->{prefix}/$_.mdkgisave") };
}
}
pkgs::remove($o->{prefix}, $o->{toRemove});
foreach (@{$o->{toSave} || []}) {
if (-e "$o->{prefix}/$_.mdkgisave") {
renamef("$o->{prefix}/$_.mdkgisave", "$o->{prefix}/$_");
}
}
$o->{toSave} = [];
#- hack for compat-glibc to upgrade properly :-(
if (pkgs::packageFlagSelected(pkgs::packageByName($packages, 'compat-glibc')) &&
!pkgs::packageFlagInstalled(pkgs::packageByName($packages, 'compat-glibc'))) {
rename "$o->{prefix}/usr/i386-glibc20-linux", "$o->{prefix}/usr/i386-glibc20-linux.mdkgisave";
}
}
#- small transaction will be built based on this selection and depslist.
my @toInstall = pkgs::packagesToInstall($packages);
my $time = time;
$ENV{DURING_INSTALL} = 1;
pkgs::install($o->{prefix}, $o->{isUpgrade}, \@toInstall, $packages->{depslist}, $packages->{mediums});
delete $ENV{DURING_INSTALL};
run_program::rooted_or_die($o->{prefix}, 'ldconfig') unless $::g_auto_install;
log::l("Install took: ", formatTimeRaw(time - $time));
install_any::log_sizes($o);
scalar(@toInstall); #- return number of packages installed.
}
sub afterInstallPackages($) {
my ($o) = @_;
return if $::g_auto_install;
die _("Some important packages didn't get installed properly.
Either your cdrom drive or your cdrom is defective.
Check the cdrom on an installed computer using \"rpm -qpl Mandrake/RPMS/*.rpm\"
") if grep { m|read failed: Input/output error| } cat_("$o->{prefix}/root/install.log");
if (arch() !~ /^sparc/) { #- TODO restore it as may be needed for sparc
-x "$o->{prefix}/usr/bin/dumpkeys" or $::testing or die
"Some important packages didn't 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";
}
pkgs::done_db();
#- why not? cuz weather is nice today :-) [pixel]
common::sync(); common::sync();
#- generate /etc/lvmtab needed for rc.sysinit
run_program::rooted($o->{prefix}, 'vgscan') if -e '/etc/lvmtab';
#- configure PCMCIA services if needed.
modules::write_pcmcia($o->{prefix}, $o->{pcmcia});
#- for mandrake_firstime
touch "$o->{prefix}/var/lock/TMP_1ST";
any::writeandclean_ldsoconf($o->{prefix});
#- 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($o->{prefix}, "chkconfig", "--add", $_) foreach
qw(random netfs network rawdevices sound kheader usb keytable syslog crond portmap);
#- call update-menus at the end of package installation
run_program::rooted($o->{prefix}, "update-menus");
if ($o->{pcmcia}) {
substInFile { s/.*(TaskBarShowAPMStatus).*/$1=1/ } "$o->{prefix}/usr/lib/X11/icewm/preferences";
eval { commands::cp("$o->{prefix}/usr/share/applnk/System/kapm.kdelnk",
"$o->{prefix}/etc/skel/Desktop/Autostart/kapm.kdelnk") };
}
my $msec = "$o->{prefix}/etc/security/msec";
substInFile { s/^usb\n//; $_ .= "usb\n" if eof } "$msec/group.conf" if -d $msec;
substInFile { s/^xgrp\n//; $_ .= "xgrp\n" if eof } "$msec/group.conf" if -d $msec;
substInFile { s/^audio\n//; $_ .= "audio\n" if eof } "$msec/group.conf" if -d $msec;
substInFile { s/^cdrom\n//; $_ .= "cdrom\n" if eof } "$msec/group.conf" if -d $msec;
substInFile { s/^cdwriter\n//; $_ .= "cdwriter\n" if eof } "$msec/group.conf" if -d $msec;
my $pkg = pkgs::packageByName($o->{packages}, 'urpmi');
if ($pkg && pkgs::packageSelectedOrInstalled($pkg)) {
install_any::install_urpmi($o->{prefix},
$::oem ? 'cdrom' : $o->{method}, #- HACK
$o->{packages}{mediums});
pkgs::saveCompssUsers($o->{prefix}, $o->{packages}, $o->{compssUsers}, $o->{compssUsersSorted});
}
# #- update language and icons for KDE.
# update_userkderc($_, 'Locale', Language => "") foreach list_skels($o->{prefix}, '.kderc');
# log::l("updating kde icons according to available devices");
# install_any::kdeicons_postinstall($o->{prefix});
my $welcome = any::to_utf8(_("Welcome to %s", "HOSTNAME"));
substInFile { s/^(GreetString)=.*/$1=$welcome/ } "$o->{prefix}/usr/share/config/kdmrc";
install_any::disable_user_view($o->{prefix}) if $o->{security} >= 3 || $o->{authentication}{NIS};
run_program::rooted($o->{prefix}, "kdeDesktopCleanup");
#- konsole and gnome-terminal are lamers in exotic languages, link them to something better
if ($o->{lang} =~ /ja|ko|zh/) {
foreach ("konsole", "gnome-terminal") {
my $f = "$o->{prefix}/usr/bin/$_";
symlinkf("X11/rxvt.sh", $f) if -e $f;
}
}
foreach (list_skels($o->{prefix}, '.kde/share/config/kfmrc')) {
my $found;
substInFile {
$found ||= /KFM Misc Defaults/;
$_ .=
"[KFM Misc Defaults]
GridWidth=85
GridHeight=70
" if eof && !$found;
} $_
}
#- move some file after an upgrade that may be seriously annoying.
#- and rename saved files to .mdkgiorig.
if ($o->{isUpgrade}) {
my $pkg = pkgs::packageByName($o->{packages}, 'rpm');
$pkg && pkgs::packageSelectedOrInstalled($pkg) && pkgs::versionCompare(pkgs::packageVersion($pkg), '4.0') >= 0 and
pkgs::clean_old_rpm_db($o->{prefix});
log::l("moving previous desktop files that have been updated to Trash of each user");
install_any::kdemove_desktop_file($o->{prefix});
foreach (@filesToSaveForUpgrade) {
renamef("$o->{prefix}/$_.mdkgisave", "$o->{prefix}/$_.mdkgiorig")
if -e "$o->{prefix}$_.mdkgisave";
}
}
if ($o->{blank} || $o->{updatemodules}) {
my @l = detect_devices::floppies();
foreach (qw(blank updatemodules)) {
$o->{$_} eq "1" and $o->{$_} = $l[0] || die _("No floppy drive available");
}
$o->{blank} and $o->copyKernelFromFloppy();
$o->{updatemodules} and $o->updateModulesFromFloppy();
}
}
sub copyKernelFromFloppy {
my ($o) = @_;
return if $::testing || !$o->{blank};
fs::mount($o->{blank}, "/floppy", "vfat", 0);
eval { commands::cp("-f", "/floppy/vmlinuz", "$o->{prefix}/boot/vmlinuz-default") };
if ($@) {
log::l("copying of /floppy/vmlinuz from blank modified disk failed: $@");
}
fs::umount("/floppy");
}
sub updateModulesFromFloppy {
my ($o) = @_;
return if $::testing || !$o->{updatemodules};
fs::mount($o->{updatemodules}, "/floppy", "ext2", 0);
foreach (glob_("$o->{prefix}/lib/modules/*")) {
my ($kernelVersion) = m,lib/modules/(\S*),;
log::l("examining updated modules for kernel $kernelVersion");
if (-d "/floppy/$kernelVersion") {
my @src_files = glob_("/floppy/$kernelVersion/*");
my @dest_files = split "\n", `chroot $o->{prefix} find /lib/modules`;
foreach my $s (@src_files) {
log::l("found updatable module $s");
my ($sfile, $sext) = $s =~ /([^\/\.]*\.o)(?:\.gz|\.bz2)?$/;
my $qsfile = quotemeta $sfile;
my $qsext = quotemeta $sext;
foreach my $target (@dest_files) {
$target =~ /$qsfile/ or next;
eval { commands::cp("-f", $s, $target) };
if ($@) {
log::l("updating module $target by $s failed: $@");
} else {
log::l("updating module $target by $s");
}
if ($target !~ /$qsfile$qsext$/) {
#- extension differ, first rename target file correctly,
#- then uncompress source file, then compress it as expected.
my ($basetarget, $text) = $target =~ /(.*?)(\.gz|\.bz2)$/;
rename $target, "$basetarget$sext";
$sext eq '.gz' and run_program::run("gzip", "-d", "$basetarget$sext");
$sext eq '.bz2' and run_program::run("bzip2", "-d", "$basetarget$sext");
$text eq '.gz' and run_program::run("gzip", $basetarget);
$text eq '.bz2' and run_program::run("bzip2", $basetarget);
}
}
}
}
}
fs::umount("/floppy");
}
#------------------------------------------------------------------------------
sub selectMouse($) {
my ($o) = @_;
}
#------------------------------------------------------------------------------
sub configureNetwork {
my ($o) = @_;
require network;
network::configureNetwork2($o, $o->{prefix}, $o->{netc}, $o->{intf}, sub { $o->pkg_install(@_) });
}
#------------------------------------------------------------------------------
sub installCrypto {
my ($o) = @_;
my $u = $o->{crypto} or return; $u->{mirror} && $u->{packages} or return;
upNetwork($o);
require crypto;
my @crypto_packages = crypto::getPackages($o->{prefix}, $o->{packages}, $u->{mirror});
$o->pkg_install(@{$u->{packages}});
}
sub summary {
my ($o) = @_;
configureTimezone($o);
configurePrinter($o);
}
#------------------------------------------------------------------------------
sub configureTimezone {
my ($o) = @_;
install_any::preConfigureTimezone($o);
$o->pkg_install('ntp') if $o->{timezone}{ntp};
require timezone;
timezone::write($o->{prefix}, $o->{timezone});
}
#------------------------------------------------------------------------------
sub configureServices {
my ($o) = @_;
if ($o->{services}) {
require services;
services::doit($o, $o->{services}, $o->{prefix});
}
}
#------------------------------------------------------------------------------
sub configurePrinter {
my($o) = @_;
my ($use_cups, $use_lpr) = (0, 0);
foreach (values %{$o->{printer}{configured} || {}}) {
for ($_->{mode}) {
/CUPS/ and $use_cups++;
/lpr/ and $use_lpr++;
}
}
#- if at least one queue is configured, configure it.
if ($use_cups || $use_lpr) {
$o->pkg_install(if_($use_cups, 'cups-drivers'), if_($use_lpr, 'rhs-printfilters'));
require printer;
eval { add2hash($o->{printer}, printer::getinfo($o->{prefix})) }; #- get existing configuration.
$use_cups and printer::poll_ppd_base();
$use_lpr and printer::read_printer_db();
foreach (values %{$o->{printer}{configured} || {}}) {
log::l("configuring printer queue $_->{QUEUE} for $_->{mode}");
printer::copy_printer_params($_, $o->{printer});
#- setup all configured queues, which is not the case interactively where
#- only the working queue is setup on configuration.
printer::configure_queue($o->{printer});
}
}
}