]> git.pld-linux.org Git - projects/pld-builder.new.git/blame - PLD_Builder/bqueue.py
Fix outdated syntax
[projects/pld-builder.new.git] / PLD_Builder / bqueue.py
CommitLineData
dfff8bd5
MM
1# vi: encoding=utf-8 ts=8 sts=4 sw=4 et
2
cf1741af
MM
3import re
4import gzip
5import time
1c54a525 6import sys
308677c3
JR
7if sys.version_info[0] == 2:
8 import StringIO
9else:
10 from io import StringIO
cf1741af
MM
11import os
12import fcntl
41f786ac 13import string
8d15cbfe 14import tempfile
cf1741af
MM
15
16# PLD_Builder:
17import gpg
18import request
4d9b6f71 19import util
f50e2253 20import log
cf1741af
MM
21
22class 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
This page took 4.28573 seconds and 4 git commands to generate.