qubes-installer-qubes-os/booty/ppc.py
2011-01-18 04:24:57 -05:00

181 lines
5.8 KiB
Python

import string
import os
from booty import BootyNoKernelWarning
from util import getDiskPart
from bootloaderInfo import *
import iutil
class ppcBootloaderInfo(bootloaderInfo):
def getBootDevs(self, bl):
import parted
retval = []
machine = iutil.getPPCMachine()
if machine == 'pSeries':
for dev in self.storage.fsset.devices:
if dev.format.type == "prepboot":
retval.append(dev.path)
elif machine == 'PMac':
for dev in self.storage.fsset.devices:
if dev.format.type == "hfs" and dev.format.bootable:
retval.append(dev.path)
if len(retval) == 0:
# Try to get a boot device; bplan OF understands ext3
if machine == 'Pegasos' or machine == 'Efika':
try:
device = self.storage.mountpoints["/boot"]
except KeyError:
# Try / if we don't have this we're not going to work
device = self.storage.rootDevice
retval.append(device.path)
else:
if bl.getDevice():
d = bl.getDevice()
retval.append(self.storage.devicetree.getDeviceByName(d).path)
return retval
def writeYaboot(self, instRoot, bl, kernelList,
chainList, defaultDev):
yabootTarget = string.join(self.getBootDevs(bl))
try:
bootDev = self.storage.mountpoints["/boot"]
cf = "/boot/etc/yaboot.conf"
cfPath = ""
if not os.path.isdir(instRoot + "/boot/etc"):
os.mkdir(instRoot + "/boot/etc")
except KeyError:
bootDev = self.storage.rootDevice
cfPath = "/boot"
cf = "/etc/yaboot.conf"
f = open(instRoot + cf, "w+")
f.write("# yaboot.conf generated by anaconda\n\n")
f.write("boot=%s\n" %(yabootTarget,))
f.write("init-message=\"Welcome to %s!\\nHit <TAB> for boot options\"\n\n"
% productName)
f.write("partition=%s\n" % bootDev.partedPartition.number)
f.write("timeout=%s\n" % (self.timeout or 80))
f.write("install=/usr/lib/yaboot/yaboot\n")
f.write("delay=5\n")
f.write("enablecdboot\n")
f.write("enableofboot\n")
f.write("enablenetboot\n")
yabootProg = "/sbin/mkofboot"
if iutil.getPPCMachine() == "PMac":
# write out the first hfs/hfs+ partition as being macosx
for (label, longlabel, device) in chainList:
if ((not label) or (label == "")):
continue
f.write("macosx=/dev/%s\n" %(device,))
break
f.write("magicboot=/usr/lib/yaboot/ofboot\n")
elif iutil.getPPCMachine() == "pSeries":
f.write("nonvram\n")
f.write("fstype=raw\n")
else: # Default non-destructive case for anything else.
f.write("nonvram\n")
f.write("mntpoint=/boot/yaboot\n")
f.write("usemount\n")
if not os.access(instRoot + "/boot/yaboot", os.R_OK):
os.mkdir(instRoot + "/boot/yaboot")
yabootProg = "/sbin/ybin"
if self.password:
f.write("password=%s\n" %(self.password,))
f.write("restricted\n")
f.write("\n")
rootDev = self.storage.rootDevice
for (label, longlabel, version) in kernelList:
kernelTag = "-" + version
kernelFile = "%s/vmlinuz%s" %(cfPath, kernelTag)
f.write("image=%s\n" %(kernelFile,))
f.write("\tlabel=%s\n" %(label,))
f.write("\tread-only\n")
initrd = self.makeInitrd(kernelTag, instRoot)
if initrd:
f.write("\tinitrd=%s/%s\n" %(cfPath, initrd))
append = "%s" %(self.args.get(),)
realroot = rootDev.fstabSpec
if rootIsDevice(realroot):
f.write("\troot=%s\n" %(realroot,))
else:
if len(append) > 0:
append = "%s root=%s" %(append,realroot)
else:
append = "root=%s" %(realroot,)
if len(append) > 0:
f.write("\tappend=\"%s\"\n" %(append,))
f.write("\n")
f.close()
os.chmod(instRoot + cf, 0600)
# FIXME: hack to make sure things are written to disk
import isys
isys.sync()
isys.sync()
isys.sync()
ybinargs = [ yabootProg, "-f", "-C", cf ]
rc = iutil.execWithRedirect(ybinargs[0],
ybinargs[1:],
stdout = "/dev/tty5",
stderr = "/dev/tty5",
root = instRoot)
if rc:
return rc
if (not os.access(instRoot + "/etc/yaboot.conf", os.R_OK) and
os.access(instRoot + "/boot/etc/yaboot.conf", os.R_OK)):
os.symlink("../boot/etc/yaboot.conf",
instRoot + "/etc/yaboot.conf")
return 0
def setPassword(self, val, isCrypted = 1):
# yaboot just handles the password and doesn't care if its crypted
# or not
self.password = val
def write(self, instRoot, bl, kernelList, chainList, defaultDev):
if len(kernelList) >= 1:
rc = self.writeYaboot(instRoot, bl, kernelList,
chainList, defaultDev)
if rc:
return rc
else:
raise BootyNoKernelWarning
return 0
def __init__(self, anaconda):
bootloaderInfo.__init__(self, anaconda)
self.useYabootVal = 1
self.kernelLocation = "/boot"
self._configdir = "/etc"
self._configname = "yaboot.conf"