def update_tld_rootservers(self): """ Find the DNS TLD servers for the domain from root servers """ self.tld_servers = [] rootservers = RootServers(self.rootfile) if not rootservers.is_downloaded: rootservers.download() server = rootservers.random_rootserver(self.rrtype).address rs = resolve_records(query=self.tld, nameserver=server, rrtype='NS', timeout=self.timeout) tld_server_addresses = {} for entry in filter(lambda x: x['rrtype'] == self.rrtype, rs['additional']): try: tld_server_addresses[entry['name']] = entry['address'] except IndexError: raise DNSError( 'Additional data did not contain proper %s records' % self.rrtype) self.tld_servers = [] for entry in filter(lambda x: x['rrtype'] == 'NS', rs['authority']): try: self.tld_servers.append(tld_server_addresses[entry['target']]) except IndexError: continue
def update_delegations(self): """ Query zone delegation details from one of the TLD servers """ self.__delslice__(0, len(self)) self.update_tld_rootservers() if len(self.tld_servers) == 0: raise DNSError('No TLD servers for %s' % self.domain) server = self.tld_servers[random.randint(0, len(self.tld_servers) - 1)] rs = resolve_records(self.domain, server, 'NS', self.timeout) reg_server_addresses = {} for entry in filter(lambda x: x['rrtype'] == self.rrtype, rs['additional']): reg_server_addresses[entry['name']] = entry['address'] for entry in filter(lambda x: x['rrtype'] == 'NS', rs['authority']): try: address = reg_server_addresses[entry['target']] except IndexError: # Need to query address for server address = None self.append( DelegateServer(self, self.rrtype, entry['target'], address))
def __init__(self, server, domain): self.server = server self.domain = domain res = resolve_records(self.domain, self.server, 'SOA') if len(res['results']) != 1: raise ValueError('Invalid SOA query result: %s' % res['results']) data = res['results'][0] if data['rrtype'] != 'SOA': raise ValueError('Response is not a SOA record') name = '%s' % data['name'] if self.domain != name: raise ValueError('Received SOA name %s expected %s' % (name, self.domain)) self.master_server = '%s' % data['mname'] self.rname = '%s' % data['rname'] for field in ('serial', 'refresh', 'retry', 'expire', 'minimum'): if field not in data.keys(): raise ValueError('Invalid SOA query result: missing %s' % field) setattr(self, field, data[field])
def update_delegations(self): """ Query zone delegation details from one of the TLD servers """ self.__delslice__(0, len(self)) self.update_tld_rootservers() if len(self.tld_servers) == 0: raise DNSError('No TLD servers for %s' % self.domain) server = self.tld_servers[random.randint(0, len(self.tld_servers)-1)] rs = resolve_records( self.domain, server, 'NS', self.timeout) reg_server_addresses = {} for entry in filter(lambda x: x['rrtype']==self.rrtype, rs['additional']): reg_server_addresses[entry['name']] = entry['address'] for entry in filter(lambda x: x['rrtype']=='NS', rs['authority']): try: address = reg_server_addresses[entry['target']] except IndexError: # Need to query address for server address = None self.append(DelegateServer(self, self.rrtype, entry['target'], address ))
def update_tld_rootservers(self): """ Find the DNS TLD servers for the domain from root servers """ self.tld_servers = [] rootservers = RootServers(self.rootfile) if not rootservers.is_downloaded: rootservers.download() server = rootservers.random_rootserver(self.rrtype).address rs = resolve_records(query=self.tld, nameserver=server, rrtype='NS', timeout=self.timeout) tld_server_addresses = {} for entry in filter(lambda x: x['rrtype']==self.rrtype, rs['additional']): try: tld_server_addresses[entry['name']] = entry['address'] except IndexError: raise DNSError('Additional data did not contain proper %s records' % self.rrtype) self.tld_servers = [] for entry in filter(lambda x: x['rrtype']=='NS', rs['authority']): try: self.tld_servers.append(tld_server_addresses[entry['target']]) except IndexError: continue
def nameservers(self): addresses = [] res = resolve_records(self.domain, self.address, 'NS') for r in res['results']: if r['rrtype'] != 'NS': continue server = '%s' % r['target'] addresses.append(server.rstrip('.')) return addresses
def query_server(self, server, rrtype): """Query RR for server Resolve this zone's RR from given server """ return resolve_records( query=self.domain, rrtype=rrtype, nameserver=server, timeout=self.timeout )