Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d10523af authored by Steven Rostedt's avatar Steven Rostedt Committed by Greg Kroah-Hartman
Browse files

kest.pl: Fix grub2 menu handling for rebooting



commit 26df05a8c1420ad3de314fdd407e7fc2058cc7aa upstream.

grub2 has submenus where to use grub-reboot, it requires:

  grub-reboot X>Y

where X is the main index and Y is the submenu. Thus if you have:

menuentry 'Debian GNU/Linux' --class debian --class gnu-linux ...
	[...]
}
submenu 'Advanced options for Debian GNU/Linux' $menuentry_id_option ...
        menuentry 'Debian GNU/Linux, with Linux 6.0.0-4-amd64' --class debian --class gnu-linux ...
                [...]
        }
        menuentry 'Debian GNU/Linux, with Linux 6.0.0-4-amd64 (recovery mode)' --class debian --class gnu-linux ...
		[...]
        }
        menuentry 'Debian GNU/Linux, with Linux test' --class debian --class gnu-linux ...
                [...]
        }

And wanted to boot to the "Linux test" kernel, you need to run:

 # grub-reboot 1>2

As 1 is the second top menu (the submenu) and 2 is the third of the sub
menu entries.

Have the grub.cfg parsing for grub2 handle such cases.

Cc: stable@vger.kernel.org
Fixes: a15ba913 ("ktest: Add support for grub2")
Reviewed-by: default avatarJohn 'Warthog9' Hawley (VMware) <warthog9@eaglescrag.net>
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent d089baa5
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -1881,7 +1881,7 @@ sub run_scp_mod {

sub _get_grub_index {

    my ($command, $target, $skip) = @_;
    my ($command, $target, $skip, $submenu) = @_;

    return if (defined($grub_number) && defined($last_grub_menu) &&
	       $last_grub_menu eq $grub_menu && defined($last_machine) &&
@@ -1898,11 +1898,16 @@ sub _get_grub_index {

    my $found = 0;

    my $submenu_number = 0;

    while (<IN>) {
	if (/$target/) {
	    $grub_number++;
	    $found = 1;
	    last;
	} elsif (defined($submenu) && /$submenu/) {
		$submenu_number++;
		$grub_number = -1;
	} elsif (/$skip/) {
	    $grub_number++;
	}
@@ -1911,6 +1916,9 @@ sub _get_grub_index {

    dodie "Could not find '$grub_menu' through $command on $machine"
	if (!$found);
    if ($submenu_number > 0) {
	$grub_number = "$submenu_number>$grub_number";
    }
    doprint "$grub_number\n";
    $last_grub_menu = $grub_menu;
    $last_machine = $machine;
@@ -1921,6 +1929,7 @@ sub get_grub_index {
    my $command;
    my $target;
    my $skip;
    my $submenu;
    my $grub_menu_qt;

    if ($reboot_type !~ /^grub/) {
@@ -1935,8 +1944,9 @@ sub get_grub_index {
	$skip = '^\s*title\s';
    } elsif ($reboot_type eq "grub2") {
	$command = "cat $grub_file";
	$target = '^menuentry.*' . $grub_menu_qt;
	$skip = '^menuentry\s|^submenu\s';
	$target = '^\s*menuentry.*' . $grub_menu_qt;
	$skip = '^\s*menuentry';
	$submenu = '^\s*submenu\s';
    } elsif ($reboot_type eq "grub2bls") {
        $command = $grub_bls_get;
        $target = '^title=.*' . $grub_menu_qt;
@@ -1945,7 +1955,7 @@ sub get_grub_index {
	return;
    }

    _get_grub_index($command, $target, $skip);
    _get_grub_index($command, $target, $skip, $submenu);
}

sub wait_for_input
@@ -2009,7 +2019,7 @@ sub reboot_to {
    if ($reboot_type eq "grub") {
	run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'";
    } elsif (($reboot_type eq "grub2") or ($reboot_type eq "grub2bls")) {
	run_ssh "$grub_reboot $grub_number";
	run_ssh "$grub_reboot \"'$grub_number'\"";
    } elsif ($reboot_type eq "syslinux") {
	run_ssh "$syslinux --once \\\"$syslinux_label\\\" $syslinux_path";
    } elsif (defined $reboot_script) {