ian.campbell@citrix.com
2009-Nov-22 19:14 UTC
[Xen-devel] [PATCH 0 of 5] pygrub support for Grub2 grub.cfg syntax
The following patches implement very basic support for Grub 2''s grub.cfg syntax. It''s pretty minimal but sufficient for booting Debian Squeeze which now uses grub2 by default. There are also some more generic fixes. Since grub2 is starting to be used by distros this might be worth porting to the 3.4 branch once it has baked for a while. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
ian.campbell@citrix.com
2009-Nov-22 19:14 UTC
[Xen-devel] [PATCH 1 of 5] pygrub: if default entry is "saved" then use first entry
# HG changeset patch # User Ian Campbell <ijc@hellion.org.uk> # Date 1258917181 0 # Node ID b50b4a265d3879f4c334361a433f4d23d5a65314 # Parent 32354b647470b843c18bd8261ab0b5f803a66289 pygrub: if default entry is "saved" then use first entry. pygrub doesn''t support the "savedefault" command and will error out if menu.lst uses the "default saved" directive. We might as well start on the first entry in this case instead of failing. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 32354b647470 -r b50b4a265d38 tools/pygrub/src/GrubConf.py --- a/tools/pygrub/src/GrubConf.py Sun Nov 22 19:13:01 2009 +0000 +++ b/tools/pygrub/src/GrubConf.py Sun Nov 22 19:13:01 2009 +0000 @@ -258,7 +258,7 @@ return self._default def _set_default(self, val): if val == "saved": - self._default = -1 + self._default = 0 else: self._default = int(val) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
ian.campbell@citrix.com
2009-Nov-22 19:15 UTC
[Xen-devel] [PATCH 2 of 5] pygrub: expands tabs before displaying menus
# HG changeset patch # User Ian Campbell <ijc@hellion.org.uk> # Date 1258917181 0 # Node ID 13311ab2b104f238a88b3842a05d0053eb8569dc # Parent b50b4a265d3879f4c334361a433f4d23d5a65314 pygrub: expands tabs before displaying menus. Otherwise the highlighting and line length trimming does not work as expected and the display appears corrupted. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r b50b4a265d38 -r 13311ab2b104 tools/pygrub/src/pygrub --- a/tools/pygrub/src/pygrub Sun Nov 22 19:13:01 2009 +0000 +++ b/tools/pygrub/src/pygrub Sun Nov 22 19:13:01 2009 +0000 @@ -239,7 +239,7 @@ break if y == self.selected_image: self.entry_win.attron(curses.A_REVERSE) - self.entry_win.addstr(y + 1 - self.start_image, 2, i.title.ljust(70)) + self.entry_win.addstr(y + 1 - self.start_image, 2, i.title.expandtabs().ljust(70)) if y == self.selected_image: self.entry_win.attroff(curses.A_REVERSE) self.entry_win.noutrefresh() @@ -271,7 +271,7 @@ self.entry_win.attron(curses.A_REVERSE) # trim the line - l = img.lines[idx].ljust(70) + l = img.lines[idx].expandtabs().ljust(70) if len(l) > 70: l = l[:69] + ">" _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
ian.campbell@citrix.com
2009-Nov-22 19:15 UTC
[Xen-devel] [PATCH 3 of 5] pygrub: factor generic Grub functionality into GrubConf base classes
# HG changeset patch # User Ian Campbell <ijc@hellion.org.uk> # Date 1258917181 0 # Node ID d641f06a4889748dc7efec62398b5d333ad0df87 # Parent 13311ab2b104f238a88b3842a05d0053eb8569dc pygrub: factor generic Grub functionality into GrubConf base classes and inherit from these classes to implement Grub-legacy functionality. Use a tuple of (parser-object,configuration-file) in pygrub to allow for multiple parsers. Makes way for grub2 support. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 13311ab2b104 -r d641f06a4889 tools/pygrub/src/GrubConf.py --- a/tools/pygrub/src/GrubConf.py Sun Nov 22 19:13:01 2009 +0000 +++ b/tools/pygrub/src/GrubConf.py Sun Nov 22 19:13:01 2009 +0000 @@ -78,7 +78,7 @@ self._part = int(val) part = property(get_part, set_part) -class GrubImage(object): +class _GrubImage(object): def __init__(self, lines): self.reset(lines) @@ -89,30 +89,14 @@ " args: %s\n" " initrd: %s\n" %(self.title, self.root, self.kernel, self.args, self.initrd)) + def _parse(self, lines): + map(self.set_from_line, lines) def reset(self, lines): self._root = self._initrd = self._kernel = self._args = None self.title = "" self.lines = [] - map(self.set_from_line, lines) - - def set_from_line(self, line, replace = None): - (com, arg) = grub_exact_split(line, 2) - - if self.commands.has_key(com): - if self.commands[com] is not None: - setattr(self, self.commands[com], 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) + self._parse(lines) def set_root(self, val): self._root = GrubDiskPart(val) @@ -141,6 +125,28 @@ return self._initrd initrd = property(get_initrd, set_initrd) +class GrubImage(_GrubImage): + def __init__(self, lines): + _GrubImage.__init__(self, lines) + + def set_from_line(self, line, replace = None): + (com, arg) = grub_exact_split(line, 2) + + if self.commands.has_key(com): + if self.commands[com] is not None: + setattr(self, self.commands[com], 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) + # set up command handlers commands = { "title": "title", "root": "root", @@ -149,9 +155,8 @@ "initrd": "initrd", "chainloader": None, "module": None} - -class GrubConfigFile(object): +class _GrubConfigFile(object): def __init__(self, fn = None): self.filename = fn self.images = [] @@ -164,50 +169,7 @@ 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") - - 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("title"): - if len(img) > 0: - self.add_image(GrubImage(img)) - img = [l] - continue - - if len(img) > 0: - img.append(l) - continue - - (com, arg) = grub_exact_split(l, 2) - if self.commands.has_key(com): - if self.commands[com] is not None: - setattr(self, 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(GrubImage(img)) - - if self.hasPassword(): - self.setPasswordAccess(False) + raise RuntimeError, "unimplemented parse function" def hasPasswordAccess(self): return self.passwordAccess @@ -285,7 +247,56 @@ commands[c] = None del c +class GrubConfigFile(_GrubConfigFile): + def __init__(self, fn = None): + _GrubConfigFile.__init__(self,fn) + + 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") + + 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("title"): + if len(img) > 0: + self.add_image(GrubImage(img)) + img = [l] + continue + + if len(img) > 0: + img.append(l) + continue + + (com, arg) = grub_exact_split(l, 2) + if self.commands.has_key(com): + if self.commands[com] is not None: + setattr(self, 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(GrubImage(img)) + + if self.hasPassword(): + self.setPasswordAccess(False) + if __name__ == "__main__": if sys.argv < 2: raise RuntimeError, "Need a grub.conf to read" diff -r 13311ab2b104 -r d641f06a4889 tools/pygrub/src/pygrub --- a/tools/pygrub/src/pygrub Sun Nov 22 19:13:01 2009 +0000 +++ b/tools/pygrub/src/pygrub Sun Nov 22 19:13:01 2009 +0000 @@ -371,17 +371,17 @@ raise RuntimeError, "Unable to access %s" %(fn,) if platform.machine() == ''ia64'': - self.cf = grub.LiloConf.LiloConfigFile() - # common distributions - file_list = ("/efi/debian/elilo.conf", "/efi/gentoo/elilo.conf", - "/efi/redflag/elilo.conf", "/efi/redhat/elilo.conf", - "/efi/SuSE/elilo.conf",) - # fallbacks - file_list += ("/efi/boot/elilo.conf", "/elilo.conf",) + cfg_list = map(lambda x: (x,grub.LiloConf.LiloConfigFile), + # common distributions + ["/efi/debian/elilo.conf", "/efi/gentoo/elilo.conf", + "/efi/redflag/elilo.conf", "/efi/redhat/elilo.conf", + "/efi/SuSE/elilo.conf",] + + # fallbacks + ["/efi/boot/elilo.conf", "/elilo.conf",]) else: - self.cf = grub.GrubConf.GrubConfigFile() - file_list = ("/boot/grub/menu.lst", "/boot/grub/grub.conf", - "/grub/menu.lst", "/grub/grub.conf") + cfg_list = map(lambda x: (x,grub.GrubConf.GrubConfigFile), + ["/boot/grub/menu.lst", "/boot/grub/grub.conf", + "/grub/menu.lst", "/grub/grub.conf"]) if not fs: # set the config file and parse it @@ -389,8 +389,10 @@ self.cf.parse() return - for f in file_list: + for f,parser in cfg_list: if fs.file_exists(f): + print >>sys.stderr, "Using %s to parse %s" % (parser,f) + self.cf = parser() self.cf.filename = f break if self.cf.filename is None: _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
ian.campbell@citrix.com
2009-Nov-22 19:15 UTC
[Xen-devel] [PATCH 4 of 5] pygrub: track the title of an item as an independant field
# HG changeset patch # User Ian Campbell <ijc@hellion.org.uk> # Date 1258917181 0 # Node ID 69d318d58ed3e4266bfb76f514d90b69270aed9a # Parent d641f06a4889748dc7efec62398b5d333ad0df87 pygrub: track the title of an item as an independant field separate to the other fields. This makes the list of lines within a GrubImage 0 based rather than 1 based therefore adjust the user interface parts to suit. This is in preparation for grub2 support where the syntax for the item title does not fit the existing usage. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r d641f06a4889 -r 69d318d58ed3 tools/pygrub/src/GrubConf.py --- a/tools/pygrub/src/GrubConf.py Sun Nov 22 19:13:01 2009 +0000 +++ b/tools/pygrub/src/GrubConf.py Sun Nov 22 19:13:01 2009 +0000 @@ -79,8 +79,9 @@ part = property(get_part, set_part) class _GrubImage(object): - def __init__(self, lines): + def __init__(self, title, lines): self.reset(lines) + self.title = title.strip() def __repr__(self): return ("title: %s\n" @@ -94,7 +95,6 @@ def reset(self, lines): self._root = self._initrd = self._kernel = self._args = None - self.title = "" self.lines = [] self._parse(lines) @@ -126,8 +126,8 @@ initrd = property(get_initrd, set_initrd) class GrubImage(_GrubImage): - def __init__(self, lines): - _GrubImage.__init__(self, lines) + def __init__(self, title, lines): + _GrubImage.__init__(self, title, lines) def set_from_line(self, line, replace = None): (com, arg) = grub_exact_split(line, 2) @@ -148,8 +148,7 @@ self.lines.insert(replace, line) # set up command handlers - commands = { "title": "title", - "root": "root", + commands = { "root": "root", "rootnoverify": "root", "kernel": "kernel", "initrd": "initrd", @@ -262,7 +261,8 @@ else: lines = buf.split("\n") - img = [] + img = None + title = "" for l in lines: l = l.strip() # skip blank lines @@ -273,12 +273,13 @@ continue # new image if l.startswith("title"): - if len(img) > 0: - self.add_image(GrubImage(img)) - img = [l] + if img is not None: + self.add_image(GrubImage(title, img)) + img = [] + title = l[6:] continue - if len(img) > 0: + if img is not None: img.append(l) continue @@ -291,8 +292,8 @@ else: logging.warning("Unknown directive %s" %(com,)) - if len(img) > 0: - self.add_image(GrubImage(img)) + if img: + self.add_image(GrubImage(title, img)) if self.hasPassword(): self.setPasswordAccess(False) diff -r d641f06a4889 -r 69d318d58ed3 tools/pygrub/src/pygrub --- a/tools/pygrub/src/pygrub Sun Nov 22 19:13:01 2009 +0000 +++ b/tools/pygrub/src/pygrub Sun Nov 22 19:13:01 2009 +0000 @@ -259,13 +259,13 @@ self.text_win.move(y - 1, x - 1) self.text_win.noutrefresh() - curline = 1 + curline = 0 img = copy.deepcopy(origimg) while 1: draw() self.entry_win.erase() self.entry_win.box() - for idx in range(1, len(img.lines)): + for idx in range(0, len(img.lines)): # current line should be highlighted if idx == curline: self.entry_win.attron(curses.A_REVERSE) @@ -275,7 +275,7 @@ if len(l) > 70: l = l[:69] + ">" - self.entry_win.addstr(idx, 2, l) + self.entry_win.addstr(idx + 1, 2, l) if idx == curline: self.entry_win.attroff(curses.A_REVERSE) self.entry_win.noutrefresh() @@ -308,8 +308,8 @@ return # bound at the top and bottom - if curline < 1: - curline = 1 + if curline < 0: + curline = 0 elif curline >= len(img.lines): curline = len(img.lines) - 1 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
ian.campbell@citrix.com
2009-Nov-22 19:15 UTC
[Xen-devel] [PATCH 5 of 5] pygrub: add basic support for parsing grub2 style grub.cfg file
# HG changeset patch # User Ian Campbell <ijc@hellion.org.uk> # Date 1258917181 0 # Node ID 870c7bbe259b5fb9dea78ee009d242e5ff006d9e # Parent 69d318d58ed3e4266bfb76f514d90b69270aed9a pygrub: add basic support for parsing grub2 style grub.cfg file This represents a very simplistic aproach to parsing these file. It is basically sufficient to parse the files produced by Debian Squeeze''s version of update-grub. The actual grub.cfg syntax is much more expresive but not apparently documented apart from a few examples... Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 69d318d58ed3 -r 870c7bbe259b tools/pygrub/src/GrubConf.py --- a/tools/pygrub/src/GrubConf.py Sun Nov 22 19:13:01 2009 +0000 +++ b/tools/pygrub/src/GrubConf.py Sun Nov 22 19:13:01 2009 +0000 @@ -14,6 +14,7 @@ import os, sys import logging +import re def grub_split(s, maxsplit = -1): eq = s.find(''='') @@ -298,9 +299,125 @@ if self.hasPassword(): self.setPasswordAccess(False) +class Grub2Image(_GrubImage): + def __init__(self, title, lines): + _GrubImage.__init__(self, title, lines) + + def set_from_line(self, line, replace = None): + (com, arg) = grub_exact_split(line, 2) + + if com == "set": + (com,arg) = grub_split(arg,2) + com="set:" + com + + if self.commands.has_key(com): + if self.commands[com] is not None: + setattr(self, self.commands[com], 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) + + commands = {''set:root'': ''root'', + ''linux'': ''kernel'', + ''initrd'': ''initrd'', + ''insmod'': None, + ''search'': None} + +class Grub2ConfigFile(_GrubConfigFile): + def __init__(self, fn = None): + _GrubConfigFile.__init__(self, fn) + + 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") + + img = None + title = "" + for l in lines: + l = l.strip() + # skip blank lines + if len(l) == 0: + continue + # skip comments + if l.startswith(''#''): + continue + # new image + title_match = re.match(''^menuentry "(.*)" {'', l) + if title_match: + if img is not None: + raise RuntimeError, "syntax error 1 %d %s" % (len(img),img) + img = [] + title = title_match.group(1) + continue + + if l.startswith("}"): + if img is None: + raise RuntimeError, "syntax error 2 %d %s" % (len(img),img) + + self.add_image(Grub2Image(title, img)) + img = None + continue + + if img is not None: + img.append(l) + continue + + (com, arg) = grub_exact_split(l, 2) + + if com == "set": + (com,arg) = grub_split(arg,2) + com="set:" + com + + if self.commands.has_key(com): + if self.commands[com] is not None: + setattr(self, self.commands[com], arg.strip()) + else: + logging.info("Ignored directive %s" %(com,)) + else: + logging.warning("Unknown directive %s" %(com,)) + + if img is not None: + raise RuntimeError, "syntax error 3 %d %s" % (len(img),img) + + if self.hasPassword(): + self.setPasswordAccess(False) + + commands = {''set:default'': ''default'', + ''set:root'': ''root'', + ''set:timeout'': ''timeout'', + ''set:gfxmode'': None, + ''set:menu_color_normal'': None, + ''set:menu_color_highlight'': None, + ''terminal'': None, + ''insmod'': None, + ''search'': None, + ''if'': None, + ''fi'': None, + } + if __name__ == "__main__": - if sys.argv < 2: - raise RuntimeError, "Need a grub.conf to read" - g = GrubConfigFile(sys.argv[1]) + if sys.argv < 3: + raise RuntimeError, "Need a grub version (\"grub\" or \"grub2\") and a grub.conf or grub.cfg to read" + if sys.argv[1] == "grub": + g = GrubConfigFile(sys.argv[2]) + elif sys.argv[1] == "grub2": + g = Grub2ConfigFile(sys.argv[2]) + else: + raise RuntimeError, "Unknown config type %s" % sys.argv[1] for i in g.images: print i #, i.title, i.root, i.kernel, i.args, i.initrd diff -r 69d318d58ed3 -r 870c7bbe259b tools/pygrub/src/pygrub --- a/tools/pygrub/src/pygrub Sun Nov 22 19:13:01 2009 +0000 +++ b/tools/pygrub/src/pygrub Sun Nov 22 19:13:01 2009 +0000 @@ -381,7 +381,9 @@ else: cfg_list = map(lambda x: (x,grub.GrubConf.GrubConfigFile), ["/boot/grub/menu.lst", "/boot/grub/grub.conf", - "/grub/menu.lst", "/grub/grub.conf"]) + "/grub/menu.lst", "/grub/grub.conf"]) + \ + map(lambda x: (x,grub.GrubConf.Grub2ConfigFile), + ["/boot/grub/grub.cfg"]) if not fs: # set the config file and parse it _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Boris Derzhavets
2009-Nov-22 21:25 UTC
Re: [Xen-devel] [PATCH 0 of 5] pygrub support for Grub2 grub.cfg syntax
Ubuntu 9.10 Server PV DomU at Xen 3.4.1 Dom0 (2.6.31.6 pvops) on top F12 in meantime may be loaded via "pygrub" like this :- [root@fedora12sda koala]# cat koala.py name="KarmicPV" memory=2048 bootloader="/usr/bin/pygrub" kernel="/boot/vmlinuz-2.6.31-14-server" ramdisk="/boot/initrd.img-2.6.31-14-server" vif=[''bridge=eth0''] extra="root=/dev/xvda1" disk=[''phy:/dev/sdb11,xvda,w''] vfb=[''type=vnc,vncunused=1''] # xm create koala.py # vncviewer localhost:0 BuildĀ Xen on F12 via xen-3.4.1-5.fc12.src.rpmĀ with e2fsprogs-devel allows pygrub support ext4fs boot partition Karmic''s PV DomU, but cannot detect kernel,ramdisk, root. Please, back port if possible. It will provide an option to manage via "virsh" Boris. --- On Sun, 11/22/09, ian.campbell@citrix.com <ian.campbell@citrix.com> wrote: From: ian.campbell@citrix.com <ian.campbell@citrix.com> Subject: [Xen-devel] [PATCH 0 of 5] pygrub support for Grub2 grub.cfg syntax To: xen-devel@lists.xensource.com Date: Sunday, November 22, 2009, 2:14 PM The following patches implement very basic support for Grub 2''s grub.cfg syntax. It''s pretty minimal but sufficient for booting Debian Squeeze which now uses grub2 by default. There are also some more generic fixes. Since grub2 is starting to be used by distros this might be worth porting to the 3.4 branch once it has baked for a while. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Keir Fraser
2009-Nov-23 07:20 UTC
Re: [Xen-devel] [PATCH 3 of 5] pygrub: factor generic Grub functionality into GrubConf base classes
On 22/11/2009 19:15, "ian.campbell@citrix.com" <ian.campbell@citrix.com> wrote:> pygrub: factor generic Grub functionality into GrubConf base classes > and inherit from these classes to implement Grub-legacy functionality. > > Use a tuple of (parser-object,configuration-file) in pygrub to allow > for multiple parsers. > > Makes way for grub2 support.This patch didn''t apply for me. It may be due to mangling at my end or yours because of sending the patch inline. Try resending it as an attachment, along with patches 4/5 and 5/5 (I have already successfully applied 1/5 and 2/5). Thanks, Keir _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
ian.campbell@citrix.com
2009-Nov-23 07:37 UTC
[Xen-devel] [PATCH 0 of 3] pygrub support for Grub2 grub.cfg syntax
The following patches implement very basic support for Grub 2''s grub.cfg syntax. It''s pretty minimal but sufficient for booting Debian Squeeze which now uses grub2 by default. There are also some more generic fixes. Since grub2 is starting to be used by distros this might be worth porting to the 3.4 branch once it has baked for a while. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
ian.campbell@citrix.com
2009-Nov-23 07:37 UTC
[Xen-devel] [PATCH 1 of 3] pygrub: factor generic Grub functionality into GrubConf base classes
and inherit from these classes to implement Grub-legacy functionality. Use a tuple of (parser-object,configuration-file) in pygrub to allow for multiple parsers. Makes way for grub2 support. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
ian.campbell@citrix.com
2009-Nov-23 07:37 UTC
[Xen-devel] [PATCH 2 of 3] pygrub: track the title of an item as an independant field
separate to the other fields. This makes the list of lines within a GrubImage 0 based rather than 1 based therefore adjust the user interface parts to suit. This is in preparation for grub2 support where the syntax for the item title does not fit the existing usage. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
ian.campbell@citrix.com
2009-Nov-23 07:37 UTC
[Xen-devel] [PATCH 3 of 3] pygrub: add basic support for parsing grub2 style grub.cfg file
This represents a very simplistic aproach to parsing these file. It is basically sufficient to parse the files produced by Debian Squeeze''s version of update-grub. The actual grub.cfg syntax is much more expresive but not apparently documented apart from a few examples... Signed-off-by: Ian Campbell <ian.campbell@citrix.com> _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel