Linux-Bootloader
view release on metacpan or search on metacpan
lib/Linux/Bootloader/Grub.pm view on Meta::CPAN
$line .= " $sections[$default]{args}" if defined $sections[$default]{args};
push( @newkernel, "$line\n" );
push( @newkernel, "\tinitrd $sections[$default]{'initrd'}\n" ) if defined $sections[$default]{'initrd'};
$line = "\tmodule $param{'add-kernel'}" if defined $param{'add-kernel'};
$line .= " root=$param{root}" if defined $param{root};
$line .= " $param{args}" if defined $param{args};
push( @newkernel, "$line\n" );
push( @newkernel, "\tmodule $param{initrd}\n" ) if defined $param{initrd};
} else {
$line = "\tkernel $param{'add-kernel'}" if defined $param{'add-kernel'};
$line .= " root=$param{root}" if defined $param{root};
$line .= " $param{args}" if defined $param{args};
push( @newkernel, "$line\n" );
push( @newkernel, "\tinitrd $param{initrd}\n" ) if defined $param{initrd};
}
push(@newkernel, "\tsavedefault $param{savedefault}\n") if defined $param{savedefault};
foreach my $module (@{$param{'module'}}) {
push(@newkernel, "\tmodule " . $module . "\n");
}
push(@newkernel, "\n");
if (!defined $param{position} || $param{position} !~ /end|\d+/) {
$param{position}=0
}
my @newconfig;
if ($param{position}=~/end/ || $param{position} >= $#sections) {
$param{position}=$#sections;
push (@newconfig,@config);
if ($newconfig[$#newconfig] =~ /\S/) {
push (@newconfig, "\n");
}
push (@newconfig,@newkernel);
} else {
my $index=0;
foreach (@config) {
if ($_ =~ /^\s*title/i) {
if ($index==$param{position}) {
push (@newconfig, @newkernel);
}
$index++;
}
push (@newconfig, $_);
}
}
@{$self->{config}} = @newconfig;
if (defined $param{'make-default'} || defined $param{'boot-once'}) {
$self->set_default($param{position});
}
print "Added: $param{'title'}.\n";
}
# Update kernel args
sub update {
my $self=shift;
my %params=@_;
print ("Updating kernel.\n") if $self->debug()>1;
if (defined $params{'option'} && !defined $params{'update-kernel'}) {
return $self->update_main_options(%params);
} elsif (!defined $params{'update-kernel'} || (!defined $params{'args'} && !defined $params{'remove-args'} && !defined $params{'option'})) {
warn "ERROR: kernel position or title (--update-kernel) and args (--args or --remove-args) required.\n";
return undef;
}
return undef unless $self->_check_config();
# my @config = @{$self->{config}};
my @sections=$self->_info();
# if not a number, do title lookup
if (defined $params{'update-kernel'} and $params{'update-kernel'} !~ /^\d+$/) {
$params{'update-kernel'} = $self->_lookup($params{'update-kernel'});
}
my $kcount = $#sections-1;
if ($params{'update-kernel'} !~ /^\d+$/ || $params{'update-kernel'} < 0 || $params{'update-kernel'} > $kcount) {
warn "ERROR: Enter a default between 0 and $kcount.\n";
return undef;
}
my $kregex = '(^\s*kernel\s+\S+)(.*)';
$kregex = '(^\s*module\s+\S+vmlinuz\S+)(.*)' if defined $params{'xen'};
my $index=-1;
my $config_line = -1;
my $line = '';
foreach $line (@{$self->{config}}) {
$config_line = $config_line + 1;
if ($line =~ /^\s*title/i) {
$index++;
}
if ($index==$params{'update-kernel'}) {
if (defined $params{'args'} or defined $params{'remove-args'}){
if ( $line =~ /$kregex/i ) {
my $kernel = $1;
my $args = $2;
$args =~ s/\s+$params{'remove-args'}(\=\S+|\s+|$)/ /ig if defined $params{'remove-args'};
if ( defined $params{'args'} ) {
my $base_arg = $params{'args'};
$base_arg =~ s/\=.*//;
$args =~ s/\s+$base_arg(\=\S+|\s+|$)/ /ig;
$args = $args . " " . $params{'args'};
}
if ($line eq $kernel . $args . "\n") {
warn "WARNING: No change made to args.\n";
return undef;
} else {
$line = $kernel . $args . "\n";
}
next;
}
} elsif (defined $params{'option'}){
foreach my $val ( keys %params){
if ($line =~ m/^\s*$val.*/i) {
splice @{$self->{config}},$config_line,1,"$val $params{$val}\n";
delete $params{$val};
$config_line += 1;
}
}
}
} elsif ($index > $params{'update-kernel'}){
last;
}
}
# Add any leftover parameters
delete $params{'update-kernel'};
if (defined $params{'option'}){
delete $params{'option'};
$config_line -= 1;
foreach my $val ( keys %params){
splice @{$self->{config}},$config_line,0,"$val $params{$val}\n";
$config_line += 1;
}
}
}
# Run command to install bootloader
sub install {
my $self=shift;
my $device;
warn "Re-installing grub is currently unsupported.\n";
warn "If you really need to re-install grub, use 'grub-install <device>'.\n";
return undef;
#system("grub-install $device");
#if ($? != 0) {
# warn ("ERROR: Failed to run grub-install.\n") && return undef;
#}
#return 1;
}
sub update_main_options{
my $self=shift;
my %params=@_;
delete $params{'option'};
foreach my $val (keys %params){
my $x=0;
foreach my $line ( @{$self->{config}} ) {
# Replace
if ($line =~ m/^\s*$val/) {
splice (@{$self->{config}},$x,1,"$val $params{$val}\n");
last;
}
# Add
if ($line =~ /^\s*title/i) {
# This is a new option, add it before here
print "Your option is not in current configuration. Adding.\n";
splice @{$self->{config}},$x,0,"$val $params{$val}\n";
last;
}
$x+=1;
}
}
}
sub boot_once {
my $self=shift;
my $entry_to_boot_once = shift;
unless ( $entry_to_boot_once ) { print "No kernel\n"; return undef;}
$self->read();
my $default=$self->get_default();
if ( $default == $self->_lookup($entry_to_boot_once)){
warn "The default and once-boot kernels are the same. No action taken. \nSet default to something else, then re-try.\n";
return undef;
}
if ( $self->_get_bootloader_version() < 0.97 ){
warn "This function works for grub version 0.97 and up. No action taken. \nUpgrade, then re-try.\n";
return undef;
}
$self->set_default('saved');
if ( ! -f '/boot/grub/default' ){
open FH, '>/boot/grub/default';
my $file_contents="default
#
#
#
#
#
#
#
#
#
#
# WARNING: If you want to edit this file directly, do not remove any line
# from this file, including this warning. Using `grub-set-default\' is
# strongly recommended.
";
print FH $file_contents;
( run in 0.619 second using v1.01-cache-2.11-cpan-df04353d9ac )