]> TLD Linux GIT Repositories - tld-builder.git/blob - TLD_Builder/chroot.py
- import shutil
[tld-builder.git] / TLD_Builder / chroot.py
1 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
2
3 import os
4 import re
5 import random
6 import util
7 import shutil
8 import subprocess
9
10 from config import config
11
12 def quote(cmd):
13     return re.sub("([\"\\\\$`])", r"\\\1", cmd)
14
15 def command(cmd, user = None, nostdin=""):
16     if user == None:
17         user = config.builder_user
18     if nostdin:
19         nostdin = "exec < /dev/null; "
20     return "%s sudo chroot %s su - %s -c \"export LC_ALL=C; %s %s\"" \
21             % (config.sudo_chroot_wrapper, config.chroot, user, nostdin, quote(cmd))
22
23 def command_sh(cmd):
24     return "%s sudo chroot %s /bin/sh -c \"export LC_ALL=C; exec < /dev/null; %s\"" \
25             % (config.sudo_chroot_wrapper, config.chroot, quote(cmd))
26
27 def popen(cmd, user = "builder", mode = "r"):
28     if mode == "r":
29         p = subprocess.Popen(command(cmd, user), shell=True, stdout=subprocess.PIPE, close_fds=True)
30         f = p.stdout
31     else:
32         p = subprocess.Popen(command(cmd, user), shell=True, stdin=subprocess.PIPE, close_fds=True)
33         f = p.stdin
34     return f
35
36 def run(cmd, user = "builder", logfile = None, logstdout = None):
37     c = command(cmd, user, nostdin=True)
38     if logfile != None:
39         if logstdout != None:
40             c = "%s 2>&1 | /usr/bin/tee -a %s" % (c, logfile)
41         else:
42             c = "%s >> %s 2>&1" % (c, logfile)
43     f = os.popen(c)
44     if logstdout != None:
45         for l in f:
46             logstdout.write(l)
47     r = f.close()
48     if r == None:
49         return 0
50     else:
51         return r
52
53 def cp(file, outfile, user="builder", rm=False):
54     f_out = open(outfile, 'wb')
55     cmd = "cat %s" % file
56     if rm:
57         cmd += "; rm %s" % file
58     p = subprocess.Popen(command(cmd, user), shell=True, stdout=subprocess.PIPE, close_fds=True)
59     f_in = p.stdout
60     shutil.copyfileobj(f_in, f_out)
61     f_out.close()
62     r = f_in.close()
63     if r == None:
64         return 0
65     else:
66         return r