ybin userland interface for specifying bootonce
authorPaul Nasrat <pnasrat@redhat.com>
Thu, 19 Apr 2007 09:14:24 +0000 (10:14 +0100)
committerPaul Nasrat <pauln@enki.eridu>
Thu, 19 Apr 2007 09:14:24 +0000 (10:14 +0100)
Add an option to ybin called "--bootonce" that takes exactly one
argument, the label of the kernel to boot exactly once, on next reboot.

Do some sanity checking.  Grep through the yaboot config file to make
sure that label=WHATEVER exists somewhere, bail if not.  Try to prune
out comment lines.  Perhaps this might be implemented better.  It worked
will in my testing, though.

Set the boot-once OF environment variable to the --bootonce value.  Due
to the previously mentioned nvsetenv bug, this will fail silently if
you're trying to set boot-once on a system where boot-once doesn't
already exist in nvram.  Thus, immediately after doing the set, try and
read it back out of nvsetenv and make sure it landed there.  Bail if
not.

Signed-off-by: Dustin Kirkland <dustin.kirkland@us.ibm.com>
ybin/ybin

index 210711f..046b6bd 100755 (executable)
--- a/ybin/ybin
+++ b/ybin/ybin
@@ -155,6 +155,8 @@ Update/install bootloader onto a bootstrap partition.
   -b, --boot                 set bootstrap partition device [ -b /dev/hda2 ]
   -o, --ofboot               set bootstrap partition OpenFirmware device
                               default: automatically determined [ -o hd:2 ]
+       --bootonce            override default boot label for ONLY next boot
+                                eg: --bootonce linux-2.6.20-testing
   -i, --install              pathname to the actual bootloader binary
                                default: /usr/{local/}lib/yaboot/yaboot same as
                                install= in config file [ -i bootloader_file ]
@@ -1377,6 +1379,17 @@ if [ $# != 0 ] ; then
                    exit 1
                fi
                ;;
+           --bootonce)
+               if [ -n "$2" ] ; then
+                   bootonce="$2"
+                   ARGS="$ARGS $1 $2"
+                   shift 2
+               else
+                   echo 1>&2 "$PRG: option requires an argument $1"
+                   echo 1>&2 "Try \`$PRG --help' for more information."
+                   exit 1
+               fi
+               ;;
            -i|--install)
                if [ -n "$2" ] ; then
                    install="$2"
@@ -1643,6 +1656,28 @@ fi
 ## validate configuration for sanity.
 checkconf || exit 1
 
+if [ "x$bootonce" != "x" ]; then
+    foundlabel=`sed s/\#.*// $bootconf | grep "label=$bootonce$" | wc -l`
+    if [ "$nonvram" = 0 ]; then
+       echo 1>&2 "$PRG: --bootonce specified, but nvsetenv not available."
+       exit 1
+    fi
+    if [ "$foundlabel" = 1 ]; then
+       nvsetenv boot-once "$bootonce"
+       foundlabel=`nvsetenv boot-once`
+       if [ "$foundlabel" != "boot-once=$bootonce" ]; then
+           echo 1>&2 "$PRG: Could not nvsetenv boot-once $bootonce"
+           exit 1
+       fi
+       [ "$VERBOSE" = 1 ] && echo "$PRG: nvsetenv boot-once $bootonce"
+    else
+       echo 1>&2 "$PRG: Could not find bootonce label [$bootonce] in $bootconf"
+       exit 1
+    fi
+fi
+
+bootparts=0
+
 ## check that we can use ofpath, its only needed for magicboot script
 ## building and nvram updates.
 if [ -n "$magicboot" -o "$nonvram" = 0 ] ; then