def generateOtherBootEntry(self, boot_menu: BootLoaderMenu, sect) -> bool: """ Generates the boot entry for other systems """ mytype = self.boot_config["{s}/type".format(s=sect)].lower() if mytype in ["dos", "msdos"]: mytype = "dos" elif mytype in ["windows", "windows 2000", "win2000", "windows xp", "winxp"]: mytype = "winxp" elif mytype in ["windows vista", "vista"]: mytype = "vista" elif mytype in ["windows 7", "win7"]: mytype = "win7" elif mytype in ["windows 8", "win8"]: mytype = "win8" elif mytype in ["windows 10", "win10"]: mytype = "win10" elif mytype in ["haiku", "haiku os"]: mytype = "haiku" elif mytype in ["linux16"]: mytype = "linux16" else: self.msgs.append(["fatal", "Unrecognized boot entry type \"{mt}\"".format(mt=mytype)]) return False params = self.boot_config["{s}/params".format(s=sect)].split() myroot = self.resolver.GetParam(params, "root=") mychainloader = self.resolver.GetParam(params, "chainloader=") myname = sect # TODO check for valid root entry boot_menu.lines.append("") boot_menu.lines.append("menuentry \"{mn}\" {{".format(mn=myname)) if mytype in ["linux16"]: k = self.resolver.strip_mount_point(self.boot_config[sect + "/kernel"]) full_k = os.path.join(self.boot_config["boot/path"], k.lstrip("/")) if not os.path.exists(full_k): self.msgs.append(["warn", "Image for section {sect} not found - {full_k}".format(sect=sect, full_k=full_k)]) else: self.bootitems.append(myname) boot_menu.lines.append(" linux16 " + k) else: # TODO: add entry to boot_menu object self.PrepareGRUBForDevice(myroot, boot_menu.lines) self.bootitems.append(myname) self.DeviceGRUB(myroot) if mytype in ["win7", "win8"] or mytype == "win10" and self.uefiboot is False: boot_menu.lines.append(" chainloader " + mychainloader) if mychainloader else boot_menu.lines.append(" chainloader +4") elif mytype in ["vista", "dos", "winxp", "haiku"]: boot_menu.lines.append(" chainloader " + mychainloader) if mychainloader else boot_menu.lines.append(" chainloader +1") elif mytype in ["win10"]: boot_menu.lines.append(" chainloader " + mychainloader) if mychainloader else boot_menu.lines.append(" chainloader /EFI/Microsoft/Boot/bootmgfw.efi") boot_menu.lines.append("}") boot_menu.addBootEntry(BootLoaderEntryType.OTHER, label=myname) return True
def generateBootEntry(self, boot_menu: BootLoaderMenu, sect: str, k_full_path: str, kext: str) -> bool: """ Generates the boot entry """ mytype = self.boot_config["{s}/type".format(s=sect)] boot_menu.lines.append("") label = self.resolver.GetBootEntryString(sect, k_full_path) boot_menu.lines.append("menuentry \"{l}\" {{".format(l=label)) # TODO: add last-selected, which is different than last-booted. #if self.config["boot/autopick"] == "last-booted": # boot_menu.lines.append(" savedefault") # self.bootitems records all our boot items self.bootitems.append(label) scanpath = os.path.join( self.config.root_path, self.boot_config.item(sect, "scan").lstrip("/")) self.PrepareGRUBForFilesystem(scanpath, boot_menu.lines) # removes ROOT env var and /boot from the kernel path: k_sub_path = self.resolver.strip_mount_point(k_full_path) c = self.boot_config params = [] if c.hasItem("boot/terminal") and c["boot/terminal"] == "serial": params += [ "console=tty0", "console=ttyS%s,%s%s%s" % (c["serial/unit"], c["serial/speed"], c["serial/parity"][0], c["serial/word"]) ] for param in self.boot_config["{s}/params".format(s=sect)].split(): if param not in params: params.append(param) # Logic here to see if we are processing a boot entry that is a kernel we should "attempt" to boot. It gets special parameters added to its boot # entry. It may be tagged by the user on this call to ego boot (user_specified_attempt_identifier) or we may simply have boot_menu.attempt_kname # set due to an attempted kernel having been selected previously: entry = boot_menu.addBootEntry(BootLoaderEntryType.LINUX, label=label, image_path=k_full_path) if BootMenuFlag.ATTEMPT in entry["flags"]: # Add special boot parameters for a kernel we are attempting to boot (usually panic=10 or similar to force a reboot) for param in self.boot_config["{s}/attemptparams".format( s=sect)].split(): if param not in params: params.append(param) # TODO: turn off panic setting after successful boot? (ego boot success?) ok, myroot = self.resolver.calculate_rootfs_for_section(params) if not ok: return False ok, fstype = self.resolver.calculate_filesystem_for_section(params) if not ok: return False initrds = self.boot_config.item(sect, "initrd") initrds = self.resolver.find_initrds(initrds, scanpath, k_full_path, kext) if myroot and ('root=' + myroot) in params and 0 == len(initrds): params.remove('root=' + myroot) params.append('root=' + self.resolver.resolvedev(myroot)) xenpath = None xenparams = None # Populate xen variables if type is xen if mytype == "xen": xenkernel = self.boot_config["{s}/xenkernel".format(s=sect)] # Add leading / if needed if not xenkernel.startswith("/"): xenkernel = "/{xker}".format(xker=xenkernel) xenpath = self.resolver.strip_mount_point(xenkernel) xenparams = self.boot_config["{s}/xenparams".format( s=sect)].split() # Add unique identifier that can be used to determine if kernel booted. params.append("rand_id=%s" % self.resolver.idmapper.get(k_full_path)) # Append kernel lines based on type if mytype == "xen": boot_menu.lines.append(" multiboot {xker} {xparams}".format( xker=xenpath, xparams=" ".join(xenparams))) boot_menu.lines.append(" module {ker} {params}".format( ker=k_sub_path, params=" ".join(params))) for initrd in initrds: boot_menu.lines.append(" module {initrd}".format( initrd=self.resolver.strip_mount_point(initrd))) else: boot_menu.lines.append(" {t} {k} {par}".format( t=mytype, k=k_sub_path, par=" ".join(params))) if initrds: initrds = (self.resolver.strip_mount_point(initrd) for initrd in initrds) boot_menu.lines.append( " initrd {rds}".format(rds=" ".join(initrds))) # Append graphics line if self.boot_config.hasItem("{s}/gfxmode".format(s=sect)): skipgfx = False for p in params: if p.startswith("vga=") or p.startswith("video=uvesafb:"): skipgfx = True break if not skipgfx: boot_menu.lines.append(" set gfxpayload=keep") boot_menu.lines.append("}") return ok
def generateBootEntry(self, boot_menu: BootLoaderMenu, sect: str, k_full_path: str, kext: str) -> bool: """ Generates the boot entry """ mytype = self.boot_config["{s}/type".format(s=sect)] boot_menu.lines.append("") label = self.resolver.GetBootEntryString(sect, k_full_path) boot_menu.lines.append("menuentry \"{l}\" {{".format(l=label)) # TODO: add last-selected, which is different than last-booted. #if self.config["boot/autopick"] == "last-booted": # boot_menu.lines.append(" savedefault") # self.bootitems records all our boot items self.bootitems.append(label) scanpath = os.path.join(self.config.root_path, self.boot_config.item(sect, "scan").lstrip("/")) self.PrepareGRUBForFilesystem(scanpath, boot_menu.lines) # removes ROOT env var and /boot from the kernel path: k_sub_path = self.resolver.strip_mount_point(k_full_path) c = self.boot_config params = [] if c.hasItem("boot/terminal") and c["boot/terminal"] == "serial": params += [ "console=tty0", "console=ttyS%s,%s%s%s" % (c["serial/unit"], c["serial/speed"], c["serial/parity"][0], c["serial/word"]) ] for param in self.boot_config["{s}/params".format(s=sect)].split(): if param not in params: params.append(param) # Logic here to see if we are processing a boot entry that is a kernel we should "attempt" to boot. It gets special parameters added to its boot # entry. It may be tagged by the user on this call to ego boot (user_specified_attempt_identifier) or we may simply have boot_menu.attempt_kname # set due to an attempted kernel having been selected previously: entry = boot_menu.addBootEntry(BootLoaderEntryType.LINUX, label=label, image_path=k_full_path) if BootMenuFlag.ATTEMPT in entry["flags"]: # Add special boot parameters for a kernel we are attempting to boot (usually panic=10 or similar to force a reboot) for param in self.boot_config["{s}/attemptparams".format(s=sect)].split(): if param not in params: params.append(param) # TODO: turn off panic setting after successful boot? (ego boot success?) ok, myroot = self.resolver.calculate_rootfs_for_section(params) if not ok: return False ok, fstype = self.resolver.calculate_filesystem_for_section(params) if not ok: return False initrds = self.boot_config.item(sect, "initrd") initrds = self.resolver.find_initrds(initrds, scanpath, k_full_path, kext) if myroot and ('root=' + myroot) in params and 0 == len(initrds): params.remove('root=' + myroot) params.append('root=' + self.resolver.resolvedev(myroot)) xenpath = None xenparams = None # Populate xen variables if type is xen if mytype == "xen": xenkernel = self.boot_config["{s}/xenkernel".format(s=sect)] # Add leading / if needed if not xenkernel.startswith("/"): xenkernel = "/{xker}".format(xker=xenkernel) xenpath = self.resolver.strip_mount_point(xenkernel) xenparams = self.boot_config["{s}/xenparams".format(s=sect)].split() # Add unique identifier that can be used to determine if kernel booted. params.append("rand_id=%s" % self.resolver.idmapper.get(k_full_path)) # Append kernel lines based on type if mytype == "xen": boot_menu.lines.append(" multiboot {xker} {xparams}".format(xker=xenpath, xparams=" ".join(xenparams))) boot_menu.lines.append(" module {ker} {params}".format(ker=k_sub_path, params=" ".join(params))) for initrd in initrds: boot_menu.lines.append(" module {initrd}".format(initrd=self.resolver.strip_mount_point(initrd))) else: boot_menu.lines.append(" {t} {k} {par}".format(t=mytype, k=k_sub_path, par=" ".join(params))) if initrds: initrds = (self.resolver.strip_mount_point(initrd) for initrd in initrds) boot_menu.lines.append(" initrd {rds}".format(rds=" ".join(initrds))) # Append graphics line if self.boot_config.hasItem("{s}/gfxmode".format(s=sect)): skipgfx = False for p in params: if p.startswith("vga=") or p.startswith("video=uvesafb:"): skipgfx = True break if not skipgfx: boot_menu.lines.append(" set gfxpayload=keep") boot_menu.lines.append("}") return ok
def generateOtherBootEntry(self, boot_menu: BootLoaderMenu, sect) -> bool: """ Generates the boot entry for other systems """ mytype = self.boot_config["{s}/type".format(s=sect)].lower() if mytype in ["dos", "msdos"]: mytype = "dos" elif mytype in [ "windows", "windows 2000", "win2000", "windows xp", "winxp" ]: mytype = "winxp" elif mytype in ["windows vista", "vista"]: mytype = "vista" elif mytype in ["windows 7", "win7"]: mytype = "win7" elif mytype in ["windows 8", "win8"]: mytype = "win8" elif mytype in ["windows 10", "win10"]: mytype = "win10" elif mytype in ["haiku", "haiku os"]: mytype = "haiku" elif mytype in ["linux16"]: mytype = "linux16" else: self.msgs.append([ "fatal", "Unrecognized boot entry type \"{mt}\"".format(mt=mytype) ]) return False params = self.boot_config["{s}/params".format(s=sect)].split() myroot = self.resolver.GetParam(params, "root=") mychainloader = self.resolver.GetParam(params, "chainloader=") myname = sect # TODO check for valid root entry boot_menu.lines.append("") boot_menu.lines.append("menuentry \"{mn}\" {{".format(mn=myname)) if mytype in ["linux16"]: k = self.resolver.strip_mount_point(self.boot_config[sect + "/kernel"]) full_k = os.path.join(self.boot_config["boot/path"], k.lstrip("/")) if not os.path.exists(full_k): self.msgs.append([ "warn", "Image for section {sect} not found - {full_k}".format( sect=sect, full_k=full_k) ]) else: self.bootitems.append(myname) boot_menu.lines.append(" linux16 " + k) else: # TODO: add entry to boot_menu object self.PrepareGRUBForDevice(myroot, boot_menu.lines) self.bootitems.append(myname) self.DeviceGRUB(myroot) if mytype in ["win7", "win8" ] or mytype == "win10" and self.uefiboot is False: boot_menu.lines.append( " chainloader " + mychainloader ) if mychainloader else boot_menu.lines.append( " chainloader +4") elif mytype in ["vista", "dos", "winxp", "haiku"]: boot_menu.lines.append( " chainloader " + mychainloader ) if mychainloader else boot_menu.lines.append( " chainloader +1") elif mytype in ["win10"]: boot_menu.lines.append( " chainloader " + mychainloader ) if mychainloader else boot_menu.lines.append( " chainloader /EFI/Microsoft/Boot/bootmgfw.efi") boot_menu.lines.append("}") boot_menu.addBootEntry(BootLoaderEntryType.OTHER, label=myname) return True