mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
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@oracle.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
(cherry picked from commit d1b93ea261)
(cherry picked from commit 3f9d2e1863)
This commit is contained in:
1 parent
a4d28628b3
commit
29a5fcbdc1
2 files changed
+25
-6
No files matched your search
@@ -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:'):
|
||||
|
||||
+20
-1
@@ -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:
|
||||
|
||||