diff options
Diffstat (limited to 'perl-install/any.pm')
| -rw-r--r-- | perl-install/any.pm | 633 |
1 files changed, 424 insertions, 209 deletions
diff --git a/perl-install/any.pm b/perl-install/any.pm index 33dcef642..3c452942f 100644 --- a/perl-install/any.pm +++ b/perl-install/any.pm @@ -9,6 +9,7 @@ use strict; use common; use detect_devices; use partition_table; +use fs::proc_partitions; use fs::type; use lang; use run_program; @@ -19,7 +20,7 @@ use fs; use c; sub facesdir() { - "$::prefix/usr/share/mdk/faces/"; + "$::prefix/usr/share/mga/faces/"; } sub face2png { my ($face) = @_; @@ -81,6 +82,7 @@ sub create_user { ? ('-l', $u->{name}, $u->{rename_from}) : $u->{name})); symlink($u->{home}, $symlink_home_from) if $symlink_home_from; + eval { run_program::rooted($::prefix, 'systemctl', 'try-restart', 'accounts-daemon.service') }; } my (undef, undef, $uid, $gid, undef, undef, undef, $home) = getpwnam($u->{name}); @@ -116,8 +118,7 @@ sub install_acpi_pkgs { my $acpi = bootloader::get_append_with_key($b, 'acpi'); my $use_acpi = !member($acpi, 'off', 'ht'); if ($use_acpi) { - $do_pkgs->ensure_is_installed('acpi', '/usr/bin/acpi', $::isInstall); - $do_pkgs->ensure_is_installed('acpid', '/usr/sbin/acpid', $::isInstall); + $do_pkgs->ensure_files_are_installed([ [ qw(acpi acpi) ], [ qw(acpid acpid) ] ], $::isInstall); } require services; services::set_status($_, $use_acpi, $::isInstall) foreach qw(acpi acpid); @@ -130,12 +131,13 @@ sub setupBootloaderBeforeStandalone { my $allow_fb = listlength(cat_("/proc/fb")); my $cmdline = cat_('/proc/cmdline'); my $vga_fb = first($cmdline =~ /\bvga=(\S+)/); - my $quiet = $cmdline =~ /\bsplash=silent\b/; - setupBootloaderBefore($do_pkgs, $b, $all_hds, $fstab, $keyboard, $allow_fb, $vga_fb, $quiet); + my $splash = $cmdline =~ /\bsplash\b/; + my $quiet = $cmdline =~ /\bquiet\b/; + setupBootloaderBefore($do_pkgs, $b, $all_hds, $fstab, $keyboard, $allow_fb, $vga_fb, $splash, $quiet); } sub setupBootloaderBefore { - my ($do_pkgs, $bootloader, $all_hds, $fstab, $keyboard, $allow_fb, $vga_fb, $quiet) = @_; + my ($_do_pkgs, $bootloader, $all_hds, $fstab, $keyboard, $allow_fb, $vga_fb, $splash, $quiet) = @_; require bootloader; #- auto_install backward compatibility @@ -144,12 +146,6 @@ sub setupBootloaderBefore { $bootloader->{message_text} = delete $bootloader->{message}; } - #- remove previous ide-scsi lines - bootloader::modify_append($bootloader, sub { - my ($_simple, $dict) = @_; - @$dict = grep { $_->[1] ne 'ide-scsi' } @$dict; - }); - if (cat_("/proc/cmdline") =~ /mem=nopentium/) { bootloader::set_append_with_key($bootloader, mem => 'nopentium'); } @@ -174,15 +170,19 @@ sub setupBootloaderBefore { bootloader::set_append_simple($bootloader, 'noresume'); } elsif (bootloader::get_append_simple($bootloader, 'noresume')) { } else { - my ($MemTotal) = cat_("/proc/meminfo") =~ /^MemTotal:\s*(\d+)/m; if (my ($biggest_swap) = sort { $b->{size} <=> $a->{size} } grep { isSwap($_) } @$fstab) { - log::l("MemTotal: $MemTotal < ", $biggest_swap->{size} / 2); - if ($MemTotal < $biggest_swap->{size} / 2) { - bootloader::set_append_with_key($bootloader, resume => fs::wild_device::from_part('', $biggest_swap)); - } + my $biggest_swap_dev = fs::wild_device::from_part('', $biggest_swap); + bootloader::set_append_with_key($bootloader, resume => $biggest_swap_dev); + mkdir_p("$::prefix/etc/dracut.conf.d"); + output("$::prefix/etc/dracut.conf.d/51-mageia-resume.conf", qq(add_device+="$biggest_swap_dev"\n)); } } + #- set nokmsboot if a conflicting driver is configured. + if (-x "$::prefix/sbin/display_driver_helper" && !run_program::rooted($::prefix, "/sbin/display_driver_helper", "--is-kms-allowed")) { + bootloader::set_append_simple($bootloader, 'nokmsboot'); + } + #- check for valid fb mode to enable a default boot with frame buffer. my $vga = $allow_fb && (!detect_devices::matching_desc__regexp('3D Rage LT') && !detect_devices::matching_desc__regexp('Rage Mobility [PL]') && @@ -203,12 +203,14 @@ sub setupBootloaderBefore { ); #- propose the default fb mode for kernel fb, if bootsplash is installed. - my $need_fb = $do_pkgs->are_installed('bootsplash'); + my $need_fb = -e "$::prefix/usr/share/bootsplash/scripts/make-boot-splash"; bootloader::suggest($bootloader, $all_hds, vga_fb => ($force_vga || $vga && $need_fb) && $vga_fb, + splash => $splash, quiet => $quiet); $bootloader->{keytable} ||= keyboard::keyboard2kmap($keyboard); + log::l("setupBootloaderBefore end"); } sub setupBootloader { @@ -223,7 +225,11 @@ sub setupBootloader { setupBootloader__boot_bios_drive($in, $b, $all_hds->{hds}) or goto general; { local $::Wizard_finished = 1 if $::isStandalone; - setupBootloader__entries($in, $b, $all_hds, $fstab) or goto general; + if (bootloader::main_method($b->{method}) eq 'grub2') { + setupBootloader__grub2($in, $b, $all_hds, $fstab) or goto general; + } else { + setupBootloader__entries($in, $b, $all_hds, $fstab) or goto general; + } } 1; } @@ -234,7 +240,9 @@ sub setupBootloaderUntilInstalled { my $before = fs::fstab_to_string($all_hds); setupBootloader($in, $b, $all_hds, $fstab, $security) or $in->exit; if ($before ne fs::fstab_to_string($all_hds)) { - #- for /tmp using tmpfs when "clean /tmp" is chosen + #- ovitters: This fstab comparison was needed for optionally + #- setting up /tmp using tmpfs. That code was removed. Not removing + #- this code as I'm not sure if something still relies on this fs::write_fstab($all_hds); } } while !installBootloader($in, $b, $all_hds); @@ -243,6 +251,9 @@ sub setupBootloaderUntilInstalled { sub installBootloader { my ($in, $b, $all_hds) = @_; return if detect_devices::is_xbox(); + + return 1 if arch() =~ /arm/; + install_bootloader_pkgs($in->do_pkgs, $b); eval { run_program::rooted($::prefix, 'echo | lilo -u') } if $::isInstall && !$::o->{isUpgrade} && -e "$::prefix/etc/lilo.conf" && glob("$::prefix/boot/boot.*"); @@ -274,11 +285,6 @@ Assign a new Volume ID?", $dev)))) { $in->ask_warn('', [ N("Installation of bootloader failed. The following error occurred:"), $err ]); return; } - } elsif (arch() =~ /ppc/) { - if (detect_devices::get_mac_model() !~ /IBM/) { - my $of_boot = bootloader::dev2yaboot($b->{boot}); - $in->ask_warn('', N("You may need to change your Open Firmware boot-device to\n enable the bootloader. If you do not see the bootloader prompt at\n reboot, hold down Command-Option-O-F at reboot and enter:\n setenv boot-device %s,\\\\:tbxi\n Then type: shut-down\nAt your next boot you should see the bootloader prompt.", $of_boot)); - } } 1; } @@ -290,7 +296,7 @@ sub setupBootloader_simple { require bootloader; bootloader::ensafe_first_bios_drive($hds) - || $b->{bootUnsafe} || arch() =~ /ppc/ or return 1; #- default is good enough + || $b->{bootUnsafe} or return 1; #- default is good enough if (arch() !~ /ia64/) { setupBootloader__mbr_or_not($in, $b, $hds, $fstab) or return 0; @@ -306,8 +312,7 @@ sub setupBootloader_simple { sub setupBootloader__boot_bios_drive { my ($in, $b, $hds) = @_; - if (arch() =~ /ppc/ || - !is_empty_hash_ref($b->{bios})) { + if (!is_empty_hash_ref($b->{bios})) { #- some bios mapping already there return 1; } elsif (bootloader::mixed_kind_of_disks($hds) && $b->{boot} =~ /\d$/) { #- on a partition @@ -318,7 +323,7 @@ sub setupBootloader__boot_bios_drive { log::l("_ask_boot_bios_drive"); my $hd = $in->ask_from_listf('', N("You decided to install the bootloader on a partition. -This implies you already have a bootloader on the hard drive you boot (eg: System Commander). +This implies you already have a bootloader on the hard disk drive you boot (eg: System Commander). On which drive are you booting?"), \&partition_table::description, $hds) or return 0; log::l("mixed_kind_of_disks chosen $hd->{device}"); @@ -326,19 +331,24 @@ On which drive are you booting?"), \&partition_table::description, $hds) or retu 1; } +sub _ask_mbr_or_not { + my ($in, $default, @l) = @_; + $in->ask_from_({ title => N("Bootloader Installation"), + interactive_help_id => 'setupBootloaderBeginner', + }, + [ + { label => N("Where do you want to install the bootloader?"), title => 1 }, + { val => \$default, list => \@l, format => sub { $_[0][0] }, type => 'list' }, + ] + ); + $default; +} + sub setupBootloader__mbr_or_not { my ($in, $b, $hds, $fstab) = @_; log::l("setupBootloader__mbr_or_not"); - if (arch() =~ /ppc/) { - if (defined $partition_table::mac::bootstrap_part) { - $b->{boot} = $partition_table::mac::bootstrap_part; - log::l("set bootstrap to $b->{boot}"); - } else { - die "no bootstrap partition - yaboot.conf creation failed"; - } - } else { my $floppy = detect_devices::floppy(); my @l = ( @@ -355,25 +365,19 @@ sub setupBootloader__mbr_or_not { ); my $default = find { $_->[1] eq $b->{boot} } @l; - $in->ask_from_({ title => N("Bootloader Installation"), - interactive_help_id => 'setupBootloaderBeginner', - }, - [ - { label => N("Where do you want to install the bootloader?"), title => 1 }, - { val => \$default, list => \@l, format => sub { $_[0][0] }, type => 'list' }, - ] - ); + if (!$::isInstall) { + $default = _ask_mbr_or_not($in, $default, @l); + } my $new_boot = $default->[1]; #- remove bios mapping if the user changed the boot device delete $b->{bios} if $new_boot && $new_boot ne $b->{boot}; $b->{boot} = $new_boot or return; - } 1; } sub setupBootloader__general { - my ($in, $b, $all_hds, $fstab, $security) = @_; + my ($in, $b, $all_hds, $fstab, $_security) = @_; return if detect_devices::is_xbox(); my @method_choices = bootloader::method_choices($all_hds); @@ -381,65 +385,57 @@ sub setupBootloader__general { my $prev_enable_apic = my $enable_apic = !bootloader::get_append_simple($b, 'noapic'); my $prev_enable_lapic = my $enable_lapic = !bootloader::get_append_simple($b, 'nolapic'); my $prev_enable_smp = my $enable_smp = !bootloader::get_append_simple($b, 'nosmp'); - my $prev_clean_tmp = my $clean_tmp = any { $_->{mntpoint} eq '/tmp' } @{$all_hds->{special} ||= []}; my $prev_boot = $b->{boot}; my $prev_method = $b->{method}; $b->{password2} ||= $b->{password} ||= ''; $::Wizard_title = N("Boot Style Configuration"); - if (arch() !~ /ppc/) { - my (@boot_devices, %boot_devices); + my (@boot_devices, %boot_devices); + if (is_uefi()) { + @boot_devices = 'ESP'; + %boot_devices = (ESP => N("EFI System Partition")); + } else { foreach (bootloader::allowed_boot_parts($b, $all_hds)) { my $dev = "/dev/$_->{device}"; push @boot_devices, $dev; - $boot_devices{$dev} = $_->{info} ? "$dev ($_->{info})" : $dev; + my $name = $_->{mntpoint} || $_->{info} || $_->{device_LABEL}; + unless ($name) { + $name = formatXiB($_->{size}*512) . " " if $_->{size}; + $name .= $_->{fs_type}; + } + $boot_devices{$dev} = $name ? "$dev ($name)" : $dev; } + } - $in->ask_from_({ #messages => N("Bootloader main options"), - title => N("Bootloader main options"), - interactive_help_id => 'setupBootloader', - }, [ + $in->ask_from_({ #messages => N("Bootloader main options"), + title => N("Bootloader main options"), + interactive_help_id => 'setupBootloader', + }, [ #title => N("Bootloader main options"), { label => N("Bootloader"), title => 1 }, - { label => N("Bootloader to use"), val => \$b->{method}, list => \@method_choices, format => \&bootloader::method2text }, - if_(arch() !~ /ia64/, - { label => N("Boot device"), val => \$b->{boot}, list => \@boot_devices, format => sub { $boot_devices{$_[0]} } }, - ), + { label => N("Bootloader to use"), val => \$b->{method}, + list => \@method_choices, format => \&bootloader::method2text }, + { label => N("Boot device"), val => \$b->{boot}, list => \@boot_devices, allow_empty_list => 1, + format => sub { $boot_devices{$_[0]} } }, { label => N("Main options"), title => 1 }, { label => N("Delay before booting default image"), val => \$b->{timeout} }, - { text => N("Enable ACPI"), val => \$force_acpi, type => 'bool' }, + { text => N("Enable ACPI"), val => \$force_acpi, type => 'bool', advanced => 1 }, { text => N("Enable SMP"), val => \$enable_smp, type => 'bool', advanced => 1 }, - { text => N("Enable APIC"), val => \$enable_apic, type => 'bool', advanced => 1, disabled => sub { !$enable_lapic } }, + { text => N("Enable APIC"), val => \$enable_apic, type => 'bool', advanced => 1, + disabled => sub { !$enable_lapic } }, { text => N("Enable Local APIC"), val => \$enable_lapic, type => 'bool', advanced => 1 }, - if_($security >= 4 || $b->{password} || $b->{restricted}, + { label => N("Security"), title => 1 }, { label => N("Password"), val => \$b->{password}, hidden => 1, validate => sub { - my $ok = $b->{password} eq $b->{password2} or $in->ask_warn('', [ N("The passwords do not match"), N("Please try again") ]); - my $ok2 = !($b->{password} && $b->{method} eq 'grub-graphic') or $in->ask_warn('', N("You can not use a password with %s", bootloader::method2text($b->{method}))); + my $ok = $b->{password} eq $b->{password2} + or $in->ask_warn('', [ N("The passwords do not match"), N("Please try again") ]); + my $ok2 = !($b->{password} && $b->{method} eq 'grub-graphic') + or $in->ask_warn('', N("You cannot use a password with %s", + bootloader::method2text($b->{method}))); $ok && $ok2; } }, { label => N("Password (again)"), val => \$b->{password2}, hidden => 1 }, - { text => N("Restrict command line options"), val => \$b->{restricted}, type => "bool", text => N("restrict"), - validate => sub { my $ok = !$b->{restricted} || $b->{password} or $in->ask_warn('', N("Option ``Restrict command line options'' is of no use without a password")); $ok } }, - ), - { text => N("Clean /tmp at each boot"), val => \$clean_tmp, type => 'bool', advanced => 1 }, ]) or return 0; - } else { - $b->{boot} = $partition_table::mac::bootstrap_part; - $in->ask_from_({ messages => N("Bootloader main options"), - title => N("Bootloader main options"), - interactive_help_id => 'setupYabootGeneral', - }, [ - { label => N("Bootloader to use"), val => \$b->{method}, list => \@method_choices, format => \&bootloader::method2text }, - { label => N("Init Message"), val => \$b->{'init-message'} }, - { label => N("Boot device"), val => \$b->{boot}, list => [ map { "/dev/$_" } (map { $_->{device} } (grep { isAppleBootstrap($_) } @$fstab)) ] }, - { label => N("Open Firmware Delay"), val => \$b->{delay} }, - { label => N("Kernel Boot Timeout"), val => \$b->{timeout} }, - { label => N("Enable CD Boot?"), val => \$b->{enablecdboot}, type => "bool" }, - { label => N("Enable OF Boot?"), val => \$b->{enableofboot}, type => "bool" }, - { label => N("Default OS?"), val => \$b->{defaultos}, list => [ 'linux', 'macos', 'macosx', 'darwin' ] }, - ]) or return 0; - } #- remove bios mapping if the user changed the boot device delete $b->{bios} if $b->{boot} ne $prev_boot; @@ -471,19 +467,60 @@ sub setupBootloader__general { ($enable_lapic ? \&bootloader::set_append_simple : \&bootloader::remove_append_simple)->($b, 'lapic'); } - if ($prev_clean_tmp != $clean_tmp) { - if ($clean_tmp && !fs::get::has_mntpoint('/tmp', $all_hds)) { - push @{$all_hds->{special}}, { device => 'none', mntpoint => '/tmp', fs_type => 'tmpfs' }; - } else { - @{$all_hds->{special}} = grep { $_->{mntpoint} ne '/tmp' } @{$all_hds->{special}}; - } - } - if (bootloader::main_method($prev_method) eq 'lilo' && bootloader::main_method($b->{method}) eq 'grub') { log::l("switching for lilo to grub, ensure we don't read lilo.conf anymore"); renamef("$::prefix/etc/lilo.conf", "$::prefix/etc/lilo.conf.unused"); } + if ($prev_method eq 'refind' && $b->{method} ne 'refind') { + log::l("switching from rEFInd, ensure we don't detect refind as the active boot method"); + renamef("$::prefix/boot/refind_linux.conf", "$::prefix/boot/refind_linux.conf.unused"); + } + if ($b->{method} eq 'refind') { + if (bootloader::main_method($prev_method) eq 'grub2') { + #- grub2 doesn't provide any entries we can use, so revert to the defaults + %$b = (); + setupBootloaderBeforeStandalone($in->do_pkgs, $b, $all_hds, $fstab); + $b->{method} = 'refind'; + $b->{boot} = 'ESP'; + undef $b->{default}; + } + setupBootloader__refind($in, $b, $fstab); + } else { + 1; + } +} + +sub setupBootloader__refind { + my ($in, $b, $fstab) = @_; + + my $already_in_refind = -e "$::prefix/boot/EFI/EFI/refind/refind.conf"; + my $already_in_default = -e "$::prefix/boot/EFI/EFI/BOOT/refind.conf"; + my $already_installed = $already_in_refind || $already_in_default; + + my $update_esp = !$already_installed; + my $as_default = $already_in_default; + $in->ask_from_( + { + title => N("Bootloader Configuration"), + interactive_help_id => 'setupBootloader', + }, + [ + { text => N("Install or update rEFInd in the EFI system partition"), + val => \$update_esp, type => 'bool', disabled => sub { !$already_installed } }, + { text => N("Install in /EFI/BOOT (workaround for some BIOSs)"), + val => \$as_default, type => 'bool', disabled => sub { !$update_esp } }, + ] + ) or return 0; + + if ($update_esp) { + $b->{install_mode} = $as_default ? 'as_default' : 'as_refind'; + } else { + $b->{install_mode} = $as_default ? 'no_install' : 'nvram_only'; + } + if (my @esp = grep { $_->{mntpoint} eq '/boot/EFI' } @$fstab) { + $b->{esp_device} = $esp[0]{real_device} || fs::wild_device::from_part('', $esp[0]); + } 1; } @@ -503,22 +540,29 @@ sub setupBootloader__entries { my %root_descr = map { my $info = delete $hd_infos{$_->{rootDevice}}; my $dev = "/dev/$_->{device}"; - my $info_ = $info ? "$dev ($info)" : $dev; + my $hint = $info || $_->{info} || $_->{device_LABEL}; + my $info_ = $hint ? "$dev ($hint)" : $dev; ($dev => $info_, fs::wild_device::from_part('', $_) => $info_); } @$fstab; my @l; - if ($e->{type} eq "image") { + if ($b->{method} eq 'refind') { + @l = ( + { label => N("Label"), val => \$e->{label} }, + { label => N("Append"), val => \$append }, + { label => N("Video mode"), val => \$vga, list => [ '', Xconfig::resolution_and_depth::bios_vga_modes() ], + format => \&Xconfig::resolution_and_depth::to_string, advanced => 1 }, + ); + } elsif ($e->{type} eq "image") { @l = ( { label => N("Image"), val => \$e->{kernel_or_dev}, list => [ map { "/boot/$_" } bootloader::installed_vmlinuz() ], not_edit => 0 }, -{ label => N("Root"), val => \$e->{root}, list => [ map { fs::wild_device::from_part('', $_) } @$fstab ], format => sub { $root_descr{$_[0]} } }, +{ label => N("Root"), val => \$e->{root}, list => [ map { fs::wild_device::from_part('', $_) } grep { !isSwap($_) } @$fstab ], format => sub { $root_descr{$_[0]} } }, { label => N("Append"), val => \$append }, if_($e->{xen}, { label => N("Xen append"), val => \$e->{xen_append} } ), - if_(arch() !~ /ppc|ia64/, + if_($b->{password}, { label => N("Requires password to boot"), val => \$e->{lock}, type => "bool" }), { label => N("Video mode"), val => \$vga, list => [ '', Xconfig::resolution_and_depth::bios_vga_modes() ], format => \&Xconfig::resolution_and_depth::to_string, advanced => 1 }, -), { label => N("Initrd"), val => \$e->{initrd}, list => [ map { if_(/^initrd/, "/boot/$_") } all("$::prefix/boot") ], not_edit => 0, advanced => 1 }, { label => N("Network profile"), val => \$netprofile, list => [ sort(uniq('', $netprofile, network::network::netprofile_list())) ], advanced => 1 }, ); @@ -527,26 +571,16 @@ sub setupBootloader__entries { { label => N("Root"), val => \$e->{kernel_or_dev}, list => [ map { "/dev/$_->{device}" } @$fstab, detect_devices::floppies() ] }, ); } - if (arch() !~ /ppc/) { + if ($b->{method} ne 'refind') { @l = ( { label => N("Label"), val => \$e->{label} }, @l, { text => N("Default"), val => \$default, type => 'bool' }, ); - } else { - unshift @l, { label => N("Label"), val => \$e->{label}, list => ['macos', 'macosx', 'darwin'] }; - if ($e->{type} eq "image") { - @l = ({ label => N("Label"), val => \$e->{label} }, - (@l[1..2], { label => N("Append"), val => \$append }), - { label => N("NoVideo"), val => \$e->{novideo}, type => 'bool' }, - { text => N("Default"), val => \$default, type => 'bool' } - ); - } } - $in->ask_from_( { - interactive_help_id => arch() =~ /ppc/ ? 'setupYabootAddEntry' : 'setupBootloaderAddEntry', + interactive_help_id => 'setupBootloaderAddEntry', callbacks => { complete => sub { $e->{label} or $in->ask_warn('', N("Empty label not allowed")), return 1; @@ -569,17 +603,22 @@ sub setupBootloader__entries { my $Add = sub { my @labels = map { $_->{label} } @{$b->{entries}}; my ($e, $prefix); - if ($in->ask_from_list_('', N("Which type of entry do you want to add?"), - [ N_("Linux"), arch() =~ /sparc/ ? N_("Other OS (SunOS...)") : arch() =~ /ppc/ ? - N_("Other OS (MacOS...)") : N_("Other OS (Windows...)") ] - ) eq "Linux") { + if ($b->{method} eq 'refind') { + $e = { type => 'image', + kernel_or_dev => '/boot/vmlinuz', + root => '/dev/' . fs::get::root($fstab)->{device}, #- assume a good default. + }; + $prefix = "linux"; + } elsif ($in->ask_from_list_('', N("Which type of entry do you want to add?"), + [ N_("Linux"), N_("Other OS (Windows...)") ] + ) eq "Linux") { $e = { type => 'image', root => '/dev/' . fs::get::root($fstab)->{device}, #- assume a good default. }; $prefix = "linux"; } else { $e = { type => 'other' }; - $prefix = arch() =~ /sparc/ ? "sunos" : arch() =~ /ppc/ ? "macos" : "windows"; + $prefix = "windows"; } $e->{label} = $prefix; for (my $nb = 0; member($e->{label}, @labels); $nb++) { @@ -600,9 +639,9 @@ sub setupBootloader__entries { my $Up = sub { my ($e) = @_; my @entries = @{$b->{entries}}; - my ($index) = grep { $entries[$_]->{label} eq $e->{label} } 0..$#entries; + my ($index) = grep { $entries[$_]{label} eq $e->{label} } 0..$#entries; if ($index > 0) { - (@{$b->{entries}}->[$index - 1], @{$b->{entries}}->[$index]) = (@{$b->{entries}}->[$index], @{$b->{entries}}->[$index - 1]); + ($b->{entries}[$index - 1], $b->{entries}[$index]) = ($b->{entries}[$index], $b->{entries}[$index - 1]); } 1; }; @@ -610,21 +649,33 @@ sub setupBootloader__entries { my $Down = sub { my ($e) = @_; my @entries = @{$b->{entries}}; - my ($index) = grep { $entries[$_]->{label} eq $e->{label} } 0..$#entries; + my ($index) = grep { $entries[$_]{label} eq $e->{label} } 0..$#entries; if ($index < $#entries) { - (@{$b->{entries}}->[$index + 1], @{$b->{entries}}->[$index]) = (@{$b->{entries}}->[$index], @{$b->{entries}}->[$index + 1]); + ($b->{entries}[$index + 1], $b->{entries}[$index]) = ($b->{entries}[$index], $b->{entries}[$index + 1]); } 1; }; my @prev_entries = @{$b->{entries}}; + + #- the rEFInd configuration file just provides alternative kernel command lines + #- so we only want to display entries that relate to the default kernel. + if ($b->{method} eq 'refind') { + @{$b->{entries}} = + grep { + my $pb = $_->{type} ne 'image' || $_->{kernel_or_dev} ne '/boot/vmlinuz'; + log::l("dropping bootloader entry $_->{label} because it is not needed by rEFInd") if $pb; + !$pb; + } @{$b->{entries}}; + } + if ($in->ask_from__add_modify_remove(N("Bootloader Configuration"), N("Here are the entries on your boot menu so far. You can create additional entries or change the existing ones."), [ { format => sub { my ($e) = @_; ref($e) ? - ($b->{default} eq $e->{label} ? " * " : " ") . "$e->{label} ($e->{kernel_or_dev})" : + ($b->{default} eq $e->{label} ? " * " : " ") . "$e->{label} ($e->{kernel_or_dev})" : translate($e); }, list => $b->{entries}, } ], Add => $Add, Modify => $Modify, Remove => $Remove, Up => $Up, Down => $Down)) { @@ -635,35 +686,127 @@ You can create additional entries or change the existing ones."), [ { } } +sub setupBootloader__grub2 { + my ($in, $b, $_all_hds, $_fstab) = @_; + + # update entries (so that we can display their list below): + my $error; + # grub2-update can take many minutes on some systems (mga#18538) + # FIXME: change the message to be more informative + my $_w = $in->wait_message(N("Please wait"), N("Please wait")); + run_program::rooted($::prefix, 'update-grub2', '2>', \$error) or die "update-grub2 failed: $error"; + undef $_w; + + # read grub2 auto-generated entries (instead of keeping eg: grub/lilo ones): + my $b2 = bootloader::read_grub2(); + + # get default parameters: + my $append = $b->{perImageAppend} || bootloader::get_grub2_append($b2); + my $default = $b2->{default}; + + require Xconfig::resolution_and_depth; + + require network::network; #- to list network profiles + my $vga = Xconfig::resolution_and_depth::from_bios($b->{default_vga}); + my $os_prober = $in->do_pkgs->is_installed('os-prober', '/usr/bin/os-prober'); + + my $res = $in->ask_from_( + { + title => N("Bootloader Configuration"), + interactive_help_id => 'setupBootloaderAddEntry', + }, + [ + { label => N("Default"), val => \$default, + list => [ map { $_->{label} } @{$b2->{entries}} ] }, + { label => N("Append"), val => \$append }, + { label => N("Video mode"), val => \$vga, list => [ '', Xconfig::resolution_and_depth::bios_vga_modes() ], + format => \&Xconfig::resolution_and_depth::to_string, advanced => 1 }, + { text => N("Do not touch ESP or MBR"), val => \$b->{no_esp_or_mbr}, type => 'bool', advanced => 1, + validate => sub { + $b->{no_esp_or_mbr} and $in->ask_warn(N("Warning"), + N("Not installing on ESP or MBR means that the installation is not bootable unless chain loaded from another OS!")); + 1; + }, + }, + { text => N("Probe Foreign OS"), val => \$os_prober, type => 'bool', + help => N("If grub2 takes too long to install, you can use this option to skip detecting other OSes and make it fast"), + }, + ]); + if ($res) { + $b->{entries} = $b2->{entries}; + $b->{default} = $default; + $b->{default_vga} = ref($vga) ? $vga->{bios} : $vga; + $b->{perImageAppend} = $append; + if ($os_prober) { + $in->do_pkgs->ensure_is_installed('os-prober', '/usr/bin/os-prober'); + } else { + $in->do_pkgs->remove('os-prober'); + } + 1; + } else { + ''; + } +} + +sub get_session_file { + my ($desktop) = @_; + my $xsession_file = find { + my %xsession = read_gnomekderc($_, 'Desktop Entry'); + $xsession{Name} =~ s/\s+//g; + $xsession{Name} eq ${desktop}; + } glob("$::prefix/usr/share/xsessions/*.desktop"); + $xsession_file =~ s!\.[^.]+$!!; + $xsession_file =~ s!.*/!!; + $xsession_file ||= $desktop; + return $xsession_file; +} + +sub get_session_file_with_extension { + return get_session_file(@_) . '.desktop'; +} + +sub available_dms() { + my @l; + foreach (glob("$::prefix/usr/share/X11/dm.d/*.conf")) { + my %dm = getVarsFromSh($_); + push @l, $dm{EXEC} if $dm{EXEC} && -x "$::prefix/$dm{EXEC}"; + } + @l; +} + sub get_autologin() { my %desktop = getVarsFromSh("$::prefix/etc/sysconfig/desktop"); my $gdm_file = "$::prefix/etc/X11/gdm/custom.conf"; - my $kdm_file = common::read_alternative('kdm4-config'); + my $sddm_file = "$::prefix/etc/sddm.conf"; + my $lightdm_conffile = "$::prefix/etc/lightdm/lightdm.conf.d/50-mageia-autologin.conf"; + my $lxdm_conffile = "$::prefix/etc/lxdm/lxdm.conf"; my $autologin_file = "$::prefix/etc/sysconfig/autologin"; my $desktop = $desktop{DESKTOP} || first(sessions()); my %desktop_to_dm = ( GNOME => 'gdm', - KDE4 => 'kdm', - xfce4 => 'gdm', - LXDE => 'gdm', - ); - my %dm_canonical = ( - gnome => 'gdm', - kde => 'kdm', + Plasma => 'sddm', + Xfce => 'lightdm', + LXDE => 'lxdm', ); my $dm = - lc($desktop{DISPLAYMANAGER}) || + basename(readlink("$::prefix/etc/systemd/system/display-manager.service")) =~ s/(.*)\.service/$1/r || $desktop_to_dm{$desktop} || - basename(chomp_(run_program::rooted_get_stdout($::prefix, "/etc/X11/lookupdm"))); - $dm = $dm_canonical{$dm} if exists $dm_canonical{$dm}; + basename(first(available_dms())); my $autologin_user; if ($dm eq "gdm") { my %conf = read_gnomekderc($gdm_file, 'daemon'); $autologin_user = text2bool($conf{AutomaticLoginEnable}) && $conf{AutomaticLogin}; - } elsif ($dm eq "kdm") { - my %conf = read_gnomekderc($kdm_file, 'X-:0-Core'); - $autologin_user = text2bool($conf{AutoLoginEnable}) && $conf{AutoLoginUser}; + } elsif ($dm eq "sddm") { + my %conf = read_gnomekderc($sddm_file, 'Autologin'); + $autologin_user = $conf{User}; + } elsif ($dm eq "lightdm") { + my %conf = read_gnomekderc($lightdm_conffile, 'Seat:*'); + $autologin_user = text2bool($conf{'#dummy-autologin'}) && $conf{"autologin-user"}; + } elsif ($dm eq "lxdm") { + my %conf = read_gnomekderc($lxdm_conffile, 'base'); + $autologin_user = $conf{autologin}; + $autologin_user =~ s/^.//; } else { my %conf = getVarsFromSh($autologin_file); $autologin_user = text2bool($conf{AUTOLOGIN}) && $conf{USER}; @@ -672,25 +815,30 @@ sub get_autologin() { { user => $autologin_user, desktop => $desktop, dm => $dm }; } +sub is_standalone_autologin_needed { + my ($dm) = @_; + return member($dm, qw(slim xdm)); +} + sub set_autologin { - my ($do_pkgs, $autologin) = @_; + my ($do_pkgs, $autologin, $o_auto) = @_; log::l("set_autologin $autologin->{user} $autologin->{desktop}"); my $do_autologin = bool2text($autologin->{user}); $autologin->{dm} ||= 'xdm'; - $do_pkgs->ensure_is_installed($autologin->{dm}) + $do_pkgs->ensure_is_installed($autologin->{dm}, undef, $o_auto) or return; - if ($autologin->{user} && $autologin->{dm} eq 'xdm') { - $do_pkgs->ensure_is_installed('autologin', '/usr/bin/startx.autologin') + if ($autologin->{user} && is_standalone_autologin_needed($autologin->{dm})) { + $do_pkgs->ensure_is_installed('autologin', '/usr/bin/startx.autologin', $o_auto) or return; } - #- Configure KDM / MDKKDM - my $kdm_conffile = common::read_alternative('kdm4-config'); - eval { common::update_gnomekderc_no_create($kdm_conffile, 'X-:0-Core' => ( - AutoLoginEnable => $do_autologin, - AutoLoginUser => $autologin->{user}, - )) } if -e $kdm_conffile; + #- Configure SDDM + my $sddm_conffile = "$::prefix/etc/sddm.conf"; + eval { common::update_gnomekderc_no_create($sddm_conffile, 'Autologin' => ( + Session => get_session_file_with_extension($autologin->{desktop}), + User => $autologin->{user}, + )) } if -e $sddm_conffile; #- Configure GDM my $gdm_conffile = "$::prefix/etc/X11/gdm/custom.conf"; @@ -699,8 +847,28 @@ sub set_autologin { AutomaticLogin => $autologin->{user}, )) } if -e $gdm_conffile; + #- Configure LIGHTDM + my $lightdm_conffile = "$::prefix/etc/lightdm/lightdm.conf.d/50-mageia-autologin.conf"; + eval { update_gnomekderc($lightdm_conffile, 'Seat:*' => ( + '#dummy-autologin' => $do_autologin, + 'autologin-user' => $autologin->{user}, + 'autologin-session' => get_session_file($autologin->{desktop}), + )) } if -e $lightdm_conffile; + + #- Configure LXDM + my $lxdm_conffile = "$::prefix/etc/lxdm/lxdm.conf"; + eval { update_gnomekderc($lxdm_conffile, 'base' => ( + 'autologin' => $autologin->{user} ? '@' . $autologin->{user} : '' + )); + if ($autologin->{user} && $autologin->{desktop} && !member($autologin->{desktop}, qw(default failsafe))) { + update_gnomekderc($lxdm_conffile, $autologin->{user} => ( + 'user' => $autologin->{user}, + 'session' => get_session_file($autologin->{desktop}), + )) } } if -e $lxdm_conffile; + + #- Configure XDM my $xdm_autologin_cfg = "$::prefix/etc/sysconfig/autologin"; - if ($autologin->{dm} eq 'xdm') { + if (is_standalone_autologin_needed($autologin->{dm})) { setVarsInShMode($xdm_autologin_cfg, 0644, { USER => $autologin->{user}, AUTOLOGIN => bool2yesno($autologin->{user}), EXEC => '/usr/bin/startx.autologin' }); } else { @@ -712,6 +880,7 @@ sub set_autologin { $desktop{DESKTOP} = $autologin->{desktop}; $desktop{DISPLAYMANAGER} = $autologin->{dm}; setVarsInSh($sys_conffile, \%desktop); + symlinkf("/usr/lib/systemd/system/$autologin->{dm}.service", "$::prefix/etc/systemd/system/display-manager.service"); if ($autologin->{user}) { my $home = (getpwnam($autologin->{user}))[7]; @@ -757,7 +926,7 @@ sub writeandclean_ldsoconf { my @l = chomp_(cat_($file)); my @default = ('/lib', '/usr/lib'); #- no need to have /lib and /usr/lib in ld.so.conf - my @suggest = ('/usr/X11R6/lib', '/usr/lib/qt3/lib'); #- needed for upgrade where package renaming can cause this to disappear + my @suggest = ('/usr/lib/qt3/lib'); #- needed for upgrade where package renaming can cause this to disappear if (arch() =~ /x86_64/) { @default = map { $_, $_ . '64' } @default; @@ -807,7 +976,7 @@ sub ask_user { } sub is_xguest_installed() { - -e "$::prefix/etc/security/namespace.d/guest.conf"; + -e "$::prefix/etc/security/namespace.d/xguest.conf"; } sub ask_user_and_root { @@ -852,19 +1021,21 @@ sub ask_user_and_root { my $id = $u->{$field} or return 'ok'; my $name = $field eq 'uid' ? N("User ID") : N("Group ID"); $id =~ /^\d+$/ or $in->ask_warn('', N("%s must be a number", $name)), return; - $id >= 500 or $in->ask_yesorno('', N("%s should be above 500. Accept anyway?", $name)) or return; + $id >= 1000 or $in->ask_yesorno('', N("%s should be above 1000. Accept anyway?", $name)) or return; 'ok'; }; my $ret = $in->ask_from_( { title => N("User management"), interactive_help_id => 'addUser', if_($::isInstall && $superuser, cancel => ''), - focus_first => 1, }, [ $superuser ? ( + if_(0, { text => N("Enable guest account"), val => \$xguest, type => 'bool', advanced => 1 }, + ), { label => N("Set administrator (root) password"), title => 1 }, { label => N("Password"), val => \$superuser->{password}, hidden => 1, alignment => 'right', weakness_check => 1, + focus => sub { 1 }, validate => sub { authentication::check_given_password($in, $superuser, 2 * $security) } }, { label => N("Password (again)"), val => \$superuser->{password2}, hidden => 1, alignment => 'right' }, ) : (), @@ -875,8 +1046,10 @@ sub ask_user_and_root { ), { label => N("Real name"), val => \$u->{realname}, alignment => 'right', focus_out => sub { $u->{name} ||= lc(Locale::gettext::iconv($u->{realname}, "utf-8", "ascii//TRANSLIT")); - $u->{name} =~ s/[^a-zA-Z0-9_-]//g; # drop any charcter that would break login program - } }, + $u->{name} =~ s/[^a-zA-Z0-9_-]//g; # drop any character that would break login program + }, + focus => sub { !$superuser }, + }, { label => N("Login name"), val => \$u->{name}, list => \@suggested_names, alignment => 'right', not_edit => 0, validate => $validate_name }, @@ -886,16 +1059,17 @@ sub ask_user_and_root { { label => N("Shell"), val => \$u->{shell}, list => [ shells() ], advanced => 1 }, { label => N("User ID"), val => \$u->{uid}, advanced => 1, validate => sub { $validate_uid_gid->('uid') } }, { label => N("Group ID"), val => \$u->{gid}, advanced => 1, validate => sub { $validate_uid_gid->('gid') } }, - if_($security > 3, + if_($security >= 1, + { label => N("Extra Groups:"), advanced => 1, title => 1 }, map { - { label => $_, val => \$groups{$_}, text => $high_security_groups{$_}, type => 'bool' }; + { label => $_, val => \$groups{$_}, text => $high_security_groups{$_}, type => 'bool', advanced => 1 }; } keys %high_security_groups, ), ], ); if ($xguest && !is_xguest_installed()) { - $in->do_pkgs->ensure_is_installed('xguest', '/etc/security/namespace.d/guest.conf'); + $in->do_pkgs->ensure_is_installed('xguest', '/etc/security/namespace.d/xguest.conf'); } elsif (!$xguest && is_xguest_installed()) { $in->do_pkgs->remove('xguest') or return; } @@ -908,7 +1082,10 @@ sub ask_user_and_root { } sub sessions() { - split(' ', run_program::rooted_get_stdout($::prefix, '/usr/sbin/chksession', '-l')); + my $old = chdir('$::prefix/usr/share/xsessions/'); + my @l = map { s/.desktop$//; $_ } glob("*.desktop"); + chdir($old); + @l; } sub sessions_with_order() { my %h = map { /(.*)=(.*)/ } split(' ', run_program::rooted_get_stdout($::prefix, '/usr/sbin/chksession', '-L')); @@ -918,18 +1095,28 @@ sub sessions_with_order() { sub urpmi_add_all_media { my ($in, $o_previous_release) = @_; - my $binary = find { whereis_binary($_, $::prefix) } 'gurpmi.addmedia', 'urpmi.addmedia' or return; + my $binary = find { whereis_binary($_, $::prefix) } if_(check_for_xserver(), 'gurpmi.addmedia'), 'urpmi.addmedia'; + if (!$binary) { + log::l("urpmi.addmedia not found!"); + return; + } #- configure urpmi media if network is up require network::tools; - return if !network::tools::has_network_connection(); + if (!network::tools::has_network_connection()) { + log::l("no network connexion!"); + return; + } + # First remove all media: + run_program::rooted($::prefix, 'urpmi.removemedia', '-a'); + # Then add online media: my $wait; my @options = ('--distrib', '--mirrorlist', '$MIRRORLIST'); if ($binary eq 'urpmi.addmedia') { $wait = $in->wait_message(N("Please wait"), N("Please wait, adding media...")); } elsif ($in->isa('interactive::gtk')) { push @options, '--silent-success'; - mygtk2::flush(); + mygtk3::flush(); } my $reason = join(',', $o_previous_release ? @@ -939,7 +1126,29 @@ sub urpmi_add_all_media { local $ENV{URPMI_ADDMEDIA_REASON} = $reason; my $log_file = '/root/drakx/updates.log'; - run_program::rooted($::prefix, $binary, '>>', $log_file, '2>>', $log_file, @options); + my $val = run_program::rooted($::prefix, $binary, '>>', $log_file, '2>>', $log_file, @options); + + undef $wait; + $val; +} + +sub format_wm { + my ($wm) = @_; + return { + cinnamon => 'Cinnamon', + enlightenment => 'Enlightenment', + 'gnome-classic' => 'GNOME Classic', + gnome => 'GNOME', + i3 => 'I3', + 'i3-with-shmlog' => 'I3 with shmlog', + lxqt => 'LxQt', + mate => 'Mate', + openbox => 'OpenBox', + 'plasma-mediacenter' => 'Plasma Mediacenter', + '01plasma' => 'Plasma', + sugar => 'Sugar', + xfce => 'Xfce', + }->{$wm}; } sub autologin { @@ -960,7 +1169,7 @@ sub autologin { messages => N("I can set up your computer to automatically log on one user.") }, [ { text => N("Use this feature"), val => \$use_autologin, type => 'bool' }, { label => N("Choose the default user:"), val => \$o->{autologin}, list => \@users, disabled => sub { !$use_autologin } }, - { label => N("Choose the window manager to run:"), val => \$o->{desktop}, list => \@wm, disabled => sub { !$use_autologin } } ] + { label => N("Choose the window manager to run:"), val => \$o->{desktop}, list => \@wm, disabled => sub { !$use_autologin }, format => \&format_wm } ] ); delete $o->{autologin} if !$use_autologin; } else { @@ -972,38 +1181,33 @@ sub display_release_notes { my ($in, $release_notes) = @_; if (!$in->isa('interactive::gtk')) { $in->ask_from_({ title => N("Release Notes"), - messages => $release_notes, #formatAlaTeX(messages::main_license()), + messages => $release_notes, }, [ {} ]); return; } - # workaround too small fonts: - $release_notes =~ s!(<head>)!$1 <style type="text/css"> - body { font-family: sans-serif; font-size: 13px } - table { font-family: sans-serif; font-size: 13px } - </style>!x; - - require Gtk2::WebKit; - require ugtk2; - ugtk2->import(':all'); - require mygtk2; - mygtk2->import('gtknew'); - my $view = gtknew('WebKit_View', no_popup_menu => 1); - $view->load_html_string($release_notes, '/'); + require Gtk3::WebKit2; + Gtk3::WebKit2->import; + require ugtk3; + ugtk3->import(':all'); + require mygtk3; + mygtk3->import('gtknew'); + my $view = gtknew('WebKit2_WebView', no_popup_menu => 1); + $view->load_html($release_notes, '/'); - my $w = ugtk2->new(N("Release Notes"), transient => $::main_window, modal => 1, pop_it => 1); + my $w = ugtk3->new(N("Release Notes"), transient => $::main_window, modal => 1, pop_it => 1); gtkadd($w->{rwindow}, - gtkpack_(Gtk2::VBox->new, - 1, create_scrolled_window(ugtk2::gtkset_border_width($view, 5), + gtkpack_(Gtk3::VBox->new, + 1, create_scrolled_window(ugtk3::gtkset_border_width($view, 5), [ 'never', 'automatic' ], ), 0, gtkpack(create_hbox('end'), gtknew('Button', text => N("Close"), - clicked => sub { Gtk2->main_quit }) + clicked => sub { Gtk3->main_quit }) ), ), ); - mygtk2::set_main_window_size($w->{rwindow}); + mygtk3::set_main_window_size($w->{rwindow}); $w->{real_window}->grab_focus; $w->{real_window}->show_all; $w->main; @@ -1024,7 +1228,7 @@ sub get_release_notes { my $d = find { -e "$_/$file" } glob_("/usr/share/doc/*-release-*"); $d && cat_("$d/$file"); } - } "release-notes$ext", 'release-notes.' . arch() . $ext); + } "release-notes$ext", 'release-notes.' . $ext); # we do not handle links: $release_notes =~ s!<a href=".*?">(.*?)</a>!$1!g; @@ -1034,26 +1238,22 @@ sub get_release_notes { sub run_display_release_notes { my ($release_notes) = @_; output('/tmp/release_notes.html', $release_notes); + local $ENV{LC_ALL} = $::o->{locale}{lang} || 'C'; run_program::raw({ detach => 1 }, '/usr/bin/display_release_notes.pl'); } sub acceptLicense { - my ($in, $google) = @_; + my ($in) = @_; require messages; my $release_notes = get_release_notes($in); my $r = $::testing ? 'Accept' : 'Refuse'; - my $license = join("\n\n\n", - messages::main_license($google, $google), - messages::warning_about_patents(), - if_($google, messages::google_provisions())); - $in->ask_from_({ title => N("License agreement"), focus_first => 1, cancel => N("Quit"), - messages => formatAlaTeX($license), + messages => formatAlaTeX(messages::main_license()), interactive_help_id => 'acceptLicense', callbacks => { ok_disabled => sub { $r eq 'Refuse' } }, }, @@ -1078,7 +1278,7 @@ sub reboot() { $o->exit; } else { # when refusing license in finish-install: - exec("/sbin/reboot"); + exec("/bin/reboot"); } } @@ -1114,10 +1314,11 @@ sub selectLanguage_install { my $non_utf8 = 0; add2hash($common, { cancel => '', focus_first => 1, - advanced_messages => formatAlaTeX(N("Mandriva Linux can support multiple languages. Select + advanced_messages => formatAlaTeX(N("%s can support multiple languages. Select the languages you would like to install. They will be available -when your installation is complete and you restart your system.")), - advanced_label => N("Multi languages"), +when your installation is complete and you restart your system.", N("Mageia"))), + advanced_label => N("Multiple languages"), + advanced_title => N("Select Additional Languages"), }); $in->ask_from_($common, [ @@ -1161,7 +1362,7 @@ sub selectLanguage_standalone { ]); $locale->{utf8} = !$non_utf8; lang::set($locale); - Gtk2->set_locale if $in->isa('interactive::gtk'); + c::init_setlocale() if $in->isa('interactive::gtk'); lang::lang_changed($locale) if $old_lang ne $locale->{lang}; } @@ -1205,7 +1406,7 @@ sub selectCountry { $in->ask_from_( { title => N("Country / Region"), messages => N("Please choose your country"), - interactive_help_id => 'misc-params.html#drakxid-selectCountry', + interactive_help_id => 'selectCountry.html', if_(@best, advanced_messages => N("Here is the full list of available countries")), advanced_label => @best ? N("Other Countries") : N("Advanced"), }, @@ -1231,26 +1432,35 @@ sub set_login_serial_console { substInFile { s/^s$port:.*//; $_ = $line if eof } "$::prefix/etc/inittab"; } -sub report_bug { - my (@other) = @_; - - sub header { " +sub header { " ******************************************************************************** * $_[0] ********************************************************************************"; - } +} + +sub fdisk() { + my @devs = grep { !m!^/dev/(loop|ram)\d+! && !/\d$/ } map { "/dev/$_->{dev}" } fs::proc_partitions::read_raw(); + `fdisk -l @devs`; + +} + +sub report_bug { + my (@other) = @_; join '', map { chomp; "$_\n" } header("lspci"), detect_devices::stringlist(), + header("hid_devices"), (map { sprintf("%-16s: %s", $_->{driver} || "unknown", $_->{description}) } c::hid_probe()), + header("input devices"), cat_("/proc/bus/input/devices"), + header("libinput devices"), `libinput list-devices`, header("pci_devices"), cat_("/proc/bus/pci/devices"), - header("dmidecode"), `dmidecode`, - header("fdisk"), arch() =~ /ppc/ ? `pdisk -l` : `fdisk -l`, + header("dmidecode"), arch() =~ /86/ ? `dmidecode` : (), + header("fdisk"), fdisk(), header("scsi"), cat_("/proc/scsi/scsi"), header("/sys/bus/scsi/devices"), -d '/sys/bus/scsi/devices' ? `ls -l /sys/bus/scsi/devices` : (), header("lsmod"), cat_("/proc/modules"), header("cmdline"), cat_("/proc/cmdline"), header("pcmcia: stab"), cat_("$::prefix/var/lib/pcmcia/stab") || cat_("$::prefix/var/run/stab"), - header("usb"), cat_("/proc/bus/usb/devices"), + header("usb"), cat_("/sys/kernel/debug/usb/devices"), header("partitions"), cat_("/proc/partitions"), header("cpuinfo"), cat_("/proc/cpuinfo"), header("syslog"), cat_("/tmp/syslog") || cat_("$::prefix/var/log/syslog"), @@ -1265,10 +1475,14 @@ sub report_bug { header("grub: menu.lst"), join('', map { s/^(\s*password)\s+(.*)/$1 xxx/; $_ } cat_("$::prefix/boot/grub/menu.lst")), header("grub: install.sh"), cat_("$::prefix/boot/grub/install.sh"), header("grub: device.map"), cat_("$::prefix/boot/grub/device.map"), + header("grub2: grub"), cat_("$::prefix/etc/default/grub"), + header("grub2: grub.cfg"), join('', map { s/^(\s*password_pbkdf2)\s+grub.pbkdf2.*/$1 xxx/; $_ } cat_("$::prefix/boot/grub2/grub.cfg")), + header("grub2: install.sh"), cat_("$::prefix/boot/grub2/install.sh"), header("xorg.conf"), cat_("$::prefix/etc/X11/xorg.conf"), header("urpmi.cfg"), cat_("$::prefix/etc/urpmi/urpmi.cfg"), header("modprobe.preload"), cat_("$::prefix/etc/modprobe.preload"), header("sysconfig/i18n"), cat_("$::prefix/etc/sysconfig/i18n"), + header("locale.conf"), cat_("$::prefix/etc/locale.conf"), header("/proc/iomem"), cat_("/proc/iomem"), header("/proc/ioport"), cat_("/proc/ioports"), map_index { even($::i) ? header($_) : $_ } @other; @@ -1315,7 +1529,7 @@ Allowing this will permit users to simply click on \"Share\" in konqueror and na nfs => [ 'nfs-utils', 'nfs-server', N("NFS: the traditional Unix file sharing system, with less support on Mac and Windows.") ], - smb => [ 'samba-server', 'smb', + smb => [ 'samba', 'smb', N("SMB: a file sharing system used by Windows, Mac OS X and many modern Linux systems.") ], ); @@ -1331,7 +1545,7 @@ Allowing this will permit users to simply click on \"Share\" in konqueror and na } foreach (keys %types) { my ($pkg, $service, $_descr) = @{$types{$_}}; - my $file = "/etc/init.d/$service"; + my $file = "/usr/lib/systemd/system/${service}.service"; if ($l{$_}) { $in->do_pkgs->ensure_is_installed($pkg, $file) or return; services::start($service); @@ -1363,9 +1577,8 @@ You can use userdrake to add a user to this group.") } sub monitor_full_edid() { - return if $::noauto; + return if $::noauto || $::local_install; - devices::make('zero'); my ($vbe, $edid); { # prevent warnings in install's logs: @@ -1394,7 +1607,7 @@ sub monitor_full_edid() { # FIXME: is buggy regarding multiple sessions sub running_window_manager() { - my @window_managers = qw(ksmserver kwin gnome-session icewm wmaker afterstep fvwm fvwm2 fvwm95 mwm twm enlightenment xfce blackbox sawfish olvwm fluxbox compiz drakx-matchbox-window-manager); + my @window_managers = qw(drakx-matchbox-window-manager ksmserver kwin kwin_x11 kwin_wayland gnome-session icewm wmaker afterstep fvwm fvwm2 fvwm95 mwm twm enlightenment xfce4-session blackbox sawfish olvwm fluxbox compiz lxsession); foreach (@window_managers) { my @pids = fuzzy_pidofs(qr/\b$_\b/) or next; @@ -1418,10 +1631,12 @@ sub ask_window_manager_to_logout { 'kwin' => "dcop kdesktop default logout", 'gnome-session' => "gnome-session-save --kill", 'icewm' => "killall -QUIT icewm", + 'xfce4-session' => "xfce4-session-logout --logout", + 'lxsession' => "lxde-logout", ); my $cmd = $h{$wm} or return; if (member($wm, 'ksmserver', 'kwin', 'gnome-session') && $> == 0) { - #- we can not use dcop when we are root + #- we cannot use dcop when we are root if (my $user = $ENV{USERHELPER_UID} && getpwuid($ENV{USERHELPER_UID})) { $cmd = "su $user -c '$cmd'"; } else { @@ -1461,11 +1676,11 @@ sub ask_for_X_restart { if (!$wm) { # no window manager, ctrl-alt-del may not be supported, but we still have to restart X.. $in->ask_okcancel('', N("You need to logout and back in again for changes to take effect. Press OK to logout now."), 1) or return; - system('killall X'); + system('killall', 'Xorg'); } else { $in->ask_okcancel('', N("You need to log out and back in again for changes to take effect"), 1) or return; - ask_window_manager_to_logout_then_do($wm, $pid, 'killall X'); + ask_window_manager_to_logout_then_do($wm, $pid, 'killall Xorg'); } } @@ -1521,7 +1736,7 @@ sub configure_time_more { my $tz_prefix = timezone::get_timezone_prefix(); local $ENV{TZ} = ':' . $tz_prefix . '/' . $timezone->{timezone}; - $in->ask_from_({ interactive_help_id => 'misc-params#drakxid-configureTimezoneGMT', + $in->ask_from_({ interactive_help_id => 'configureTimezoneUTC', title => N("Date, Clock & Time Zone Settings"), }, [ { label => N("Date, Clock & Time Zone Settings"), title => 1 }, |
