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