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

[Xen-changelog] [xen stable-4.3] tools/pygrub: Make pygrub understand default entry in string format



commit 29a5fcbdc19c55b0d903b84c469666647cd14399
Author:     Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx>
AuthorDate: Fri Jun 27 10:07:31 2014 -0400
Commit:     Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
CommitDate: Fri Feb 27 15:18:56 2015 +0000

    tools/pygrub: Make pygrub understand default entry in string format
    
    Currently pygrub can only correctly parse grub2's default attribute when it 
is
    specified as a number. If it is set to ${saved_entry} or ${next_entry} then
    the first image (i.e. entry number 0) is selected. If any other value is
    specified (typically this would be the string in menuentry) pygrub will 
crash.
    
    This patch will allow pygrub to interpret default attribute if it is 
specified
    as a string (note that in case of submenus only the leaf string will be
    considered).
    
    Also issue a warning if default is set to ${saved_entry} or ${next_entry}.
    
    Signed-off-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx>
    Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
    (cherry picked from commit d1b93ea2615bd789ee28901f1f1c05ffb319cb61)
    (cherry picked from commit 3f9d2e1863a2301a219ed9f34f6857df019555ee)
---
 tools/pygrub/src/GrubConf.py |   10 +++++-----
 tools/pygrub/src/pygrub      |   21 ++++++++++++++++++++-
 2 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/tools/pygrub/src/GrubConf.py b/tools/pygrub/src/GrubConf.py
index 9ff8437..62d75ef 100644
--- a/tools/pygrub/src/GrubConf.py
+++ b/tools/pygrub/src/GrubConf.py
@@ -227,7 +227,7 @@ class _GrubConfigFile(object):
         if val == "saved":
             self._default = 0
         else:
-            self._default = int(val)
+            self._default = val
 
         if self._default < 0:
             raise ValueError, "default must be positive number"
@@ -427,11 +427,11 @@ class Grub2ConfigFile(_GrubConfigFile):
                 
             if self.commands.has_key(com):
                 if self.commands[com] is not None:
-                    if arg.strip() == "${saved_entry}":
+                    arg_strip = arg.strip()
+                    if arg_strip == "${saved_entry}" or arg_strip == 
"${next_entry}":
+                        logging.warning("grub2's saved_entry/next_entry not 
supported")
                         arg = "0"
-                    elif arg.strip() == "${next_entry}":
-                        arg = "0"
-                    setattr(self, self.commands[com], arg.strip())
+                    setattr(self, self.commands[com], arg_strip)
                 else:
                     logging.info("Ignored directive %s" %(com,))
             elif com.startswith('set:'):
diff --git a/tools/pygrub/src/pygrub b/tools/pygrub/src/pygrub
index 6d09d96..5287c9b 100644
--- a/tools/pygrub/src/pygrub
+++ b/tools/pygrub/src/pygrub
@@ -463,9 +463,28 @@ class Grub:
     def run(self):
         timeout = int(self.cf.timeout)
 
-        self.selected_image = self.cf.default
+        if self.cf.default.isdigit():
+            self.selected_image = int(self.cf.default)
+        else:
+            # We don't fully support submenus. Look for the leaf value in
+            # "submenu0>submenu1>...>menuentry" and hope that it's unique.
+            title = self.cf.default
+            while 1:
+                try:
+                    title = re.search('(\S)>(\S.+$)',title).group(2)
+                except AttributeError:
+                    break
+
+            # Map string to index in images array
+            self.selected_image = 0
+            for i in range(len(self.cf.images)):
+                if self.cf.images[i].title == title:
+                    self.selected_image = i
+                    break
+
         # If the selected (default) image doesn't exist we select the first 
entry
         if self.selected_image > len(self.cf.images):
+            logging.warning("Default image not found")
             self.selected_image = 0
         self.isdone = False
         while not self.isdone:
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.3

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.