summaryrefslogtreecommitdiffstats
path: root/move/move.pm
diff options
context:
space:
mode:
authorMystery Man <unknown@mandriva.org>2005-08-20 21:09:11 +0000
committerMystery Man <unknown@mandriva.org>2005-08-20 21:09:11 +0000
commit132ca0305e567b13a0bdf65455e7f04d3d8c33a8 (patch)
treeb6d9f55e281d5d8f037ca88ef643ed483587fb2e /move/move.pm
parentb569006d83d0e3c836e9f5eacae81b485015b6c3 (diff)
downloaddrakx-132ca0305e567b13a0bdf65455e7f04d3d8c33a8.tar
drakx-132ca0305e567b13a0bdf65455e7f04d3d8c33a8.tar.gz
drakx-132ca0305e567b13a0bdf65455e7f04d3d8c33a8.tar.bz2
drakx-132ca0305e567b13a0bdf65455e7f04d3d8c33a8.tar.xz
drakx-132ca0305e567b13a0bdf65455e7f04d3d8c33a8.zip
This commit was manufactured by cvs2svn to create tagV10_3_0_47mdk
'V10_3_0_47mdk'.
Diffstat (limited to 'move/move.pm')
-rw-r--r--move/move.pm809
1 files changed, 0 insertions, 809 deletions
diff --git a/move/move.pm b/move/move.pm
deleted file mode 100644
index 1ca46710f..000000000
--- a/move/move.pm
+++ /dev/null
@@ -1,809 +0,0 @@
-package move; # $Id$ $
-
-#- Copyright (c) 2003-2004 Mandriva
-#-
-#- This program is free software; you can redistribute it and/or modify
-#- it under the terms of the GNU General Public License as published by
-#- the Free Software Foundation; either version 2, or (at your option)
-#- any later version.
-#-
-#- This program is distributed in the hope that it will be useful,
-#- but WITHOUT ANY WARRANTY; without even the implied warranty of
-#- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-#- GNU General Public License for more details.
-#-
-#- You should have received a copy of the GNU General Public License
-#- along with this program; if not, write to the Free Software
-#- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-use diagnostics;
-use strict;
-
-use modules;
-use common;
-use fs;
-use fsedit;
-use run_program;
-use partition_table qw(:types);
-use swap;
-use log;
-use lang;
-use Digest::MD5 qw(md5_hex);
-
-my $key_disabled;
-
-my ($using_existing_user_config, $using_existing_host_config);
-my $key_sysconf = '/home/.sysconf';
-my $key_part;
-my $virtual_key_part;
-my $key_mountopts = 'umask=077,uid=501,gid=501,shortname=mixed,nobadchars';
-
-sub symlinkf_short {
- my ($dest, $file) = @_;
- if (my $l = readlink $dest) {
- $dest = $l if $l =~ m!^/!;
- }
- -d $file and log::l("$file already exists and is a directory! writing in directory may be needed, not overwriting"), return;
- symlinkf($dest, $file);
-}
-
-sub handle_etcfiles {
- my (@allowed_modes) = @_;
- #- non-trivial files listed from tools/scan-etc.pl
- my ($mode, $allowed);
- foreach (chomp_(cat_('/image/move/etcfiles'))) {
- if (m|^# (\S+)|) {
- $mode = $1;
- $allowed = member($mode, @allowed_modes);
- } elsif (m|^/| && $allowed) {
- if ($mode eq 'READ') {
- mkdir_p(dirname($_));
- symlinkf_short("/image$_", $_) if !-e $_;
- } elsif ($mode eq 'OVERWRITE') {
- mkdir_p(dirname($_));
- cp_f("/image$_", $_); #- need copy contents
- } elsif ($mode eq 'DIR') {
- mkdir_p $_;
- }
- }
- }
-
-}
-
-sub handle_virtual_key() {
- return if $key_disabled;
- if (my ($device, $file, $options) = cat_('/proc/cmdline') =~ /\bvirtual_key=([^,\s]+),([^,\s]+)(,\S+)?/) {
- log::l("using device=$device file=$file as a virtual key with options $options");
- my $dir = '/virtual_key_mount';
- mkdir $dir;
- run_program::run('mount', $device, $dir);
- if ($options =~ /format/) {
- if (! -e "$dir$file") {
- require commands;
- commands::dd("if=/dev/zero", "of=$dir$file", "bs=1M", "count=40");
- }
- run_program::run('mkdosfs', "$dir$file");
- }
- require devices;
- my $loop = devices::find_free_loop();
- run_program::run('losetup', $loop, "$dir$file");
- run_program::run('mount', $loop, '/home', '-o', $key_mountopts);
- $virtual_key_part = { device => $loop, mntpoint => '/home', type => 0xc, isMounted => 1 };
- }
-}
-
-sub setup_userconf {
- my ($o) = @_;
- if (is_empty_array_ref($o->{users}) && `getent passwd 501` =~ /([^:]+):/) {
- log::l("passwd/501 is $1");
- $o->{users} = [ { name => $1 } ];
- $ENV{HOME} = "/home/$1"; #- used by lang::read() :-/
- print "using existing user configuration\n";
- $using_existing_user_config = 1;
- }
-}
-
-sub lang2move_clp_name {
- my ($lang) = @_;
- my $dir = '/usr/share/locale/' . lang::l2locale($lang);
- my $link = readlink($dir) or return -d $dir ? '' : 'ERROR';
- my ($name) = $link =~ m!image_(i18n_.*?)/! or log::l("ERROR: bad link $link for $dir"), return 'ERROR';
- $name;
-}
-
-#- run very soon at stage2 start, setup things on tmpfs rw / that
-#- were not necessary to start stage2 itself (there were setup
-#- by stage1 of course)
-sub init {
- my ($o) = @_;
-
- $::testing and goto drakx_stuff;
-
- #- rw things
- mkdir "/$_" foreach qw(home mnt root root/tmp etc var);
-
- mkdir "/etc/$_" foreach qw(X11);
- touch '/etc/modules.conf';
- touch '/etc/modprobe.conf';
- cp_f('/proc/mounts', '/etc/mtab');
-
- #- these files need be writable but we need a sensible first contents
- cp_f("/image/etc/$_", '/etc') foreach qw(passwd passwd- group sudoers fstab);
-
- #- these files are typically opened in read-write mode, we need them copied
- mkdir_p("/etc/$_"), cp_f(glob_("/image/etc/$_/*"), "/etc/$_")
- foreach qw(cups profile.d sysconfig devfs/conf.d);
-
- #- TODO: cp_af is broken for symlinks to directories
- #- replace below with cp_af is fixed in perl-MDK-Common
- run_program::run('cp', '-a', glob("/image/etc/rc[0-6].d"), '/etc');
-
- #- directories we badly need as non-links because files will be written in
- handle_etcfiles('DIR');
-
- #- for /etc/sysconfig/networking/ifcfg-lo
- mkdir "/etc/sysconfig/networking";
-
- #- ro things
- symlinkf_short("/image/etc/$_", "/etc/$_")
- foreach qw(alternatives man.config services shells pam.d inputrc ld.so.conf
- DIR_COLORS bashrc profile init.d devfsd.conf gtk-2.0 pango fonts modules.devfs
- dynamic hotplug gnome-vfs-2.0 gnome-vfs-mime-magic gtk gconf menu menu-methods nsswitch.conf default login.defs
- skel ld.so.cache openoffice xinetd.d xinetd.conf syslog.conf sysctl.conf sysconfig/networking/ifcfg-lo
- ifplugd);
- symlinkf_short("/image/etc/X11/$_", "/etc/X11/$_")
- foreach qw(encodings.dir app-defaults applnk fs lbxproxy proxymngr rstart wmsession.d xinit xkb xserver xsm);
- symlinkf_short("/image/root/$_", "/root/$_") foreach qw(.bashrc);
-
- mkdir_p(dirname("/var/$_")), symlinkf_short("/image/var/$_", "/var/$_") foreach qw(lib/samba lib/rpm cache/gstreamer-0.6);
-
- #- non-trivial files/directories that need be readable, files that will be overwritten
- handle_etcfiles('READ', 'OVERWRITE');
-
- run_program::run('chown', 'clamav.clamav', '/var/log/clamav/freshclam.log');
-
- #- create remaining /etc and /var subdirectories if not already copied or symlinked,
- #- because programs most often will not try to create the missing subdir before trying
- #- to write a file, leading to obscure unexpected failures
- foreach (cat_('/image/move/directories-to-create')) {
- my ($mode, $uid, $gid, $name) = split;
- next if -d $name;
- mkdir($name);
- chmod(oct($mode), $name);
- chown($uid, $gid, $name);
- }
-
- chmod 01777, '/tmp', '/var/tmp'; #- /var/tmp -> badly needed for printing from OOo
-
- #- remaining non existent /etc files are symlinked from the RO volume,
- #- better to have them RO than non existent.
- #- PB: problems arise when programs try to open then in O_WRONLY
- #- or O_RDWR -> in that case, they should be handled in the
- #- OVERWRITE section of data/etcfiles)
- foreach (chomp_(cat_('/image/move/all-etcfiles'))) {
- -f $_ or symlinkf_short("/image$_", $_);
- }
-
- #- free up stage1 memory
- eval { fs::umount($_) } foreach qw(/stage1/proc/bus/usb /stage1/proc /stage1);
-
- #- devfsd needed for devices accessed by old names
- fs::mount("none", "/dev", "devfs", 0);
- fs::mount("none", "/dev/pts", "devpts", 0);
- run_program::run('/sbin/devfsd', '/dev');
-
- -d '/lib/modules/' . c::kernel_version() or warn("ERROR: kernel package " . c::kernel_version() . " not installed\n"), c::_exit(1);
-
- $key_disabled = !-e '/cdrom/live_tree_nvidia.clp' && cat_('/proc/mounts') !~ /nfs/;
-
- run_program::run('/sbin/service', 'syslog', 'start');
- run_program::run('sysctl', '-w', 'kernel.hotplug=/bin/true');
- modules::load_category('bus/usb');
- eval { modules::load('usb-storage', 'sd_mod') };
- handle_virtual_key();
- $o->{pcmcia} ||= !$::noauto && c::pcmcia_probe();
- cat_('/proc/cmdline') =~ /\bwaitkey\b/ and sleep 15;
- install_steps::setupSCSI($o);
- run_program::run('sysctl', '-w', 'kernel.hotplug=/sbin/hotplug');
-
- if (cat_('/proc/cmdline') =~ /\bformatkey\b/) {
- #- waiting until X is launched
- } else {
- key_mount($o);
- }
- if (cat_('/proc/cmdline') =~ /\bcleankey\b/) {
- eval { rm_rf $key_sysconf, glob_('/home/.mdkmove*') };
- }
- key_installfiles('simple');
- setup_userconf($o);
- if (-f '/etc/X11/X') {
- print "using existing host configuration\n";
- $using_existing_host_config = 1;
-
- #- so that /etc/devfsd/conf.d/mouse.conf is used and /dev/mouse created
- run_program::run('/sbin/service', 'devfsd', 'reload');
- }
- if (-s '/etc/sysconfig/i18n') {
- lang::set($o->{locale} = lang::read('', 0)); #- read ~/.i18n first if it exists
- }
-
- touch '/var/run/rebootctl';
-
-drakx_stuff:
- $o->{steps}{$_} = { reachable => 1, text => $_ }
- foreach qw(initGraphical autoSelectLanguage verifyKey configMove startMove);
- $o->{orderedSteps_orig} = $o->{orderedSteps};
- $o->{orderedSteps} = [ $using_existing_host_config ?
- qw(initGraphical verifyKey startMove)
- : $using_existing_user_config ?
- qw(initGraphical autoSelectLanguage verifyKey selectMouse selectKeyboard configMove startMove)
- : qw(initGraphical selectLanguage acceptLicense verifyKey selectMouse selectKeyboard configMove startMove) ];
- $o->{steps}{first} = $o->{orderedSteps}[0];
-
- #- do not use shadow passwords since pwconv overwrites /etc/shadow hence contents will be lost for usb key
- delete $o->{authentication}{shadow};
-
- foreach my $lang (keys %lang::langs) {
- my $clp_name = lang2move_clp_name($lang) or next;
- if (! -e "/cdrom/live_tree_$clp_name.clp") {
- log::l("disabling lang $lang");
- delete $lang::langs{$lang};
- }
- }
-}
-
-sub lomount_clp {
- my ($name, $needed_file) = @_;
- my ($clp, $dir) = ("/cdrom/live_tree_$name.clp", "/image_$name");
-
- -e "$dir$needed_file" and return;
-
- if (! -e $clp || cat_('/proc/cmdline') =~ /\blive\b/) {
- symlink "/cdrom/live_tree_$name", $dir;
- return;
- }
-
- log::l("lomount_clp: lomounting $name");
-
- mkdir_p($dir);
- my $dev = devices::find_free_loop();
- run_program::run('losetup', '-r', '-e', 'gz', $dev, $clp);
- run_program::run('mount', '-r', $dev, $dir);
-}
-
-sub install2::autoSelectLanguage {
- my $o = $::o;
-
- install_steps::selectLanguage($o);
-}
-
-sub handleI18NClp {
- my ($lang) = @_;
-
- my $clp_name = lang2move_clp_name($lang) or return;
- log::l("move: handleI18NClp (lang=$lang, clp_name=$clp_name)");
- lomount_clp($clp_name, '/usr');
- lomount_clp("always_$clp_name", '/usr');
-}
-
-sub clean_partition_table_and_format_key {
- my ($in) = @_;
- my @keys = grep { detect_devices::isKeyUsb($_) } detect_devices::getSCSI() or return;
- my $key = $in->ask_from_listf('', N("Which USB key do you want to format?"),
- sub { "$_->{usb_description} ($_->{device})" },
- \@keys);
-
- $in->ask_warn('', N("You are about to format a USB device \"%s\". This will delete all data on it.
-Make sure that the selected device is the USB key you want to format.
-We advise you to unplug all other USB storage devices while doing this operation.", $key->{usb_description}));
-
- $key->{prefix} ||= $key->{device};
- add2hash_($key, partition_table::raw::get_geometry($key->{file} = devices::make($key->{device})));
- partition_table::raw::zero_MBR($key);
- my ($part) = partition_table::get_normal_parts_and_holes($key);
- $part->{type} = 0xb;
- partition_table::add($key, $part);
- partition_table::write($key);
- fs::real_format_part($part);
-}
-
-sub key_parts {
- my ($o) = @_;
-
- return () if $key_disabled;
-
- my @keys = grep { detect_devices::isKeyUsb($_) } @{$o->{all_hds}{hds}};
- my @parts = (fsedit::get_fstab(@keys), grep { detect_devices::isKeyUsb($_) } @{$o->{all_hds}{raw_hds}});
- grep { isFat({ type => fsedit::typeOfPart($_->{device}) }) } @parts;
-}
-
-sub key_mount {
- my ($o, $o_reread) = @_;
-
- if ($o_reread) {
- $o->{all_hds} = fsedit::empty_all_hds();
- install_any::getHds($o, $o);
- }
- if ($virtual_key_part) {
- #- :/ merge_from_mtab did not got my virtual key, need to add it manually
- push @{$o->{fstab}}, $virtual_key_part;
- $key_part = $virtual_key_part;
- return;
- }
-
- foreach (key_parts($o)) {
- if ($key_part) {
- log::l("trying another usb key partition than $key_part->{device}");
- fs::umount_part($key_part);
- delete $key_part->{mntpoint};
- undef $key_part;
- }
- $_->{mntpoint} = '/home';
- $_->{options} = "$key_mountopts,sync";
- my $ok = eval { fs::mount_part($_); 1 };
- if ($ok) {
- my ($kb_size) = MDK::Common::System::df('/home');
- log::l("$_->{device} is $kb_size KB");
- $ok = $kb_size > 10 * 1024; #- at least 10 MB
- fs::umount_part($_) if !$ok;
- }
- if ($ok) {
- $key_part = $_;
- last if -e $key_sysconf;
- } else {
- delete $_->{mntpoint};
- }
- }
-
-
-}
-
-sub machine_ident() {
- #- , c::get_hw_address('eth0'); before detect of network :(
- md5_hex(join '', (map { (split)[1] } cat_('/proc/bus/pci/devices')));
-}
-
-sub key_installfiles {
- my ($mode) = @_;
-
- my $done if 0;
- $done and return;
-
- mkdir $key_sysconf;
- my $sysconf = "$key_sysconf/" . machine_ident();
-
- my $copy_userinfo = sub {
- my (@files) = @_;
- my @etcpasswords = glob("$key_sysconf/*/etc/passwd");
- if (@etcpasswords > 1) {
- print "inconsistency: more than one /etc/passwd on key! can not proceed, please clean the key\n";
- exit 1;
- }
- return if !@etcpasswords;
- my ($path) = $etcpasswords[0] =~ m|(.*)/etc/passwd|;
- run_program::run('cp', '-f', "$path$_", $_) foreach @files;
- run_program::run('rm', '-f', $etcpasswords[0]);
- };
-
- if (!-d $sysconf) {
- if ($mode eq 'full') {
- log::l("key_installfiles: installing config files in $sysconf");
- mkdir $sysconf;
- foreach (chomp_(cat_('/image/move/keyfiles'))) {
- mkdir_p($sysconf . dirname($_));
- my @l = /\*$/ ? glob_($_) : $_;
- foreach (@l) {
- eval { cp_f($_, "$sysconf$_") };
- symlinkf("$sysconf$_", $_);
- }
- }
- eval { cp_f('/image/move/README.adding.more.files', $key_sysconf) };
- $done = 1;
- } else {
- #- not in full mode and no host directory, grab user config from first existing host directory if possible
- log::l("key_installfiles: only looking for user config files");
- $copy_userinfo->(qw(/etc/passwd /etc/group /etc/sysconfig/i18n));
- }
- } else {
- log::l("key_installfiles: installing symlinks to key");
- if (!-e "$sysconf/etc/passwd") {
- log::l("key_installfiles: /etc/passwd not here, trying to copy from previous host boot");
- $copy_userinfo->(qw(/etc/passwd /etc/group));
- }
- foreach (chomp_(`find $sysconf -type f`)) {
- my ($path) = /^\Q$sysconf\E(.*)/;
- mkdir_p(dirname($path));
- symlinkf($_, $path);
- }
- $done = 1;
- $::o->{steps}{configMove}{done} = 1;
- }
-
- #- /etc/sudoers can not be a link
- unlink($_), cp_f("/image$_", $_) foreach qw(/etc/sudoers);
-}
-
-sub reboot() {
- output('/var/run/rebootctl', "reboot"); #- tell X_move to not respawn
- run_program::run('killall', 'X'); #- kill it ourselves to be sure that it will not lock console when killed by our init
- exit 0;
-}
-
-
-sub check_key {
- my ($o) = @_;
-
- if ($key_part) {
- my $tmp = '/home/.touched';
- #- can we write?
- if (eval { output($tmp, 'foo'); cat_($tmp) eq 'foo' && unlink $tmp }) {
- return 1;
- }
-
- #- argh, key is read-only
- #- try umounting
- if (eval { fs::umount_part($key_part); undef $key_part; 1 }) {
- modules::unload('usb-storage'); #- it will not notice change on write protection otherwise :/
-
- $o->ask_okcancel_({ title => N("Key is not writable"),
- messages => formatAlaTeX(
-N("The USB key seems to have write protection enabled. Please
-unplug it, remove write protection, and then plug it again.")),
- ok => N("Retry"),
- cancel => N("Continue without USB key") }) or return;
-
- modules::load('usb-storage');
- sleep 2;
- } else {
- #- this case happens when the user boots with a write-protected key containing
- #- all user and host data, /etc/X11/X which is on key busyfies it
- $o->ask_okcancel_({ title => N("Key is not writable"),
- messages => formatAlaTeX(
-N("The USB key seems to have write protection enabled, but we can not safely
-unplug it now.
-
-
-Click the button to reboot the machine, unplug it, remove write protection,
-plug the key again, and launch Mandriva Move again.")),
- ok => N("Reboot") });
- reboot();
- }
- } else {
- my $message = key_parts($o) ?
-N("Your USB key does not have any valid Windows (FAT) partitions.
-We need one to continue (beside, it's more standard so that you
-will be able to move and access your files from machines
-running Windows). Please plug in an USB key containing a
-Windows partition instead.
-
-
-You may also proceed without an USB key - you'll still be
-able to use Mandriva Move as a normal live Mandriva
-Operating System.") :
-N("We did not detect any USB key on your system. If you
-plug in an USB key now, Mandriva Move will have the ability
-to transparently save the data in your home directory and
-system wide configuration, for next boot on this computer
-or another one. Note: if you plug in a key now, wait several
-seconds before detecting again.
-
-
-You may also proceed without an USB key - you'll still be
-able to use Mandriva Move as a normal live Mandriva
-Operating System.");
- $o->ask_okcancel_({ title => N("Need a key to save your data"),
- messages => formatAlaTeX($message),
- ok => N("Detect USB key again"),
- cancel => N("Continue without USB key") }) or return;
-
- }
- key_mount($o, 'reread');
- check_key($o);
-}
-
-sub install2::verifyKey {
- my $o = $::o;
-
- log::l("automatic transparent key support is disabled"), return if $key_disabled;
-
- if (cat_('/proc/cmdline') =~ /\bformatkey\b/) {
- clean_partition_table_and_format_key($o);
- key_mount($o, 'reread');
- }
-
- check_key($o) or return;
-
- my $_wait = $using_existing_host_config
- || $o->wait_message(N("Setting up USB key"), N("Please wait, setting up system configuration files on USB key..."));
-
- if (eval { fs::umount_part($key_part); 1 }) {
- log::l("remounting without sync option");
- $key_part->{options} = $key_mountopts;
- fs::mount_part($key_part);
- }
-
- key_installfiles('full');
-
- setup_userconf($o);
-}
-
-sub enable_service {
- run_program::run('/sbin/chkconfig', '--level', 5, $_[0], 'on');
-}
-
-sub install2::configMove {
- my $o = $::o;
-
- #- just in case
- lomount_clp("always_i18n_$o->{locale}{lang}", '/usr');
-
- if (!$using_existing_user_config) {
- if (cat_('/proc/cmdline') =~ /\buser=(\w+)/) {
- $o->{users} = [ { name => $1 } ];
- } else {
- require any;
- any::ask_user_one($o, $o->{users} ||= [], $o->{security},
- additional_msg => N("Enter your user information, password will be used for screensaver"), noaccept => 1, needauser => 1, noicons => 1);
- }
- #- force uid/gid to 501 as it was used when mounting key, addUser may choose 502 when key already holds user data
- put_in_hash($o->{users}[0], { uid => 501, gid => 501 });
- require install_steps;
- install_steps::addUser($o);
- }
-
- $::noauto and goto after_autoconf;
-
- my $_wait = $o->wait_message(N("Auto configuration"), N("Please wait, detecting and configuring devices..."));
-
- #- automatic printer, timezone, network configs
- require install_steps_interactive;
- if (cat_('/proc/mounts') !~ /nfs/) {
- install_steps_interactive::configureNetwork($o);
- touch('/etc/resolv.conf');
- enable_service('network');
- }
- enable_service('netfs');
- install_steps_interactive::summaryBefore($o);
-
- modules::load_category('multimedia/sound');
- enable_service('sound');
-
- detect_devices::isLaptop() or enable_service('numlock');
-
-after_autoconf:
- require timezone;
- timezone::write($o->{timezone});
-
- $o->{useSupermount} = 'magicdev';
- fs::set_removable_mntpoints($o->{all_hds});
- fs::set_all_default_options($o->{all_hds}, %$o, lang::fs_options($o->{locale}));
-
- require install_any;
- install_any::write_fstab($o);
-
- modules::write_conf();
- require mouse;
- mouse::write_conf($o, $o->{mouse}, 1); #- write xfree mouse conf
- detect_devices::install_addons('');
-
- {
- my $user = $o->{users}[0]{name};
- my $confdir = "/home/$user/.kde/share/config";
- mkdir_p($confdir);
- output("$confdir/kdeglobals", cat_("/usr/share/config/kdeglobals"));
- lang::configure_kdeglobals($o->{locale}, $confdir);
-
- run_program::run('chown', '-R', "$user.$user", "/home/$user/.kde");
- }
-
- foreach my $step (@{$o->{orderedSteps_orig}}) {
- next if member($step, @{$o->{orderedSteps}});
- while (my $f = shift @{$o->{steps}{$step}{toBeDone} || []}) {
- log::l("doing remaining toBeDone for undone step $step");
- eval { &$f() };
- $o->ask_warn(N("Error"), [
-N("An error occurred, but I do not know how to handle it nicely.
-Continue at your own risk."), formatError($@) ]) if $@;
- }
- }
-}
-
-sub install_TrueFS_in_home {
- my ($o) = @_;
-
- my $home = fsedit::mntpoint2part('/home', $o->{fstab}) or return;
-
- my %loopbacks = map {
- my $part = {
- type => 0x83,
- device => "/home/.mdkmove-$_",
- loopback_file => "/.mdkmove-$_", loopback_device => $home,
- mntpoint => "/home/$_/.mdkmove-truefs", size => 6 << 11,
- toFormat => ! -e "/home/.mdkmove-$_",
- };
- $_ => $part;
- } list_users();
- $home->{loopback} = [ values %loopbacks ];
- fsedit::recompute_loopbacks($o->{all_hds});
- fs::formatMount_all([], $home->{loopback}, $o->{prefix});
-
- foreach my $user (keys %loopbacks) {
- my $dir = $loopbacks{$user}{mntpoint};
-
- foreach (qw(.kde .openoffice)) {
- if (-d "/home/$user/$_" && ! -d "$dir/$_") {
- run_program::run('mv', "/home/$user/$_", "$dir/$_");
- }
- mkdir $_ foreach "/home/$user/$_", "$dir/$_";
-
- run_program::run('mount', '-o', 'bind', "$dir/$_", "/home/$user/$_");
- }
-
- my $cache = "/tmp/.$user-cache";
- foreach (qw(.kde/share/cache)) {
- mkdir_p("$cache/$_");
- mkdir_p("/home/$user/" . dirname($_));
- symlink "$cache/$_", "/home/$user/$_";
- }
- run_program::run('chown', '-R', "$user.$user", $dir);
- run_program::run('chown', '-R', "$user.$user", $cache);
-
- $ENV{XAUTHORITY} = "$dir/.Xauthority";
- $ENV{ICEAUTHORITY} = "$dir/.ICEauthority";
- }
-}
-
-sub errorInStep {
- my ($o, $err) = @_;
-
- if (!fsedit::mntpoint2part('/home', $o->{fstab})) {
- $o->ask_warn(N("Error"), [ N("An error occurred"), formatError($err) ]);
- return;
- }
-
- $o->ask_okcancel_({ title => N("Error"),
- messages => formatAlaTeX(
-N("An error occurred:
-
-
-%s
-
-This may come from corrupted system configuration files
-on the USB key, in this case removing them and then
-rebooting Mandriva Move would fix the problem. To do
-so, click on the corresponding button.
-
-
-You may also want to reboot and remove the USB key, or
-examine its contents under another OS, or even have
-a look at log files in console #3 and #4 to try to
-guess what's happening.", formatError($err))),
- ok => N("Remove system config files"),
- cancel => N("Simply reboot") }) or goto reboot;
- eval { rm_rf $key_sysconf };
-reboot:
- reboot();
-}
-
-sub install2::initGraphical {
- my $xdim = $::rootwidth;
- $xdim < 800 and $xdim = 800;
- $xdim > 1600 and $xdim = 1600;
- run_program::run('qiv', '--root', "/image/move/BOOT-$xdim-MOVE.jpg");
-
- undef *install_steps_interactive::errorInStep;
- *install_steps_interactive::errorInStep = \&errorInStep;
-}
-
-sub install2::startMove {
- my $o = $::o;
-
- $::WizardWindow->destroy if $::WizardWindow;
- require ugtk2;
- ugtk2::flush();
-
- #- get info from existing fstab. This will not do anything if we already wrote fstab in configMove
- fs::get_info_from_fstab($o->{all_hds}, '');
- foreach (fsedit::get_really_all_fstab($o->{all_hds})) {
- if (isSwap($_)) {
- eval { swap::swapon($_->{device}) };
- } elsif ($_->{mntpoint} && !$_->{isMounted} && !$::noauto) {
- mkdir_p($_->{mntpoint});
- run_program::run('mount', $_->{mntpoint}) if $_->{options} !~ /noauto/;
- }
- }
-
- symlinkf("/usr/share/services/ksycoca-$o->{locale}{lang}", '/etc/X11/ksycoca');
-
- install_TrueFS_in_home($o);
-
- my $username = $o->{users}[0]{name} or die 'no user';
- output('/var/run/console.lock', $username);
- output("/var/run/console/$username", 1);
- run_program::run('pam_console_apply');
-
- run_program::run('hwclock', '-s', '--localtime');
- run_program::run('chown', "$username.root", '/var/run/rebootctl');
- substInFile { $_ = '' if m!\s/home\s! } $_ foreach '/etc/fstab', '/etc/mtab';
-
- touch '/var/run/utmp';
- run_program::run('runlevel_set', '5');
- foreach (glob('/etc/rc.d/rc5.d/*')) {
- next if member($_, qw(xfs dm devfsd syslog));
- next if /~$/;
- run_program::run($_, 'start');
- }
-
- #- allow user customisation of startup through /etc/rc.d/rc.local
- run_program::run('/etc/rc.d/rc.local');
-
- if ($key_part) {
- output '/var/lib/machine_ident', machine_ident();
- run_program::run('/usr/bin/etc-monitorer.pl', uniq map { dirname($_) } (chomp_(`find /etc -type f`),
- grep { readlink($_) !~ m|^/| } chomp_(`find /etc -type l`)));
- run_program::raw({ detach => 1 }, '/usr/bin/dnotify', '-MCRD', '/etc', '-r', '-e', '/usr/bin/etc-monitorer.pl', '{}') or die "dnotify not found!";
- }
-
- #- password in screensaver does not make sense if we keep the shell
- if (cat_('/proc/cmdline') !~ /\bshell\b/) {
- kill 9, cat_('/var/run/drakx_shell.pid');
- output('/dev/tty2', "Killed\n");
- }
-
- if (fork()) {
- sleep 1;
- log::l("DrakX waves bye-bye");
-
- open STDOUT, ">>/tmp/.kde-errors"; #- do not display startkde shit on first console
- open STDERR, ">>/tmp/.kde-errors";
-
- my (undef, undef, $uid, $gid, undef, undef, undef, $home, $shell) = getpwnam($username);
- $( = $) = "$gid $gid";
- $< = $> = $uid;
- $ENV{LOGNAME} = $ENV{USER} = $username;
- $ENV{HOME} = $home;
- $ENV{SHELL} = $shell;
- $ENV{XDM_MANAGED} = '/var/run/rebootctl,maysd,mayfn,sched'; #- for reboot/halt availability of "logout" by kde
- $ENV{GDMSESSION} = 1; #- disable ~/.xsession-errors in Xsession (waste of usb key writes)
- $ENV{LD_LIBRARY_PATH} = "$home/lib";
- chdir $home;
- exec 'startkde_move';
- } else {
- exec 'xwait', '-permanent' or c::_exit(0);
- }
-}
-
-sub automatic_xconf {
- my ($o) = @_;
-
- if (!$using_existing_host_config) {
-
- log::l('automatic XFree configuration');
-
- any::devfssymlinkf($o->{mouse}, 'mouse');
- local $o->{mouse}{device} = 'mouse';
-
- require Xconfig::default;
- $o->{raw_X} = Xconfig::default::configure(class_discard->new, { KEYBOARD => 'uk' }, $o->{mouse}); #- using uk instead of us for now to have less warnings
-
- require Xconfig::main;
- require class_discard;
-
- Xconfig::main::configure_everything_auto_install($o->{raw_X}, class_discard->new, {}, install_any::X_options_from_o($o));
- }
-
- modules::load_category('various/agpgart');
-
- my $file = '/etc/X11/XF86Config';
- $file = "$file-4" if -e "$file-4";
- my ($Driver) = cat_($file) =~ /Section "Device".*Driver\s*"(.*?)"/s;
- if ($Driver eq 'nvidia') {
- modules::load('nvidia');
- lomount_clp('nvidia', '/usr/lib/libGLcore.so.1');
- }
- my $lib = 'libGL.so.1';
- symlinkf_short(-e "/usr/lib/$lib.$Driver" ? "/usr/lib/$lib.$Driver" : "/usr/X11R6/lib/$lib", "/etc/X11/$lib");
-}
-
-
-1;