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