def getcached(self, name, rtype = proto.QTANY): self.cachelock.acquire() try: if name not in self.cache: return [] now = int(time.time()) if isinstance(self.cache[name], nxdmark): if self.cache[name].expire < now: self.cache[name] = [] return [] return self.cache[name] ret = [] if rtype == proto.QTANY: cond = lambda rt: True elif type(rtype) == int: cond = lambda rt: rtype == rt elif type(rtype) == str: rtid = rec.rtypebyname(rtype) cond = lambda rt: rtid == rt else: rtset = set([((type(rtid) == str) and rec.rtypebyname(rtid)) or rtid for rtid in rtype]) cond = lambda rt: rt in rtset for exp, trd, data, auth in self.cache[name]: if exp > now and cond(trd): ret += [(rec.rr((name, trd), exp - now, data), auth)] return ret finally: self.cachelock.release()
def decoderecord(self, name, record): set = pickle.loads(record) rrset = [] for cur in set: head = rec.rrhead(name, cur[0]) data = cur[2] newrr = rec.rr(head, cur[1], data) newrr.setflags(cur[3]) rrset += [newrr] return rrset
def tsigsign(pkt, key, stime = None, fudge = 300, error = 0, other = "", ctx = None): if stime is None: stime = int(time.time()) msg = "" if ctx is not None: if key is None: key = ctx.key msg += struct.pack(">H", len(ctx.prevmac)) + ctx.prevmac msg += pkt.encode() msg += key.name.canonwire() msg += struct.pack(">HL", rec.CLASSANY, 0) msg += key.algo.cname.canonwire() msg += struct.pack(">Q", stime)[-6:] msg += struct.pack(">3H", fudge, error, len(other)) msg += other digest = key.sign(msg) pkt.addad(rec.rr((key.name, "TSIG", rec.CLASSANY), 0, rec.rrdata("TSIG", key.algo.cname, stime, fudge, digest, pkt.qid, error, other))) pkt.signed = True