diff options
Diffstat (limited to 'perl-install/any.pm')
-rw-r--r-- | perl-install/any.pm | 436 |
1 files changed, 276 insertions, 160 deletions
diff --git a/perl-install/any.pm b/perl-install/any.pm index 271dfe845..751a8392e 100644 --- a/perl-install/any.pm +++ b/perl-install/any.pm @@ -87,8 +87,7 @@ sub create_user { if (@existing && $::isInstall && ($uid != $existing[4] || $gid != $existing[5])) { log::l("chown'ing $home from $existing[4].$existing[5] to $uid.$gid"); - require commands; - eval { commands::chown_("-r", "$uid.$gid", "$::prefix$home") }; + eval { common::chown_('recursive', $uid, $gid, "$::prefix$home") }; } } @@ -104,26 +103,102 @@ sub add_users { } } -sub hdInstallPath() { - my $tail = first(readlink("/tmp/image") =~ m|^(?:/tmp/)?hdimage/*(.*)|); - my $head = first(readlink("/tmp/hdimage") =~ m|$::prefix(.*)|); - log::l("search HD install path, tail=$tail, head=$head, tail defined=" . to_bool(defined $tail)); - defined $tail && ($head ? "$head/$tail" : "/mnt/hd/$tail"); -} - sub install_acpi_pkgs { my ($do_pkgs, $b) = @_; 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'); - $do_pkgs->ensure_is_installed('acpid', '/usr/sbin/acpid'); + $do_pkgs->ensure_is_installed('acpi', '/usr/bin/acpi', $::isInstall); + $do_pkgs->ensure_is_installed('acpid', '/usr/sbin/acpid', $::isInstall); } require services; services::set_status($_, $use_acpi, $::isInstall) foreach qw(acpi acpid); } +sub setupBootloaderBeforeStandalone { + my ($do_pkgs, $b, $all_hds, $fstab) = @_; + require keyboard; + my $keyboard = keyboard::read_or_default(); + 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); +} + +sub setupBootloaderBefore { + my ($do_pkgs, $bootloader, $all_hds, $fstab, $keyboard, $allow_fb, $vga_fb, $quiet) = @_; + require bootloader; + + #- auto_install backward compatibility + #- one should now use {message_text} + if ($bootloader->{message} =~ m!^[^/]!) { + $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'); + } + if (cat_("/proc/cmdline") =~ /\b(pci)=(\S+)/) { + bootloader::set_append_with_key($bootloader, $1, $2); + } + if (my ($acpi) = cat_("/proc/cmdline") =~ /\bacpi=(\w+)/) { + if ($acpi eq 'ht') { + #- the user is using the default, which may not be the best + my $year = detect_devices::computer_info()->{BIOS_Year}; + if ($year >= 2002) { + log::l("forcing ACPI on recent bios ($year)"); + $acpi = ''; + } + } + bootloader::set_append_with_key($bootloader, acpi => $acpi); + } + if (cat_("/proc/cmdline") =~ /\bnoapic/) { + bootloader::set_append_simple($bootloader, 'noapic'); + } + 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 => devices::make($biggest_swap->{device})); + } + } + + #- 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]') && + !detect_devices::matching_desc__regexp('i740') && + !detect_devices::matching_desc__regexp('Matrox') && + !detect_devices::matching_desc__regexp('Tseng.*ET6\d00') && + !detect_devices::matching_desc__regexp('SiS.*SG86C2.5') && + !detect_devices::matching_desc__regexp('SiS.*559[78]') && + !detect_devices::matching_desc__regexp('SiS.*300') && + !detect_devices::matching_desc__regexp('SiS.*540') && + !detect_devices::matching_desc__regexp('SiS.*6C?326') && + !detect_devices::matching_desc__regexp('SiS.*6C?236') && + !detect_devices::matching_desc__regexp('Voodoo [35]|Voodoo Banshee') && #- 3d acceleration seems to bug in fb mode + !detect_devices::matching_desc__regexp('828[14][05].* CGC') #- i810 & i845 now have FB support during install but we disable it afterwards + ); + my $force_vga = $allow_fb && (detect_devices::matching_desc__regexp('SiS.*630') || #- SiS 630 need frame buffer. + detect_devices::matching_desc__regexp('GeForce.*Integrated') #- needed for fbdev driver (hack). + ); + + #- propose the default fb mode for kernel fb, if aurora or bootsplash is installed. + my $need_fb = $do_pkgs->are_installed('bootsplash'); + bootloader::suggest($bootloader, $all_hds, + vga_fb => ($force_vga || $vga && $need_fb) && $vga_fb, + quiet => $quiet); + + $bootloader->{keytable} ||= keyboard::keyboard2kmap($keyboard); +} + sub setupBootloader { my ($in, $b, $all_hds, $fstab, $security) = @_; @@ -141,6 +216,18 @@ sub setupBootloader { 1; } +sub setupBootloaderUntilInstalled { + my ($in, $b, $all_hds, $fstab, $security) = @_; + do { + 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 + fs::write_fstab($all_hds); + } + } while !installBootloader($in, $b, $all_hds); +} + sub installBootloader { my ($in, $b, $all_hds) = @_; return if detect_devices::is_xbox(); @@ -249,6 +336,7 @@ sub setupBootloader__mbr_or_not { my $default = find { $_->[1] eq $b->{boot} } @l; $in->ask_from_({ title => N("LILO/grub Installation"), + icon => 'banner-bootL', messages => N("Where do you want to install the bootloader?"), interactive_help_id => 'setupBootloaderBeginner', }, @@ -268,11 +356,12 @@ sub setupBootloader__general { return if detect_devices::is_xbox(); my @method_choices = bootloader::method_choices($all_hds); my $prev_force_acpi = my $force_acpi = bootloader::get_append_with_key($b, 'acpi') !~ /off|ht/; - my $prev_force_noapic = my $force_noapic = bootloader::get_append_simple($b, 'noapic'); - my $prev_force_nolapic = my $force_nolapic = bootloader::get_append_simple($b, 'nolapic'); + 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 $memsize = bootloader::get_append_memsize($b); 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"); @@ -284,37 +373,36 @@ sub setupBootloader__general { $boot_devices{$dev} = $_->{info} ? "$dev ($_->{info})" : $dev; } - $in->ask_from_({ messages => N("Bootloader main options"), + $in->ask_from_({ #messages => N("Bootloader main options"), title => N("Bootloader main options"), icon => 'banner-bootL', interactive_help_id => 'setupBootloader', - callbacks => { - complete => sub { - !$memsize || $memsize =~ /^\d+K$/ || $memsize =~ s/^(\d+)M?$/$1M/i or $in->ask_warn('', N("Give the ram size in MB")), return 1; - #- $security > 4 && length($b->{password}) < 6 and $in->ask_warn('', N("At this level of security, a password (and a good one) in lilo is requested")), return 1; - $b->{restricted} && !$b->{password} and $in->ask_warn('', N("Option ``Restrict command line options'' is of no use without a password")), return 1; - $b->{password} eq $b->{password2} or !$b->{restricted} or $in->ask_warn('', [ N("The passwords do not match"), N("Please try again") ]), return 1; - 0; - }, - }, }, [ + #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]} }, not_edit => !$::expert }, + { label => N("Boot device"), val => \$b->{boot}, list => \@boot_devices, 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' }, - if_(!$force_nolapic, - { text => N("Force no APIC"), val => \$force_noapic, type => 'bool' }, - ), - { text => N("Force No Local APIC"), val => \$force_nolapic, type => 'bool' }, + { 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("Password"), val => \$b->{password}, hidden => 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}))); + $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") }, + { 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 }, - { label => N("Precise RAM size if needed (found %d MB)", availableRamMB()), val => \$memsize, advanced => 1 }, + { label => N("Precise RAM size if needed (found %d MB)", availableRamMB()), val => \$memsize, advanced => 1, + validate => sub { my $ok = !$memsize || $memsize =~ /^\d+K$/ || $memsize =~ s/^(\d+)M?$/$1M/i or $in->ask_warn('', N("Give the ram size in MB")); $ok } }, ]) or return 0; } else { $b->{boot} = $partition_table::mac::bootstrap_part; @@ -325,7 +413,7 @@ sub setupBootloader__general { }, [ { 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)) ], not_edit => !$::expert }, + { 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" }, @@ -343,20 +431,19 @@ sub setupBootloader__general { delete $b->{'raid-extra-boot'} if $b->{'raid-extra-boot'} eq 'mbr'; } - if ($b->{method} eq 'grub') { - $in->do_pkgs->ensure_binary_is_installed('grub', "grub", 1) or return 0; - } + bootloader::ensure_pkg_is_installed($in->do_pkgs, $b) or return 0; + bootloader::suggest_message_text($b) if ! -e "$::prefix/boot/message-text"; #- in case we switch from grub to lilo bootloader::set_append_memsize($b, $memsize); if ($prev_force_acpi != $force_acpi) { bootloader::set_append_with_key($b, acpi => ($force_acpi ? '' : 'ht')); } - if ($prev_force_noapic != $force_noapic) { - ($force_noapic ? \&bootloader::set_append_simple : \&bootloader::remove_append_simple)->($b, 'noapic'); + if ($prev_enable_apic != $enable_apic) { + ($enable_apic ? \&bootloader::remove_append_simple : \&bootloader::set_append_simple)->($b, 'noapic'); } - if ($prev_force_nolapic != $force_nolapic) { - ($force_nolapic ? \&bootloader::set_append_simple : \&bootloader::remove_append_simple)->($b, 'nolapic'); + if ($prev_enable_lapic != $enable_lapic) { + ($enable_lapic ? \&bootloader::remove_append_simple : \&bootloader::set_append_simple)->($b, 'nolapic'); } if ($prev_clean_tmp != $clean_tmp) { @@ -366,11 +453,17 @@ sub setupBootloader__general { @{$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"); + } 1; } sub setupBootloader__entries { - my ($in, $b, $_all_hds, $fstab) = @_; + my ($in, $b, $all_hds, $fstab) = @_; require Xconfig::resolution_and_depth; @@ -381,12 +474,22 @@ sub setupBootloader__entries { my $vga = Xconfig::resolution_and_depth::from_bios($e->{vga}); my ($append, $netprofile) = bootloader::get_append_netprofile($e); + my %hd_infos = map { $_->{device} => $_->{info} } fs::get::hds($all_hds); + my %root_descr = map { + my $info = delete $hd_infos{$_->{rootDevice}}; + my $dev = "/dev/$_->{device}"; + $dev => $info ? "$dev ($info)" : $dev; + } @$fstab; + my @l; if ($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 { "/dev/$_->{device}" } @$fstab ], not_edit => !$::expert }, +{ label => N("Root"), val => \$e->{root}, list => [ map { "/dev/$_->{device}" } @$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/, { label => N("Video mode"), val => \$vga, list => [ '', Xconfig::resolution_and_depth::bios_vga_modes() ], format => \&Xconfig::resolution_and_depth::to_string, advanced => 1 }, ), @@ -395,7 +498,7 @@ sub setupBootloader__entries { ); } else { @l = ( -{ label => N("Root"), val => \$e->{kernel_or_dev}, list => [ map { "/dev/$_->{device}" } @$fstab, detect_devices::floppies() ], not_edit => !$::expert }, +{ label => N("Root"), val => \$e->{kernel_or_dev}, list => [ map { "/dev/$_->{device}" } @$fstab, detect_devices::floppies() ] }, ); } if (arch() !~ /ppc/) { @@ -408,9 +511,7 @@ sub setupBootloader__entries { unshift @l, { label => N("Label"), val => \$e->{label}, list => ['macos', 'macosx', 'darwin'] }; if ($e->{type} eq "image") { @l = ({ label => N("Label"), val => \$e->{label} }, - $::expert ? @l[1..4] : (@l[1..2], { label => N("Append"), val => \$append }), - if_($::expert, { label => N("Initrd-size"), val => \$e->{initrdsize}, list => [ '', '4096', '8192', '16384', '24576' ] }), - if_($::expert, $l[5]), + (@l[1..2], { label => N("Append"), val => \$append }), { label => N("NoVideo"), val => \$e->{novideo}, type => 'bool' }, { text => N("Default"), val => \$default, type => 'bool' } ); @@ -431,7 +532,7 @@ sub setupBootloader__entries { $b->{default} = $old_default || $default ? $default && $e->{label} : $b->{default}; $e->{vga} = ref($vga) ? $vga->{bios} : $vga; bootloader::set_append_netprofile($e, $append, $netprofile); - bootloader::configure_entry($e); #- hack to make sure initrd file are built. + bootloader::configure_entry($b, $e); #- hack to make sure initrd file are built. 1; }; @@ -473,7 +574,7 @@ You can create additional entries or change the existing ones."), [ { format => sub { my ($e) = @_; ref($e) ? - "$e->{label} ($e->{kernel_or_dev})" . ($b->{default} eq $e->{label} && " *") : + ($b->{default} eq $e->{label} ? " * " : " ") . "$e->{label} ($e->{kernel_or_dev})" : translate($e); }, list => $b->{entries}, } ], Add => $Add, Modify => $Modify, Remove => $Remove)) { @@ -489,10 +590,10 @@ sub get_autologin() { my $desktop = $desktop{DESKTOP} || 'KDE'; my $autologin = do { if (($desktop{DISPLAYMANAGER} || $desktop) eq 'GNOME') { - my %conf = read_gnomekderc("$::prefix/etc/X11/gdm/gdm.conf", 'daemon'); + my %conf = read_gnomekderc("$::prefix/etc/X11/gdm/custom.conf", 'daemon'); text2bool($conf{AutomaticLoginEnable}) && $conf{AutomaticLogin}; } else { # KDM / MdkKDM - my %conf = read_gnomekderc("$::prefix/usr/share/config/kdm/kdmrc", 'X-:0-Core'); + my %conf = read_gnomekderc("$::prefix/etc/kde/kdm/kdmrc", 'X-:0-Core'); text2bool($conf{AutoLoginEnable}) && $conf{AutoLoginUser}; } }; @@ -500,18 +601,18 @@ sub get_autologin() { } sub set_autologin { - my ($o_user, $o_wm) = @_; + my ($do_pkgs, $o_user, $o_wm) = @_; log::l("set_autologin $o_user $o_wm"); my $autologin = bool2text($o_user); #- Configure KDM / MDKKDM - eval { update_gnomekderc("$::prefix/usr/share/config/kdm/kdmrc", 'X-:0-Core' => ( + eval { common::update_gnomekderc_no_create("$::prefix/etc/kde/kdm/kdmrc", 'X-:0-Core' => ( AutoLoginEnable => $autologin, AutoLoginUser => $o_user, )) }; #- Configure GDM - eval { update_gnomekderc("$::prefix/etc/X11/gdm/gdm.conf", daemon => ( + eval { update_gnomekderc("$::prefix/etc/X11/gdm/custom.conf", daemon => ( AutomaticLoginEnable => $autologin, AutomaticLogin => $o_user, )) }; @@ -520,8 +621,9 @@ sub set_autologin { if (member($o_wm, 'KDE', 'GNOME')) { unlink $xdm_autologin_cfg; } else { + $do_pkgs->ensure_is_installed('autologin', '/usr/bin/startx.autologin') if $o_user; setVarsInShMode($xdm_autologin_cfg, 0644, - { USER => $o_user, AUTOLOGIN => bool2yesno($o_user), EXEC => '/usr/X11R6/bin/startx.autologin' }); + { USER => $o_user, AUTOLOGIN => bool2yesno($o_user), EXEC => '/usr/bin/startx.autologin' }); } if ($o_user) { @@ -611,11 +713,11 @@ sub inspect { } sub ask_user_one { - my ($in, $users, $security, $u, %options) = @_; + my ($in, $users, $security, $u, $suggested_names, %options) = @_; $options{needauser} ||= $security >= 3; - my @icons = facesnames(); + my @suggested_names = grep { ! defined getpwnam($_) } @$suggested_names; my %high_security_groups = ( xgrp => N("access to X programs"), @@ -631,13 +733,14 @@ sub ask_user_one { my $names = @$users ? N("(already added %s)", join(", ", map { $_->{realname} || $_->{name} } @$users)) : ''; my %groups; + + require authentication; my $verif = sub { - $u->{password} eq $u->{password2} or $in->ask_warn('', [ N("The passwords do not match"), N("Please try again") ]), return 1,2; - $security > 3 && length($u->{password}) < 6 and $in->ask_warn('', N("This password is too simple")), return 1,2; - $u->{name} or $in->ask_warn('', N("Please give a user name")), return 1,0; + authentication::check_given_password($in, $u, $security > 3 ? 6 : 0) or return 1,2; + $u->{name} or $in->ask_warn('', N("Please give a user name")), return 1,0; $u->{name} =~ /^[a-z]+?[a-z0-9_-]*?$/ or $in->ask_warn('', N("The user name must contain only lower cased letters, numbers, `-' and `_'")), return 1,0; length($u->{name}) <= 32 or $in->ask_warn('', N("The user name is too long")), return 1,0; - member($u->{name}, 'root', map { $_->{name} } @$users) and $in->ask_warn('', N("This user name has already been added")), return 1,0; + defined getpwnam($u->{name}) || member($u->{name}, map { $_->{name} } @$users) and $in->ask_warn('', N("This user name has already been added")), return 1,0; foreach ([ $u->{uid}, N("User ID") ], [ $u->{gid}, N("Group ID") ]) { my ($id, $name) = @$_; @@ -656,24 +759,18 @@ sub ask_user_one { if_(!$::isInstall, ok => N("Done")), cancel => $options{noaccept} ? '' : N("Accept user"), callbacks => { - focus_out => sub { - if ($_[0] eq '0') { - $u->{name} ||= lc first($u->{realname} =~ /([a-zA-Z0-9_-]+)/); - } - }, canceled => $verif, ok_disabled => sub { $options{needauser} && !@$users || $u->{name} }, } }, [ - { label => N("Real name"), val => \$u->{realname} }, - { label => N("Login name"), val => \$u->{name} }, + { label => N("Real name"), val => \$u->{realname}, focus_out => sub { + $u->{name} ||= lc first($u->{realname} =~ /([a-zA-Z0-9_-]+)/); + } }, + { label => N("Login name"), val => \$u->{name}, list => \@suggested_names, not_edit => 0 }, { label => N("Password"),val => \$u->{password}, hidden => 1 }, { label => N("Password (again)"), val => \$u->{password2}, hidden => 1 }, - { label => N("Shell"), val => \$u->{shell}, list => [ shells() ], not_edit => !$::expert, advanced => 1 }, + { label => N("Shell"), val => \$u->{shell}, list => [ shells() ], advanced => 1 }, { label => N("User ID"), val => \$u->{uid}, advanced => 1 }, { label => N("Group ID"), val => \$u->{gid}, advanced => 1 }, - if_($security <= 3 && !$options{noicons} && @icons, - { label => N("Icon"), val => \ ($u->{icon} ||= 'default'), list => \@icons, icon2f => \&face2png, format => \&translate }, - ), if_($security > 3, map { { label => $_, val => \$groups{$_}, text => $high_security_groups{$_}, type => 'bool' }; @@ -693,8 +790,7 @@ sub ask_users { while (1) { my $u = {}; - $u->{name} = shift @$suggested_names; - ask_user_one($in, $users, $security, $u) and return; + ask_user_one($in, $users, $security, $u, $suggested_names) and return; } } @@ -733,12 +829,19 @@ sub autologin { sub acceptLicense { my ($o) = @_; - require install_messages; + require messages; + + $o->{release_notes} = join("\n\n", grep { $_ } map { + if ($::isInstall) { + my $f = install::any::getFile_($o->{stage2_phys_medium}, $_); + $f && cat__($f); + } else { + my $file = $_; + my $d = find { -e "$_/$file" } glob_("/usr/share/doc/*-release-*"); + $d && cat_("$d/$file"); + } + } 'release-notes.txt', 'release-notes.' . arch() . '.txt'); - $o->{release_notes} = join("\n\n", map { - my $f = install_any::getFile($_); - $f && cat__($f); - } 'release-notes.txt', 'release-notes.' . arch() . '.txt') if $::isInstall; return if $o->{useless_thing_accepted}; @@ -746,10 +849,11 @@ sub acceptLicense { $o->ask_from_({ title => N("License agreement"), icon => 'banner-license', + focus_first => 1, cancel => N("Quit"), - messages => formatAlaTeX(install_messages::main_license() . "\n\n\n" . install_messages::warning_about_patents()), + messages => formatAlaTeX(messages::main_license() . "\n\n\n" . messages::warning_about_patents()), interactive_help_id => 'acceptLicense', - if_(!$::globetrotter, more_buttons => [ [ N("Release Notes"), sub { $o->ask_warn(N("Release Notes"), $o->{release_notes}) }, 1 ] ]), + if_(!$::globetrotter && $o->{release_notes}, more_buttons => [ [ N("Release Notes"), sub { $o->ask_warn(N("Release Notes"), $o->{release_notes}) }, 1 ] ]), callbacks => { ok_disabled => sub { $r eq 'Refuse' } }, }, [ { list => [ N_("Accept"), N_("Refuse") ], val => \$r, type => 'list', format => sub { translate($_[0]) } } ]) @@ -759,9 +863,11 @@ sub acceptLicense { if ($::globetrotter) { run_program::run('killall', 'Xorg'); exec("/sbin/reboot"); + } else { + install::media::umount_phys_medium($o->{stage2_phys_medium}); + install::media::openCdromTray($o->{stage2_phys_medium}{device}) if !detect_devices::is_xbox() && $o->{method} eq 'cdrom'; + $o->exit; } - install_any::ejectCdrom(); - $o->exit; }; } @@ -796,28 +902,27 @@ sub selectLanguage_install { $lang = first($add_location->($lang)); } - my $last_utf8 = $locale->{utf8}; + my $non_utf8 = 0; + my $utf8_forced; add2hash($common, { cancel => '', + focus_first => 1, advanced_messages => formatAlaTeX(N("Mandriva Linux 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"), - callbacks => { advanced => sub { $langs->{$listval2val->($lang)} = 1 }, - changed => sub { - if ($last_utf8 == $locale->{utf8}) { - $last_utf8 = $locale->{utf8} = lang::utf8_should_be_needed({ lang => $listval2val->($lang), langs => $langs }); - } else { - $last_utf8 = -1; #- disable auto utf8 once touched - } - } } }); + }); $in->ask_from_($common, [ { val => \$lang, separator => '|', if_($using_images, image2f => sub { $name2l{$_[0]} =~ /^[a-z]/ && "langs/lang-$name2l{$_[0]}" }), format => sub { $_[0] =~ /(.*\|)(.*)/ ? $1 . lang::l2name($2) : lang::l2name($_[0]) }, - list => \@langs, sort => 0 }, + list => \@langs, sort => 0, changed => sub { + #- very special cases for langs which do not like UTF-8 + $non_utf8 = $lang =~ /\bzh/ if !$utf8_forced; + }, focus_out => sub { $langs->{$listval2val->($lang)} = 1 } }, if_(!$::move, - { val => \$locale->{utf8}, type => 'bool', text => N("Use Unicode by default"), advanced => 1 }, + { val => \$non_utf8, type => 'bool', text => N("Old compatibility (non UTF-8) encoding"), + advanced => 1, changed => sub { $utf8_forced = 1 } }, { val => \$langs->{all}, type => 'bool', text => N("All languages"), advanced => 1 }, map { { val => \$langs->{$_->[0]}, type => 'bool', disabled => sub { $langs->{all} }, @@ -827,6 +932,7 @@ when your installation is complete and you restart your system.")), } sort { $a->[1] cmp $b->[1] } map { [ $_, $sort_func->($_) ] } lang::list_langs(), ), ]) or return; + $locale->{utf8} = !$non_utf8; %$langs = grep_each { $::b } %$langs; #- clean hash $langs->{$listval2val->($lang)} = 1; @@ -842,12 +948,13 @@ sub selectLanguage_standalone { interactive_help_id => 'selectLanguage' }; my @langs = sort { lang::l2name($a) cmp lang::l2name($b) } lang::list_langs(exclude_non_installed => 1); - die 'one lang only' if @langs == 1; + my $non_utf8 = !$locale->{utf8}; $in->ask_from_($common, [ { val => \$locale->{lang}, type => 'list', - format => sub { lang::l2name($_[0]) }, list => \@langs }, - { val => \$locale->{utf8}, type => 'bool', text => N("Use Unicode by default"), advanced => 1 }, + format => sub { lang::l2name($_[0]) }, list => \@langs, allow_empty_list => 1 }, + { val => \$non_utf8, type => 'bool', text => N("Old compatibility (non UTF-8) encoding"), advanced => 1 }, ]); + $locale->{utf8} = !$non_utf8; lang::set($locale); Gtk2->set_locale if $in->isa('interactive::gtk'); } @@ -866,9 +973,7 @@ sub selectLanguage_and_more_standalone { selectCountry($in, $locale) or goto language; }; if ($@) { - if ($@ =~ /^one lang only/) { - selectCountry($in, $locale) or $in->exit(0); - } elsif ($@ !~ /wizcancel/) { + if ($@ !~ /wizcancel/) { die; } else { $in->exit(0); @@ -888,8 +993,9 @@ sub selectCountry { } @lang::locales; @best == 1 and @best = (); - my ($other, $ext_country); - member($country, @best) or ($ext_country, $country) = ($country, $ext_country); + my $other = !member($country, @best); + my $ext_country = $country; + $other and @best = (); $in->ask_from_( { title => N("Country / Region"), @@ -898,13 +1004,11 @@ sub selectCountry { interactive_help_id => 'selectCountry', if_(@best, advanced_messages => N("Here is the full list of available countries")), advanced_label => @best ? N("Other Countries") : N("Advanced"), - advanced_state => $ext_country && scalar(@best), - callbacks => { changed => sub { $_[0] != 2 and $other = $_[0] == 1 } }, }, [ if_(@best, { val => \$country, type => 'list', format => \&lang::c2name, - list => \@best, sort => 1 }), + list => \@best, sort => 1, changed => sub { $other = 0 } }), { val => \$ext_country, type => 'list', format => \&lang::c2name, - list => [ @countries ], advanced => scalar(@best) }, + list => [ @countries ], advanced => scalar(@best), changed => sub { $other = 1 } }, { val => \$locale->{IM}, type => 'combo', label => N("Input method:"), sort => 0, separator => '|', list => [ '', sort(lang::get_ims()) ], @@ -919,7 +1023,7 @@ sub selectCountry { sub set_login_serial_console { my ($port, $speed) = @_; - my $line = "s$port:12345:respawn:/sbin/getty ttyS$port DT$speed ansi\n"; + my $line = "s$port:12345:respawn:/sbin/agetty ttyS$port $speed ansi\n"; substInFile { s/^s$port:.*//; $_ = $line if eof } "$::prefix/etc/inittab"; } @@ -938,7 +1042,7 @@ sub report_bug { header("dmidecode"), `dmidecode`, header("fdisk"), arch() =~ /ppc/ ? `pdisk -l` : `fdisk -l`, header("scsi"), cat_("/proc/scsi/scsi"), - header("/sys/bus/scsi/devices"), `ls -l /sys/bus/scsi/devices`, + 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"), @@ -953,55 +1057,18 @@ sub report_bug { header("fstab"), cat_("$::prefix/etc/fstab"), header("modprobe.conf"), cat_("$::prefix/etc/modprobe.conf"), header("lilo.conf"), cat_("$::prefix/etc/lilo.conf"), - header("menu.lst"), cat_("$::prefix/boot/grub/menu.lst"), + header("grub: menu.lst"), 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("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("/proc/iomem"), cat_("/proc/iomem"), + header("/proc/ioport"), cat_("/proc/ioports"), map_index { even($::i) ? header($_) : $_ } @other; } -sub devfssymlinkf { - my ($if_struct, $of) = @_; - my $if = $if_struct->{device}; - - my $devfs_if = $if_struct->{devfs_device}; - $devfs_if ||= devices::to_devfs($if); - $devfs_if ||= $if; - - #- example: $of is mouse, $if is usbmouse, $devfs_if is input/mouse0 - - output_p("$::prefix/etc/devfs/conf.d/$of.conf", -"REGISTER ^$devfs_if\$ CFUNCTION GLOBAL mksymlink $devfs_if $of -UNREGISTER ^$devfs_if\$ CFUNCTION GLOBAL unlink $of -"); - - output_p("$::prefix/etc/devfs/conf.d/$if.conf", -"REGISTER ^$devfs_if\$ CFUNCTION GLOBAL mksymlink $devfs_if $if -UNREGISTER ^$devfs_if\$ CFUNCTION GLOBAL unlink $if -") if $devfs_if ne $if && $if !~ /^hd[a-z]/ && $if !~ /^sr/ && $if !~ /^sd[a-z]/; - - #- add a specific udev script, we can't do it with a udev rule, - #- eg, ttySL0 is a symlink - output_with_perm("$::prefix/etc/udev/conf.d/$of.conf", 0755, "ln -sf $if /dev/$of\n") - if $of !~ /dvd|mouse/; - - #- when creating a symlink on the system, use devfs name if devfs is mounted - symlinkf($devfs_if, "$::prefix/dev/$if") if $devfs_if ne $if && detect_devices::dev_is_devfs(); - symlinkf($if, "$::prefix/dev/$of"); -} -sub devfs_rawdevice { - my ($if_struct, $of) = @_; - - my $devfs_if = $if_struct->{devfs_device}; - $devfs_if ||= devices::to_devfs($if_struct->{device}); - $devfs_if ||= $if_struct->{device}; - - output_p("$::prefix/etc/devfs/conf.d/$of.conf", -"REGISTER ^$devfs_if\$ EXECUTE /etc/dynamic/scripts/rawdevice.script add /dev/$devfs_if /dev/$of -UNREGISTER ^$devfs_if\$ EXECUTE /etc/dynamic/scripts/rawdevice.script del /dev/$of -"); -} - sub fix_broken_alternatives { my ($force_default) = @_; #- fix bad update-alternatives that may occurs after upgrade (and sometimes for install too). @@ -1114,7 +1181,7 @@ sub monitor_full_edid() { } sub running_window_manager() { - my @window_managers = qw(kwin gnome-session icewm wmaker afterstep fvwm fvwm2 fvwm95 mwm twm enlightenment xfce blackbox sawfish olvwm fluxbox); + my @window_managers = qw(kwin gnome-session icewm wmaker afterstep fvwm fvwm2 fvwm95 mwm twm enlightenment xfce blackbox sawfish olvwm fluxbox compiz); foreach (@window_managers) { my @pids = fuzzy_pidofs(qr/\b$_\b/) or next; @@ -1163,6 +1230,23 @@ sub ask_window_manager_to_logout_then_do { ), $wm, $pid, $action; } +sub ask_for_X_restart { + my ($in) = @_; + + $::isStandalone && $in->isa('interactive::gtk') or return; + + my ($wm, $pid) = running_window_manager(); + + if (!$wm) { + $in->ask_warn('', N("Please log out and then use Ctrl-Alt-BackSpace")); + return; + } + + $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'); +} + sub alloc_raw_device { my ($prefix, $device) = @_; my $used = 0; @@ -1178,24 +1262,18 @@ sub alloc_raw_device { } sub config_dvd { - my ($prefix, $have_devfsd) = @_; - - #- can not have both a devfs and a non-devfs config - #- the /etc/sysconfig/rawdevices solution gives errors with devfs + my ($prefix) = @_; my @dvds = grep { detect_devices::isDvdDrive($_) } detect_devices::cdroms() or return; log::l("configuring DVD: " . join(" ", map { $_->{device} } @dvds)); #- create /dev/dvd symlink each_index { - devfssymlinkf($_, 'dvd' . ($::i ? $::i + 1 : '')); - devfs_rawdevice($_, 'rdvd' . ($::i ? $::i + 1 : '')) if $have_devfsd; + devices::symlink_now_and_register($_, 'dvd' . ($::i ? $::i + 1 : '')); } @dvds; - if (!$have_devfsd) { - my $raw_dev = alloc_raw_device($prefix, 'dvd'); - symlink($raw_dev, "$prefix/dev/rdvd"); - } + my $raw_dev = alloc_raw_device($prefix, 'dvd'); + symlink($raw_dev, "$prefix/dev/rdvd"); } sub config_mtools { @@ -1210,4 +1288,42 @@ sub config_mtools { } $file; } +sub configure_timezone { + my ($in, $timezone, $ask_gmt) = @_; + + require timezone; + $timezone->{timezone} = $in->ask_from_treelist(N("Timezone"), N("Which is your timezone?"), '/', [ timezone::getTimeZones() ], $timezone->{timezone}) or return; + + my $ntp = to_bool($timezone->{ntp}); + my $servers = timezone::ntp_servers(); + $timezone->{ntp} ||= 'pool.ntp.org'; + + require POSIX; + use POSIX qw(strftime); + my $time_format = "%H:%M:%S"; + local $ENV{TZ} = $timezone->{timezone}; + + $in->ask_from_({ interactive_help_id => 'configureTimezoneGMT', + title => N("Date, Clock & Time Zone Settings"), + }, [ + { label => N("Date, Clock & Time Zone Settings"), title => 1 }, + { label => N("What is the best time?") }, + { val => \$timezone->{UTC}, + type => 'list', list => [ 0, 1 ], format => sub { + $_[0] ? + N("%s (hardware clock set to UTC)", POSIX::strftime($time_format, localtime())) : + N("%s (hardware clock set to local time)", POSIX::strftime($time_format, gmtime())); + } }, + { label => N("NTP Server"), title => 1 }, + { text => N("Automatic time synchronization (using NTP)"), val => \$ntp, type => 'bool' }, + { val => \$timezone->{ntp}, disabled => sub { !$ntp }, + type => "list", separator => '|', + list => [ keys %$servers ], format => sub { $servers->{$_[0]} } }, + ]) or goto &configure_timezone if $ask_gmt || $ntp; + + $timezone->{ntp} = '' if !$ntp; + + 1; +} + 1; |