def test_ptr(self): """ The repr of a L{dns.Record_PTR} instance includes the name of the pointer and the TTL of the record. """ self.assertEqual(repr(dns.Record_PTR('example.com', 4321)), "<PTR name=example.com ttl=4321>")
def test_represent_answer_ptr(self): ptr_record = dns.RRHeader(payload=dns.Record_PTR(name="example.com"), type=dns.PTR) self.assertEqual(dnst.representAnswer(ptr_record), { 'hostname': 'example.com', 'answer_type': 'PTR' })
def test_PTR(self): """ PTR records are loaded. """ [answers, [], []] = self.successResultOf( self.auth.lookupPointer(b"2.0.0.10.in-addr.arpa")) rr = answers[0] self.assertEqual( dns.Record_PTR(name=b"no-in.example.com", ), rr.payload, )
def _lookup(self, name, cls, qtype, timeout): if qtype == 12: # Reverse Query: hostname = self.__getRandomName() ip = '.'.join(reversed(name[:-13].split('.'))) self.__logInfo('Reverse-Query', "%s --> %s" % (ip, hostname), True) rr = dns.RRHeader(name=name, type=qtype, cls=cls, ttl=60, payload=dns.Record_PTR(name=hostname, ttl=60)) results = [rr] authority = addtional = [] return defer.succeed((results, authority, addtional))
def create_message(self, instances, name, prop, record=dns.A): """ Construct a message to return to the client. instances is a reservation list (the output from ec2_connection.get_all_instances) name is the query value prop is the property to inspect on each instance to return record is a constant that indicates what type of record to create in the payload. """ output = ([], [], []) if not instances: self.log.debug("No instances found for '%s'" % (name)) return output for instance in instances[0].instances: value = self._tag_or_property(instance, prop) self.log.debug("%s: %s %s" % (name, prop, value)) if not value: continue if record == dns.A: payload = dns.Record_A(str(value)) elif record == dns.PTR: payload = dns.Record_PTR(str(value)) else: raise ValueError, "Record constant '%s' is not supported" % ( record) answer = dns.RRHeader(name, type=record, payload=payload, ttl=self.ttl) output[0].append(answer) for extra_prop in self.extra: extra_value = self._tag_or_property(instance, extra_prop) self.log.debug("%s: %s = %s" % (name, extra_prop, extra_value)) if extra_value: string = "%s = %s" % (extra_prop, extra_value) extra = dns.Record_TXT(str(string)) extra_rr = dns.RRHeader(name, type=dns.TXT, payload=extra, ttl=self.ttl) output[2].append(extra_rr) return output
def _doDynamicResponse(self, query): myip = b'%s' % (query.name.name[:-9][::-1].replace(".","")) myptr = "-".join([myip[:4], myip[4:8], myip[8:12], myip[12:16], myip[16:20], myip[20:24], myip[24:28], myip[28:]])+self._mysuffix _payload = dns.Record_PTR(name=myptr) answer = dns.RRHeader( name=query.name.name, type=_payload.TYPE, ttl=3600, auth=True, payload=_payload) answers = [answer] authority = [] additional = [] return answers, authority, additional
def create_message(self, instances, name, prop, record=dns.A): """ Construct a message to return to the client. instances is a reservation list (the output from ec2_connection.get_all_instances) name is the query value prop is the property to inspect on each instance to return record is a constant that indicates what type of record to create in the payload. """ output = ([], [], []) print "OUTPUT FROM CREATE_MESSAGE type %s" % (record) if not instances: print "NO INSTANCES FOUND" return output for instance in instances[0].instances: value = self._tag_or_property(instance, prop) print "VALUE: %s %s" % (prop, value) if not value: continue if record == dns.A: payload = dns.Record_A(str(value)) elif record == dns.PTR: payload = dns.Record_PTR(str(value)) else: raise ValueError, "Record constant '%s' is not supported" % ( record) answer = dns.RRHeader(name, type=record, payload=payload) output[0].append(answer) for extra_prop in self.extra: extra_value = self._tag_or_property(instance, extra_prop) if extra_value: string = "%s = %s" % (extra_prop, extra_value) extra = dns.Record_TXT(str(string)) extra_rr = dns.RRHeader(name, type=dns.TXT, payload=extra) output[2].append(extra_rr) print "OUTPUT" pprint.pprint(output) return output
def lookupPointer(self, query, timeout=None): answers = [] authority = [] additional = [] containerName = self.__findContainerByPTRQuery(query) if containerName is None: return super().lookupPointer(query, timeout) p = dns.Record_PTR(name=containerName) answer = dns.RRHeader(name=query, payload=p, type=dns.PTR) answers.append(answer) return defer.succeed((answers, authority, additional))
def makeResult(value): print "dht: %s -> %s" % (dhtQueryString(name, type), value) response = dns.RRHeader(name=name, type=type, ttl=10) if type == dns.A: payload = dns.Record_A(address=value, ttl=10) elif type == dns.AAAA: payload = dns.Record_AAAA(address=value, ttl=10) elif type == dns.CNAME: payload = dns.Record_CNAME(name=value, ttl=10) elif type == dns.MX: payload = dns.Record_MX(name=value, ttl=10) elif type == dns.PTR: payload = dns.Record_PTR(name=value, ttl=10) response.payload = payload return ([response], [], [])
def _lookup(self, name, cls, type, timeout): containers = getRunningContainers() if name in containers: if name.endswith('.in-addr.arpa'): return defer.succeed(([ dns.RRHeader(name=name, ttl=TTL, payload=dns.Record_PTR(name=containers[name], ttl=TTL), auth=True, type=type) ], (), ())) else: return defer.succeed(([ dns.RRHeader(name=name, ttl=TTL, payload=dns.Record_A(containers[name], ttl=TTL), auth=True) ], (), ())) print "Falling back to default impl" return client.Resolver._lookup(self, name, cls, type, timeout)
def browse(localname): services = [] def handler(zeroconf, service_type, name, state_change): if state_change is ServiceStateChange.Added: services.append(name) sb = ServiceBrowser(self.zeroconf, localname, [handler]) time.sleep(timeout) sb.cancel() answers, additional = [], [] for service in services: answers.append( dns.RRHeader(name=localname[:-6] + domain, ttl=ttl, type=dns.PTR, payload=dns.Record_PTR(name=service[:-6] + domain))) #txt_ans, _, _ = txt(service) #srv_ans, _, a_ans = srv(service) #additional += a_ans + txt_ans + srv_ans return answers, [], additional
def testPTR(self): """Test DNS 'PTR' record queries""" return self.namesTest( self.resolver.lookupPointer('123.93.84.28.in-addr.arpa'), [dns.Record_PTR('test.host-reverse.lookup.com', ttl=11193983)])
# # Python bug # dns.Record_A('255.255.255.255'), # dns.Record_A('255.255.255.254'), dns.Record_A('0.0.0.0') ], 'cname.test-domain.com': [dns.Record_CNAME('test-domain.com')], 'anothertest-domain.com': [dns.Record_A('1.2.3.4')], }) reverse_domain = NoFileAuthority( soa=('93.84.28.in-addr.arpa', reverse_soa), records={ '123.93.84.28.in-addr.arpa': [dns.Record_PTR('test.host-reverse.lookup.com'), reverse_soa] }) my_domain_com = NoFileAuthority(soa=('my-domain.com', my_soa), records={ 'my-domain.com': [ my_soa, dns.Record_A('1.2.3.4', ttl='1S'), dns.Record_NS('ns1.domain', ttl='2M'), dns.Record_NS('ns2.domain', ttl='3H'), dns.Record_SRV(257, 16383, 43690, 'some.other.place.fool', ttl='4D') ]
dns.Record_A(b'255.255.255.254'), dns.Record_A(b'0.0.0.0') ], b'cname.test-domain.com': [ dns.Record_CNAME(b'test-domain.com') ], b'anothertest-domain.com': [ dns.Record_A(b'1.2.3.4')], } ) reverse_domain = NoFileAuthority( soa = (b'93.84.28.in-addr.arpa', reverse_soa), records = { b'123.93.84.28.in-addr.arpa': [ dns.Record_PTR(b'test.host-reverse.lookup.com'), reverse_soa ] } ) my_domain_com = NoFileAuthority( soa = (b'my-domain.com', my_soa), records = { b'my-domain.com': [ my_soa, dns.Record_A(b'1.2.3.4', ttl='1S'), dns.Record_NS(b'ns1.domain', ttl=b'2M'), dns.Record_NS(b'ns2.domain', ttl='3H'), dns.Record_SRV(257, 16383, 43690, b'some.other.place.fool',
# Python bug # dns.Record_A('255.255.255.255'), # dns.Record_A(b"255.255.255.254"), dns.Record_A(b"0.0.0.0"), ], b"cname.test-domain.com": [dns.Record_CNAME(b"test-domain.com")], b"anothertest-domain.com": [dns.Record_A(b"1.2.3.4")], }, ) reverse_domain = NoFileAuthority( soa=(b"93.84.28.in-addr.arpa", reverse_soa), records={ b"123.93.84.28.in-addr.arpa": [ dns.Record_PTR(b"test.host-reverse.lookup.com"), reverse_soa, ] }, ) my_domain_com = NoFileAuthority( soa=(b"my-domain.com", my_soa), records={ b"my-domain.com": [ my_soa, dns.Record_A(b"1.2.3.4", ttl="1S"), dns.Record_NS(b"ns1.domain", ttl=b"2M"), dns.Record_NS(b"ns2.domain", ttl="3H"), dns.Record_SRV(257, 16383,
def query(self, query, timeout=None): logging.debug("Received Query from %s: name=%s type=%s timeout=%s", self.src_ip, query.name.name, query.type, timeout) if query.type not in (dns.A, dns.PTR): logging.info("Query type %s is not supported.", query.type) return defer.fail(error.DomainError()) # Native logic says never redirect is_auth = True # If config says so, let's redirect by default if self.config['default-action'] == 'redirect': is_auth = False if 'auth-plugin' in self.config and 'type' in self.config['auth-plugin']: try: plugin_name = self.config['auth-plugin']['type'] plugin = auth_factory(plugin_name, self.config) is_auth = plugin.auth(self.src_ip, query.type, query.name.name) logging.debug("Answer from auth plugin '%s': %s", plugin_name, is_auth) except Exception: logging.exception("Auth plugin raised exception:") if is_auth: return defer.fail(error.DomainError()) redirect_a_records = ['10.0.0.1',] redirect_ptr_records = ['portal.local.',] ttl = 30 if 'ttl' in self.config: ttl = self.config['ttl'] or ttl if 'default-a-records' in self.config: redirect_a_records = self.config['default-a-records'] or redirect_a_records if 'default-ptr-records' in self.config: redirect_ptr_records = self.config['default-ptr-records'] or redirect_ptr_records answers = [] payloads = [] if query.type == dns.A: for a_rec in redirect_a_records: payloads.append(dns.Record_A(address=a_rec, ttl=ttl)) # TODO: Multiple PTR records? Fix this. if query.type == dns.PTR: for ptr_rec in redirect_ptr_records: payloads.append(dns.Record_PTR(name=ptr_rec, ttl=ttl)) for payload in payloads: logging.debug("Adding payload: %s", payload) answers.append(dns.RRHeader(name=query.name.name, type=query.type, payload=payload)) logging.debug("Sending Response: answers=%s", answers) return defer.succeed((answers, [], []))
def __build_answer(self, query, db_zone, db_record, is_conditional_response=False): record = None # Calculate the query type (in case it's a request for A but a CNAME is returned). query_type = REV_TYPES[db_record.type] if query_type == dns.A: record = dns.Record_A(address=db_record.property( 'address', conditional=is_conditional_response), ttl=db_record.ttl) elif query_type == dns.AAAA: record = dns.Record_AAAA(address=db_record.property( 'address', conditional=is_conditional_response), ttl=db_record.ttl) elif query_type == dns.AFSDB: record = dns.Record_AFSDB(subtype=int( db_record.property('subtype', conditional=is_conditional_response)), hostname=db_record.property( 'hostname', conditional=is_conditional_response)) elif query_type == dns.CNAME: record = dns.Record_CNAME(name=db_record.property( 'name', conditional=is_conditional_response), ttl=db_record.ttl) elif query_type == dns.DNAME: record = dns.Record_DNAME(name=db_record.property( 'name', conditional=is_conditional_response), ttl=db_record.ttl) elif query_type == dns.HINFO: record = dns.Record_HINFO( cpu=db_record.property( 'cpu', conditional=is_conditional_response).encode(), os=db_record.property( 'os', conditional=is_conditional_response).encode()) elif query_type == dns.MX: record = dns.Record_MX(preference=int( db_record.property('preference', conditional=is_conditional_response)), name=db_record.property( 'name', conditional=is_conditional_response)) elif query_type == dns.NAPTR: record = dns.Record_NAPTR( order=int( db_record.property('order', conditional=is_conditional_response)), preference=int( db_record.property('preference', conditional=is_conditional_response)), flags=db_record.property( 'flags', conditional=is_conditional_response).encode(), service=db_record.property( 'service', conditional=is_conditional_response).encode(), regexp=db_record.property( 'regexp', conditional=is_conditional_response).encode(), replacement=db_record.property( 'replacement', conditional=is_conditional_response)) elif query_type == dns.NS: record = dns.Record_NS(name=db_record.property( 'name', conditional=is_conditional_response), ttl=db_record.ttl) elif query_type == dns.PTR: record = dns.Record_PTR(name=db_record.property( 'name', conditional=is_conditional_response), ttl=db_record.ttl) elif query_type == dns.RP: record = dns.Record_RP( mbox=db_record.property('mbox', conditional=is_conditional_response), txt=db_record.property('txt', conditional=is_conditional_response)) elif query_type == dns.SOA: record = dns.Record_SOA( mname=db_record.property('mname', conditional=is_conditional_response), rname=db_record.property('rname', conditional=is_conditional_response), serial=int( db_record.property('serial', conditional=is_conditional_response)), refresh=int( db_record.property('refresh', conditional=is_conditional_response)), retry=int( db_record.property('retry', conditional=is_conditional_response)), expire=int( db_record.property('expire', conditional=is_conditional_response)), minimum=int( db_record.property('minimum', conditional=is_conditional_response))) elif query_type == dns.SPF: record = dns.Record_SPF( db_record.property( 'data', conditional=is_conditional_response).encode()) elif query_type == dns.SRV: record = dns.Record_SRV( priority=int( db_record.property('priority', conditional=is_conditional_response)), port=int( db_record.property('port', conditional=is_conditional_response)), weight=int( db_record.property('weight', conditional=is_conditional_response)), target=db_record.property('target', conditional=is_conditional_response)) elif query_type == dns.SSHFP: record = dns.Record_SSHFP( algorithm=int( db_record.property('algorithm', conditional=is_conditional_response)), fingerprintType=int( db_record.property('fingerprint_type', conditional=is_conditional_response)), fingerprint=db_record.property( 'fingerprint', conditional=is_conditional_response).encode()) elif query_type == dns.TSIG: record = dns.Record_TSIG( algorithm=db_record.property( 'algorithm', conditional=is_conditional_response).encode(), timeSigned=int( db_record.property('timesigned', conditional=is_conditional_response)), fudge=int( db_record.property('fudge', conditional=is_conditional_response)), originalID=int( db_record.property('original_id', conditional=is_conditional_response)), MAC=db_record.property( 'mac', conditional=is_conditional_response).encode(), otherData=db_record.property( 'other_data', conditional=is_conditional_response).encode()) elif query_type == dns.TXT: record = dns.Record_TXT( db_record.property( 'data', conditional=is_conditional_response).encode()) else: pass if not record: return None answer = dns.RRHeader(name=query.name.name, type=query_type, cls=query.cls, ttl=db_record.ttl, payload=record) return answer