def response(self, peer, response): id = response.header.id qname = str(response.q.qname) qtype = response.q.qtype qclass = response.q.qclass if id not in self.peers: self.logger.info( "Unknown Response ({0:s}): {1:s} {2:s} {3:s}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname)) return peer = self.peers[id] request = self.requests[id] key = (str(request.q.qname), request.q.qtype, request.q.qclass) reply = request.reply() reply.add_answer(*response.rr) self.cache[key] = reply.rr self.fire(write(peer, reply.pack())) del self.peers[id] del self.requests[id]
def response(self, peer, response): id = response.header.id qname = str(response.q.qname) qtype = response.q.qtype qclass = response.q.qclass if id not in self.peers: self.logger.info( "Unknown Response ({0:s}): {1:s} {2:s} {3:s}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname ) ) return peer = self.peers[id] request = self.requests[id] key = (str(request.q.qname), request.q.qtype, request.q.qclass) reply = request.reply() reply.add_answer(*response.rr) self.cache[key] = reply.rr self.fire(write(peer, reply.pack())) del self.peers[id] del self.requests[id]
async def __handle_response(self, response, peer): """ 本地没查到,本服务做递归DNS查询,其他服务器返回的结果 :return: """ record = DNSRecord.parse(response) id = record.header.id qname = str(record.q.qname) qtype = record.q.qtype qclass = record.q.qclass if id not in self.peers: self.logger.info( "Unknown Response ({0:s}): {1:s} {2:s} {3:s}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname)) return addr = self.peers[id] request = self.requests[id] reply = request.reply() reply.add_answer(*record.rr) del self.peers[id] del self.requests[id] self.transport.sendto(reply.pack(), addr) self.logger.info(f"==Reply from {peer}")
def ttl(self): for k, rrs in self.cache.items()[:]: if any(rr.ttl == 0 for rr in rrs): qname, qtype, qclass = k self.logger.info("Expired Entry: {0:s} {1:s} {2:s}".format( CLASS.get(qclass), QTYPE.get(qtype), qname)) del self.cache[k] else: for rr in rrs: rr.ttl -= 1
def ttl(self): for k, rrs in self.cache.items()[:]: if any(rr.ttl == 0 for rr in rrs): qname, qtype, qclass = k self.logger.info( "Expired Entry: {0:s} {1:s} {2:s}".format( CLASS.get(qclass), QTYPE.get(qtype), qname ) ) del self.cache[k] else: for rr in rrs: rr.ttl -= 1
def GetBINDRecords(domain): file = BINDPath(domain) f = open(file, "r") body = f.read() f.close() records = RR.fromZone(body) ss = "" for r in records: host = HostConvert(r, domain) ttl = r.ttl cl = CLASS.get(r.rclass) qt = QTYPE.get(r.rtype) record = r.rdata.toZone() line = '%-23s %-7s %-7s %-7s %s' % (host, ttl, cl, qt, record) ss += line + "\n" return ss
def export(self): out = [ "$TTL {0:d}".format(self.ttl), "$ORIGIN {0:s}".format(self.name.rstrip(".")), "", ] for record in self.records: rr = record.rr rname = str(rr.rname.stripSuffix(self.name)) out.append( "{0:23s} {1:7d} {2:7s} {3:7s} {4:s}".format( rname, rr.ttl, CLASS.get(rr.rclass), QTYPE.get(rr.rtype), rr.rdata.toZone() ) ) return "\n".join(out)
def request(self, peer, request): qname = str(request.q.qname) qtype = request.q.qtype qclass = request.q.qclass key = (qname, qtype, qclass) if key in self.cache: self.logger.info( "Cached Request ({0:s}): {1:s} {2:s} {3:s}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname)) reply = request.reply() for rr in self.cache[key]: reply.add_answer(rr) self.fire(write(peer, reply.pack())) return if key in self.hosts: self.logger.info( "Local Hosts Request ({0:s}): {1:s} {2:s} {3:s}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname)) rr = [RR(qname, rdata=A(self.hosts[key]))] reply = request.reply() reply.add_answer(*rr) self.cache[key] = rr self.fire(write(peer, reply.pack())) return records = Record.objects.filter(rname=qname, rclass=qclass, rtype=qtype) if records: self.logger.info( "Authoritative Request ({0:s}): {1:s} {2:s} {3:s}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname)) rr = [record.rr for record in records] reply = request.reply() reply.add_answer(*rr) self.cache[key] = rr self.fire(write(peer, reply.pack())) return self.logger.info("Request ({0:s}): {1:s} {2:s} {3:s}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname)) lookup = DNSRecord(q=DNSQuestion(qname, qtype, qclass)) id = lookup.header.id self.peers[id] = peer self.requests[id] = request self.fire(write((self.forward, 53), lookup.pack()))
def request(self, peer, request): qname = str(request.q.qname) qtype = request.q.qtype qclass = request.q.qclass key = (qname, qtype, qclass) if key in self.cache: self.logger.info( "Cached Request ({0:s}): {1:s} {2:s} {3:s}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname ) ) reply = request.reply() for rr in self.cache[key]: reply.add_answer(rr) self.fire(write(peer, reply.pack())) return if key in self.hosts: self.logger.info( "Local Hosts Request ({0:s}): {1:s} {2:s} {3:s}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname ) ) reply = request.reply() for rdata in self.hosts[key]: rr = RR( qname, rclass=CLASS.IN, rtype=QTYPE.AAAA if ":" in rdata else QTYPE.A, rdata=AAAA(rdata) if ":" in rdata else A(rdata) ) reply.add_answer(rr) self.cache[key] = rr self.fire(write(peer, reply.pack())) return records = Record.objects.filter(rname=qname) if not records: self.logger.info( "Request ({0:s}): {1:s} {2:s} {3:s} -> {4:s}:{5:d}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname, self.forward, 53 ) ) lookup = DNSRecord(q=DNSQuestion(qname, qtype, qclass)) id = lookup.header.id self.peers[id] = peer self.requests[id] = request self.fire(write((self.forward, 53), lookup.pack())) return self.logger.info( "Authoritative Request ({0:s}): {1:s} {2:s} {3:s}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname ) ) rr = [] reply = request.reply() if len(records) == 1 and records[0].rtype == CNAME: rr.append(records[0].rr) records = Record.objects.filter(rname=records[0].rdata) for record in records: rr.append(record.rr) reply.add_answer(*rr) self.cache[key] = rr self.fire(write(peer, reply.pack()))
def request(self, peer, request): qname = str(request.q.qname) qtype = request.q.qtype qclass = request.q.qclass key = (qname, qtype, qclass) if key in self.cache: self.logger.info( "Cached Request ({0:s}): {1:s} {2:s} {3:s}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname)) reply = request.reply() for rr in self.cache[key]: reply.add_answer(rr) self.fire(write(peer, reply.pack())) return if key in self.hosts: self.logger.info( "Local Hosts Request ({0:s}): {1:s} {2:s} {3:s}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname)) reply = request.reply() for rdata in self.hosts[key]: rr = RR(qname, rclass=CLASS.IN, rtype=QTYPE.AAAA if ":" in rdata else QTYPE.A, rdata=AAAA(rdata) if ":" in rdata else A(rdata)) reply.add_answer(rr) self.cache[key] = rr self.fire(write(peer, reply.pack())) return records = Record.objects.filter(rname=qname) if not records: self.logger.info( "Request ({0:s}): {1:s} {2:s} {3:s} -> {4:s}:{5:d}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname, self.forward, 53)) lookup = DNSRecord(q=DNSQuestion(qname, qtype, qclass)) id = lookup.header.id self.peers[id] = peer self.requests[id] = request self.fire(write((self.forward, 53), lookup.pack())) return self.logger.info( "Authoritative Request ({0:s}): {1:s} {2:s} {3:s}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname)) rr = [] reply = request.reply() if len(records) == 1 and records[0].rtype == CNAME: rr.append(records[0].rr) records = Record.objects.filter(rname=records[0].rdata) for record in records: rr.append(record.rr) reply.add_answer(*rr) self.cache[key] = rr self.fire(write(peer, reply.pack()))
def request(self, peer, request): qname = str(request.q.qname) qtype = request.q.qtype qclass = request.q.qclass key = (qname, qtype, qclass) if key in self.cache: self.logger.info( "Cached Request ({0:s}): {1:s} {2:s} {3:s}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname ) ) reply = request.reply() for rr in self.cache[key]: reply.add_answer(rr) self.fire(write(peer, reply.pack())) return if key in self.hosts: self.logger.info( "Local Hosts Request ({0:s}): {1:s} {2:s} {3:s}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname ) ) rr = [RR(qname, rdata=A(self.hosts[key]))] reply = request.reply() reply.add_answer(*rr) self.cache[key] = rr self.fire(write(peer, reply.pack())) return records = Record.objects.filter( rname=qname, rclass=qclass, rtype=qtype ) if records: self.logger.info( "Authoritative Request ({0:s}): {1:s} {2:s} {3:s}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname ) ) rr = [record.rr for record in records] reply = request.reply() reply.add_answer(*rr) self.cache[key] = rr self.fire(write(peer, reply.pack())) return self.logger.info( "Request ({0:s}): {1:s} {2:s} {3:s}".format( "{0:s}:{1:d}".format(*peer), CLASS.get(qclass), QTYPE.get(qtype), qname ) ) lookup = DNSRecord(q=DNSQuestion(qname, qtype, qclass)) id = lookup.header.id self.peers[id] = peer self.requests[id] = request self.fire(write((self.forward, 53), lookup.pack()))