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