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