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