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