def _linkRecurse(fromDir, toDir): for root, dirs, files in os.walk(fromDir): for dir in dirs: newRoot = toDir + root[len(fromDir):] util.mkdirChain(os.path.join(newRoot, dir)) for file in files: newRoot = toDir + root[len(fromDir):] src = os.path.join(root, file) dest = os.path.join(newRoot, file) gencslist._linkOrCopyFile(src, dest)
def lndir(src, dest, excludes=[]): for dirpath, dirnames, filenames in os.walk(src): curdir = dirpath[len(src) + 1:] # skipping the directory by itself is not enough, we need to ensure # that sub directories get excluded as well (since we can't know them # ahead of time) if [x for x in excludes if curdir.startswith(x)]: continue for p in (filenames + dirnames): if curdir: curpath = join(curdir, p) else: curpath = p if curpath in excludes: continue if not os.path.exists(join(dest, curpath)) or os.path.isfile(join(dest, curpath)): # this is perfectly fine since the exact same path can't appear # in both the directory list and the file list. if p in filenames: _linkOrCopyFile(join(dirpath, p), join(dest, curpath)) else: os.mkdir(join(dest, curpath))
def buildIsos(self, topdir): outputDir = os.path.join(constants.finishedDir, self.UUID) self.outputDir = outputDir util.mkdirChain(outputDir) # add the group writeable bit os.chmod(outputDir, os.stat(outputDir)[0] & 0777 | 0020) isoList = [] if self.basefilename: isoNameTemplate = self.basefilename + '-' else: isoNameTemplate = "%s-%s-%s-" % \ (self.jobData['project']['hostname'], upstream(self.baseVersion), self.arch) sourceDir = os.path.normpath(topdir + "/../") for d in sorted(os.listdir(sourceDir)): if not d.startswith('disc'): continue discNum = d.split("disc")[-1] discNumStr = "Disc %d" % int(discNum) truncatedName = self.jobData['name'][:31-len(discNumStr)] volumeId = "%s %s" % (truncatedName, discNumStr) outputIsoName = isoNameTemplate + d + ".iso" if os.access(os.path.join(sourceDir, d, "isolinux/isolinux.bin"), os.R_OK): os.chdir(os.path.join(sourceDir, d)) call("mkisofs", "-o", outputDir + "/" + outputIsoName, "-b", "isolinux/isolinux.bin", "-c", "isolinux/boot.cat", "-no-emul-boot", "-boot-load-size", "4", "-boot-info-table", "-R", "-J", "-V", volumeId, "-T", ".") else: os.chdir(os.path.join(sourceDir, d)) call("mkisofs", "-o", outputDir + "/" + outputIsoName, "-R", "-J", "-V", volumeId, "-T", ".") # mkisofs will happily ignore out of space conditions and produce a # truncated ISO file, so assume that if there's less than 1MB of # free space afterwards that it failed. fst = os.statvfs(outputDir) if fst.f_bsize * fst.f_bfree < 1000000: raise RuntimeError( "Not enough scratch space while running mkisofs") isoList.append((outputIsoName, "%s Disc %s" % (self.jobData['project']['name'], discNum))) isoList = [ (os.path.join(outputDir, iso[0]), iso[1]) for iso in isoList ] # this for loop re-identifies any iso greater than 700MB as a DVD for index, (iso, name) in zip(range(len(isoList)), isoList[:]): szPipe = os.popen('isosize %s' % iso, 'r') isoSize = int(szPipe.read()) szPipe.close() if isoSize > 734003200: # 700 MB in bytes newIso = iso.replace('disc', 'dvd') newName = name.replace('Disc', 'DVD') os.rename(iso, newIso) isoList[index] = (newIso, newName) for iso, name in isoList: if not os.access(iso, os.R_OK): raise RuntimeError, "ISO generation failed" else: cmd = [constants.implantIsoMd5] if not self.showMediaCheck: cmd.append('--supported-iso') cmd.append(iso) call(*cmd) # add the netboot images for f in ('boot.iso', 'diskboot.img'): inF = os.path.join(topdir, 'images', f) outF = os.path.join(outputDir, f) if os.path.exists(inF): gencslist._linkOrCopyFile(inF, outF) isoList += ( (outF, f), ) return isoList