Exemplo n.º 1
0
 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))
Exemplo n.º 2
0
	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
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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
Exemplo n.º 7
0
    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
Exemplo n.º 8
0
 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)
Exemplo n.º 9
0
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
Exemplo n.º 10
0
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
Exemplo n.º 11
0
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
Exemplo n.º 12
0
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
Exemplo n.º 13
0
def format_nsec3_name(name):
    return dns.name.from_text(name.labels[0].upper(), name.parent().canonicalize()).to_text()
Exemplo n.º 14
0
def format_nsec3_name(name):
    return lb2s(
        dns.name.from_text(name.labels[0].upper(),
                           name.parent().canonicalize()).to_text())