Index: xen-4.17.2-testing/tools/pygrub/src/pygrub =================================================================== --- xen-4.17.2-testing.orig/tools/pygrub/src/pygrub +++ xen-4.17.2-testing/tools/pygrub/src/pygrub @@ -579,7 +579,7 @@ class Grub: self.cf.filename = f break if self.__dict__.get('cf', None) is None: - raise RuntimeError("couldn't find bootloader config file in the image provided.") + return f = fs.open_file(self.cf.filename) # limit read size to avoid pathological cases buf = f.read(FS_READ_MAX) @@ -754,6 +754,20 @@ def run_grub(file, entry, fs, cfg_args): g = Grub(file, fs) + # If missing config or grub has no menu entries to select, look for + # vmlinuz-xen and initrd-xen in /boot + if g.__dict__.get('cf', None) is None or len(g.cf.images) == 0 or re.search(r"xen(-pae)?\.gz",g.cf.images[0].kernel[1]): + if not list_entries: + chosencfg = { "kernel": None, "ramdisk": None, "args": "" } + chosencfg = sniff_xen_kernel(fs, incfg) + if chosencfg["kernel"] and chosencfg["ramdisk"]: + chosencfg["args"] = cfg_args + return chosencfg + if g.__dict__.get('cf', None) is None: + raise RuntimeError("couldn't find bootloader config file in the image provided.") + else: + return + if list_entries: for i in range(len(g.cf.images)): img = g.cf.images[i] @@ -840,6 +854,19 @@ def sniff_netware(fs, cfg): return cfg +def sniff_xen_kernel(fs, cfg): + if not cfg["kernel"]: + if fs.file_exists('/boot/vmlinuz-xen'): + cfg["kernel"] = '/boot/vmlinuz-xen' + elif fs.file_exists('/boot/vmlinuz-xenpae'): + cfg["kernel"] = '/boot/vmlinuz-xenpae' + if cfg["kernel"] and not cfg["ramdisk"]: + if fs.file_exists('/boot/initrd-xen'): + cfg["ramdisk"] = '/boot/initrd-xen' + elif fs.file_exists('/boot/initrd-xenpae'): + cfg["ramdisk"] = '/boot/initrd-xenpae' + return cfg + def format_sxp(kernel, ramdisk, args): s = "linux (kernel %s)" % repr(kernel) if ramdisk: @@ -918,7 +945,7 @@ if __name__ == "__main__": debug = False not_really = False output_format = "sxp" - output_directory = "/var/run/xen/pygrub/" + output_directory = "/var/run/xen" uid = None # what was passed in