From mboxrd@z Thu Jan 1 00:00:00 1970 From: Michal Novotny Subject: Re: [PATCH] pyGrub: Use proper bootloader class when entering command manually Date: Wed, 26 May 2010 11:27:29 +0200 Message-ID: <4BFCE981.6020103@redhat.com> References: <4BFBE114.20208@redhat.com> <4BFBE92A.7040603@redhat.com> <1274804553.24218.7232.camel@zakaz.uk.xensource.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------030700070509030403060306" Return-path: In-Reply-To: <1274804553.24218.7232.camel@zakaz.uk.xensource.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Ian Campbell Cc: "xen-devel@lists.xensource.com" , Keir Fraser List-Id: xen-devel@lists.xenproject.org This is a multi-part message in MIME format. --------------030700070509030403060306 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Yeah, that's right Ian. However adding a new method called new_image() to all of the boot loader configuration classes (*ConfigFile classes) will still be necessary. I wrote a new version of my patch to add support for new_image() method all the existing classes and did the modifications to pygrub. As in previous version of my patch, the isconfig debug option has been fixed too. Keir, please use this version to be committed. Thanks, Michal Signed-off-by: Michal Novotny On 05/25/2010 06:22 PM, Ian Campbell wrote: > On Tue, 2010-05-25 at 16:13 +0100, Michal Novotny wrote: > >> Ok, I found that the infrastructure of ExtLinuxImage and LiloImage is >> different so I rewrote it a little (but according to the code the old >> behaviour should be preserved) and also fixed the isconfig bug (since no >> img.initrd is accessible that time). >> >> So please ignore the previous version of my patch and use this one. >> > Perhaps instead of these two hunks: > > --- a/tools/pygrub/src/pygrub Tue May 25 11:28:58 2010 +0100 > +++ b/tools/pygrub/src/pygrub Tue May 25 17:10:32 2010 +0200 > @@ -356,7 +356,7 @@ class Grub: > continue > > # if we got boot, then we want to boot the entered image > - img = grub.GrubConf.GrubImage(lines) > + img = self.imgcl("entered", lines) > self.cf.add_image(img) > self.selected_image = len(self.cf.images) - 1 > self.isdone = True > > [...] > self.cf = parser() > self.cf.filename = f > + > + # Get the bootloader image file constructor to imgcl > + if type(self.cf) == grub.LiloConf.LiloConfigFile: > + self.imgcl = grub.LiloConf.LiloImage > + elif type(self.cf) == grub.GrubConf.Grub2ConfigFile: > + self.imgcl = grub.GrubConf.Grub2Image > + elif type(self.cf) == > grub.ExtLinuxConf.ExtLinuxConfigFile: > + self.imgcl = grub.ExtLinuxConf.ExtLinuxImage > + else: > + self.imgcl = grub.GrubConf.GrubImage > + > break > if self.__dict__.get('cf', None) is None: > raise RuntimeError, "couldn't find bootloader config file > in the image provided." > > We could add a method to each of the self.cf classes which returns a new > image from the title+lines given. Then the first hunk becomes something > like: > > - img = grub.GrubConf.GrubImage(lines) > + img = self.cf.new_image("entered", lines) > > and the second bit goes away. This would be nice since it avoids > hardcoding another list of bootloaders. > > Ian. > > -- Michal Novotny, RHCE Virtualization Team (xen userspace), Red Hat --------------030700070509030403060306 Content-Type: text/x-patch; name="xen-pygrub-command-use-proper-bootloader-class.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="xen-pygrub-command-use-proper-bootloader-class.patch" diff -r 15f4ead9e686 tools/pygrub/src/ExtLinuxConf.py --- a/tools/pygrub/src/ExtLinuxConf.py Wed May 26 08:15:31 2010 +0100 +++ b/tools/pygrub/src/ExtLinuxConf.py Wed May 26 11:22:43 2010 +0200 @@ -118,6 +118,12 @@ class ExtLinuxConfigFile(object): if fn is not None: self.parse() + + def new_image(self, title, lines): + # ExtLinuxImage constructor doesn't have title but since path + # is being used by get_{kernel|initrd} functions we pass + # empty string rather than None (see lines above) + return ExtLinuxImage(lines, "") def parse(self, buf = None): if buf is None: diff -r 15f4ead9e686 tools/pygrub/src/GrubConf.py --- a/tools/pygrub/src/GrubConf.py Wed May 26 08:15:31 2010 +0100 +++ b/tools/pygrub/src/GrubConf.py Wed May 26 11:22:43 2010 +0200 @@ -252,6 +252,9 @@ class GrubConfigFile(_GrubConfigFile): def __init__(self, fn = None): _GrubConfigFile.__init__(self,fn) + def new_image(self, title, lines): + return GrubImage(title, lines) + def parse(self, buf = None): if buf is None: if self.filename is None: @@ -345,7 +348,10 @@ class Grub2ConfigFile(_GrubConfigFile): class Grub2ConfigFile(_GrubConfigFile): def __init__(self, fn = None): _GrubConfigFile.__init__(self, fn) - + + def new_image(self, title, lines): + return Grub2Image(title, lines) + def parse(self, buf = None): if buf is None: if self.filename is None: diff -r 15f4ead9e686 tools/pygrub/src/LiloConf.py --- a/tools/pygrub/src/LiloConf.py Wed May 26 08:15:31 2010 +0100 +++ b/tools/pygrub/src/LiloConf.py Wed May 26 11:22:43 2010 +0200 @@ -147,6 +147,12 @@ class LiloConfigFile(object): def add_image(self, image): self.images.append(image) + def new_image(self, title, lines): + # LiloImage constructor doesn't have title but since path + # is being used by get_{kernel|initrd} functions we pass + # empty string rather than None (see lines above) + return LiloImage(lines, "") + def _get_default(self): for i in range(len(self.images)): if self.images[i].title == self._default: diff -r 15f4ead9e686 tools/pygrub/src/pygrub --- a/tools/pygrub/src/pygrub Wed May 26 08:15:31 2010 +0100 +++ b/tools/pygrub/src/pygrub Wed May 26 11:22:43 2010 +0200 @@ -356,7 +356,7 @@ class Grub: continue # if we got boot, then we want to boot the entered image - img = grub.GrubConf.GrubImage(lines) + img = self.cf.new_image("entered", lines) self.cf.add_image(img) self.selected_image = len(self.cf.images) - 1 self.isdone = True @@ -392,9 +392,11 @@ class Grub: if not fs: # set the config file and parse it - self.cf.filename = fn - self.cf.parse() - return + for f,parser in cfg_list: + self.cf = parser() + self.cf.filename = fn + self.cf.parse() + return for f,parser in cfg_list: if fs.file_exists(f): @@ -689,7 +691,7 @@ if __name__ == "__main__": if isconfig: chosencfg = run_grub(file, entry, fs, incfg["args"]) print " kernel: %s" % chosencfg["kernel"] - if img.initrd: + if chosencfg["ramdisk"]: print " initrd: %s" % chosencfg["ramdisk"] print " args: %s" % chosencfg["args"] sys.exit(0) --------------030700070509030403060306 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --------------030700070509030403060306--