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