]> 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
8 try:
9     from hashlib import md5 as md5
10 except ImportError:
11     from md5 import md5
12
13 from config import config
14
15 def quote(cmd):
16     return re.sub("([\"\\\\$`])", r"\\\1", cmd)
17
18 def command(cmd, user = None, nostdin=""):
19     if user == None:
20         user = config.builder_user
21     if nostdin:
22         nostdin = "exec < /dev/null; "
23     return "%s sudo chroot %s su - %s -c \"export LC_ALL=C; %s %s\"" \
24             % (config.sudo_chroot_wrapper, config.chroot, user, nostdin, quote(cmd))
25
26 def command_sh(cmd):
27     return "%s sudo chroot %s /bin/sh -c \"export LC_ALL=C; exec < /dev/null; %s\"" \
28             % (config.sudo_chroot_wrapper, config.chroot, quote(cmd))
29
30 def popen(cmd, user = "builder", mode = "r"):
31     if mode == "r":
32         p = subprocess.Popen(command(cmd, user), shell=True, stdout=subprocess.PIPE, close_fds=True)
33         f = p.stdout
34     else:
35         p = subprocess.Popen(command(cmd, user), shell=True, stdin=subprocess.PIPE, close_fds=True)
36         f = p.stdin
37     return f
38
39 def run(cmd, user = "builder", logfile = None, logstdout = None):
40     c = command(cmd, user, nostdin=True)
41     if logfile != None:
42         if logstdout != None:
43             c = "%s 2>&1 | /usr/bin/tee -a %s" % (c, logfile)
44         else:
45             c = "%s >> %s 2>&1" % (c, logfile)
46     f = os.popen(c)
47     if logstdout != None:
48         for l in f:
49             logstdout.write(l)
50     r = f.close()
51     if r == None:
52         return 0
53     else:
54         return r
55
56 def cp(file, outfile, user="builder", rm=False):
57     m = md5()
58     m.update(util.to_bytes(str(random.sample(range(100000), 500))))
59     digest = m.hexdigest()
60
61     marker_start = "--- FILE BEGIN DIGEST %s ---" % digest
62     marker_end = "--- FILE END DIGEST %s ---" % digest
63
64     f = open(outfile, 'wb')
65     cmd = "echo \"%s\"; cat %s; echo \"%s\"" % (marker_start, file, marker_end)
66     if rm:
67         cmd += "; rm %s" % file
68     c = command(cmd, user)
69     p = os.popen(c)
70     # get file contents
71     marker = False
72     for l in p:
73         if not marker and l.strip() == marker_start:
74             marker = True
75             continue
76         me = l.find(marker_end)
77         if me != -1:
78             l = l[:me]
79             f.write(util.to_bytes(l))
80             marker = False
81             break
82         if marker:
83             f.write(util.to_bytes(l))
84     rp = p.close()
85     rf = f.close()
86     if rp == None:
87         return 0
88     else:
89         return rp