[PATCH] boottool: Handle boot once logic differenly for Red Hat systems

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



As the method previously proposed to get boot once working does
not work for distros other than Red Hat, let's not modify the
way boottool works, rather, handle boot_once logic in a special
case for the Red Hat distros, on the boottool wrapper code. Ugly
but works without breaking what was already working.

Signed-off-by: Lucas Meneghel Rodrigues <lmr@xxxxxxxxxx>
---
 client/common_lib/boottool.py |   29 +++++++++++++++++++++++++++--
 client/tools/boottool         |   12 +++++++++++-
 2 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/client/common_lib/boottool.py b/client/common_lib/boottool.py
index f123f1c..3c1bd33 100644
--- a/client/common_lib/boottool.py
+++ b/client/common_lib/boottool.py
@@ -1,7 +1,8 @@
 # Copyright 2009 Google Inc. Released under the GPL v2
 
 import re
-
+from autotest_lib.client.bin import utils as client_utils
+import utils
 
 class boottool(object):
     """
@@ -267,11 +268,35 @@ class boottool(object):
         Sets a specific entry for the next boot, then falls back to the
         default kernel.
 
+        Apparently there is no standard to get it done in a distro agnostic
+        way, because even the same program, with similar versions behaves
+        differently from distro to distro. If for some reason this is not
+        working for your particular distro, you might have to implement some
+        custom logic on this method (I know is ugly, but it seems to be the
+        least intrusive option).
+
         @param kernel: title that identifies the entry to set for booting. If
                 evaluates to false, this becomes a no-op.
         """
+        vendor = client_utils.get_os_vendor()
         if title:
-            self._run_boottool('--boot-once', '--title=%s' % title)
+            if vendor in ['Red Hat', 'Fedora']:
+                try:
+                    title_index = int(title)
+                except ValueError:
+                    title_index = self._lookup(title)
+                g_cmd = ('echo "savedefault --default=%s --once" '
+                         '| grub --batch' % title_index)
+                utils.system(g_cmd)
+            else:
+                self._run_boottool('--boot-once', '--title=%s' % title)
+
+
+    def _lookup(self, title):
+        """
+        Finds the index of the given title.
+        """
+        return int(self._run_boottool('--lookup', '--title=%s' % title))
 
 
     def enable_xen_mode(self):
diff --git a/client/tools/boottool b/client/tools/boottool
index 4dafbab..93515ca 100755
--- a/client/tools/boottool
+++ b/client/tools/boottool
@@ -2425,6 +2425,7 @@ GetOptions(
            "force",
            "boot-once",
            "install",
+           "lookup",
 	   "module=s@", 
            "default",
            "help",
@@ -2533,7 +2534,10 @@ if (defined $params{'install'}) {
     $bootloader->read();
     $bootloader->set_default($params{'title'});
     $bootloader->write();
-  } 
+  }
+} elsif (defined $params{'lookup'} && defined $params{'title'}) {
+  $bootloader->read();
+  print $bootloader->_lookup($params{title});
 }
 
  
@@ -2554,6 +2558,7 @@ boottool [--bootloader-probe] [--arch-probe]
          [--remove-kernel=<#|title|start|end>] [--module=<module>]
          [--update-kernel=<#|title>] [--remove-args=<args>]
          [--info=<all|default|#>] [--default]
+         [--lookup] [--title]
          [--help] [--debug=<0..5>] [--set-default=<#>]
 
 =head1 DESCRIPTION
@@ -2641,6 +2646,11 @@ Also accepts 'start' or 'end'.
 Updates the bootloader to set the default boot entry to given given
 position or title.
 
+=item B<--lookup>=I<string>
+
+Returns the given index of position given by title. Has to be used with the
+option --title.
+
 =item B<--boot-once>
 
 Causes the bootloader to boot the kernel specified by --title just one
-- 
1.7.2.3

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux