Difference between revisions of "Mac Build Scripts: Python"
Jump to navigation
Jump to search
(add scripts section) |
(→replicate.py: update, os action prevented) |
||
| Line 3: | Line 3: | ||
==Disk Replication== | ==Disk Replication== | ||
===replicate.py=== | ===replicate.py=== | ||
| − | + | #!/usr/bin/python | |
| − | + | from platform import * | |
| − | + | from globals import * | |
| − | + | from scripts import * | |
| − | + | import sys, getopt, string | |
| − | + | ||
| − | + | def usage(): | |
| − | + | errExit(2,"usage: replicate -t macType targetdev") | |
| − | + | ||
| − | + | def getArgs(): | |
| − | + | macType = target = None | |
| − | + | try: | |
| − | + | opts, args = getopt.getopt(sys.argv[1:], "ht:", ["help"]) | |
| − | + | except getopt.GetoptError: | |
| − | + | # print help information and exit: | |
| − | + | usage() | |
| − | + | if not opts: | |
| − | + | usage() | |
| − | + | for o, a in opts: | |
| − | + | if o == "-t": | |
| − | + | macType = a | |
| − | + | if o in ("-h", "--help"): | |
| − | + | usage() | |
| − | + | if args: | |
| − | + | target = args[0] | |
| + | else: | ||
| + | target = os.environ.get('REPL_TARGET_DRIVE') | ||
| + | if target is None: | ||
| + | print "error: no target drive specified" | ||
| + | usage() | ||
| + | return macType, target | ||
| + | |||
| + | |||
| + | def verifyTarget(host): | ||
| + | """ target device must exist and have no partition map. Existence | ||
| + | is tested by probing with hdparm; partition map is probed with | ||
| + | fdisk. | ||
| + | """ | ||
| + | devPath = host.get_hdPath() | ||
| + | cmd = 'hdparm -i ' + devPath | ||
| + | r = os.popen(cmd) | ||
| + | status = r.close() | ||
| + | if status is not None: | ||
| + | errExit(8,'error: device ' + devPath + ' does not seem to exist') | ||
| + | cmd = ('fdisk -l ' + devPath + '| grep ' + devPath + ' | wc -l') | ||
| + | nPartitions = map(string.strip, os.popen(cmd).readlines()) | ||
| + | if nPartitions: | ||
| + | errExit(9,'error: there appear to be existing partitions on ' + devPath) | ||
| + | |||
| + | def createPartitions(host): | ||
| + | """ create an fdisk script for creating partitions on the local | ||
| + | target drive; create an ext3 filesystem on the linux partition, | ||
| + | and initinitialize the swap partition. Initialializing the swap | ||
| + | partition has the benefit of creating a UUID for it. | ||
| + | """ | ||
| + | # generate fdisk script and apply it | ||
| + | devPath = host.get_hdPath() | ||
| + | genFdiskScript(devPath) | ||
| + | cmd = 'fdisk ' + devPath + ' < ' + fdiskScript | ||
| + | # os.system(cmd) | ||
| + | print 'os.system(' + cmd + ')' | ||
| + | |||
| + | # verify partition existence, and create linux filesystem and swap space | ||
| + | cmd = 'fdisk -l ' + devPath + ' | grep ' + host.get_linuxPart() \ | ||
| + | + ' | wc -l' | ||
| + | n_partitions = map(string.strip, os.popen(cmd).readlines()) | ||
| + | if (not n_partitions or n_partitions[0] is not '1'): | ||
| + | err = 'error: no linux partition ' + host.get_linuxPart() \ | ||
| + | + ' for fs creation' | ||
| + | errExit(10, err) | ||
| + | # os.system('mkfs3.ext3' + host.get_linuxPart()) | ||
| + | # os.system('mkswap' + host.get_swapPart()) | ||
| + | print 'os.system(mkfs3.ext3 ' + host.get_linuxPart() + ')' | ||
| + | print 'os.system(mkswap ' + host.get_swapPart() + ')' | ||
| + | |||
| + | def setupForCopy(host): | ||
| + | """ verify/create all the necessary mount points | ||
| + | """ | ||
| + | ## linux target | ||
| + | mntPath = '/mnt/' + host.get_hd() + linuxpart | ||
| + | if os.path.exists(mntPath): | ||
| + | if not os.path.isdir(mntPath): | ||
| + | errExit(18,'error: mount point ' + mntPath + 'is a regular file;' | ||
| + | + 'it must be a directory') | ||
| + | # else it exists and it is a directory | ||
| + | else: | ||
| + | # it does not exist, so create it | ||
| + | # os.path.mkdir(mntPath,0644) | ||
| + | print 'os.path.mkdir(' + mntPath + ',0644)' | ||
| + | # mount target linux partition | ||
| + | cmd = 'mount -t ext3 -o rw ' + host.get_linuxPart() + ' ' + mntPath | ||
| + | # status = os.system(cmd) | ||
| + | print 'os.system(' + cmd + ')' | ||
| + | # if (status is not 0): | ||
| + | # errExit(12,'error: mount target linux partition failed: ' \ | ||
| + | # + host.get_linuxPart() + ' to ' + mntPath) | ||
| + | # else: | ||
| + | # os.system('umount ' + mntPath) | ||
| + | |||
| + | ## boot target | ||
| + | mntPath = '/mnt/' + host.get_hd() + swappart | ||
| + | if os.path.exists(mntPath): | ||
| + | if not os.path.isdir(mntPath): | ||
| + | errExit(18,'error: mount point ' + mntPath + 'is a regular file;' | ||
| + | + 'it must be a directory') | ||
| + | # else it exists and it is a directory | ||
| + | else: | ||
| + | # it does not exist, so create it | ||
| + | # os.path.mkdir(mntPath,0644) | ||
| + | print 'os.path.mkdir(' + mntPath + ',0644)' | ||
| + | |||
| + | def copyPartitions(host,pfm): | ||
| + | """ copy boot partition with dd, and copy linux install image with | ||
| + | rsync; verify boot partition by mounting it as an hfs filesystem | ||
| + | """ | ||
| + | # copy the boot partition | ||
| + | mntPath = '/mnt/' + host.get_hd() + bootpart | ||
| + | bootimgPath = srcHome + '/' + pfm.get_imageType() + '/' + bootpartImg | ||
| + | cmd = 'dd if=' + bootimgPath + ' of=' + mntPath | ||
| + | # os.system(cmd) | ||
| + | print 'os.system(' + cmd + ')' | ||
| + | |||
| + | # mount/verify target boot partition | ||
| + | cmd = 'mount -t hfs ' + host.get_bootPart() + ' ' + mntPath | ||
| + | # status = os.system(cmd) | ||
| + | print 'os.system(' + cmd + ')' | ||
| + | # if (status is not 0): | ||
| + | # errExit(12,'error: mount target swap partition failed: ' \ | ||
| + | # + host.get_swapPart() + ' to ' + mntPath) | ||
| + | # else: | ||
| + | # os.system('umount ' + mntPath) | ||
| + | |||
| + | # copy the linux partition | ||
| + | mntPath = '/mnt/' + host.get_hd() + linuxpart | ||
| + | linuximgPath = srcHome + '/' + pfm.get_imageType() + '/' + linuxImg | ||
| + | cmd = 'rsync -av ' + linuximgPath + '/ ' + mntPath + '/' | ||
| + | # status = os.system(cmd) | ||
| + | print 'os.system(' + cmd + ')' | ||
| + | # if (status is not 0): | ||
| + | # errExit(12,'error: mount target linux partition failed: ' \ | ||
| + | # + host.get_linuxPart() + ' to ' + mntPath) | ||
| + | # else: | ||
| + | # os.system('umount ' + mntPath) | ||
| + | |||
| + | def tweakConfigFiles(host,pfm): | ||
| + | r1=re.compile(r'UUID=([0-9a-fA-F\-]+)') | ||
| + | cmd = 'vol_id ' + host.get_linuxPart() + ' | grep -i uuid' | ||
| + | print 'os.system(' + cmd + ')' | ||
| + | for line in os.popen(cmd).readlines(): | ||
| + | m = r1.search(line) | ||
| + | if (m): | ||
| + | linuxuuid = m.group(1) | ||
| + | break | ||
| + | cmd = 'vol_id ' + host.get_swapPart() + ' | grep -i uuid' | ||
| + | print 'os.system(' + cmd + ')' | ||
| + | for line in os.popen(cmd).readlines(): | ||
| + | print line | ||
| + | m = r1.search(line) | ||
| + | if (m): | ||
| + | swapuuid = m.group(1) | ||
| + | break | ||
| + | |||
| + | try: | ||
| + | genYbConf(pfm) | ||
| + | except: | ||
| + | errExit(19,"error: failed to generate yaboot configuration") | ||
| + | try: | ||
| + | genFstab(pfm,linuxuuid,swapuuid) | ||
| + | except: | ||
| + | errExit(20,"error: failed to generate fstab") | ||
| + | |||
| + | mntPath = '/mnt/' + host.get_hd() + linuxpart | ||
| + | cmd = 'mount -t ext3 -o rw ' + host.get_linuxPart() + ' ' + mntPath | ||
| + | # status = os.system(cmd) | ||
| + | print 'os.system(' + cmd + ')' | ||
| + | cmd = 'cp ' + fstabFile + ' ' + mntPath + '/etc/yaboot.conf' | ||
| + | # os.system(cmd) | ||
| + | print 'os.system(' + cmd + ')' | ||
| + | cmd = 'cp ' + ybConfFile + ' ' + mntPath + '/etc/fstab' | ||
| + | # os.system(cmd) | ||
| + | print 'os.system(' + cmd + ')' | ||
| + | cmd = 'mkofboot -b ' + host.get_bootPart() + ' ' + pfm.get_bootPart() \ | ||
| + | + ' -o ' + pfm.get_bootdev() + ' -C ' + mntPath \ | ||
| + | + '/etc/yaboot.conf ' + '--nonvram' | ||
| + | # status = os.system(cmd) | ||
| + | print 'os.system(' + cmd + ')' | ||
| + | # if (status is not 0): | ||
| + | # errExit(15,'error:failed to update boot partition') | ||
| + | # else: | ||
| + | # os.system('umount ' + mntPath) | ||
| + | |||
| + | def main(): | ||
| + | # first, ensure root user | ||
| + | if os.getuid() is not 0: | ||
| + | errExit(1 ,"You must be root to run this script; try using sudo") | ||
| + | |||
| + | macType, target = getArgs() | ||
| + | h = aPlatform("host") | ||
| + | p = aPlatform(macType) | ||
| + | h.set_hd(target) | ||
| + | verifyTarget(h) | ||
| + | createPartitions(h) | ||
| + | setupForCopy(h) | ||
| + | copyPartitions(h,p) | ||
| + | tweakConfigFiles(h,p) | ||
| + | |||
| + | if __name__ == "__main__": | ||
| + | main() | ||
===globals.py=== | ===globals.py=== | ||
Revision as of 09:07, 6 March 2007
Now let's try that Linux Disk Replication script in Python.
Disk Replication
replicate.py
- !/usr/bin/python
from platform import * from globals import * from scripts import * import sys, getopt, string
def usage():
errExit(2,"usage: replicate -t macType targetdev")
def getArgs():
macType = target = None
try:
opts, args = getopt.getopt(sys.argv[1:], "ht:", ["help"])
except getopt.GetoptError:
# print help information and exit:
usage()
if not opts:
usage()
for o, a in opts:
if o == "-t":
macType = a
if o in ("-h", "--help"):
usage()
if args:
target = args[0]
else:
target = os.environ.get('REPL_TARGET_DRIVE')
if target is None:
print "error: no target drive specified"
usage()
return macType, target
def verifyTarget(host):
""" target device must exist and have no partition map. Existence
is tested by probing with hdparm; partition map is probed with
fdisk.
"""
devPath = host.get_hdPath()
cmd = 'hdparm -i ' + devPath
r = os.popen(cmd)
status = r.close()
if status is not None:
errExit(8,'error: device ' + devPath + ' does not seem to exist')
cmd = ('fdisk -l ' + devPath + '| grep ' + devPath + ' | wc -l')
nPartitions = map(string.strip, os.popen(cmd).readlines())
if nPartitions:
errExit(9,'error: there appear to be existing partitions on ' + devPath)
def createPartitions(host):
""" create an fdisk script for creating partitions on the local
target drive; create an ext3 filesystem on the linux partition,
and initinitialize the swap partition. Initialializing the swap
partition has the benefit of creating a UUID for it.
"""
# generate fdisk script and apply it
devPath = host.get_hdPath()
genFdiskScript(devPath)
cmd = 'fdisk ' + devPath + ' < ' + fdiskScript
- os.system(cmd)
print 'os.system(' + cmd + ')'
# verify partition existence, and create linux filesystem and swap space
cmd = 'fdisk -l ' + devPath + ' | grep ' + host.get_linuxPart() \
+ ' | wc -l'
n_partitions = map(string.strip, os.popen(cmd).readlines())
if (not n_partitions or n_partitions[0] is not '1'):
err = 'error: no linux partition ' + host.get_linuxPart() \
+ ' for fs creation'
errExit(10, err)
- os.system('mkfs3.ext3' + host.get_linuxPart())
- os.system('mkswap' + host.get_swapPart())
print 'os.system(mkfs3.ext3 ' + host.get_linuxPart() + ')' print 'os.system(mkswap ' + host.get_swapPart() + ')'
def setupForCopy(host):
""" verify/create all the necessary mount points
"""
## linux target
mntPath = '/mnt/' + host.get_hd() + linuxpart
if os.path.exists(mntPath):
if not os.path.isdir(mntPath):
errExit(18,'error: mount point ' + mntPath + 'is a regular file;'
+ 'it must be a directory')
# else it exists and it is a directory
else:
# it does not exist, so create it
- os.path.mkdir(mntPath,0644)
print 'os.path.mkdir(' + mntPath + ',0644)'
# mount target linux partition
cmd = 'mount -t ext3 -o rw ' + host.get_linuxPart() + ' ' + mntPath
- status = os.system(cmd)
print 'os.system(' + cmd + ')'
- if (status is not 0):
- errExit(12,'error: mount target linux partition failed: ' \
- + host.get_linuxPart() + ' to ' + mntPath)
- else:
- os.system('umount ' + mntPath)
## boot target
mntPath = '/mnt/' + host.get_hd() + swappart
if os.path.exists(mntPath):
if not os.path.isdir(mntPath):
errExit(18,'error: mount point ' + mntPath + 'is a regular file;'
+ 'it must be a directory')
# else it exists and it is a directory
else:
# it does not exist, so create it
- os.path.mkdir(mntPath,0644)
print 'os.path.mkdir(' + mntPath + ',0644)'
def copyPartitions(host,pfm):
""" copy boot partition with dd, and copy linux install image with
rsync; verify boot partition by mounting it as an hfs filesystem
"""
# copy the boot partition
mntPath = '/mnt/' + host.get_hd() + bootpart
bootimgPath = srcHome + '/' + pfm.get_imageType() + '/' + bootpartImg
cmd = 'dd if=' + bootimgPath + ' of=' + mntPath
- os.system(cmd)
print 'os.system(' + cmd + ')'
# mount/verify target boot partition
cmd = 'mount -t hfs ' + host.get_bootPart() + ' ' + mntPath
- status = os.system(cmd)
print 'os.system(' + cmd + ')'
- if (status is not 0):
- errExit(12,'error: mount target swap partition failed: ' \
- + host.get_swapPart() + ' to ' + mntPath)
- else:
- os.system('umount ' + mntPath)
# copy the linux partition mntPath = '/mnt/' + host.get_hd() + linuxpart linuximgPath = srcHome + '/' + pfm.get_imageType() + '/' + linuxImg cmd = 'rsync -av ' + linuximgPath + '/ ' + mntPath + '/'
- status = os.system(cmd)
print 'os.system(' + cmd + ')'
- if (status is not 0):
- errExit(12,'error: mount target linux partition failed: ' \
- + host.get_linuxPart() + ' to ' + mntPath)
- else:
- os.system('umount ' + mntPath)
def tweakConfigFiles(host,pfm):
r1=re.compile(r'UUID=([0-9a-fA-F\-]+)')
cmd = 'vol_id ' + host.get_linuxPart() + ' | grep -i uuid'
print 'os.system(' + cmd + ')'
for line in os.popen(cmd).readlines():
m = r1.search(line)
if (m):
linuxuuid = m.group(1)
break
cmd = 'vol_id ' + host.get_swapPart() + ' | grep -i uuid'
print 'os.system(' + cmd + ')'
for line in os.popen(cmd).readlines():
print line
m = r1.search(line)
if (m):
swapuuid = m.group(1)
break
try:
genYbConf(pfm)
except:
errExit(19,"error: failed to generate yaboot configuration")
try:
genFstab(pfm,linuxuuid,swapuuid)
except:
errExit(20,"error: failed to generate fstab")
mntPath = '/mnt/' + host.get_hd() + linuxpart cmd = 'mount -t ext3 -o rw ' + host.get_linuxPart() + ' ' + mntPath
- status = os.system(cmd)
print 'os.system(' + cmd + ')'
cmd = 'cp ' + fstabFile + ' ' + mntPath + '/etc/yaboot.conf'
- os.system(cmd)
print 'os.system(' + cmd + ')'
cmd = 'cp ' + ybConfFile + ' ' + mntPath + '/etc/fstab'
- os.system(cmd)
print 'os.system(' + cmd + ')'
cmd = 'mkofboot -b ' + host.get_bootPart() + ' ' + pfm.get_bootPart() \
+ ' -o ' + pfm.get_bootdev() + ' -C ' + mntPath \
+ '/etc/yaboot.conf ' + '--nonvram'
- status = os.system(cmd)
print 'os.system(' + cmd + ')'
- if (status is not 0):
- errExit(15,'error:failed to update boot partition')
- else:
- os.system('umount ' + mntPath)
def main():
# first, ensure root user
if os.getuid() is not 0:
errExit(1 ,"You must be root to run this script; try using sudo")
macType, target = getArgs()
h = aPlatform("host")
p = aPlatform(macType)
h.set_hd(target)
verifyTarget(h)
createPartitions(h)
setupForCopy(h)
copyPartitions(h,p)
tweakConfigFiles(h,p)
if __name__ == "__main__":
main()
globals.py
linuxroot = "/root/rootdir" bootpartimg = "/root/bootpart.img"
platform.py
class Platform:
def __init__(self):
self.name = "prototype"
self.hd_device = "hda"
self.cd_device = "hdc"
self.of_bootdev = "hd:"
def get_name(self):
return self.name
def set_name(self,name):
self.name = name
def get_hd(self):
return self.hd_device
def set_hd(self,device):
self.hd_device = device
def get_cd(self):
return self.cd_device
def set_cd(self,device):
self.cd_device = device
def get_bootdev(self):
return self.of_bootdev
def set_cd(self,ofpath):
self.of_bootdev = ofpath
class imac(Platform):
def __init__(self):
self.name = "iMac"
self.hd_device = "hda"
self.cd_device = "hdb"
self.of_bootdev = "/pci@f2000000/mac-io@17/ata-4@1f000/disk@0:"
class g3(Platform):
def __init__(self):
self.name = "g3"
self.hd_device = "hdc"
self.cd_device = "hda"
self.of_bootdev = "/pci@80000000/pci-bridge@d/pci-ata@1/@0/disk@0:"
class g4(Platform):
def __init__(self):
self.name = "g4"
self.hd_device = "hda"
self.cd_device = "hdc"
self.of_bootdev = "/pci@f2000000/pci-bridge@d/mac-io@7/ata-4@1f000/disk@0:"
class g4q(Platform):
def __init__(self):
self.name = "g4q"
self.hd_device = "hda"
self.cd_device = "hdc"
self.of_bootdev = "/pci@f2000000/mac-io@17/ata-4@1f000/disk@0:"
def aPlatform(name):
if name == "imac":
return imac()
elif name == "g3":
return g3()
elif name == "g4":
return g4()
elif name == "g4q":
return g4q()
else:
return Platform()
def dump_platform(p):
print 'name : %s '% p.get_name().upper()
print 'hd : %s '% p.get_hd()
print 'cd : %s '% p.get_cd()
print 'of_bootdev: %s '% p.get_bootdev()
print
if __name__ == "__main__":
dump_platform(aPlatform("g4"))
dump_platform(aPlatform("imac"))
dump_platform(aPlatform("g3"))
dump_platform(aPlatform("g4q"))