#!/usr/bin/env python # Construct a chroot environment based on a config file. import garstowlib, sys, os class Config: def __init__(self): self.root = None self.packages = [] self.copy = [] def load(self, fn): f = open(fn) for l in f.readlines(): l = l.strip() if l == "" or l[0] == "#": continue (c, v) = l.split(" ", 1) if c == "include": self.load(v) elif c == "root": self.root = v elif c == "package": self.packages.append(v) elif c == "copy": self.copy.append(v) f.close() def die(s): print s sys.exit(1) def cmd(s): print "==> " + s result = os.system(s) if (result >> 8) != 0: die("command failed: " + s) def build_chroot(fn): conf = Config() conf.load(fn) packages = {} for p in conf.packages: packages[p] = None for d in garstowlib.get_deps_rec(p): packages[d] = None copylist = [] for l in conf.copy: copylist.append(l) for p in packages.keys(): v = garstowlib.get_installed_version(p) if v is None: die("package " + p + " not installed") packages[p] = p + "-" + v copylist.append(garstowlib.get_packages_dir() + "/" + packages[p]) copylist.sort() # FIXME broken for filenames with spaces in (owing to use of shell) cmd("mkdir -p " + conf.root) cmd("tar -C / -cpf - " + " ".join([c[1:] for c in copylist]) + " | tar -C " + conf.root + " --same-owner -xpf -") for p in packages.keys(): dest = conf.root + garstowlib.get_packages_dir() + "/" + p cmd("rm -f " + dest) cmd("ln -sf " + packages[p] + " " + dest) cmd("stow -t " + conf.root + garstowlib.get_stow_dir() + " -d " + conf.root + garstowlib.get_packages_dir() + " " + " ".join(packages.keys())) if __name__ == "__main__": for fn in sys.argv[1:]: build_chroot(fn) sys.exit(0)