WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] pygrub: support parsing of syslinux configuration fi

To: --attach@xxxxxxxxxxxxxxxxxxxxxxx, Xen <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] pygrub: support parsing of syslinux configuration files
From: Ian Campbell <ian.campbell@xxxxxxxxxx>
Date: Fri, 29 Jan 2010 17:34:19 +0000
Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
Delivery-date: Fri, 29 Jan 2010 09:34:41 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1264786454 0
# Node ID 4de38cbfb7bd2aff2097cfc0f4ae91a9cc948279
# Parent  9521ff86dd9ff217fb9d26fc77f4804c60a4824f
pygrub: support parsing of syslinux configuration files

Allows booting from ISOs which use isolinux as well as guests using
extlinux.

Also add copyright header to GrubConf.py, I think the grub2 support
added last year qualifies as a substantial change.

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

diff -r 9521ff86dd9f -r 4de38cbfb7bd tools/pygrub/src/ExtLinuxConf.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/pygrub/src/ExtLinuxConf.py  Fri Jan 29 17:34:14 2010 +0000
@@ -0,0 +1,200 @@
+#
+# ExtLinuxConf.py - Simple syslinux config parsing
+#
+# Copyright 2010 Citrix Systems Ltd.
+#
+# This software may be freely redistributed under the terms of the GNU
+# general public license.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+import sys, re, os
+import logging
+import GrubConf
+
+class ExtLinuxImage(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._initrd = self._kernel = self._readonly = None
+        self._args = ""
+        self.title = ""
+        self.lines = []
+        self.path = path
+        self.root = ""
+        map(self.set_from_line, lines)
+
+    def set_from_line(self, line, replace = None):
+        (com, arg) = GrubConf.grub_exact_split(line, 2)
+        com = com.lower()
+
+        # Special handling for mboot.c32
+        if com.lower() == "append" and self.kernel is not None:
+            (_,kernel) = self.kernel
+            if kernel.endswith("mboot.c32"):
+                kernel = None
+                args = None
+                initrd = None
+                modules = arg.split("---")
+
+                if len(modules) == 3: # Assume Xen + Kernel + Initrd
+                    (_,kernel,initrd) = modules
+                elif len(modules) == 2: # Assume Kernel + Initrd
+                    (kernel,initrd) = modules
+
+                if kernel:
+                    setattr(self, "kernel", kernel.strip())
+                if initrd:
+                    setattr(self, "initrd", initrd.strip())
+
+                # Bypass regular self.commands handling
+                com = None
+
+        if com is not None and self.commands.has_key(com):
+            if self.commands[com] is not None:
+                setattr(self, self.commands[com], re.sub('^"(.+)"$', r"\1", 
arg.strip()))
+            else:
+                logging.info("Ignored image directive %s" %(com,))
+        elif com is not None:
+            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):
+        if val.find(" ") == -1:
+            self._kernel = (None,val)
+            self._args = None
+            return
+        (kernel, args) = val.split(None, 1)
+        self._kernel = (None,kernel)
+        self._args = args
+    def get_kernel(self):
+        return self._kernel
+    def get_args(self):
+        return self._args
+    kernel = property(get_kernel, set_kernel)
+    args = property(get_args)
+
+    def set_initrd(self, val):
+        self._initrd = (None,val)
+    def get_initrd(self):
+        return self._initrd
+    initrd = property(get_initrd, set_initrd)
+
+    def set_readonly(self, val):
+        self._readonly = 1
+    def get_readonly(self):
+        return self._readonly
+    readonly = property(get_readonly, set_readonly)
+
+    # set up command handlers
+    commands = {
+        "label": "title",
+        "kernel": "kernel",
+        "append": "args"}
+
+class ExtLinuxConfigFile(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.lower().startswith("label"):
+                if len(img) > 0:
+                    self.add_image(ExtLinuxImage(img, path))
+                img = [l]
+                continue
+
+            if len(img) > 0:
+                img.append(l)
+                continue
+
+            (com, arg) = GrubConf.grub_exact_split(l, 2)
+            com = com.lower()
+            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(ExtLinuxImage(img, path))
+
+    def hasPassword(self):
+        return False
+
+    def hasPasswordAccess(self):
+        return True
+
+    def add_image(self, image):
+        self.images.append(image)
+
+    def _get_default(self):
+        for i in range(len(self.images)):
+            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": "default",
+                 "timeout": "timeout",
+                 "serial": None,
+                 "prompt": None,
+                 "display": None,
+                 "f1": None,
+                 "f2": None,
+                 }
+        
+if __name__ == "__main__":
+    if sys.argv < 2:
+        raise RuntimeError, "Need a configuration file to read"
+    g = ExtLinuxConfigFile(sys.argv[1])
+    for i in g.images:
+        print i
+    print g.default
diff -r 9521ff86dd9f -r 4de38cbfb7bd tools/pygrub/src/GrubConf.py
--- a/tools/pygrub/src/GrubConf.py      Fri Jan 29 15:50:47 2010 +0000
+++ b/tools/pygrub/src/GrubConf.py      Fri Jan 29 17:34:14 2010 +0000
@@ -1,6 +1,7 @@
 #
 # GrubConf.py - Simple grub.conf parsing
 #
+# Copyright 2009 Citrix Systems Inc.
 # Copyright 2005-2006 Red Hat, Inc.
 # Jeremy Katz <katzj@xxxxxxxxxx>
 #
diff -r 9521ff86dd9f -r 4de38cbfb7bd tools/pygrub/src/pygrub
--- a/tools/pygrub/src/pygrub   Fri Jan 29 15:50:47 2010 +0000
+++ b/tools/pygrub/src/pygrub   Fri Jan 29 17:34:14 2010 +0000
@@ -24,6 +24,7 @@
 import fsimage
 import grub.GrubConf
 import grub.LiloConf
+import grub.ExtLinuxConf
 
 PYGRUB_VER = 0.6
 
@@ -383,7 +384,10 @@
                            ["/boot/grub/menu.lst", "/boot/grub/grub.conf",
                             "/grub/menu.lst", "/grub/grub.conf"]) + \
                        map(lambda x: (x,grub.GrubConf.Grub2ConfigFile),
-                           ["/boot/grub/grub.cfg"])
+                           ["/boot/grub/grub.cfg"]) + \
+                       map(lambda x: (x,grub.ExtLinuxConf.ExtLinuxConfigFile),
+                           ["/boot/isolinux/isolinux.cfg",
+                            "/boot/extlinux.conf"])
 
         if not fs:
             # set the config file and parse it
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] pygrub: support parsing of syslinux configuration files, Ian Campbell <=