コード例 #1
0
ファイル: grub.py プロジェクト: funtoo/ego
	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
コード例 #2
0
ファイル: grub.py プロジェクト: palica/ego
    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
コード例 #3
0
ファイル: grub.py プロジェクト: funtoo/ego
	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
コード例 #4
0
ファイル: grub.py プロジェクト: palica/ego
 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