def setUp(self): self.results = None self.d = defer.Deferred() self.d.addCallback(self._gotResults) self.controller = client.AXFRController('fooby.com', self.d) self.soa = dns.RRHeader(name='fooby.com', type=dns.SOA, cls=dns.IN, ttl=86400, auth=False, payload=dns.Record_SOA(mname='fooby.com', rname='hooj.fooby.com', serial=100, refresh=200, retry=300, expire=400, minimum=500, ttl=600)) self.records = [ self.soa, dns.RRHeader(name='fooby.com', type=dns.NS, cls=dns.IN, ttl=700, auth=False, payload=dns.Record_NS(name='ns.twistedmatrix.com', ttl=700)), dns.RRHeader(name='fooby.com', type=dns.MX, cls=dns.IN, ttl=700, auth=False, payload=dns.Record_MX(preference=10, exchange='mail.mv3d.com', ttl=700)), dns.RRHeader(name='fooby.com', type=dns.A, cls=dns.IN, ttl=700, auth=False, payload=dns.Record_A(address='64.123.27.105', ttl=700)), self.soa ]
def __init__(self, wildcard_domain, debug_level=0, ns_domain=None, my_ip=None): common.ResolverBase.__init__(self) self._cache = {} self._debug_level = debug_level self.ns_domain = ns_domain self.wildcard_domain = wildcard_domain self.my_ip = bytes(my_ip) self.soa = dns.Record_SOA(mname=self.wildcard_domain, rname=self.wildcard_domain, serial=0, refresh=TTL, minimum=TTL, expire=TTL * 24, ttl=TTL) # Create regex pattern corresponding to xip.io style DNS # wilcard domain. pattern = (r'(.*\.)?(?P<ipaddr>\d+\.\d+\.\d+\.\d+)\.%s' % re.escape(wildcard_domain)) if self._debug_level > 0: print('wildcard %s' % pattern, file=sys.stderr) self._wildcard = re.compile(pattern)
def __parseLine(self, line): tokens = line.split(None, 2) # reject if incorrectly formatted. if len(tokens) != 3: raise RuntimeError( "line '%s': wrong # of tokens %d." %(line, len(tokens))) rname, rtype, rvalue = tokens # # if rvalue is a list, make sure to store it as one! if rvalue.startswith("["): rvalue = json.loads(rvalue) # create correct payload payload = None if rtype == "A": payload = dns.Record_A(address=rvalue) elif rtype == "CNAME": payload = dns.Record_CNAME(name=rvalue) elif rtype == "MX": payload = dns.Record_MX(name=rvalue[0], preference=int(rvalue[1])) elif rtype == "NS": payload = dns.Record_NS(name=rvalue) elif rtype == "SOA": payload = dns.Record_SOA(mname=rvalue[0], rname=rvalue[1]) elif rtype == "TXT": payload = dns.Record_TXT(data=[rvalue]) else: raise "cannot parse line!" return dns.RRHeader(name=rname, type=self.__query_types[rtype], payload=payload, ttl=0) # set TTL to 0 for now so that we can
def _Record_SOA(self, query): d = self.lookup_result['domain'] answers = [dns.RRHeader( name=query.name.name, type=dns.SOA, payload=dns.Record_SOA(mname=self.lookup_result['domain'], rname="hostmaster." % d, serial=int(time.time()), refresh=3600, ttl=5), auth=True)] return answers, [], []
def packResultSOA(value): if edns is not None: if edns.rdlength > 8: add.append(dns.RRHeader('', dns.EDNS, 4096, edns.ttl, edns.payload, True)) else: add.append(dns.RRHeader('', dns.EDNS, 4096, 0, dns.Record_EDNS(None, 0), True)) return [(dns.RRHeader(name, dns.SOA, dns.IN, value['ttl'], dns.Record_SOA(value['record'], value['email'], value['serial'], value['refresh'], value['retry'], value['expire'], value['ttl']), True),), (), add ]
def test_represent_answer_soa(self): ptr_record = dns.RRHeader(payload=dns.Record_SOA( mname='example.com', rname='foo.example.com'), type=dns.SOA) represented_answer = {} represented_answer['ttl'] = None represented_answer['answer_type'] = 'SOA' represented_answer['hostname'] = 'example.com' represented_answer['responsible_name'] = 'foo.example.com' represented_answer['serial_number'] = 0 represented_answer['refresh_interval'] = 0 represented_answer['retry_interval'] = 0 represented_answer['minimum_ttl'] = 0 represented_answer['expiration_limit'] = 0 self.assertEqual(dnst.representAnswer(ptr_record), represented_answer)
def _do_soa_response(self, name=None): """ Ensure a standard response to a SOA query. """ answer = dns.RRHeader( name=name, payload=dns.Record_SOA(mname=name.lower(), rname='info.'+name.lower(), serial=0, refresh=300, retry=300, expire=300, minimum=300, ttl=300), type=dns.SOA) answers = [answer] authority = [] additional = [] return answers, authority, additional
def test_soa(self): """ The repr of a L{dns.Record_SOA} instance includes all of the authority fields. """ self.assertEqual( repr( dns.Record_SOA(mname='mName', rname='rName', serial=123, refresh=456, retry=789, expire=10, minimum=11, ttl=12)), "<SOA mname=mName rname=rName serial=123 refresh=456 " "retry=789 expire=10 minimum=11 ttl=12>")
def loadFile(self, base): self.base = base self.soa = ( base, dns.Record_SOA( base, # mname = self.ns_name, # rname = '???', serial="1970010100", refresh="7D", expire="7D", minimum="7D", ttl="7D", ), ) self.records = DNSEchoRecordProducer(self.base, self.ns_name, self.extra_records)
def _doDynamicResponse(self, query): """ Calculate the response to a query. """ name = query.name.name answers = [ dns.RRHeader( name=name, type=dns.CNAME, payload=dns.Record_CNAME( name=self.cname, ), ), dns.RRHeader( name=name, type=dns.SOA, payload=dns.Record_SOA( serial=2018101700, refresh=10800, minimum=86400, expire=604800, retry=2000, ), ), dns.RRHeader( name=name, type=dns.NS, payload=dns.Record_NS( name=self.nameserver1, ), ), dns.RRHeader( name=name, type=dns.NS, payload=dns.Record_NS( name=self.nameserver2, ), ), ] authority = [] additional = [] return answers, authority, additional
def __init__(self, domain, ns_server, ns_email, ns_records): self.domain = domain self.ns_server = ns_server self.ns_email = ns_email self._matcher = re.compile(r'^.*?-?(\d+)\.%s$' % domain.replace('.', '\\.')) self.ns_records = dict() for record in ns_records.split(','): ns, ip = record.split(':', 1) name = "%s.%s" % (ns, domain) self.ns_records[name] = dns.RRHeader( name=name, payload=dns.Record_A(address=ip)) self.authority = dns.RRHeader(name=self.domain, type=dns.SOA, payload=dns.Record_SOA( mname=self.ns_server, rname=self.ns_email, serial=1, refresh="1H", retry="1H", expire="1H", minimum="1H"))
def update_records(self): resolvers = [] self._da = {} for z,zd in self._data["zones"].items(): soa = dns.Record_SOA( mname=zd["server_name"], rname="root." + z, # what is this for? serial=1, # must be int, fit in struct.pack("L") so 32-bits refresh="1M", retry="1M", expire="1M", minimum="1M", ) ns = dns.Record_NS(zd["server_name"]) records = { z: [soa, ns], } da = DynamicAuthority(z, soa, records) resolvers.append(da) self._authorities[z] = da print(self._dns_server.resolver) self._dns_server.resolver = ResolverChain(resolvers)
def justPayload(results): return [r.payload for r in results[0]] class NoFileAuthority(authority.FileAuthority): def __init__(self, soa, records): # Yes, skip FileAuthority common.ResolverBase.__init__(self) self.soa, self.records = soa, records soa_record = dns.Record_SOA(mname='test-domain.com', rname='root.test-domain.com', serial=100, refresh=1234, minimum=7654, expire=19283784, retry=15, ttl=1) reverse_soa = dns.Record_SOA(mname='93.84.28.in-addr.arpa', rname='93.84.28.in-addr.arpa', serial=120, refresh=54321, minimum=382, expire=11193983, retry=30, ttl=3) my_soa = dns.Record_SOA( mname='my-domain.com',
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
def start_local_dns_server(args): all_records = {} def _push_record(name, r): print('pushing record: |%s|' % name) if all_records.get(name) is not None: all_records[name].append(r) return all_records[name] = [r] def _maybe_split_up_txt_data(name, txt_data, r_ttl): start = 0 txt_data_list = [] while len(txt_data[start:]) > 0: next_read = len(txt_data[start:]) if next_read > 255: next_read = 255 txt_data_list.append(txt_data[start:start + next_read]) start += next_read _push_record(name, dns.Record_TXT(*txt_data_list, ttl=r_ttl)) with open(args.records_config_path) as config: test_records_config = yaml.load(config) common_zone_name = test_records_config['resolver_tests_common_zone_name'] for group in test_records_config['resolver_component_tests']: for name in group['records'].keys(): for record in group['records'][name]: r_type = record['type'] r_data = record['data'] r_ttl = int(record['TTL']) record_full_name = '%s.%s' % (name, common_zone_name) assert record_full_name[-1] == '.' record_full_name = record_full_name[:-1] if r_type == 'A': _push_record(record_full_name, dns.Record_A(r_data, ttl=r_ttl)) if r_type == 'AAAA': _push_record(record_full_name, dns.Record_AAAA(r_data, ttl=r_ttl)) if r_type == 'SRV': p, w, port, target = r_data.split(' ') p = int(p) w = int(w) port = int(port) target_full_name = '%s.%s' % (target, common_zone_name) r_data = '%s %s %s %s' % (p, w, port, target_full_name) _push_record( record_full_name, dns.Record_SRV(p, w, port, target_full_name, ttl=r_ttl)) if r_type == 'TXT': _maybe_split_up_txt_data(record_full_name, r_data, r_ttl) # Server health check record _push_record(_SERVER_HEALTH_CHECK_RECORD_NAME, dns.Record_A(_SERVER_HEALTH_CHECK_RECORD_DATA, ttl=0)) soa_record = dns.Record_SOA(mname=common_zone_name) test_domain_com = NoFileAuthority( soa=(common_zone_name, soa_record), records=all_records, ) server = twisted.names.server.DNSServerFactory( authorities=[test_domain_com], verbose=2) server.noisy = 2 twisted.internet.reactor.listenTCP(args.port, server) dns_proto = twisted.names.dns.DNSDatagramProtocol(server) dns_proto.noisy = 2 twisted.internet.reactor.listenUDP(args.port, dns_proto) print('starting local dns server on 127.0.0.1:%s' % args.port) print('starting twisted.internet.reactor') twisted.internet.reactor.suggestThreadPoolSize(1) twisted.internet.reactor.run()
def test_soa(self): """ Two L{dns.Record_SOA} instances compare equal if and only if they have the same mname, rname, serial, refresh, minimum, expire, retry, and ttl. """ # Vary the mname self._equalityTest( dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30), dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30), dns.Record_SOA('xname', 'rname', 123, 456, 789, 10, 20, 30)) # Vary the rname self._equalityTest( dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30), dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30), dns.Record_SOA('mname', 'xname', 123, 456, 789, 10, 20, 30)) # Vary the serial self._equalityTest( dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30), dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30), dns.Record_SOA('mname', 'rname', 1, 456, 789, 10, 20, 30)) # Vary the refresh self._equalityTest( dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30), dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30), dns.Record_SOA('mname', 'rname', 123, 1, 789, 10, 20, 30)) # Vary the minimum self._equalityTest( dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30), dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30), dns.Record_SOA('mname', 'rname', 123, 456, 1, 10, 20, 30)) # Vary the expire self._equalityTest( dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30), dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30), dns.Record_SOA('mname', 'rname', 123, 456, 789, 1, 20, 30)) # Vary the retry self._equalityTest( dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30), dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30), dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 1, 30)) # Vary the ttl self._equalityTest( dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30), dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30), dns.Record_SOA('mname', 'xname', 123, 456, 789, 10, 20, 1))