diff options
author | Olivier Blin <oblin@mandriva.com> | 2007-05-02 09:34:18 +0000 |
---|---|---|
committer | Olivier Blin <oblin@mandriva.com> | 2007-05-02 09:34:18 +0000 |
commit | 52b74143bcf10c4580c3da3d31ad18e99d39daab (patch) | |
tree | 909484944c9132993df4df209d5ae33e2f834ba6 /draklive-install | |
download | draklive-install-52b74143bcf10c4580c3da3d31ad18e99d39daab.tar draklive-install-52b74143bcf10c4580c3da3d31ad18e99d39daab.tar.gz draklive-install-52b74143bcf10c4580c3da3d31ad18e99d39daab.tar.bz2 draklive-install-52b74143bcf10c4580c3da3d31ad18e99d39daab.tar.xz draklive-install-52b74143bcf10c4580c3da3d31ad18e99d39daab.zip |
reimport draklive-install in SVN
Diffstat (limited to 'draklive-install')
-rwxr-xr-x | draklive-install | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/draklive-install b/draklive-install new file mode 100755 index 0000000..083f768 --- /dev/null +++ b/draklive-install @@ -0,0 +1,268 @@ +#!/usr/bin/perl + +use lib qw(/usr/lib/libDrakX); +use standalone; +use interactive; +use fs::any; +use fs::type; +use fs::partitioning; +use fs::partitioning_wizard; +use MDK::Common; +use common; + +push @::textdomains, 'draklive-install'; + +{ + use diskdrake::interactive; + package diskdrake::interactive; + my $old = \&hd_possible_actions; + undef *hd_possible_actions; + *hd_possible_actions = sub { + #- for the partition wizard to show the auto-allocate option + local $::isInstall = 1; + &$old; + }; + undef *Done; + #- skip the fstab/reboot checks + *Done = \&diskdrake_interactive_Done; + #- don't ask whether to Move/Hide old files + undef *need_migration; + *need_migration = sub { 'hide' }; +} + +sub umount_all { + my ($fstab) = @_; + #- make sure nothing is mounted in the new root + foreach (sort { $b cmp $a } grep { /^$::prefix/ } map { (split)[1] } cat_('/proc/mounts')) { + system('umount', $_); + } + #- make sure selected devices aren't mounted, and swap isn't used + foreach (grep { isSwap($_) } @$fstab) { + eval { fs::mount::swapoff($_->{device}) }; + } + foreach (map { $_->{mntpoint} && !isSwap($_) ? "/dev/$_->{device}" : () } @$fstab) { + system('umount', $_); + } +} + +sub on_reboot_needed { + my ($in) = @_; + fs::partitioning_wizard::warn_reboot_needed($in); + $in->exit(0); +} + +my $in = 'interactive'->vnew('su'); +$::prefix = '/mnt/install'; +my $all_hds = {}; +my $fstab = []; +fs::any::get_hds($all_hds, $fstab, [], {}, 'skip_mtab', $in); + +umount_all($fstab); + +require any; +my $has_running_wm = to_bool(any::running_window_manager()); + + +$::isWizard = 1; +$::Wizard_no_previous = 1; +$::Wizard_pix_up = "MandrivaOne-install-icon"; +my $title = N("Mandriva Live"); +{ + local $::isStandalone = $has_running_wm; # center me if run in xsetup.d script + my $w = ugtk2->new($title); + ugtk2::gtkadd($w->{window}, + ugtk2::gtkcreate_img("MandrivaOne-install"), + ugtk2::gtknew('Label', height => 5), + N("This wizard will help you to install the live distribution."), + ugtk2::create_okcancel($w)); + $w->{ok}->grab_focus; + $w->main; +} + +fs::partitioning_wizard::main($in, $all_hds, $fstab, [], undef, {}, 'skip_mtab'); + +mkdir_p($::prefix) or die "unable to create $::prefix"; + +fs::any::write_hds($all_hds, $fstab, undef, \&on_reboot_needed, $in); +fs::any::check_hds_boot_and_root($all_hds, $fstab); +fs::partitioning::choose_partitions_to_format($in, $fstab); +umount_all($fstab); +fs::partitioning::format_mount_partitions($in, $all_hds, $fstab); + +#- copy to disk +my $wait = do { + local $::isInstall = 1; # quick hack to embed the wait message + $in->wait_message('', N("Computing total size")); +}; +my $total = first(split(/\s+/, `du -sbx / 2>/dev/null`)); +undef $wait; + +sub build_copy_command { + my ($source, $dest) = @_; + join(' ', + 'tar', 'c', '--one-file-system', '-C', $source, '.', + '|', + 'tar', 'xvv', '-C', $dest, + ); +} + +($wait, my $update_progress) = do { + local $::isInstall = 1; # quick hack to embed the wait message; + copying_message_with_progress_bar($in, N("Copying in progress")); +}; +open(my $OUTPUT, '-|', build_copy_command('/', $::prefix)); +{ + local $_; + my $current = my $previous = 0; + while (<$OUTPUT>) { + (undef, undef, my $size) = split; + $current += $size; + if ($current <= $total && $current/$total > $previous/$total + 0.001) { + $update_progress->('', $current, $total); + $previous = $current; + } + } +} +undef $update_progress; +undef $wait; + +#- FIXME: maybe factorize with draklive, using draklive --clean-chroot ? +#- remove unwanted files and packages +unlink(map { $::prefix . $_ } '/.autofsck', + '/home/guest/Desktop/draklive-copy-wizard.desktop', + '/home/guest/Desktop/draklive-install.desktop'); +system('chroot', $::prefix, 'rpm', '-e', 'draklive-install'); + +#- enable first boot wizard at system boot +output($::prefix . '/etc/sysconfig/firstboot', 'FIRSTBOOT=yes'); +#- enable drakx-finish-install at system boot +output($::prefix . '/etc/sysconfig/finish-install', qq( +FINISH_INSTALL=yes +LICENSE=no +LANGUAGE=no +KEYBOARD=no +TIMEZONE=no +NETWORK=yes +AUTHENTICATION=yes +USERS=yes +USER_RENAME_FROM=guest +GLX=no +)); +#- unselect guest user in kdm +my $kdm_cfg = '/etc/kde/kdm/kdmrc'; +update_gnomekderc($::prefix . $kdm_cfg, + 'X-:0-Greeter' => (PreselectUser => 'None', DefaultUser => '')) if -f $kdm_cfg; +#- allow to install doc in disk install +substInFile { undef $_ if /^\%_excludedocs/ } $::prefix . '/etc/rpm/macros'; + +#- create required directories and devices +mkdir_p($::prefix . $_) foreach qw(/dev /etc /proc /sys); +run_program::run('makedev', $::prefix . '/dev'); +#- write fstab +fs::write_fstab($all_hds, $::prefix); + +# enable back some disabled services +require services; +services::start_service_on_boot($_) foreach qw(dkms crond); + +use bootloader; +my $bootloader = {}; +any::setupBootloaderBeforeStandalone($in->do_pkgs, $bootloader, $all_hds, $fstab); +{ + local $::Wizard_no_previous = 0; + any::setupBootloaderUntilInstalled($in, $bootloader, $all_hds, $fstab, $ENV{SECURE_LEVEL}); +} + +#- cleanly umount here, it will avoid fs journals to be corrupted after a hackish reboot +umount_all($fstab); + +$::Wizard_finished = 1; +$in->ask_okcancel(N("Congratulations"), N("Please halt your computer, remove your live system, and restart your computer.")); + +$in->exit(0); + + +### +### duplicate code +### + +#- from disdrake::interactive +{ + package diskdrake::interactive; + sub diskdrake_interactive_Done { + my ($in, $all_hds) = @_; + eval { raid::verify($all_hds->{raids}) }; + if (my $err = $@) { + $::expert or die; + $in->ask_okcancel('', [ formatError($err), N("Continue anyway?") ]) or return; + } + foreach (@{$all_hds->{hds}}) { + if (!write_partitions($in, $_, 'skip_check_rebootNeeded')) { + return if !$::isStandalone; + $in->ask_yesorno(N("Quit without saving"), N("Quit without writing the partition table?"), 1) or return; + } + } + #- skip that fstab/reboot steps + if (!$::isInstall && 0) { + my $new = fs::fstab_to_string($all_hds); + if ($new ne $all_hds->{current_fstab} && $in->ask_yesorno('', N("Do you want to save /etc/fstab modifications"), 1)) { + $all_hds->{current_fstab} = $new; + fs::write_fstab($all_hds); + } + update_bootloader_for_renumbered_partitions($in, $all_hds); + + if (any { $_->{rebootNeeded} } @{$all_hds->{hds}}) { + $in->ask_warn('', N("You need to reboot for the partition table modifications to take place")); + tell_wm_and_reboot(); + } + } + if (my $part = find { $_->{mntpoint} && !maybeFormatted($_) } fs::get::fstab($all_hds)) { + $in->ask_okcancel('', N("You should format partition %s. +Otherwise no entry for mount point %s will be written in fstab. +Quit anyway?", $part->{device}, $part->{mntpoint})) or return if $::isStandalone && 0; #- no, please + } + 1; + } +} + +# forked from interactive::wait_message +sub copying_message { + my ($o, $title, $message, $b_temp) = @_; + + my $w = $o->wait_messageW($title, N("Copying in progress"), ugtk2::gtknew('VBox', children_tight => [ + ugtk2::gtkcreate_img("MandrivaOne-advert"), + $message, + ])); + push @tempory::objects, $w if $b_temp; + my $b = before_leaving { $o->wait_message_endW($w) }; + + #- enable access through set + MDK::Common::Func::add_f4before_leaving(sub { $o->wait_message_nextW($_[1], $w) }, $b, 'set'); + $b; +} + +# forked from interactive::gtk::wait_message_with_progress_bar +sub copying_message_with_progress_bar { + my ($in, $o_title) = @_; + + my $progress = Gtk2::ProgressBar->new; + my $w = copying_message($in, $o_title, $progress); + my $displayed; + $progress->signal_connect(expose_event => sub { $displayed = 1; 0 }); + $w, sub { + my ($msg, $current, $total) = @_; + if ($msg) { + $w->set($msg); + } + + if ($total) { + $progress or internal_error('You must first give some text to display'); + $progress->set_fraction($current / $total); + $progress->show; + $displayed = 0; + mygtk2::flush() while !$displayed; + } else { + $progress->hide if !$total; + } + }; +} |