diff options
| author | Steven Rostedt <srostedt@redhat.com> | 2012-11-13 14:30:37 -0500 | 
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2012-11-13 14:30:37 -0500 | 
| commit | a15ba91361d46b4cc71d76d5712fb6420b517d8a (patch) | |
| tree | cd19df83d9631fea30a7f21f0b00aa987d027e32 /tools/testing | |
| parent | 77b67063bb6bce6d475e910d3b886a606d0d91f7 (diff) | |
| download | linux-a15ba91361d46b4cc71d76d5712fb6420b517d8a.tar.bz2 | |
ktest: Add support for grub2
As only grub or 'script' is supported for rebooting to a new kernel,
and Fedora 17 has dropped support for grub, I decided to add grub2
support as well (I also plan on adding syslinux/extlinux support too).
The options GRUB_FILE and GRUB_REBOOT were added to allow the user
to specify where to find the grub.cfg and what tool to use to reboot
into the next kernel respectively.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'tools/testing')
| -rwxr-xr-x | tools/testing/ktest/ktest.pl | 69 | ||||
| -rw-r--r-- | tools/testing/ktest/sample.conf | 26 | 
2 files changed, 91 insertions, 4 deletions
| diff --git a/tools/testing/ktest/ktest.pl b/tools/testing/ktest/ktest.pl index c7ba7614061b..63245a56aca3 100755 --- a/tools/testing/ktest/ktest.pl +++ b/tools/testing/ktest/ktest.pl @@ -53,6 +53,7 @@ my %default = (      "STOP_AFTER_FAILURE"	=> 60,      "STOP_TEST_AFTER"		=> 600,      "MAX_MONITOR_WAIT"		=> 1800, +    "GRUB_REBOOT"		=> "grub2-reboot",  # required, and we will ask users if they don't have them but we keep the default  # value something that is common. @@ -105,7 +106,9 @@ my $scp_to_target;  my $scp_to_target_install;  my $power_off;  my $grub_menu; +my $grub_file;  my $grub_number; +my $grub_reboot;  my $target;  my $make;  my $pre_install; @@ -232,6 +235,8 @@ my %option_map = (      "ADD_CONFIG"		=> \$addconfig,      "REBOOT_TYPE"		=> \$reboot_type,      "GRUB_MENU"			=> \$grub_menu, +    "GRUB_FILE"			=> \$grub_file, +    "GRUB_REBOOT"		=> \$grub_reboot,      "PRE_INSTALL"		=> \$pre_install,      "POST_INSTALL"		=> \$post_install,      "NO_INSTALL"		=> \$no_install, @@ -368,7 +373,7 @@ EOF      ;  $config_help{"REBOOT_TYPE"} = << "EOF"   Way to reboot the box to the test kernel. - Only valid options so far are "grub" and "script". + Only valid options so far are "grub", "grub2", and "script".   If you specify grub, it will assume grub version 1   and will search in /boot/grub/menu.lst for the title \$GRUB_MENU @@ -378,11 +383,14 @@ $config_help{"REBOOT_TYPE"} = << "EOF"   The entry in /boot/grub/menu.lst must be entered in manually.   The test will not modify that file. + + If you specify grub2, then you also need to specify both \$GRUB_MENU + and \$GRUB_FILE.  EOF      ;  $config_help{"GRUB_MENU"} = << "EOF"   The grub title name for the test kernel to boot - (Only mandatory if REBOOT_TYPE = grub) + (Only mandatory if REBOOT_TYPE = grub or grub2)   Note, ktest.pl will not update the grub menu.lst, you need to   manually add an option for the test. ktest.pl will search @@ -393,6 +401,17 @@ $config_help{"GRUB_MENU"} = << "EOF"   title Test Kernel   kernel vmlinuz-test   GRUB_MENU = Test Kernel + + For grub2, a search of \$GRUB_FILE is performed for the lines + that begin with "menuentry". It will not detect submenus. The + menu must be a non-nested menu. Add the quotes used in the menu + to guarantee your selection, as the first menuentry with the content + of \$GRUB_MENU that is found will be used. +EOF +    ; +$config_help{"GRUB_FILE"} = << "EOF" + If grub2 is used, the full path for the grub.cfg file is placed + here. Use something like /boot/grub2/grub.cfg to search.  EOF      ;  $config_help{"REBOOT_SCRIPT"} = << "EOF" @@ -521,6 +540,11 @@ sub get_ktest_configs {      if ($rtype eq "grub") {  	get_ktest_config("GRUB_MENU");      } + +    if ($rtype eq "grub2") { +	get_ktest_config("GRUB_MENU"); +	get_ktest_config("GRUB_FILE"); +    }  }  sub process_variables { @@ -1452,8 +1476,44 @@ sub run_scp_mod {      return run_scp($src, $dst, $cp_scp);  } +sub get_grub2_index { + +    return if (defined($grub_number)); + +    doprint "Find grub2 menu ... "; +    $grub_number = -1; + +    my $ssh_grub = $ssh_exec; +    $ssh_grub =~ s,\$SSH_COMMAND,cat $grub_file,g; + +    open(IN, "$ssh_grub |") +	or die "unable to get $grub_file"; + +    my $found = 0; + +    while (<IN>) { +	if (/^menuentry.*$grub_menu/) { +	    $grub_number++; +	    $found = 1; +	    last; +	} elsif (/^menuentry\s/) { +	    $grub_number++; +	} +    } +    close(IN); + +    die "Could not find '$grub_menu' in $grub_file on $machine" +	if (!$found); +    doprint "$grub_number\n"; +} +  sub get_grub_index { +    if ($reboot_type eq "grub2") { +	get_grub2_index; +	return; +    } +      if ($reboot_type ne "grub") {  	return;      } @@ -1524,6 +1584,8 @@ sub reboot_to {      if ($reboot_type eq "grub") {  	run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'"; +    } elsif ($reboot_type eq "grub2") { +	run_ssh "$grub_reboot $grub_number";      } elsif (defined $reboot_script) {  	run_command "$reboot_script";      } @@ -3700,6 +3762,9 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {  	$target = "$ssh_user\@$machine";  	if ($reboot_type eq "grub") {  	    dodie "GRUB_MENU not defined" if (!defined($grub_menu)); +	} elsif ($reboot_type eq "grub2") { +	    dodie "GRUB_MENU not defined" if (!defined($grub_menu)); +	    dodie "GRUB_FILE not defined" if (!defined($grub_file));  	}      } diff --git a/tools/testing/ktest/sample.conf b/tools/testing/ktest/sample.conf index de28a0a3b8fc..57617ec88c3b 100644 --- a/tools/testing/ktest/sample.conf +++ b/tools/testing/ktest/sample.conf @@ -332,8 +332,18 @@  # from other linux builds on the system.  #LOCALVERSION = -test +# For REBOOT_TYPE = grub2, you must specify where the grub.cfg +# file is. This is the file that is searched to find the menu +# option to boot to with GRUB_REBOOT +#GRUB_FILE = /boot/grub2/grub.cfg + +# The tool for REBOOT_TYPE = grub2 to set the next reboot kernel +# to boot into (one shot mode). +# (default grub2_reboot) +#GRUB_REBOOT = grub2_reboot +  # The grub title name for the test kernel to boot -# (Only mandatory if REBOOT_TYPE = grub) +# (Only mandatory if REBOOT_TYPE = grub or grub2)  #  # Note, ktest.pl will not update the grub menu.lst, you need to  # manually add an option for the test. ktest.pl will search @@ -343,6 +353,15 @@  # For example, if in the /boot/grub/menu.lst the test kernel title has:  # title Test Kernel  # kernel vmlinuz-test +# +# For grub2, a search of top level "menuentry"s are done. No +# submenu is searched. The menu is found by searching for the +# contents of GRUB_MENU in the line that starts with "menuentry". +# You may want to include the quotes around the option. For example: +# for: menuentry 'Test Kernel' +# do a: GRUB_MENU = 'Test Kernel' +# For customizing, add your entry in /etc/grub.d/40_custom. +#  #GRUB_MENU = Test Kernel  # A script to reboot the target into the test kernel @@ -497,7 +516,7 @@  #POST_BUILD_DIE = 1  # Way to reboot the box to the test kernel. -# Only valid options so far are "grub" and "script" +# Only valid options so far are "grub", "grub2" and "script"  # (default grub)  # If you specify grub, it will assume grub version 1  # and will search in /boot/grub/menu.lst for the title $GRUB_MENU @@ -505,6 +524,9 @@  # your setup, then specify "script" and have a command or script  # specified in REBOOT_SCRIPT to boot to the target.  # +# For REBOOT_TYPE = grub2, you must define both GRUB_MENU and +# GRUB_FILE. +#  # The entry in /boot/grub/menu.lst must be entered in manually.  # The test will not modify that file.  #REBOOT_TYPE = grub |