]>
Commit | Line | Data |
---|---|---|
dfff8bd5 MM |
1 | # vi: encoding=utf-8 ts=8 sts=4 sw=4 et |
2 | ||
cf1741af MM |
3 | import re |
4 | import gzip | |
5 | import time | |
1c54a525 | 6 | import sys |
14edabbe | 7 | from io import StringIO |
cf1741af MM |
8 | import os |
9 | import fcntl | |
41f786ac | 10 | import string |
8d15cbfe | 11 | import tempfile |
14edabbe | 12 | import shutil |
cf1741af MM |
13 | |
14 | # PLD_Builder: | |
15 | import gpg | |
16 | import request | |
4d9b6f71 | 17 | import util |
f50e2253 | 18 | import log |
cf1741af MM |
19 | |
20 | class B_Queue: | |
dfff8bd5 MM |
21 | def __init__(self, filename): |
22 | self.name = filename | |
23 | self.requests = [] | |
24 | self.fd = None | |
cf1741af | 25 | |
8d15cbfe | 26 | def dump(self, fname): |
d1e5eeef | 27 | (fdno, tmpfname) = tempfile.mkstemp(dir=os.path.dirname(fname)) |
1ac7da2a | 28 | f = os.fdopen(fdno, "w") |
dfff8bd5 | 29 | self.requests.reverse() |
a82562d3 AM |
30 | for r in self.requests: |
31 | r.dump(f) | |
dfff8bd5 | 32 | self.requests.reverse() |
8d15cbfe AM |
33 | f.flush() |
34 | os.fsync(f.fileno()) | |
35 | f.close() | |
3bdce373 | 36 | os.chmod(tmpfname, 0o0644) |
8d15cbfe AM |
37 | os.rename(tmpfname, fname) |
38 | ||
3c00bb2c | 39 | def dump_html(self, fname): |
d1e5eeef | 40 | (fdno, tmpfname) = tempfile.mkstemp(dir=os.path.dirname(fname)) |
1ac7da2a | 41 | f = os.fdopen(fdno, "w") |
a0877b58 | 42 | f.write(""" |
6d31e66e ER |
43 | <html> |
44 | <head> | |
c37e2c66 | 45 | <link rel="Shortcut Icon" href="//www.pld-linux.org/favicon.ico"/> |
6d31e66e ER |
46 | <title>PLD builder queue</title> |
47 | <link rel="stylesheet" type="text/css" charset="utf-8" media="all" href="style.css"> | |
c25f6a1a | 48 | <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> |
d867e693 | 49 | <script src="//cdnjs.cloudflare.com/ajax/libs/jquery-timeago/1.4.3/jquery.timeago.min.js"></script> |
04ce7f54 | 50 | <script type="text/javascript" src="script.js"></script> |
6d31e66e | 51 | </head> |
c35cae86 ER |
52 | <body> |
53 | <div id="header"> | |
54 | <div id="requesters-filter">Filter by requesters:<br></div> | |
55 | </div> | |
56 | <div id="content"> | |
57 | """ | |
6d31e66e | 58 | ) |
dfff8bd5 MM |
59 | self.requests.reverse() |
60 | for r in self.requests: | |
3c00bb2c | 61 | r.dump_html(f) |
dfff8bd5 | 62 | self.requests.reverse() |
c35cae86 | 63 | f.write("</div></body></html>\n") |
3c00bb2c AM |
64 | f.flush() |
65 | os.fsync(f.fileno()) | |
66 | f.close() | |
3bdce373 | 67 | os.chmod(tmpfname, 0o0644) |
3c00bb2c | 68 | os.rename(tmpfname, fname) |
04ce7f54 | 69 | |
dfff8bd5 MM |
70 | # read possibly compressed, signed queue |
71 | def read_signed(self): | |
72 | if re.search(r"\.gz$", self.name): | |
73 | f = gzip.open(self.name) | |
74 | else: | |
75 | f = open(self.name) | |
24a365b4 | 76 | (signers, body) = gpg.verify_sig(f.read()) |
dfff8bd5 MM |
77 | self.signers = signers |
78 | self.requests = request.parse_requests(body) | |
cf1741af | 79 | |
dfff8bd5 MM |
80 | def _open(self): |
81 | if self.fd == None: | |
82 | if os.access(self.name, os.F_OK): | |
83 | self.fd = open(self.name, "r+") | |
84 | else: | |
85 | self.fd = open(self.name, "w+") | |
e6376553 | 86 | |
dfff8bd5 MM |
87 | def read(self): |
88 | self._open() | |
89 | self.signers = [] | |
5180bf1f | 90 | body = self.fd.read() |
3bdce373 | 91 | if body.strip() == "": |
dfff8bd5 MM |
92 | # empty file, don't choke |
93 | self.requests = [] | |
94 | return | |
798d3c8e ER |
95 | try: |
96 | self.requests = request.parse_requests(body) | |
5131e729 | 97 | except Exception as e: |
798d3c8e ER |
98 | log.panic("error parsing %s: %s" % (self.name, e)) |
99 | pass | |
cf1741af | 100 | |
dfff8bd5 MM |
101 | def _write_to(self, f): |
102 | f.write("<queue>\n") | |
103 | for r in self.requests: | |
104 | r.write_to(f) | |
105 | f.write("</queue>\n") | |
cf1741af | 106 | |
dfff8bd5 MM |
107 | def write(self): |
108 | self._open() | |
109 | self.fd.seek(0) | |
110 | self.fd.truncate(0) | |
111 | self._write_to(self.fd) | |
112 | self.fd.flush() | |
113 | ||
114 | def lock(self, no_block): | |
115 | self._open() | |
116 | op = fcntl.LOCK_EX | |
117 | if no_block: | |
118 | op = op + fcntl.LOCK_NB | |
119 | try: | |
120 | fcntl.flock(self.fd, op) | |
121 | return 1 | |
122 | except IOError: | |
123 | return 0 | |
e6376553 | 124 | |
dfff8bd5 MM |
125 | def unlock(self): |
126 | fcntl.flock(self.fd, fcntl.LOCK_UN) | |
cf1741af | 127 | |
dfff8bd5 | 128 | def write_signed(self, name): |
9366870d | 129 | sio = StringIO() |
dfff8bd5 MM |
130 | self._write_to(sio) |
131 | sio.seek(0) | |
14edabbe | 132 | sio.write(util.to_str(gpg.sign(sio.read()))) |
8d15cbfe | 133 | sio.seek(0) |
d1e5eeef | 134 | (fdno, tmpname) = tempfile.mkstemp(dir=os.path.dirname(name)) |
1ac7da2a | 135 | f = os.fdopen(fdno, "w") |
14edabbe | 136 | util.sendfile(sio, f) |
8d15cbfe AM |
137 | f.flush() |
138 | os.fsync(f.fileno()) | |
dfff8bd5 | 139 | f.close() |
14edabbe MK |
140 | if re.search(r"\.gz$", name): |
141 | f_in = open(tmpname, 'rb') | |
142 | f_out = gzip.open(name, 'wb') | |
143 | shutil.copyfileobj(f_in, f_out) | |
144 | f_in.close(); | |
145 | f_out.flush(); | |
146 | os.fsync(f_out.fileno()) | |
147 | f_out.close(); | |
148 | os.remove(tmpname) | |
149 | else: | |
150 | os.rename(tmpname, name) | |
151 | os.chmod(name, 0o0644) | |
cf1741af | 152 | |
dfff8bd5 MM |
153 | def add(self, req): |
154 | self.requests.append(req) | |
cf1741af | 155 | |
dfff8bd5 MM |
156 | def value(self): |
157 | return self.requests |