diff --git a/src/pylorax/imgutils.py b/src/pylorax/imgutils.py index 86a56f3e..84f0d040 100644 --- a/src/pylorax/imgutils.py +++ b/src/pylorax/imgutils.py @@ -35,11 +35,13 @@ from pylorax.executils import runcmd, runcmd_output ######## Functions for making container images (cpio, tar, squashfs) ########## -def compress(command, rootdir, outfile, compression="xz", compressargs=["-9"]): +def compress(command, rootdir, outfile, compression="xz", compressargs=None): '''Make a compressed archive of the given rootdir. command is a list of the archiver commands to run compression should be "xz", "gzip", "lzma", "bzip2", or None. compressargs will be used on the compression commandline.''' + if compressargs is None: + compressargs = ["-9"] if compression not in (None, "xz", "gzip", "lzma", "bzip2"): raise ValueError, "Unknown compression type %s" % compression if compression == "xz": @@ -68,17 +70,18 @@ def compress(command, rootdir, outfile, compression="xz", compressargs=["-9"]): [p.kill() for p in (find, archive, comp) if p] return 1 -def mkcpio(rootdir, outfile, compression="xz", compressargs=["-9"]): +def mkcpio(rootdir, outfile, compression="xz", compressargs=None): return compress(["cpio", "--null", "--quiet", "-H", "newc", "-o"], rootdir, outfile, compression, compressargs) -def mktar(rootdir, outfile, compression="xz", compressargs=["-9"]): - compressargs = compressargs or ["-9"] +def mktar(rootdir, outfile, compression="xz", compressargs=None): return compress(["tar", "--no-recursion", "--selinux", "--acls", "--xattrs", "-cf-", "--null", "-T-"], rootdir, outfile, compression, compressargs) -def mksquashfs(rootdir, outfile, compression="default", compressargs=[]): +def mksquashfs(rootdir, outfile, compression="default", compressargs=None): '''Make a squashfs image containing the given rootdir.''' + if compressargs is None: + compressargs = [] if compression != "default": compressargs = ["-comp", compression] + compressargs return execWithRedirect("mksquashfs", [rootdir, outfile] + compressargs) @@ -282,7 +285,9 @@ def round_to_blocks(size, blocksize): return size # TODO: move filesystem data outside this function -def estimate_size(rootdir, graft={}, fstype=None, blocksize=4096, overhead=128): +def estimate_size(rootdir, graft=None, fstype=None, blocksize=4096, overhead=128): + if graft is None: + graft = {} getsize = lambda f: os.lstat(f).st_size if fstype == "btrfs": overhead = 64*1024 # don't worry, it's all sparse @@ -401,12 +406,16 @@ class PartitionMount(object): ######## Functions for making filesystem images ########################## -def mkfsimage(fstype, rootdir, outfile, size=None, mkfsargs=[], mountargs="", graft={}): +def mkfsimage(fstype, rootdir, outfile, size=None, mkfsargs=None, mountargs="", graft=None): '''Generic filesystem image creation function. fstype should be a filesystem type - "mkfs.${fstype}" must exist. graft should be a dict: {"some/path/in/image": "local/file/or/dir"}; if the path ends with a '/' it's assumed to be a directory. Will raise CalledProcessError if something goes wrong.''' + if mkfsargs is None: + mkfsargs = [] + if graft is None: + graft = {} preserve = (fstype not in ("msdos", "vfat")) if not size: size = estimate_size(rootdir, graft, fstype) @@ -427,18 +436,18 @@ def mkfsimage(fstype, rootdir, outfile, size=None, mkfsargs=[], mountargs="", gr runcmd(["sync"]) # convenience functions with useful defaults -def mkdosimg(rootdir, outfile, size=None, label="", mountargs="shortname=winnt,umask=0077", graft={}): +def mkdosimg(rootdir, outfile, size=None, label="", mountargs="shortname=winnt,umask=0077", graft=None): mkfsimage("msdos", rootdir, outfile, size, mountargs=mountargs, mkfsargs=["-n", label], graft=graft) -def mkext4img(rootdir, outfile, size=None, label="", mountargs="", graft={}): +def mkext4img(rootdir, outfile, size=None, label="", mountargs="", graft=None): mkfsimage("ext4", rootdir, outfile, size, mountargs=mountargs, mkfsargs=["-L", label, "-b", "1024", "-m", "0"], graft=graft) -def mkbtrfsimg(rootdir, outfile, size=None, label="", mountargs="", graft={}): +def mkbtrfsimg(rootdir, outfile, size=None, label="", mountargs="", graft=None): mkfsimage("btrfs", rootdir, outfile, size, mountargs=mountargs, mkfsargs=["-L", label], graft=graft) -def mkhfsimg(rootdir, outfile, size=None, label="", mountargs="", graft={}): +def mkhfsimg(rootdir, outfile, size=None, label="", mountargs="", graft=None): mkfsimage("hfsplus", rootdir, outfile, size, mountargs=mountargs, mkfsargs=["-v", label], graft=graft) diff --git a/src/pylorax/ltmpl.py b/src/pylorax/ltmpl.py index af15bbc3..364ea221 100644 --- a/src/pylorax/ltmpl.py +++ b/src/pylorax/ltmpl.py @@ -40,7 +40,9 @@ import sys, traceback import struct class LoraxTemplate(object): - def __init__(self, directories=["/usr/share/lorax"]): + def __init__(self, directories=None): + if directories is None: + directories = ["/usr/share/lorax"] # we have to add ["/"] to the template lookup directories or the # file includes won't work properly for absolute paths self.directories = ["/"] + directories @@ -148,7 +150,9 @@ class LoraxTemplateRunner(object): * Commands should raise exceptions for errors - don't use sys.exit() ''' def __init__(self, inroot, outroot, yum_obj=None, fatalerrors=True, - templatedir=None, defaults={}): + templatedir=None, defaults=None): + if defaults is None: + defaults = {} self.inroot = inroot self.outroot = outroot self.yum = yum_obj diff --git a/src/pylorax/treebuilder.py b/src/pylorax/treebuilder.py index d34fcf1e..ae86e294 100644 --- a/src/pylorax/treebuilder.py +++ b/src/pylorax/treebuilder.py @@ -156,7 +156,9 @@ class RuntimeBuilder(object): runcmd(["depmod", "-a", "-F", ksyms, "-b", root, kver]) generate_module_info(moddir+kver, outfile=moddir+"module-info") - def create_runtime(self, outfile="/var/tmp/squashfs.img", compression="xz", compressargs=[], size=2): + def create_runtime(self, outfile="/var/tmp/squashfs.img", compression="xz", compressargs=None, size=2): + if compressargs is None: + compressargs = [] # make live rootfs image - must be named "LiveOS/rootfs.img" for dracut workdir = joinpaths(os.path.dirname(outfile), "runtime-workdir") os.makedirs(joinpaths(workdir, "LiveOS")) @@ -192,13 +194,15 @@ class TreeBuilder(object): def kernels(self): return findkernels(root=self.vars.inroot) - def rebuild_initrds(self, add_args=[], backup="", prefix=""): + def rebuild_initrds(self, add_args=None, backup="", prefix=""): '''Rebuild all the initrds in the tree. If backup is specified, each initrd will be renamed with backup as a suffix before rebuilding. If backup is empty, the existing initrd files will be overwritten. If suffix is specified, the existing initrd is untouched and a new image is built with the filename "${prefix}-${kernel.version}.img" ''' + if add_args is None: + add_args = [] dracut = ["dracut", "--nomdadmconf", "--nolvmconf"] + add_args if not backup: dracut.append("--force") diff --git a/src/sbin/lorax b/src/sbin/lorax index 0984e927..5048419b 100755 --- a/src/sbin/lorax +++ b/src/sbin/lorax @@ -234,8 +234,8 @@ def main(args): remove_temp=True) -def get_yum_base_object(installroot, repositories, mirrorlists=[], repo_files=[], - tempdir="/var/tmp", proxy=None, excludepkgs=[], +def get_yum_base_object(installroot, repositories, mirrorlists=None, repo_files=None, + tempdir="/var/tmp", proxy=None, excludepkgs=None, sslverify=True, releasever=None): def sanitize_repo(repo): @@ -247,6 +247,13 @@ def get_yum_base_object(installroot, repositories, mirrorlists=[], repo_files=[] else: return None + if mirrorlists is None: + mirrorlists = [] + if repo_files is None: + repo_files = [] + if excludepkgs is None: + excludepkgs = [] + # sanitize the repositories repositories = map(sanitize_repo, repositories) mirrorlists = map(sanitize_repo, mirrorlists)