summaryrefslogtreecommitdiffstats
path: root/perl-install/any.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/any.pm')
-rw-r--r--perl-install/any.pm283
1 files changed, 144 insertions, 139 deletions
diff --git a/perl-install/any.pm b/perl-install/any.pm
index 960f6909f..267e91673 100644
--- a/perl-install/any.pm
+++ b/perl-install/any.pm
@@ -74,164 +74,169 @@ sub enableShadow {
run_program::rooted($prefix, "grpconv") or log::l("grpconv failed");
}
-sub grub_installed {
- my ($in) = @_;
- my $f = "/usr/sbin/grub";
- $in->do_pkgs->install('grub') if !-e $f;
- -e $f;
+sub setupBootloader {
+ my ($in, $b, $all_hds, $fstab, $security) = @_;
+ my $hds = $all_hds->{hds};
+
+ general:
+ setupBootloader__general($in, $b, $all_hds, $fstab, $security) or return 0;
+ setupBootloader__boot_bios_drive($in, $b, $hds) or goto general;
+
+ setupBootloader__entries($in, $b, $all_hds, $fstab);
}
-sub setupBootloader {
- my ($in, $b, $all_hds, $fstab, $security, $prefix, $more) = @_;
+
+sub setupBootloader_simple {
+ my ($in, $b, $all_hds, $fstab, $security) = @_;
my $hds = $all_hds->{hds};
- $more++ if $b->{bootUnsafe};
- my $automatic = !$::expert && $more < 1;
- my $semi_auto = !$::expert && arch() !~ /ia64/;
- my $ask_per_entries = $::expert || $more > 1;
- my $prev_boot = $b->{boot};
- my $mixed_kind_of_disks =
- (grep { $_->{device} =~ /^sd/ } @$hds) && (grep { $_->{device} =~ /^hd/ } @$hds) ||
- (grep { $_->{device} =~ /^hd[e-z]/ } @$hds) && (grep { $_->{device} =~ /^hd[a-d]/ } @$hds);
-
- if ($mixed_kind_of_disks) {
- $automatic = $semi_auto = 0;
- #- full expert questions when there is 2 kind of disks
- #- it would need a semi_auto asking on which drive the bios boots...
+ my $mixed_kind_of_disks = bootloader::mixed_kind_of_disks($hds);
+ #- full expert questions when there is 2 kind of disks
+ #- it would need a semi_auto asking on which drive the bios boots...
+
+ $mixed_kind_of_disks || $b->{bootUnsafe} || arch() =~ /ppc/ or return 1; #- default is good enough
+
+ if (!$mixed_kind_of_disks && arch() !~ /ia64/) {
+ setupBootloader__mbr_or_not($in, $b, $hds, $fstab);
+ } else {
+ general:
+ setupBootloader__general($in, $b, $all_hds, $fstab, $security) or return 0;
}
- $automatic = 0 if arch() =~ /ppc/; #- no auto for PPC yet
-
- if ($automatic) {
- #- automatic
- } elsif ($semi_auto) {
- my @l = (N_("First sector of drive (MBR)"), N_("First sector of boot partition"));
-
- $in->set_help('setupBootloaderBeginner') unless $::isStandalone;
- if (arch() =~ /sparc/) {
- $in->ask_from(N("SILO Installation"),
- N("Where do you want to install the bootloader?"),
- { val => \$b->{use_partition}, list => [ 0, 1 ], format => sub { translate($l[$_[0]]) } }) or return 0;
- } elsif (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";
- }
+ setupBootloader__boot_bios_drive($in, $b, $hds) or goto general;
+ 1;
+}
+
+
+sub setupBootloader__boot_bios_drive {
+ my ($in, $b, $hds) = @_;
+
+ bootloader::mixed_kind_of_disks($hds) &&
+ $b->{boot} =~ /\d$/ && #- on a partition
+ is_empty_hash_ref($b->{bios}) && #- some bios mapping already there
+ arch() !~ /ppc/ or return 1;
+
+ log::l("mixed_kind_of_disks");
+ 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).
+
+On which drive are you booting?"), \&partition_table::description, $hds) or return 0;
+ log::l("mixed_kind_of_disks chosen $hd->{device}");
+ $b->{first_hd_device} = "/dev/$hd->{device}";
+ 1;
+}
+
+sub setupBootloader__mbr_or_not {
+ my ($in, $b, $hds, $fstab) = @_;
+
+ my @l = (N_("First sector of drive (MBR)"), N_("First sector of boot partition"));
+
+ $in->set_help('setupBootloaderBeginner') if !$::isStandalone;
+ 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 {
- my $boot = $hds->[0]{device};
- my $use_partition = "/dev/$boot" ne $b->{boot};
- $in->ask_from(N("LILO/grub Installation"),
- N("Where do you want to install the bootloader?"),
- [ { val => \$use_partition, list => [ 0, 1 ], format => sub { translate($l[$_[0]]) } } ]);
- $b->{boot} = "/dev/" . ($use_partition ? fsedit::get_root($fstab, 'boot')->{device} : $boot);
+ die "no bootstrap partition - yaboot.conf creation failed";
}
} else {
- $in->set_help(arch() =~ /sparc/ ? "setupSILOGeneral" : arch() =~ /ppc/ ? 'setupYabootGeneral' : "setupBootloader") unless $::isStandalone; #- TO MERGE ?
-
- my @silo_install_lang = (N("First sector of drive (MBR)"), N("First sector of boot partition"));
-
- my %bootloaders = (if_(exists $b->{methods}{silo},
- N_("SILO") => sub { $b->{methods}{silo} = 1 }),
- if_(exists $b->{methods}{lilo},
- N_("LILO with text menu") => sub { $b->{methods}{lilo} = "lilo-menu" },
- N_("LILO with graphical menu") => sub { $b->{methods}{lilo} = "lilo-graphic" }),
- if_(exists $b->{methods}{grub},
- #- put lilo if grub is chosen, so that /etc/lilo.conf is generated
- N_("Grub") => sub { $b->{methods}{grub} = 1;
- exists $b->{methods}{lilo}
- and $b->{methods}{lilo} = "lilo-menu" }),
- if_(exists $b->{methods}{yaboot},
- N_("Yaboot") => sub { $b->{methods}{yaboot} = 1 }),
- );
- my $bootloader = arch() =~ /sparc/ ? N_("SILO") : arch() =~ /ppc/ ? N_("Yaboot") : N_("LILO with graphical menu");
- my $profiles = bootloader::has_profiles($b);
- my $memsize = bootloader::get_append($b, 'mem');
- my $prev_clean_tmp = my $clean_tmp = grep { $_->{mntpoint} eq '/tmp' } @{$all_hds->{special} ||= []};
+ my $boot = $hds->[0]{device};
+ my $use_partition = arch() =~ /sparc/ ? $b->{use_partition} : "/dev/$boot" ne $b->{boot};
+ $in->ask_from(arch() =~ /sparc/ ? N("SILO Installation") : N("LILO/grub Installation"),
+ N("Where do you want to install the bootloader?"),
+ [ { val => \$use_partition, list => [ 0, 1 ], format => sub { translate($l[$_[0]]) } } ]);
+ if (arch() =~ /sparc/) {
+ $b->{use_partition} = $use_partition;
+ } else {
+ my $new_boot = "/dev/" . ($use_partition ? fsedit::get_root($fstab, 'boot')->{device} : $boot);
- $b->{password2} ||= $b->{password} ||= '';
- $b->{vga} ||= 'normal';
- if (arch() !~ /ppc/) {
- $in->ask_from('', N("Bootloader main options"), [
-{ label => N("Bootloader to use"), val => \$bootloader, list => [ keys(%bootloaders) ], format => \&translate },
- arch() =~ /sparc/ ? (
-{ label => N("Bootloader installation"), val => \$b->{use_partition}, list => [ 0, 1 ], format => sub { $silo_install_lang[$_[0]] } },
-) : if_(arch() !~ /ia64/,
-{ label => N("Boot device"), val => \$b->{boot}, list => [ map { "/dev/$_" } (map { $_->{device} } (@$hds, grep { !isFat($_) } @$fstab)), detect_devices::floppies_dev() ], not_edit => !$::expert },
-{ label => N("Compact"), val => \$b->{compact}, type => "bool", text => N("compact"), advanced => 1 },
-{ label => N("Video mode"), val => \$b->{vga}, list => [ keys %bootloader::vga_modes ], not_edit => !$::expert, format => sub { $bootloader::vga_modes{$_[0]} }, advanced => 1 },
-),
-{ label => N("Delay before booting default image"), val => \$b->{timeout} },
- if_($security >= 4 || $b->{password} || $b->{restricted},
-{ label => N("Password"), val => \$b->{password}, hidden => 1 },
-{ label => N("Password (again)"), val => \$b->{password2}, hidden => 1 },
-{ label => N("Restrict command line options"), val => \$b->{restricted}, type => "bool", text => N("restrict") },
- ),
-{ label => 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 },
- if_(detect_devices::isLaptop(),
-{ label => N("Enable multi profiles"), val => \$profiles, type => 'bool', advanced => 1 },
- ),
-],
- complete => sub {
- !$memsize || $memsize =~ /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;
- }
- ) or return 0;
- } else {
- $b->{boot} = $partition_table::mac::bootstrap_part;
- $in->ask_from('', N("Bootloader main options"), [
- { label => N("Bootloader to use"), val => \$bootloader, list => [ keys(%bootloaders) ], format => \&translate },
- { 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("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 $new_boot ne $b->{boot};
+
+ $b->{boot} = $new_boot;
}
-
- $b->{methods}{$_} = 0 foreach keys %{$b->{methods}};
- $bootloaders{$bootloader} and $bootloaders{$bootloader}->();
+ }
+}
- grub_installed($in) or return 1 if $b->{methods}{grub};
+sub setupBootloader__general {
+ my ($in, $b, $all_hds, $fstab, $security) = @_;
- #- at least one method
- grep_each { $::b } %{$b->{methods}} or return 0;
+ $in->set_help(arch() =~ /sparc/ ? "setupSILOGeneral" : arch() =~ /ppc/ ? 'setupYabootGeneral' : "setupBootloader") if !$::isStandalone; #- TO MERGE ?
- bootloader::set_profiles($b, $profiles);
- bootloader::add_append($b, "mem", $memsize);
+ my @silo_install_lang = (N("First sector of drive (MBR)"), N("First sector of boot partition"));
- if ($prev_clean_tmp != $clean_tmp) {
- if ($clean_tmp) {
- push @{$all_hds->{special}}, { device => 'none', mntpoint => '/tmp', type => 'tmpfs' };
- } else {
- @{$all_hds->{special}} = grep { $_->{mntpoint} eq '/tmp' } @{$all_hds->{special}};
- }
- }
+ ($b->{method}, my $method_choices) = bootloader::method_choices($fstab);
+ my $profiles = bootloader::has_profiles($b);
+ my $memsize = bootloader::get_append($b, 'mem');
+ my $prev_clean_tmp = my $clean_tmp = grep { $_->{mntpoint} eq '/tmp' } @{$all_hds->{special} ||= []};
+ my $prev_boot = $b->{boot};
+
+ $b->{password2} ||= $b->{password} ||= '';
+ $b->{vga} ||= 'normal';
+ if (arch() !~ /ppc/) {
+ $in->ask_from('', N("Bootloader main options"), [
+ { label => N("Bootloader to use"), val => \$b->{method}, list => [ keys %$method_choices ], format => sub { $method_choices->{$_[0]} } },
+ arch() =~ /sparc/ ? (
+ { label => N("Bootloader installation"), val => \$b->{use_partition}, list => [ 0, 1 ], format => sub { $silo_install_lang[$_[0]] } },
+ ) : if_(arch() !~ /ia64/,
+ { label => N("Boot device"), val => \$b->{boot}, list => [ map { "/dev/$_" } (map { $_->{device} } (@{$all_hds->{hds}}, grep { !isFat($_) } @$fstab)), detect_devices::floppies_dev() ], not_edit => !$::expert },
+ { label => N("Compact"), val => \$b->{compact}, type => "bool", text => N("compact"), advanced => 1 },
+ { label => N("Video mode"), val => \$b->{vga}, list => [ keys %bootloader::vga_modes ], not_edit => !$::expert, format => sub { $bootloader::vga_modes{$_[0]} }, advanced => 1 },
+ ),
+ { label => N("Delay before booting default image"), val => \$b->{timeout} },
+ if_($security >= 4 || $b->{password} || $b->{restricted},
+ { label => N("Password"), val => \$b->{password}, hidden => 1 },
+ { label => N("Password (again)"), val => \$b->{password2}, hidden => 1 },
+ { label => N("Restrict command line options"), val => \$b->{restricted}, type => "bool", text => N("restrict") },
+ ),
+ { label => 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 },
+ if_(detect_devices::isLaptop(),
+ { label => N("Enable multi profiles"), val => \$profiles, type => 'bool', advanced => 1 },
+ ),
+ ],
+ complete => sub {
+ !$memsize || $memsize =~ /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;
+ }) or return 0;
+ } else {
+ $b->{boot} = $partition_table::mac::bootstrap_part;
+ $in->ask_from('', N("Bootloader main options"), [
+ { label => N("Bootloader to use"), val => \$b->{method}, list => [ keys %$method_choices ], format => sub { $method_choices->{$_[0]} } },
+ { 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("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;
- if ($mixed_kind_of_disks &&
- $b->{boot} =~ /\d$/ && #- on a partition
- is_empty_hash_ref($b->{bios}) && #- some bios mapping already there
- arch() !~ /ppc/) {
- log::l("mixed_kind_of_disks");
- 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).
+ if ($b->{method} eq 'grub') {
+ $in->do_pkgs->ensure_is_installed('grub', "/usr/sbin/grub", 1) or return 0;
+ }
+
+ bootloader::set_profiles($b, $profiles);
+ bootloader::add_append($b, "mem", $memsize);
-On which drive are you booting?"), \&partition_table::description, $hds) or goto &setupBootloader;
- log::l("mixed_kind_of_disks chosen $hd->{device}");
- $b->{first_hd_device} = "/dev/$hd->{device}";
+ if ($prev_clean_tmp != $clean_tmp) {
+ if ($clean_tmp) {
+ push @{$all_hds->{special}}, { device => 'none', mntpoint => '/tmp', type => 'tmpfs' };
+ } else {
+ @{$all_hds->{special}} = grep { $_->{mntpoint} eq '/tmp' } @{$all_hds->{special}};
+ }
}
+ 1;
+}
- $ask_per_entries or return 1;
+sub setupBootloader__entries {
+ my ($in, $b, $all_hds, $fstab) = @_;
$in->set_help(arch() =~ /sparc/ ? 'setupSILOAddEntry' : arch() =~ /ppc/ ? 'setupYabootAddEntry' : 'setupBootloaderAddEntry') unless $::isStandalone;
@@ -242,13 +247,13 @@ On which drive are you booting?"), \&partition_table::description, $hds) or goto
my @l;
if ($e->{type} eq "image") {
@l = (
-{ label => N("Image"), val => \$e->{kernel_or_dev}, list => [ map { s/$prefix//; $_ } glob_("$prefix/boot/vmlinuz*") ], not_edit => 0 },
+{ label => N("Image"), val => \$e->{kernel_or_dev}, list => [ map { s/$::prefix//; $_ } glob_("$::prefix/boot/vmlinuz*") ], not_edit => 0 },
{ label => N("Root"), val => \$e->{root}, list => [ map { "/dev/$_->{device}" } @$fstab ], not_edit => !$::expert },
{ label => N("Append"), val => \$e->{append} },
if_(arch() !~ /ppc|ia64/,
{ label => N("Video mode"), val => \$e->{vga}, list => [ keys %bootloader::vga_modes ], format => sub { $bootloader::vga_modes{$_[0]} }, not_edit => !$::expert },
),
-{ label => N("Initrd"), val => \$e->{initrd}, list => [ map { s/$prefix//; $_ } glob_("$prefix/boot/initrd*") ], not_edit => 0 },
+{ label => N("Initrd"), val => \$e->{initrd}, list => [ map { s/$::prefix//; $_ } glob_("$::prefix/boot/initrd*") ], not_edit => 0 },
{ label => N("Read-write"), val => \$e->{'read-write'}, type => 'bool' }
);
@l = @l[0..2] unless $::expert;
@@ -256,7 +261,7 @@ On which drive are you booting?"), \&partition_table::description, $hds) or goto
@l = (
{ label => N("Root"), val => \$e->{kernel_or_dev}, list => [ map { "/dev/$_->{device}" } @$fstab ], not_edit => !$::expert },
if_(arch() !~ /sparc|ppc|ia64/,
-{ label => N("Table"), val => \$e->{table}, list => [ '', map { "/dev/$_->{device}" } @$hds ], not_edit => !$::expert },
+{ label => N("Table"), val => \$e->{table}, list => [ '', map { "/dev/$_->{device}" } @{$all_hds->{hds}} ], not_edit => !$::expert },
{ label => N("Unsafe"), val => \$e->{unsafe}, type => 'bool' }
),
);