summaryrefslogtreecommitdiffstats
path: root/perl-install/standalone/bootloader-config
blob: 1f3efae3d7242bdcb9daaa252e5d33de0a9b8da2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/usr/bin/perl

use lib qw(/usr/lib/libDrakX);
use Getopt::Long;

use common;
use bootloader;

$::isStandalone = 1; #- not using standalone which messes with @ARGV and usage

my %options = (
	       'action=s' => \ (my $action),
	       'kernel-version=s' => \ (my $kernel_version), 

	       'vmlinuz=s' => \ (my $vmlinuz), 
	       'initrd-options=s' => \ (my $initrd_options),
	       'no-link' => \ (my $nolink),
	       'no-entry' => \ (my $no_entry),
	       'no-launch' => \ (my $no_launch),
	       'no-initrd' => \ (my $no_initrd),	       
	      );

GetOptions(%options) or die "usage: Releve " . join(' ', map { "[--$_]" } keys %options) . "\n";

my @known_actions = qw(add-kernel remove-kernel update-splash remove-splash detectloader);
$action && member($action, @known_actions) or die "<action> must be one of " . join(' ', @known_actions) . "\n";

if ($vmlinuz) {
    if (my $ver = bootloader::vmlinuz2version($vmlinuz)) {
	if ($kernel_version) {
	    $kernel_version eq $ver or die "$kernel_version and $ver don't match (hint: don't pass both --vmlinuz and --kernel-version)\n";
	} else {
	    $kernel_version = $ver;
	}
    }
    $vmlinuz = "/boot/$vmlinuz" if $vmlinuz !~ m!^/!;
} elsif ($kernel_version) {
    $vmlinuz = "/boot/vmlinuz-$kernel_version";
}


my $all_hds = fsedit::get_hds();
fs::get_info_from_fstab($all_hds, '');
my $hds = $all_hds->{hds};

my $bootloader = bootloader::read([ fsedit::get_fstab(@$hds) ]) or die "Cannot find a boot loader installed\n";


$action =~ s/-/_/g;
$::{$action}->();


#-###############################################################################
sub remove_now_broken_boot_symlinks() {
    foreach (glob("/boot/vmlinuz*"), glob("/boot/initrd*")) {
	-l $_ && !-e $_ or next;
	log::l("removing now broken symlink $_");
	unlink $_;
    }
}
sub remove_kernel() {
    unlink "/lib/modules/$kernel_version/build";
    remove_now_broken_boot_symlinks();


    my ($to_remove, $to_keep) = partition {
	$_->{kernel_or_dev} && $_->{kernel_or_dev} eq $vmlinuz;
    } @{$bootloader->{entries}};

    $_->{initrd} && unlink $_->{initrd} foreach @$to_remove;

#    foreach (@$to_keep) {
#	$_->{kernel_or_dev} && bootloader::expand_vmlinuz_symlink($_->{kernel_or_dev}) eq $vmlinuz or next;
#    }

    @{$bootloader->{entries}} = @$to_keep;


    modify_bootloader();
}    


#-###############################################################################
sub add_kernel() {
    bootloader::create_link_source();

    my $kernel_str = bootloader::vmlinuz2kernel_str($vmlinuz);
    my $root_part = fsedit::get_root([ fsedit::get_fstab(@$hds) ]);
    bootloader::add_kernel($bootloader, $kernel_str, 
			   { 
			    root => "/dev/$root_part->{device}", 
			    initrd_options => $initrd_options,
			    if_($bootloader->{default_vga}, vga => $bootloader->{default_vga}),
			   }, $nolink, $no_initrd);

    modify_bootloader();
}

sub modify_bootloader() {
    !$no_entry or return;

    bootloader::action($bootloader, 'write', $hds);
    bootloader::action($bootloader, 'when_config_changed', $hds) if !$no_launch;
}

#-###############################################################################
sub update_splash() {
    foreach (@{$bootloader->{entries}}) {
	bootloader::make_boot_splash($_->{initrd}, $_->{vga}) if $_->{initrd};
    }
}

sub remove_splash() {
    foreach (@{$bootloader->{entries}}) {
	bootloader::remove_boot_splash($_->{initrd}) if $_->{initrd};
    }
}

sub detectloader() {
    print $bootloader && uc(bootloader::main_method($bootloader->{method})), "\n";
}