def _find_zone_match(self, zone, name, rdtype): try: while name != dns.name.root: found_rrset = None try: found_rrset = zone.find_rrset(name, rdtype) except KeyError: pass if found_rrset is None: try: found_rrset = zone.find_rrset(name, dns.rdatatype.CNAME) except KeyError: pass if found_rrset is None: try: found_rrset = zone.find_rrset(name, dns.rdatatype.DNAME) except KeyError: pass if found_rrset is not None: return found_rrset if name.labels[0] == '*': name = name.parent() name = dns.name.Name(['*'] + list(name.parent().labels)) except dns.name.NoParent: pass raise KeyError('No matching record for {} {}'.format(name, rdtype))
def _find_ns(self): name = dns.name.from_text(self.zone_name) ns = set() while True: try: for hostname in [str(x) for x in dns.resolver.query(name, "NS")]: try: for rdata in dns.resolver.query(hostname, "A"): ns.add(str(rdata)) except dns.resolver.NXDOMAIN: pass except dns.resolver.NoAnswer: pass try: for rdata in dns.resolver.query(hostname, "AAAA"): ns.add(str(rdata)) except dns.resolver.NXDOMAIN: pass except dns.resolver.NoAnswer: pass break except dns.resolver.NXDOMAIN: name = name.parent() except dns.resolver.NoAnswer: name = name.parent() return ns
def populate_empty_non_terminals(self): for name in self._policies.keys(): if name in (dns.name.empty, dns.name.root): continue name = name.parent() while name not in self._policies: self._policies[name] = None try: name = name.parent() except dns.name.NoParent: break
def longest_match(name, psl): try: suffixes = psl[dns.name.from_text(name[-2])] except KeyError: return None while name != dns.name.root: if name in suffixes: return name if dns.name.from_text('*', name.parent()) in suffixes and \ dns.name.from_text('!%s' % name[0], name.parent()) not in suffixes: return name if dns.name.from_text('*', name) in suffixes: return name name = name.parent() return None
def zone_for_name(name, rdclass=dns.rdataclass.IN, tcp=False, resolver=None): """Find the name of the zone which contains the specified name. @param name: the query name @type name: absolute dns.name.Name object or string @param rdclass: The query class @type rdclass: int @param tcp: use TCP to make the query (default is False). @type tcp: bool @param resolver: the resolver to use @type resolver: dns.resolver.Resolver object or None @rtype: dns.name.Name""" if isinstance(name, basestring): name = dns.name.from_text(name, dns.name.root) if resolver is None: resolver = get_default_resolver() if not name.is_absolute(): raise NotAbsolute(name) while 1: try: answer = resolver.query(name, dns.rdatatype.SOA, rdclass, tcp) if answer.rrset.name == name: return name # otherwise we were CNAMEd or DNAMEd and need to look higher except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer): pass try: name = name.parent() except dns.name.NoParent: raise NoRootSOA
def zone_for_name(name, rdclass=dns.rdataclass.IN, tcp=False, resolver=None): """Find the name of the zone which contains the specified name. @param name: the query name @type name: absolute dns.name.Name object or string @param rdclass: The query class @type rdclass: int @param tcp: use TCP to make the query (default is False). @type tcp: bool @param resolver: the resolver to use @type resolver: dns.resolver.Resolver object or None @rtype: dns.name.Name""" if isinstance(name, (str, unicode)): name = dns.name.from_text(name, dns.name.root) if resolver is None: resolver = get_default_resolver() if not name.is_absolute(): raise NotAbsolute(name) while 1: try: answer = resolver.query(name, dns.rdatatype.SOA, rdclass, tcp) if answer.rrset.name == name: return name # otherwise we were CNAMEd or DNAMEd and need to look higher except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer): pass try: name = name.parent() except dns.name.NoParent: raise NoRootSOA
def getRdatasetWildcardRecursion(self, name, rdtype, first=True): try: rdataset = self.data.find_rdataset( name, rdtype ) except KeyError as e: if name.is_wild(): name = name.parent() name.relativize(self.zone) if not first: name = name.parent() name = dns.name.Name(['*']).concatenate(name) rdataset = self.getRdatasetWildcardRecursion(name, rdtype, False) return rdataset
def __init__(self, name, fname): self.zone = dns.zone.from_file(fname, name, relativize=False) self.zone.check_origin() self.allnames = set() for name in self.zone.nodes.keys(): while len(name.labels) > len(self.zone.origin.labels): self.allnames.add(name) name = name.parent() self.allnames.add(self.zone.origin)
def get_ds_sets(zone): name = dns.name.from_text(zone) parent = name.parent() result = [] for ns in dns.resolver.query(parent, 'NS'): for family, socktype, proto, canonname, sockaddr in getaddrinfo( ns.target.to_text(), 53): ns_addr = sockaddr[0] r = dns.resolver.Resolver(configure=False) r.nameservers = [ns_addr] try: ds = r.query(name, 'DS') result.append( set((d.key_tag, d.algorithm, d.digest_type, d.digest.hex()) for d in ds)) except dns.resolver.NoAnswer: result.append(set()) return result
def zone_for_name(name, rdclass=dns.rdataclass.IN, tcp=False, resolver=None): """Find the name of the zone which contains the specified name. *name*, an absolute ``dns.name.Name`` or ``text``, the query name. *rdclass*, an ``int``, the query class. *tcp*, a ``bool``. If ``True``, use TCP to make the query. *resolver*, a ``dns.resolver.Resolver`` or ``None``, the resolver to use. If ``None``, the default resolver is used. Raises ``dns.resolver.NoRootSOA`` if there is no SOA RR at the DNS root. (This is only likely to happen if you're using non-default root servers in your network and they are misconfigured.) Returns a ``dns.name.Name``. """ if isinstance(name, str): name = dns.name.from_text(name, dns.name.root) if resolver is None: resolver = get_default_resolver() if not name.is_absolute(): raise NotAbsolute(name) while 1: try: answer = resolver.query(name, dns.rdatatype.SOA, rdclass, tcp) if answer.rrset.name == name: return name # otherwise we were CNAMEd or DNAMEd and need to look higher except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer): pass try: name = name.parent() except dns.name.NoParent: raise NoRootSOA
async def zone_for_name( name: Union[dns.name.Name, str], rdclass: dns.rdataclass.RdataClass = dns.rdataclass.IN, tcp: bool = False, resolver: Optional[Resolver] = None, backend: Optional[dns.asyncbackend.Backend] = None, ) -> dns.name.Name: """Find the name of the zone which contains the specified name. See :py:func:`dns.resolver.Resolver.zone_for_name` for more information on the parameters and possible exceptions. """ if isinstance(name, str): name = dns.name.from_text(name, dns.name.root) if resolver is None: resolver = get_default_resolver() if not name.is_absolute(): raise NotAbsolute(name) while True: try: answer = await resolver.resolve(name, dns.rdatatype.SOA, rdclass, tcp, backend=backend) assert answer.rrset is not None if answer.rrset.name == name: return name # otherwise we were CNAMEd or DNAMEd and need to look higher except (NXDOMAIN, NoAnswer): pass try: name = name.parent() except dns.name.NoParent: # pragma: no cover raise NoRootSOA
def format_nsec3_name(name): return dns.name.from_text(name.labels[0].upper(), name.parent().canonicalize()).to_text()
def format_nsec3_name(name): return lb2s( dns.name.from_text(name.labels[0].upper(), name.parent().canonicalize()).to_text())