예제 #1
0
    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
예제 #2
0
    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))
예제 #3
0
    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])
예제 #4
0
파일: delegation.py 프로젝트: hile/seine
    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 ))
예제 #5
0
파일: delegation.py 프로젝트: hile/seine
    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
예제 #6
0
    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
예제 #7
0
파일: delegation.py 프로젝트: hile/seine
    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
예제 #8
0
    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
        )
예제 #9
0
파일: delegation.py 프로젝트: hile/seine
    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])