diff options
Diffstat (limited to 'perl-install/standalone/bootloader-config')
| -rwxr-xr-x | perl-install/standalone/bootloader-config | 57 |
1 files changed, 37 insertions, 20 deletions
diff --git a/perl-install/standalone/bootloader-config b/perl-install/standalone/bootloader-config index 56245dcd3..e80133fde 100755 --- a/perl-install/standalone/bootloader-config +++ b/perl-install/standalone/bootloader-config @@ -26,14 +26,14 @@ my %options = ( ); GetOptions(%options) or die <<'EOF'; -usage: Releve --action add-kernel (--image <vmlinuz> | --kernel-version <2.6.xxx>) [--label <...>] [--no-short-name] [--initrd-options <options>] - Releve --action remove-kernel (--image <vmlinuz> | --kernel-version <2.6.xxx>) +usage: bootloader-config --action add-kernel (--image <vmlinuz> | --kernel-version <2.6.xxx>) [--label <...>] [--no-short-name] [--initrd-options <options>] + bootloader-config --action remove-kernel (--image <vmlinuz> | --kernel-version <2.6.xxx>) - Releve --action add-entry (--image <image> | --chainload <device>) --label <...> - Releve --action remove-entry (--image <image> | --chainload <device> | --label <...>) + bootloader-config --action add-entry (--image <image> | --chainload <device>) --label <...> + bootloader-config --action remove-entry (--image <image> | --chainload <device> | --label <...>) - Releve --action update-splash - Releve --action remove-splash + bootloader-config --action update-splash + bootloader-config --action remove-splash EOF my @known_actions = qw(add-kernel remove-kernel update-splash remove-splash detectloader add-entry remove-entry); @@ -54,10 +54,9 @@ if ($image) { my $all_hds = fsedit::get_hds(); -fs::get_info_from_fstab($all_hds, ''); -my $hds = $all_hds->{hds}; +fs::get_info_from_fstab($all_hds); -my $bootloader = bootloader::read([ fsedit::get_fstab(@$hds) ]) or die "Cannot find a boot loader installed\n"; +my $bootloader = bootloader::read([ fs::get::fstab($all_hds) ]) or die "Cannot find a boot loader installed\n"; $action =~ s/-/_/g; @@ -76,19 +75,37 @@ sub remove_kernel() { unlink "/lib/modules/$kernel_version/build"; remove_now_broken_boot_symlinks(); + my %proposed_labels; + my @new_entries; my ($to_remove, $to_keep) = partition { - $_->{kernel_or_dev} && $_->{kernel_or_dev} eq $image; + if ($_->{kernel_or_dev} && $_->{kernel_or_dev} eq $image) { + 1; + } else { + my $vmlinuz = $_->{kernel_or_dev} && bootloader::expand_vmlinuz_symlink($_->{kernel_or_dev}); + if ($vmlinuz && "/boot/$vmlinuz" eq $image) { + if (!%proposed_labels) { + %proposed_labels = bootloader::get_kernels_and_labels_before_kernel_remove($vmlinuz); + } + if (my $proposed = $proposed_labels{$_->{label}}) { + my %to_add = %$_; + put_in_hash(\%to_add, $proposed); + push @new_entries, \%to_add; + } + 1; + } else { + 0; + } + } } @{$bootloader->{entries}}; $_->{initrd} && unlink $_->{initrd} foreach @$to_remove; -# foreach (@$to_keep) { -# $_->{kernel_or_dev} && bootloader::expand_vmlinuz_symlink($_->{kernel_or_dev}) eq $image or next; -# } - @{$bootloader->{entries}} = @$to_keep; + foreach (@new_entries) { + bootloader::add_kernel($bootloader, $_, {}); + } modify_bootloader(); } @@ -98,9 +115,9 @@ sub remove_kernel() { sub add_kernel() { bootloader::create_link_source(); - my $kernel_str = bootloader::vmlinuz2kernel_str($image); + my $kernel_str = bootloader::vmlinuz2kernel_str($image) or die "bad kernel name $image\n"; - my $root_part = fsedit::get_root([ fsedit::get_fstab(@$hds) ]); + my $root_part = fs::get::root([ fs::get::fstab($all_hds) ]) or die "can't find root partition\n"; my %opts = ( root => "/dev/$root_part->{device}", initrd_options => $initrd_options, @@ -120,8 +137,8 @@ sub add_kernel() { sub modify_bootloader() { !$no_entry or return; - bootloader::action($bootloader, 'write', $hds); - bootloader::action($bootloader, 'when_config_changed', $hds) if !$no_launch; + bootloader::action($bootloader, 'write', $all_hds); + bootloader::action($bootloader, 'when_config_changed') if !$no_launch; } #-############################################################################### @@ -156,14 +173,14 @@ sub update_splash() { foreach (@{$bootloader->{entries}}) { bootloader::add_boot_splash($_->{initrd}, $_->{vga}) if $_->{initrd}; } - bootloader::action($bootloader, 'when_config_changed', $hds) if !$no_launch; + bootloader::action($bootloader, 'when_config_changed') if !$no_launch; } sub remove_splash() { foreach (@{$bootloader->{entries}}) { bootloader::remove_boot_splash($_->{initrd}) if $_->{initrd}; } - bootloader::action($bootloader, 'when_config_changed', $hds) if !$no_launch; + bootloader::action($bootloader, 'when_config_changed') if !$no_launch; } sub detectloader() { |
