From 29a5fcbdc19c55b0d903b84c469666647cd14399 Mon Sep 17 00:00:00 2001 From: Boris Ostrovsky Date: Fri, 27 Jun 2014 10:07:31 -0400 Subject: [PATCH] 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 Acked-by: Ian Campbell (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 9ff843780d..62d75ef40a 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 6d09d960f1..5287c9ba8d 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: