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