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