import re import gzip import time import StringIO import os import fcntl # 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 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 _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(self): self._open() self.fd.seek(0) self.fd.truncate(0) self._write_to(self.fd) self.fd.flush() 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 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 add(self, req): self.requests.append(req) def value(self): return self.requests