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