Linux-Bootloader

 view release on metacpan or  search on metacpan

contrib/boottool.pl  view on Meta::CPAN

            push ( @newkernel, "$line\n" );
        } else {
            $line = "\tkernel $sections[$default]{kernel}";
            $line .= " $sections[$default]{root}" if defined $sections[$default]{root};
            $line .= " $sections[$default]{args}" if defined $sections[$default]{args};
            push( @newkernel, "$line\n" );
        }
        $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};
    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, $_ );
        }
    }

    @bootconfig = @newconfig;

    if ( defined $param{'make-default'} || defined $param{'boot-once'} ) {
        &set_default( $param{position} );
    }
    print "Added: $param{'title'}.\n";
}

# Update kernel args

sub update_grub {
    my %params = @_;

    print("Updating kernel.\n") if &debug() > 1;

    if ( !defined $params{'update-kernel'} && !defined $params{'xenhyper-args'}
        || ( !defined $params{'args'} && !defined $params{'remove-args'} 
        && !defined $params{'xenhyper-args'} ) )
    {
        warn
"ERROR:  kernel position or title (--update-kernel) and args (--args or --remove-args) required.\n";
        return undef;
    }

    return undef unless &_check_config();

    my @config   = @bootconfig;
    my @sections = &_info();

    # if not a number, do title lookup
    if ( $params{'update-kernel'} !~ /^\d+$/ ) {
        $params{'update-kernel'} = &_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+)(.*)';
    if ( !defined $params{'update-xenhyper'} && defined $params{'xen'} )
    {
    $kregex = '(^\s*module\s+\S+vmlinuz\S+)(.*)' if defined $params{'xen'};
    }

    my $index = -1;
    foreach (@config) {
        if ( $_ =~ /^\s*title/i ) {
            $index++;
        }
        if ( $index == $params{'update-kernel'} ) {
            if ( $_ =~ /$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'} || defined $params{'xenhyper-args'} ) {
                    $params{'args'} = $params{'xenhyper-args'} if defined $params{'xenhyper-args'};
                    my $base_arg = $params{'args'};
                    $base_arg =~ s/\=.*//;
                    $args =~ s/\s+$base_arg(\=\S+|\s+|$)/ /ig;
                    $args = $args . " " . $params{'args'};
                }
                if ( $_ eq $kernel . $args . "\n" ) {
                    warn "WARNING:  No change made to args.\n";
                    return undef;
                }

contrib/boottool.pl  view on Meta::CPAN

    # Use default kernel to fill in missing info
    my $default = &get_default();
    $default++;

    foreach my $p ( 'args', 'root' ) {
        if ( !defined $param{$p} ) {
            $param{$p} = $sections[$default]{$p};
        }
    }

    # use default entry to determine if path (/boot) should be removed
    if ( $sections[$default]{'kernel'} !~ /^\/boot/ ) {
        $param{'add-kernel'} =~ s/^\/boot//;
        $param{'initrd'} =~ s/^\/boot// unless ( !defined $param{'initrd'} );
    }

    my @newkernel;
    push( @newkernel,
        "image=$param{'add-kernel'}\n",
        "\tlabel=$param{title}\n" );
    push( @newkernel, "\tappend=\"$param{args}\"\n" ) if defined $param{args};
    push( @newkernel, "\tinitrd=$param{initrd}\n" )   if defined $param{initrd};
    push( @newkernel, "\troot=$param{root}\n" )       if defined $param{root};
    push( @newkernel, "\tread-only\n\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*(image|other)/i ) {
                if ( $index == $param{position} ) {
                    push( @newconfig, @newkernel );
                }
                $index++;
            }
            push( @newconfig, $_ );
        }
    }

    @bootconfig = @newconfig;

    if ( defined $param{'make-default'} ) {
        &set_default( $param{position} );
    }
}

# Update kernel args

sub update {
    my %params = @_;

    return &update_grub(%params) if ( $bootloader eq 'grub' );

    print("Updating kernel.\n") if &debug() > 1;

    if ( !defined $params{'update-kernel'}
        || ( !defined $params{'args'} && !defined $params{'remove-args'} ) )
    {
        warn
"ERROR:  kernel position or title (--update-kernel) and args (--args or --remove-args) required.\n";
        return undef;
    }

    return undef unless &_check_config();

    my @config   = @bootconfig;
    my @sections = &_info();

    # if not a number, do title lookup
    if ( $params{'update-kernel'} !~ /^\d+$/ ) {
        $params{'update-kernel'} = &_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 $index = -1;
    foreach (@config) {
        if ( $_ =~ /^\s*(image|other)/i ) {
            $index++;
        }
        if ( $index == $params{'update-kernel'} ) {
            if ( $_ =~ /(^\s*append[\s\=]+)(.*)\n/i ) {
                my $append = $1;
                my $args   = $2;
                $args =~ s/\"|\'//g;
                $args =~ s/\s*$params{'remove-args'}\=*\S*//ig
                  if defined $params{'remove-args'};
                $args = $args . " " . $params{'args'}
                  if defined $params{'args'};
                if ( $_ eq "$append\"$args\"\n" ) {
                    warn "WARNING:  No change made to args.\n";
                    return undef;
                }
                else {
                    $_ = "$append\"$args\"\n";
                }
                next;
            }
        }
    }
    @bootconfig = @config;
}



( run in 0.500 second using v1.01-cache-2.11-cpan-df04353d9ac )