[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Fix pygrub for IA64 support.
# HG changeset patch # User kfraser@xxxxxxxxxxxxxxxxxxxxx # Date 1176302164 -3600 # Node ID 6cd828db1a5defcc6267e502d946a47929a8c0a9 # Parent ed78f08aad6195810f2c8296dea43eb5e3ce87ab Fix pygrub for IA64 support. Signed-off-by: Shinya Kuwamura <kuwa@xxxxxxxxxxxxxx> Signed-off-by: Tomohiro Takahashi <takatom@xxxxxxxxxxxxxx> --- tools/pygrub/src/LiloConf.py | 147 +++++++++++++++++++++++++++++++++++++++++++ tools/pygrub/src/pygrub | 25 ++++--- 2 files changed, 162 insertions(+), 10 deletions(-) diff -r ed78f08aad61 -r 6cd828db1a5d tools/pygrub/src/LiloConf.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/pygrub/src/LiloConf.py Wed Apr 11 15:36:04 2007 +0100 @@ -0,0 +1,147 @@ +# +#LiloConf.py +# + +import sys, re, os +import logging +import GrubConf + +class LiloImage(object): + def __init__(self, lines, path): + self.reset(lines, path) + + def __repr__(self): + return ("title: %s\n" + " root: %s\n" + " kernel: %s\n" + " args: %s\n" + " initrd: %s\n" %(self.title, self.root, self.kernel, + self.args, self.initrd)) + def reset(self, lines, path): + self._root = self._initrd = self._kernel = self._args = None + self.title = "" + self.lines = [] + self.path = path + map(self.set_from_line, lines) + self.root = "" # dummy + + def set_from_line(self, line, replace = None): + (com, arg) = GrubConf.grub_exact_split(line, 2) + + if self.commands.has_key(com): + if self.commands[com] is not None: + exec("%s = r\'%s\'" %(self.commands[com], re.sub('^"(.+)"$', r"\1", arg.strip()))) + else: + logging.info("Ignored image directive %s" %(com,)) + else: + logging.warning("Unknown image directive %s" %(com,)) + + # now put the line in the list of lines + if replace is None: + self.lines.append(line) + else: + self.lines.pop(replace) + self.lines.insert(replace, line) + + def set_kernel(self, val): + self._kernel = (None, self.path + "/" + val) + def get_kernel(self): + return self._kernel + kernel = property(get_kernel, set_kernel) + + def set_initrd(self, val): + self._initrd = (None, self.path + "/" + val) + def get_initrd(self): + return self._initrd + initrd = property(get_initrd, set_initrd) + + # set up command handlers + commands = { "label": "self.title", + "root": "self.root", + "rootnoverify": "self.root", + "image": "self.kernel", + "initrd": "self.initrd", + "append": "self.args", + "read-only": None, + "chainloader": None, + "module": None} + +class LiloConfigFile(object): + def __init__(self, fn = None): + self.filename = fn + self.images = [] + self.timeout = -1 + self._default = 0 + + if fn is not None: + self.parse() + + def parse(self, buf = None): + if buf is None: + if self.filename is None: + raise ValueError, "No config file defined to parse!" + + f = open(self.filename, 'r') + lines = f.readlines() + f.close() + else: + lines = buf.split("\n") + + path = os.path.dirname(self.filename) + img = [] + for l in lines: + l = l.strip() + # skip blank lines + if len(l) == 0: + continue + # skip comments + if l.startswith('#'): + continue + # new image + if l.startswith("image"): + if len(img) > 0: + self.add_image(LiloImage(img, path)) + img = [l] + continue + + if len(img) > 0: + img.append(l) + continue + + (com, arg) = GrubConf.grub_exact_split(l, 2) + if self.commands.has_key(com): + if self.commands[com] is not None: + exec("%s = r\"%s\"" %(self.commands[com], arg.strip())) + else: + logging.info("Ignored directive %s" %(com,)) + else: + logging.warning("Unknown directive %s" %(com,)) + + if len(img) > 0: + self.add_image(LiloImage(img, path)) + + def add_image(self, image): + self.images.append(image) + + def _get_default(self): + for i in range(0, len(self.images) - 1): + if self.images[i].title == self._default: + return i + return 0 + def _set_default(self, val): + self._default = val + default = property(_get_default, _set_default) + + commands = { "default": "self.default", + "timeout": "self.timeout", + "prompt": None, + "relocatable": None, + } + +if __name__ == "__main__": + if sys.argv < 2: + raise RuntimeError, "Need a grub.conf to read" + g = LiloConfigFile(sys.argv[1]) + for i in g.images: + print i #, i.title, i.root, i.kernel, i.args, i.initrd + print g.default diff -r ed78f08aad61 -r 6cd828db1a5d tools/pygrub/src/pygrub --- a/tools/pygrub/src/pygrub Wed Apr 11 15:27:14 2007 +0100 +++ b/tools/pygrub/src/pygrub Wed Apr 11 15:36:04 2007 +0100 @@ -16,6 +16,7 @@ import os, sys, string, struct, tempfile import os, sys, string, struct, tempfile, re import copy import logging +import platform import curses, _curses, curses.wrapper, curses.textpad, curses.ascii import getopt @@ -24,6 +25,7 @@ sys.path = [ '/usr/lib/python' ] + sys.p import fsimage import grub.GrubConf +import grub.LiloConf PYGRUB_VER = 0.5 @@ -353,7 +355,13 @@ class Grub: if not os.access(fn, os.R_OK): raise RuntimeError, "Unable to access %s" %(fn,) - self.cf = grub.GrubConf.GrubConfigFile() + if platform.machine() == 'ia64': + self.cf = grub.LiloConf.LiloConfigFile() + file_list = ("/efi/redhat/elilo.conf",) + else: + self.cf = grub.GrubConf.GrubConfigFile() + file_list = ("/boot/grub/menu.lst", "/boot/grub/grub.conf", + "/grub/menu.lst", "/grub/grub.conf") if not fs: # set the config file and parse it @@ -361,18 +369,15 @@ class Grub: self.cf.parse() return - grubfile = None - for f in ("/boot/grub/menu.lst", "/boot/grub/grub.conf", - "/grub/menu.lst", "/grub/grub.conf"): + for f in file_list: if fs.file_exists(f): - grubfile = f - break - if grubfile is None: - raise RuntimeError, "we couldn't find grub config file in the image provided." - f = fs.open_file(grubfile) + self.cf.filename = f + break + if self.cf.filename is None: + raise RuntimeError, "couldn't find bootloader config file in the image provided." + f = fs.open_file(self.cf.filename) buf = f.read() del f - # then parse the grub config self.cf.parse(buf) def run(self): _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |