diff options
Diffstat (limited to 'files')
-rwxr-xr-x | files/WIP/draklive-install | 448 | ||||
-rwxr-xr-x | files/WIP/draklive-install.wrapper | 6 | ||||
-rw-r--r-- | files/WIP/mageia-draklive-install.desktop | 82 | ||||
-rw-r--r-- | files/WIP/org.mageia.draklive-install-lock-storage.policy | 22 | ||||
-rw-r--r-- | files/WIP/org.mageia.draklive-install.policy | 22 |
5 files changed, 580 insertions, 0 deletions
diff --git a/files/WIP/draklive-install b/files/WIP/draklive-install new file mode 100755 index 0000000..42ac2f1 --- /dev/null +++ b/files/WIP/draklive-install @@ -0,0 +1,448 @@ +#!/usr/bin/perl + +# Must be done as early as possible to avoid issues when displaying translated +# strings +BEGIN { + push @::textdomains, 'draklive-install'; +} + +use lib qw(/usr/lib/libDrakX); +use standalone; +use interactive; +use fs; +use fs::any; +use fs::type; +use fs::partitioning; +use fs::partitioning_wizard; +use partition_table; +use MDK::Common; +use common; +use feature qw(state); + +($::real_windowwidth, $::real_windowheight) = (600, 400); + +{ + use diskdrake::interactive; + package diskdrake::interactive; + my $old = \&hd_possible_actions_base; + undef *hd_possible_actions_base; + *hd_possible_actions_base = sub { + #- for the partition wizard to show the auto-allocate option + local $::isInstall = 1; + &$old; + }; + undef *Done; + #- skip the fstab/reboot checks (see below FIXME note) + *Done = \&diskdrake_interactive_Done; + #- don't ask whether to Move/Hide old files (FIXME: add a method to skip that to diskdrake::interactive) + undef *need_migration; + *need_migration = sub { 'hide' }; +} + +install_live(); + +sub install_live() { + my $in = 'interactive'->vnew('su'); + $in->{pop_wait_messages} = 0; + + $::isWizard = 1; + $::Wizard_no_previous = 1; + $::Wizard_pix_up = "draklive-install"; + any::set_wm_hints_if_needed($in); + + my $all_hds = {}; + my $fstab = []; + $::prefix = '/mnt/install'; + + my $system_file = '/etc/sysconfig/draklive-install'; + my %settings = getVarsFromSh($system_file); + + my $copy_source = $settings{SOURCE} || '/'; + my $live_media = '/live/media'; + + display_start_message(); + init_hds($in, $all_hds, $fstab, $live_media); + ask_partitions_loop($in, $all_hds, $fstab, $copy_source); + remove_unused_packages($in, $copy_source); + prepare_root($in); + copy_root($in, $copy_source); + complete_install($in, $all_hds); + setup_bootloader($in, $all_hds, $fstab); + finish_installation($fstab); + display_end_message($in); + $in->exit(0); +} + +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); +} + +sub display_start_message() { + require any; + my $has_running_wm = to_bool(any::running_window_manager()); + local $::isStandalone = $has_running_wm; # center me if run in xsetup.d script + mygtk3::enable_quit_popup(1); + my $w = ugtk3->new(N("Mageia Live")); + ugtk3::gtkadd($w->{window}, + ugtk3::gtkcreate_img("MageiaLive-install"), + ugtk3::gtknew('Label', height => 5), + N("This wizard will help you to install the live distribution."), + ugtk3::create_okcancel($w)); + $w->{ok}->grab_focus; + $w->main; +} + +sub umount_first_pass() { + local $::prefix = undef; + my $all_hds = fsedit::get_hds(); + fs::get_raw_hds('', $all_hds); + fs::get_info_from_fstab($all_hds); + my $fstab = [ fs::get::fstab($all_hds) ]; + fs::merge_info_from_mtab($fstab); + + #- inlined from fs::mount::umount_all to go on when one umount fail + #- (maybe the sort function could be shared) + log::l("unmounting all filesystems"); + foreach (sort { $b->{mntpoint} cmp $a->{mntpoint} } + grep { $_->{mntpoint} && !$_->{real_mntpoint} } @$fstab) { + eval { fs::mount::umount_part($_) }; + log::l("error unmounting $_->{mntpoint}: $@") if $@; + } +} + +sub init_hds { + my ($in, $all_hds, $fstab, $live_media) = @_; + my $wait = $in->wait_message('', N("Please wait")); + umount_first_pass(); + eval { fs::any::get_hds($all_hds, $fstab, [], {}, 'skip_mtab', $in) }; + + #- fs::any::get_hds does not return mounts that are not in fstab + my @mounted = fs::read_fstab('', '/proc/mounts'); + my $live_part = find { $_->{mntpoint} eq $live_media } @mounted; + my $live_device = $live_part && $live_part->{device}; + #- remove live device from the detected hds, so that bootloader is not installed on it: + #- bootloader installation uses first device from detect_devices::get, which tries to list devices + #- by booting order, and our live system is likely to be here in first position + #- it can be either a partition (USB) or the full disk (Hybrid on USB) + @{$all_hds->{hds}} = grep { + $_->{device} ne $live_device && + !member($live_device, map { $_->{device} } partition_table::get_normal_parts_and_holes($_)); + } @{$all_hds->{hds}} if $live_device; + + my $err = $@; + umount_all($fstab); + if ($err) { + undef $wait; + $in->ask_warn(N("Error"), [ formatError($err) ]); + $in->exit(1); + } +} + +sub ask_partitions_loop { + my ($in, $all_hds, $fstab, $copy_source) = @_; + + while (1) { + eval { ask_partitions($in, $all_hds, $fstab, $copy_source) }; + my $err = $@ or last; + $in->exit(1) if $err =~ /wizcancel/ || + !$in->ask_warn(N("Error"), [ N("An error occurred"), formatError($err) ]); + } +} + +sub ask_partitions { + my ($in, $all_hds, $fstab, $copy_source) = @_; + 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, sub { on_reboot_needed($in) }, {}); + fs::any::check_hds_boot_and_root($all_hds, $fstab); + fs::partitioning::choose_partitions_to_format($in, $fstab); + + my $total = get_total_size($in, $copy_source); + my $available = fs::any::getAvailableSpace($fstab, 'skip_mounted', 1); + $total += fs::any::getNeededMinSpace($available); + die N("Not enough space available (%s available while %s are needed)", + formatXiB($available), formatXiB($total)) . "\n" + if $total > $available; + + umount_all($fstab); + fs::partitioning::format_mount_partitions($in, $all_hds, $fstab); +} + +sub remove_unused_packages { + my ($in, $o_prefix) = @_; + require pkgs; + #in remove_unused_packages, we want to get the locale from the currently + #running system, but we want to remove unused packages from the + #system based in $o_prefix, that's why we use an extra arg instead of + #directly using $::prefix + local $::prefix; + pkgs::remove_unused_packages($in, $in->do_pkgs, $o_prefix); +} + +sub prepare_root { + my ($in) = @_; + #- create required directories and devices (early to have a consistent root before calling other programs) + my $_wait = $in->wait_message('', N("Please wait")); + fs::any::prepare_minimal_root(); +} + +sub build_copy_command { + my ($source, $dest) = @_; + join(' ', + 'tar', 'c', '--one-file-system', '-C', $source, '.', + '|', + 'tar', 'xvv', '-C', $dest, + ); +} + +sub get_total_size { + my ($in, $source) = @_; + state %total; + return $total{$source} if $total{$source}; + my $_wait = $in->wait_message('', N("Computing total size")); + $total{$source} = first(split(/\s+/, `du -sbx /run/mgalive/ovlsize 2>/dev/null`)); +} + +sub sync_logs() { + cp_af('/var/log', $::prefix . '/var'); +} + +sub copy_root { + my ($in, $copy_source) = @_; + my $total = get_total_size($in, $copy_source); + + my ($wait, $update_progress) = copying_message_with_progress_bar($in, N("Copying in progress")); + open(my $OUTPUT, '-|', build_copy_command($copy_source, $::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; + } + } + } + if (!close($OUTPUT)) { + undef $wait; + undef $update_progress; + $in->ask_warn(N("Error"), N("Unable to copy files to new root")); + $in->exit(1); + } + sync_logs(); +} + +sub clean_harddrake_hds { + my ($prefix) = @_; + #- remove harddisks from harddrake's config file, so that hardddisks + #- are automatically rediscovered at first boot + require Storable; + my $harddrake_file = $prefix . "/etc/sysconfig/harddrake2/previous_hw"; + my $harddrake_conf = eval { Storable::retrieve($harddrake_file) }; + if ($harddrake_conf) { + delete $harddrake_conf->{HARDDISK}; + Storable::store($harddrake_conf, $harddrake_file); + } +} + + +sub complete_install { + my ($in, $all_hds) = @_; + my $_wait = $in->wait_message('', N("Please wait")); + + my $real_rpm_dir = "/tmp/rpm/real"; + cp_f(glob($real_rpm_dir . "/*"), $::prefix . "/var/lib/rpm") if -d $real_rpm_dir; + + #- FIXME: maybe factorize with draklive, using draklive --clean-chroot ? + #- remove unwanted files and packages + my $live_user = chomp_(cat_('/etc/draklive-install.d/user')); + my $live_user_desktop = $live_user && chomp_(run_program::rooted_get_stdout($::prefix, "su - $live_user -c 'xdg-user-dir DESKTOP'")); + unlink(map { $::prefix . $_ } '/.autofsck', + chomp_(cat_(glob('/etc/draklive-install.d/remove.d/*'))), + if_($live_user_desktop, + $live_user_desktop . '/draklive-copy-wizard.desktop', + $live_user_desktop . '/draklive-install.desktop'), + ); + { + #- do not allow update-menus to create home directory with invalid perms + local $ENV{HOME} = '/root'; + system('chroot', $::prefix, 'rpm', '-e', 'draklive-install'); + } + + foreach (glob('/etc/draklive-install.d/run.d/*')) { + run_program::rooted($::prefix, $_); + } + + #- copy sysconfig files for first boot + cp_f(glob('/etc/draklive-install.d/sysconfig/*'), $::prefix . '/etc/sysconfig'); + + #- unselect live user in kdm + my $kdm_cfg = common::read_alternative('kdm4-config'); + update_gnomekderc($::prefix . $kdm_cfg, + 'X-:0-Greeter' => (PreselectUser => 'None', DefaultUser => '')) if -f $kdm_cfg; + my $autologin = any::get_autologin(); + delete $autologin->{user}; + any::set_autologin($in->do_pkgs, $autologin); + + #- allow to install doc in disk install + substInFile { undef $_ if /^\%_excludedocs/ } $::prefix . '/etc/rpm/macros'; + + fs::write_fstab($all_hds, $::prefix); + + clean_harddrake_hds($::prefix); + + # enable back some disabled services + require services; + services::start_service_on_boot($_) foreach chomp_(cat_('/etc/draklive-install.d/services')); + + sync_logs(); +} + +sub setup_bootloader { + my ($in, $all_hds, $fstab) = @_; + 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}); + sync_logs(); +} + +sub clean_live_system_hds() { + #- clean fstab and harddrake config in the live system + #- since partitions UUIDs of the installed system have been modified + #- (useful for persistent live systems) + local $::prefix = undef; + clean_harddrake_hds($::prefix); + my $all_hds = fs::get::empty_all_hds(); #- skip real harddisks + fs::get_raw_hds('', $all_hds); + fs::get_info_from_fstab($all_hds); + fs::write_fstab($all_hds, $::prefix); +} + +sub finish_installation { + my ($fstab) = @_; + sync_logs(); + #- cleanly umount here, it will avoid fs journals to be corrupted after a hackish reboot + umount_all($fstab); + clean_live_system_hds(); +} + +sub display_end_message { + my ($in) = @_; + $::Wizard_finished = 1; + $in->ask_okcancel(N("Congratulations"), N("Please halt your computer, remove your live system, and restart your computer.")); +} + +### +### duplicate code +### + +# FIXME: code begins to fork +# FIXME: => in mga4 add diskdrake::interactive::set_skip_fstab_reboot_steps() and use it instead + +#- 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"), ugtk3::gtknew('VBox', padding => 5, children_tight => [ + ugtk3::gtkcreate_img("MageiaLive-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 = Gtk3::ProgressBar->new; + my $w = copying_message($in, $o_title, $progress); + my $displayed; + $progress->signal_connect(draw => 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'); + my $fraction = min(1, $current / $total); + if ($fraction != $progress->get_fraction) { + $progress->set_fraction($fraction); + $progress->show; + $displayed = 0; + mygtk3::flush() while !$displayed; + } + } else { + $progress->hide; + mygtk3::flush(); + } + }; +} diff --git a/files/WIP/draklive-install.wrapper b/files/WIP/draklive-install.wrapper new file mode 100755 index 0000000..5a8f4eb --- /dev/null +++ b/files/WIP/draklive-install.wrapper @@ -0,0 +1,6 @@ +#!/bin/sh +if [[ "$UID" != "0" ]] ; then + /usr/bin/pkexec /usr/sbin/draklive-install-lock-storage "$@" + exit $? +fi +exec /usr/sbin/draklive-install-lock-storage "$@" diff --git a/files/WIP/mageia-draklive-install.desktop b/files/WIP/mageia-draklive-install.desktop new file mode 100644 index 0000000..ac88cdc --- /dev/null +++ b/files/WIP/mageia-draklive-install.desktop @@ -0,0 +1,82 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Install on Hard Disk +Name[ar]=التثبيت على القرص الصلب +Name[ast]=Instalar nel to discu duru +Name[bg]=Инсталиране на твърд диск +Name[br]=Staliañ war ar bladenn galet +Name[ca]=Instal·la al disc dur +Name[cs]=Instalace na pevný disk +Name[cy]=Gosod i'r disg caled +Name[da]=Installér på harddisk +Name[de]=Auf die Festplatte installieren +Name[el]=Εγκατάσταση στο σκληρό δίσκο +Name[en_GB]=Install on Hard Disk +Name[es]=Instalar en el Disco Duro +Name[es_419]=Instalar en disco rígido +Name[et]=Paigaldamine kõvakettale +Name[eu]=Instalatu disko zurrunean +Name[fi]=Asenna kiintolevylle +Name[fr]=Installer sur disque dur +Name[hr]=Instaliraj na tvrdi disk +Name[hu]=Telepítés a merevlemezre +Name[id]=Install ke Hard Disk +Name[it]=Installa sul disco fisso +Name[ja]=ハードディスクへインストール +Name[ko]=하드디스크에 인스톨하기 +Name[ky]=Катуу дискке орнотуу +Name[nb]=Installer på harddisk +Name[nl]=Installeer op de harde schijf +Name[nn]=Installer på harddisken +Name[pl]=Zainstaluj na dysku twardym +Name[pt]=Instalar no Disco Rígido +Name[pt_BR]=Instalar no Disco Rígido +Name[ro]=Instalare pe discul dur +Name[ru]=Установка на жёсткий диск +Name[sk]=Inštalovať na hard disk +Name[sl]=Namestitev na trdi disk +Name[sq]=Instalo në Hard Disk +Name[sv]=Installera på hårddisk +Name[tr]=Sabit diske kur +Name[uk]=Встановити на жорсткий диск +Name[zh_CN]=安装到硬盘 +Name[zh_TW]=安裝在硬碟上 +Comment=Install your Mageia live system to disk +Comment[ar]=تثبيت نظام ماجيا الحي على القرص الصلب +Comment[ast]=Instalar el to sistema live de Mageia al discu +Comment[ca]=Instal·la el sistema autònom de Mageia al disc +Comment[cs]=Instalace vašeho živého systému Mageia na disk +Comment[cy]=Gosod eich system Mageia fyw i'r disg +Comment[de]=Installieren Sie Ihr Mageia-Livesystem auf der Festplatte +Comment[el]=Εγκαταστήστε το σύστημά σας Mageia Live σ' ένα δίσκο +Comment[en_GB]=Install your Mageia live system to disk +Comment[es]=Instalar sistema live de Mageia en disco +Comment[es_419]=Instalar tu sistema Mageia Live al disco +Comment[et]=Mageia live-süsteemi paigaldamine kettale +Comment[eu]=Zure Live Mageia sistema instalatu diskoan +Comment[fi]=Asenna Mageia Live -järjestelmä kiintolevylle +Comment[fr]=Installer votre système Mageia live sur le disque dur +Comment[hr]=Instalirajte vaš Mageia live sustav na disk +Comment[hu]=Mageia live rendszer telepítése a lemezre +Comment[id]=Install sistem live Mageia Anda ke disk +Comment[it]=Installa Mageia Live sul disco +Comment[ja]=Mageia ライブシステムをディスクへインストール +Comment[nl]=Het Mageia live systeem op de harde schijf installeren +Comment[pl]=Zainstaluj system Mageia na dysku twardym +Comment[pt]=Instalar o sistema Mageia 'Live' no disco +Comment[pt_BR]=Instalar seu sistema Mageia live para o HD +Comment[ro]=Instalați sistemul Mageia Live pe disc +Comment[ru]=Установить Mageia LiveCD на жёсткий диск +Comment[sk]=Inštalovať Mageia Live systém na disk +Comment[sl]=Namestitev žive Mageje na trdi disk +Comment[sq]=Instalo Sistemin Aktual Mageia në hard disk +Comment[sv]=Installera ditt Mageia live system till disk +Comment[tr]=Mageia Çalışan CD sisteminizi diske yükleyin +Comment[uk]=Встановити портативну систему Mageia на диск +Comment[zh_CN]=将 Mageia live 系统安装到磁盘 +Comment[zh_TW]=將您的 Mageia live 系統安裝到硬碟 +Exec=/usr/bin/draklive-install +Icon=draklive-install +Terminal=false +Type=Application +Categories=GTK;X-Mageia-CrossDesktop;Settings; diff --git a/files/WIP/org.mageia.draklive-install-lock-storage.policy b/files/WIP/org.mageia.draklive-install-lock-storage.policy new file mode 100644 index 0000000..a73282f --- /dev/null +++ b/files/WIP/org.mageia.draklive-install-lock-storage.policy @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE policyconfig PUBLIC +"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN" +"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd"> +<policyconfig> + + <vendor>Mageia</vendor> + <vendor_url>http://www.mageia.org/</vendor_url> + + <action id="org.mageia.draklive-install-lock-storage.pkexec.run"> + <description>Run draklive-install</description> + <message>Authentication is required to run Mageia Draklive Installer</message> + <icon_name>draklive-install</icon_name> + <defaults> + <allow_any>yes</allow_any> + <allow_inactive>no</allow_inactive> + <allow_active>yes</allow_active> + </defaults> + <annotate key="org.freedesktop.policykit.exec.path">/usr/sbin/draklive-install-lock-storage</annotate> + <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate> + </action> +</policyconfig> diff --git a/files/WIP/org.mageia.draklive-install.policy b/files/WIP/org.mageia.draklive-install.policy new file mode 100644 index 0000000..dccc272 --- /dev/null +++ b/files/WIP/org.mageia.draklive-install.policy @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE policyconfig PUBLIC +"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN" +"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd"> +<policyconfig> + + <vendor>Mageia</vendor> + <vendor_url>http://www.mageia.org/</vendor_url> + + <action id="org.mageia.draklive-install.pkexec.run"> + <description>Run draklive-install</description> + <message>Authentication is required to run Mageia Draklive Installer</message> + <icon_name>draklive-install</icon_name> + <defaults> + <allow_any>yes</allow_any> + <allow_inactive>no</allow_inactive> + <allow_active>yes</allow_active> + </defaults> + <annotate key="org.freedesktop.policykit.exec.path">/usr/sbin/draklive-install</annotate> + <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate> + </action> +</policyconfig> |