]> TLD Linux GIT Repositories - tld-builder.git/blob - TLD_Builder/srpm_builder.py
- more python3 fixes, dropped python2 support
[tld-builder.git] / TLD_Builder / srpm_builder.py
1 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
2
3 import email
4 import string
5 import time
6 import os
7 import sys
8 import re
9 import shutil
10 import atexit
11 import tempfile
12
13 import gpg
14 import request
15 import log
16 import path
17 import util
18 import loop
19 import chroot
20 import ftp
21 import buildlogs
22 import notify
23 import status
24 import build
25 import report
26 #import messagebus
27
28 from lock import lock
29 from bqueue import B_Queue
30 from config import config, init_conf
31
32 def pick_request(q):
33     def mycmp(r1, r2):
34         if r1.kind != 'group' or r2.kind != 'group':
35             raise Exception("non-group requests")
36         pri_diff = cmp(r1.priority, r2.priority)
37         if pri_diff == 0:
38             return cmp(r1.time, r2.time)
39         else:
40             return pri_diff
41     q.requests.sort(key=util.cmp_to_key(mycmp))
42     ret = q.requests[0]
43     q.requests = q.requests[1:]
44     return ret
45
46 def store_binary_request(r):
47     new_b = []
48     for b in r.batches:
49         if not b.build_failed: new_b.append(b)
50     if new_b == []:
51         return
52     r.batches = new_b
53     # store new queue and max_req_no for binary builders
54     num = int(open(path.max_req_no_file, "r").read().strip()) + 1
55
56     r.no = num
57     q = B_Queue(path.req_queue_file)
58     q.lock(0)
59     q.read()
60     q.add(r)
61     q.write()
62     q.dump(path.queue_stats_file)
63     q.dump_html(path.queue_html_stats_file)
64     q.write_signed(path.req_queue_signed_file)
65     q.unlock()
66
67     (fdno, tmpfname) = tempfile.mkstemp(dir=os.path.dirname(path.max_req_no_file))
68     cnt_f = os.fdopen(fdno, "w")
69     cnt_f.seek(0)
70     cnt_f.write("%d\n" % num)
71     cnt_f.flush()
72     os.fsync(cnt_f.fileno())
73     cnt_f.close()
74     os.chmod(tmpfname, 0o0644)
75     os.rename(tmpfname, path.max_req_no_file)
76
77 def transfer_file(r, b):
78     local = path.srpms_dir + '/' + r.id + "/" + b.src_rpm
79     f = b.src_rpm_file
80     # export files from chroot
81     chroot.cp(f, outfile = local, rm = True)
82     os.chmod(local, 0o0644)
83     ftp.add(local)
84
85     if config.gen_upinfo and 'test-build' not in r.flags:
86         fname = path.srpms_dir + '/' + r.id + "/" + b.src_rpm + ".uploadinfo"
87         f = open(fname, "w")
88         f.write("info:build:%s:requester:%s\ninfo:build:%s:requester_email:%s\nfile:SRPMS:%s\nEND\n" % (b.gb_id, b.requester, b.gb_id, b.requester_email, b.src_rpm))
89         f.close()
90         ftp.add(fname, "uploadinfo")
91
92 def build_srpm(r, b):
93     if len(b.spec) <= len('.spec'):
94         # should not really get here
95         util.append_to(b.logfile, "error: No .spec given but build src.rpm wanted")
96         return "FAIL"
97
98     status.push("building %s" % b.spec)
99 #    messagebus.notify(topic="build_srpm.start", spec=b.spec, flags=r.flags, batch=b, request=r)
100
101     b.src_rpm = ""
102     builder_opts = "-nu -nm --nodeps --http --define \'_tld_builder 1\'"
103     cmd = ("cd rpm/packages; nice -n %s ./builder %s -bs %s -r %s %s %s %s 2>&1" %
104              (config.nice, builder_opts, b.bconds_string(), b.branch,
105               b.kernel_string(), b.defines_string(), b.spec))
106     util.append_to(b.logfile, "request from: %s" % r.requester)
107     util.append_to(b.logfile, "started at: %s" % time.asctime())
108     util.append_to(b.logfile, "building SRPM using: %s\n" % cmd)
109     res = chroot.run(cmd, logfile = b.logfile)
110     util.append_to(b.logfile, "exit status %d" % res)
111     files = util.collect_files(b.logfile)
112     if len(files) > 0:
113         if len(files) > 1:
114             util.append_to(b.logfile, "error: More than one file produced: %s" % files)
115             res = "FAIL_TOOMANYFILES"
116         last = files[len(files) - 1]
117         b.src_rpm_file = last
118         b.src_rpm = os.path.basename(last)
119         r.chroot_files.extend(files)
120     else:
121         util.append_to(b.logfile, "error: No files produced.")
122         res = "FAIL"
123     if res == 0 and not "test-build" in r.flags:
124         util.append_to(b.logfile, "Writing package revision")
125         res = chroot.run("cd rpm/packages; ./builder -bs %s -r %s --pkgrev %s %s" % \
126             (b.bconds_string(), b.branch, b.defines_string(), b.spec), logfile = b.logfile)
127     if res == 0:
128         transfer_file(r, b)
129
130     packagename = b.spec[:-5]
131     packagedir = "rpm/packages/%s" % packagename
132     chroot.run("rpm/packages/builder -m %s" % \
133             (b.spec,), logfile = b.logfile)
134     chroot.run("rm -rf %s" % packagedir, logfile = b.logfile)
135     status.pop()
136
137     if res:
138         res = "FAIL"
139
140 #    messagebus.notify(topic="build_srpm.finish", spec=b.spec)
141     return res
142
143 def handle_request(r):
144     os.mkdir(path.srpms_dir + '/' + r.id)
145     os.chmod(path.srpms_dir + '/' + r.id, 0o0755)
146     ftp.init(r)
147     buildlogs.init(r)
148     build.build_all(r, build_srpm)
149     report.send_report(r, is_src = True)
150     report.send_cia_report(r, is_src = True)
151     store_binary_request(r)
152     ftp.flush()
153     notify.send(r)
154
155 def main():
156     init_conf("src")
157     if lock("building-srpm", non_block = 1) == None:
158         return
159     while True:
160         status.push("srpm: processing queue")
161         q = B_Queue(path.queue_file)
162         if not q.lock(1):
163             status.pop()
164             return
165         q.read()
166         if q.requests == []:
167             q.unlock()
168             status.pop()
169             return
170         r = pick_request(q)
171         q.write()
172         q.unlock()
173         status.pop()
174         status.push("srpm: handling request from %s" % r.requester)
175         handle_request(r)
176         status.pop()
177
178 if __name__ == '__main__':
179     loop.run_loop(main)