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