X-Git-Url: https://git.pld-linux.org/?a=blobdiff_plain;f=PLD_Builder%2Fbqueue.py;h=395e32fa7e0e10d44ee4da1d1e0092f91731038d;hb=5131e72930f3986dd82a660d6ba87b25920a7192;hp=99f099ca246ab79e92a72f8b76f0b75f7a056db4;hpb=59ce7cd66397f0ed5d0cb50e4b2b795ca5616c7a;p=projects%2Fpld-builder.new.git
diff --git a/PLD_Builder/bqueue.py b/PLD_Builder/bqueue.py
index 99f099c..395e32f 100644
--- a/PLD_Builder/bqueue.py
+++ b/PLD_Builder/bqueue.py
@@ -1,88 +1,154 @@
+# vi: encoding=utf-8 ts=8 sts=4 sw=4 et
+
import re
import gzip
import time
-import StringIO
+import sys
+if sys.version_info[0] == 2:
+ import StringIO
+else:
+ from io import StringIO
import os
import fcntl
+import string
+import tempfile
# PLD_Builder:
import gpg
import request
import util
+import log
class B_Queue:
- def __init__(self, filename):
- self.name = filename
- self.requests = []
- self.fd = None
+ def __init__(self, filename):
+ self.name = filename
+ self.requests = []
+ self.fd = None
+
+ def dump(self, fname):
+ (fdno, tmpfname) = tempfile.mkstemp(dir=os.path.dirname(fname))
+ f = os.fdopen(fdno, "w")
+ self.requests.reverse()
+ for r in self.requests:
+ r.dump(f)
+ self.requests.reverse()
+ f.flush()
+ os.fsync(f.fileno())
+ f.close()
+ os.chmod(tmpfname, 0644)
+ os.rename(tmpfname, fname)
+
+ def dump_html(self, fname):
+ (fdno, tmpfname) = tempfile.mkstemp(dir=os.path.dirname(fname))
+ f = os.fdopen(fdno, "w")
+ f.write("""
+
+
+
+ PLD builder queue
+
+
+
+
+
+
+
+
+"""
+ )
+ self.requests.reverse()
+ for r in self.requests:
+ r.dump_html(f)
+ self.requests.reverse()
+ f.write("
\n")
+ f.flush()
+ os.fsync(f.fileno())
+ f.close()
+ os.chmod(tmpfname, 0644)
+ os.rename(tmpfname, fname)
+
+ # read possibly compressed, signed queue
+ def read_signed(self):
+ if re.search(r"\.gz$", self.name):
+ f = gzip.open(self.name)
+ else:
+ f = open(self.name)
+ (signers, body) = gpg.verify_sig(f.read())
+ self.signers = signers
+ self.requests = request.parse_requests(body)
+
+ def _open(self):
+ if self.fd == None:
+ if os.access(self.name, os.F_OK):
+ self.fd = open(self.name, "r+")
+ else:
+ self.fd = open(self.name, "w+")
- def dump(self, f):
- for r in self.requests:
- r.dump(f)
-
- # read possibly compressed, signed queue
- def read_signed(self):
- if re.search(r"\.gz$", self.name):
- f = gzip.open(self.name)
- else:
- f = open(self.name)
- (signers, body) = gpg.verify_sig(f)
- self.signers = signers
- self.requests = request.parse_requests(body)
+ def read(self):
+ self._open()
+ self.signers = []
+ body = self.fd.read()
+ if string.strip(body) == "":
+ # empty file, don't choke
+ self.requests = []
+ return
+ try:
+ self.requests = request.parse_requests(body)
+ except Exception as e:
+ log.panic("error parsing %s: %s" % (self.name, e))
+ pass
- def _open(self):
- if self.fd == None:
- if os.access(self.name, os.F_OK):
- self.fd = open(self.name, "r+")
- else:
- self.fd = open(self.name, "w+")
-
- def read(self):
- self._open()
- self.signers = []
- self.requests = request.parse_requests(self.fd)
+ def _write_to(self, f):
+ f.write("\n")
+ for r in self.requests:
+ r.write_to(f)
+ f.write("\n")
- def _write_to(self, f):
- f.write("\n")
- for r in self.requests:
- r.write_to(f)
- f.write("\n")
+ def write(self):
+ self._open()
+ self.fd.seek(0)
+ self.fd.truncate(0)
+ self._write_to(self.fd)
+ self.fd.flush()
- def write(self):
- self._open()
- self.fd.seek(0)
- self.fd.truncate(0)
- self._write_to(self.fd)
+ def lock(self, no_block):
+ self._open()
+ op = fcntl.LOCK_EX
+ if no_block:
+ op = op + fcntl.LOCK_NB
+ try:
+ fcntl.flock(self.fd, op)
+ return 1
+ except IOError:
+ return 0
- def lock(self, no_block):
- self._open()
- op = fcntl.LOCK_EX
- if no_block:
- op = op + fcntl.LOCK_NB
- try:
- fcntl.flock(self.fd, op)
- return 1
- except IOError:
- return 0
-
- def unlock(self):
- fcntl.flock(self.fd, fcntl.LOCK_UN)
+ def unlock(self):
+ fcntl.flock(self.fd, fcntl.LOCK_UN)
- def write_signed(self, name):
- sio = StringIO.StringIO()
- self._write_to(sio)
- sio.seek(0)
- sio = gpg.sign(sio)
- if os.access(name, os.F_OK): os.unlink(name)
- if re.search(r"\.gz$", name):
- f = gzip.open(name, "w", 6)
- else:
- f = open(name, "w")
- util.sendfile(sio, f)
- f.close()
+ def write_signed(self, name):
+ sio = StringIO.StringIO()
+ self._write_to(sio)
+ sio.seek(0)
+ sio.write(gpg.sign(sio.read()))
+ sio.seek(0)
+ (fdno, tmpname) = tempfile.mkstemp(dir=os.path.dirname(name))
+ f = os.fdopen(fdno, "w")
+ if re.search(r"\.gz$", name):
+ fgz = gzip.GzipFile(filename=name, mode="w", compresslevel=6, fileobj=f)
+ util.sendfile(sio, fgz)
+ fgz.close()
+ else:
+ util.sendfile(sio, f)
+ f.flush()
+ os.fsync(f.fileno())
+ f.close()
+ os.chmod(tmpname, 0644)
+ os.rename(tmpname, name)
- def add(self, req):
- self.requests.append(req)
+ def add(self, req):
+ self.requests.append(req)
- def value(self):
- return self.requests
+ def value(self):
+ return self.requests