]> TLD Linux GIT Repositories - tld-builder.git/blob - TLD_Builder/chroot.py
- more python3 fixes, dropped python2 support
[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     f = os.popen(command(cmd, user), mode)
32     return f
33
34 def run(cmd, user = "builder", logfile = None, logstdout = None):
35     c = command(cmd, user, nostdin=True)
36     if logfile != None:
37         if logstdout != None:
38             c = "%s 2>&1 | /usr/bin/tee -a %s" % (c, logfile)
39         else:
40             c = "%s >> %s 2>&1" % (c, logfile)
41     f = os.popen(c)
42     if logstdout != None:
43         for l in f:
44             logstdout.write(l)
45     r = f.close()
46     if r == None:
47         return 0
48     else:
49         return r
50
51 def cp(file, outfile, user="builder", rm=False):
52     m = md5()
53     m.update(util.to_bytes(str(random.sample(range(100000), 500))))
54     digest = m.hexdigest()
55
56     marker_start = "--- FILE BEGIN DIGEST %s ---" % digest
57     marker_end = "--- FILE END DIGEST %s ---" % digest
58
59     f = open(outfile, 'wb')
60     cmd = "echo \"%s\"; cat %s; echo \"%s\"" % (marker_start, file, marker_end)
61     if rm:
62         cmd += "; rm %s" % file
63     c = command(cmd, user)
64     p = os.popen(c)
65     # get file contents
66     marker = False
67     for l in p:
68         if not marker and l.strip() == marker_start:
69             marker = True
70             continue
71         me = l.find(marker_end)
72         if me != -1:
73             l = l[:me]
74             f.write(util.to_bytes(l))
75             marker = False
76             break
77         if marker:
78             f.write(util.to_bytes(l))
79     rp = p.close()
80     rf = f.close()
81     if rp == None:
82         return 0
83     else:
84         return rp