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