From d660a768359fee65de067709badd4004008b9a8e Mon Sep 17 00:00:00 2001 From: Martin Whitaker Date: Thu, 5 Jan 2017 10:20:02 +0000 Subject: Revert "(temporary) Convert draklive-install to use polkit, not consolehelper." This reverts commit f740ecb1f5cec298aa05b8c946e3d06a1d446395. The draklive-install package has been updated to incorporate these changes. --- config/live.cfg | 7 - files/WIP/draklive-install | 450 --------------------- files/WIP/draklive-install.wrapper | 6 - files/WIP/mageia-draklive-install.desktop | 82 ---- ...org.mageia.draklive-install-lock-storage.policy | 22 - files/WIP/org.mageia.draklive-install.policy | 22 - 6 files changed, 589 deletions(-) delete mode 100755 files/WIP/draklive-install delete mode 100755 files/WIP/draklive-install.wrapper delete mode 100644 files/WIP/mageia-draklive-install.desktop delete mode 100644 files/WIP/org.mageia.draklive-install-lock-storage.policy delete mode 100644 files/WIP/org.mageia.draklive-install.policy diff --git a/config/live.cfg b/config/live.cfg index 252414d..fb6e849 100644 --- a/config/live.cfg +++ b/config/live.cfg @@ -103,13 +103,6 @@ my $_l = { (map { [ 'files/draksnapshot.sysconfig', $_ . '/.draksnapshot', { mode => 0644, no_install => 1 } ] } @user_config_dirs), [ 'files/compute-ooo-dicts.pl', '/usr/sbin/compute-ooo-dicts.pl', { mode => 0755 } ], [ 'files/compute-i18n-list.pl', '/usr/sbin/compute-i18n-list.pl', { mode => 0755 } ], - - # Changes to draklive-install - remove once these are pushed - [ 'files/WIP/draklive-install', '/usr/sbin/draklive-install', { mode => 0755 } ], - [ 'files/WIP/draklive-install.wrapper', '/usr/bin/draklive-install', { mode => 0755 } ], - [ 'files/WIP/mageia-draklive-install.desktop', '/usr/share/applications/mageia-draklive-install.desktop', { mode => 0644 } ], - [ 'files/WIP/org.mageia.draklive-install.policy', '/usr/share/polkit-1/actions/org.mageia.draklive-install.policy', { mode => 0644, no_install => 1 } ], - [ 'files/WIP/org.mageia.draklive-install-lock-storage.policy', '/usr/share/polkit-1/actions/org.mageia.draklive-install-lock-storage.policy', { mode => 0644, no_install => 1 } ], ], remove_files => [ (map { "/etc/modprobe.preload.d/$_" } qw(cpufreq pcmcia rfswitch)), diff --git a/files/WIP/draklive-install b/files/WIP/draklive-install deleted file mode 100755 index c831c5f..0000000 --- a/files/WIP/draklive-install +++ /dev/null @@ -1,450 +0,0 @@ -#!/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) = @_; - #- remove the extra permission draklive added - run_program::rooted($::prefix, 'sed', '-i', '/for draklive-install/d', '/etc/pam.d/polkit-1'); - 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 deleted file mode 100755 index 5a8f4eb..0000000 --- a/files/WIP/draklive-install.wrapper +++ /dev/null @@ -1,6 +0,0 @@ -#!/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 deleted file mode 100644 index ac88cdc..0000000 --- a/files/WIP/mageia-draklive-install.desktop +++ /dev/null @@ -1,82 +0,0 @@ -[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 deleted file mode 100644 index a73282f..0000000 --- a/files/WIP/org.mageia.draklive-install-lock-storage.policy +++ /dev/null @@ -1,22 +0,0 @@ - - - - - Mageia - http://www.mageia.org/ - - - Run draklive-install - Authentication is required to run Mageia Draklive Installer - draklive-install - - yes - no - yes - - /usr/sbin/draklive-install-lock-storage - true - - diff --git a/files/WIP/org.mageia.draklive-install.policy b/files/WIP/org.mageia.draklive-install.policy deleted file mode 100644 index dccc272..0000000 --- a/files/WIP/org.mageia.draklive-install.policy +++ /dev/null @@ -1,22 +0,0 @@ - - - - - Mageia - http://www.mageia.org/ - - - Run draklive-install - Authentication is required to run Mageia Draklive Installer - draklive-install - - yes - no - yes - - /usr/sbin/draklive-install - true - - -- cgit v1.2.1