X-Git-Url: https://git.adam-barratt.org.uk/?a=blobdiff_plain;f=modules%2Fporterbox%2Ffiles%2Fdd-schroot-cmd;h=598fb12589b5dc57f86aea508345482fa1c6b551;hb=46c4cc91cdd8c148b56b50dd20233de38448d3ec;hp=e82a71c889473dce58a00ef405e996575809de55;hpb=1af943401cb3dea6a550030e3c6ad3043c463e03;p=mirror%2Fdsa-puppet.git diff --git a/modules/porterbox/files/dd-schroot-cmd b/modules/porterbox/files/dd-schroot-cmd index e82a71c88..598fb1258 100755 --- a/modules/porterbox/files/dd-schroot-cmd +++ b/modules/porterbox/files/dd-schroot-cmd @@ -56,7 +56,7 @@ def die(s): sys.exit(1) def get_session_owner(session): - if re.search('[^0-9a-zA-Z_-]', session): + if re.search('^\.|~$|[^0-9a-zA-Z_.~-]', session): die("Invalid session name.") path = os.path.join('/var/lib/schroot/session', session) @@ -80,7 +80,7 @@ def ensure_ok(session): die("Session owner mismatch.") def os_supports_unshare(): - if platform.uname()[0] == 'GNU/kFreeBSD': + if platform.uname()[0] in ('GNU/kFreeBSD', 'GNU'): return False return True @@ -88,7 +88,7 @@ class WrappedRunner(): def __init__(self, session, args, unshare=True): self.unshare = unshare if not os_supports_unshare(): self.unshare = False - s,r = self.run('schroot', '-c', session, '--run-session', '--', 'env', 'DEBIAN_FRONTEND=noninteractive', *args) + s,r = self.run('schroot', '-c', session, '--directory=/', '--run-session', '--', 'env', 'DEBIAN_FRONTEND=noninteractive', *args) if s != 0: die("Command %s exited due to signal %d."%(' '.join(args), s)) if r != 0: @@ -106,20 +106,26 @@ class WrappedRunner(): cmdstr = ' '.join(pipes.quote(s) for s in cmd) cmd = ['unshare', '--uts', '--ipc', '--net', '--'] cmd += ['sh', '-c', 'ip addr add 127.0.0.1/8 dev lo && ip link set dev lo up && %s'%(cmdstr)] - pid, fd = pty.fork() + (r, w) = os.pipe() + pid, ptyfd = pty.fork() if pid == pty.CHILD: + os.close(r) fd = os.open("/dev/null", os.O_RDWR) os.dup2(fd, 0) # stdin + os.dup2(w, 1) # stdout + os.dup2(w, 2) # stderr os.execlp(cmd[0], *cmd) + os.close(w) try: while 1: - b = os.read(fd, 1) + b = os.read(r, 1) if b == "": break sys.stdout.write(b) except OSError, e: if e[0] == EIO: pass else: raise - os.close(fd) + os.close(r) + os.close(ptyfd) # we don't care about that one p,v = os.waitpid(pid, 0) s,r = WrappedRunner.get_ret(v) return s,r @@ -148,7 +154,12 @@ class AptSchroot: elif op == "install": self.apt_install(args) elif op == "build-dep": - self.apt_build_dep(args) + try: + args.remove("--arch-only") + archonly = True + except ValueError: + archonly = False + self.apt_build_dep(args, archonly) else: die("Invalid operation %s"%(op,)) @@ -168,8 +179,9 @@ class AptSchroot: def apt_install(self, packages): self.apt_simulate_and_ask(['install', '--'] + packages) - def apt_build_dep(self, packages): - self.apt_simulate_and_ask(['build-dep', '--'] + packages) + def apt_build_dep(self, packages, archonly=False): + cmd = (['--arch-only'] if archonly else []) + ['build-dep', '--'] + self.apt_simulate_and_ask(cmd + packages) def apt_simulate_and_ask(self, cmd, split_download=True, run_clean=True): if not self.assume_yes: