Пример #1
0
def nslookup(name, type_, response, resolvers=None, recursive=True):
    name = name.rstrip('.')
    if isinstance(type_, basestring):
        type_ = dns.rdatatype.from_text(type_)
    if type_ == dns.rdatatype.PTR:
        name = dns.reversename.from_address(name)
    if not resolvers:
        resolvers = dns.resolver.get_default_resolver().nameservers
    elif isinstance(resolvers, basestring):
        resolvers = [resolvers]

    if type_ in [dns.rdatatype.AXFR, dns.rdatatype.IXFR]:
        try:
            discovered_names = []
            for ns in dns.resolver.query(name, dns.rdatatype.NS):
                xfr(ns.to_text(), name, response, discovered_names=discovered_names)
            return True
        except dns.resolver.NXDOMAIN:
            response += UIMessage("DNS records for %s do not exist." % repr(name))
        except dns.resolver.NoNameservers:
            response += UIMessage("No nameservers found for %s." % repr(name))
        except dns.resolver.Timeout:
            response += UIMessage("DNS request for %s timed out." % repr(name))
        except dns.resolver.NoAnswer:
            response += UIMessage("DNS request for %s resulted in no response." % repr(name))
        except socket.error:
            response += UIMessage("A socket error has occurred. Make sure you are connected or the traffic is allowed.")
        return False

    try:
        request = dns.message.make_query(name, type_, dns.rdataclass.IN)
        if not recursive:
            request.flags ^= dns.flags.RD
        for resolver in resolvers:
            ans = dns.query.udp(request, resolver).answer
            if ans:
                for rrset in ans:
                    for rr in rrset:
                        if rr.rdtype == type_:
                            if type_ == dns.rdatatype.A:
                                response += IPv4Address(rr.to_text(True))
                            elif type_ == dns.rdatatype.NS:
                                response += UIMessage(repr(rr))
                                response += NSRecord(rr.to_text()[:-1])
                            elif type_ == dns.rdatatype.CNAME:
                                response += DNSName(rr.to_text())
                            elif type_ == dns.rdatatype.SOA:
                                e = NSRecord(rr.mname.to_text(True))
                                e += Field('mailaddr', rr.rname.to_text(True), displayname='Authority')
                                response += e
                            elif type_ == dns.rdatatype.PTR:
                                response += DNSName(rr.to_text()[:-1])
                            elif type_ == dns.rdatatype.MX:
                                e = MXRecord(rr.exchange.to_text(True))
                                e.mxpriority = rr.preference
                                response += e
                            elif type_ == dns.rdatatype.TXT:
                                response += Phrase(rr.to_text(True))
                            elif type_ == dns.rdatatype.AAAA:
                                response += IPv6Address(rr.to_text(True))
                            else:
                                response += Phrase(rr.to_text(True))
                return True
    except dns.resolver.NXDOMAIN:
        response += UIMessage("DNS records for %s do not exist." % repr(name))
    except dns.resolver.Timeout:
        response += UIMessage("DNS request for %s timed out." % repr(name))
    except dns.resolver.NoNameservers:
        response += UIMessage("No name servers found for %s." % repr(name))
    except dns.resolver.NoAnswer:
        response += UIMessage("The DNS server returned with no response for %s." % repr(name))
    except socket.error:
        response += UIMessage("A socket error has occurred. Make sure you are connected or the traffic is allowed.")
    return False
Пример #2
0
def nslookup(name, type_, response, resolvers=None, recursive=True):
    name = name.rstrip('.')
    if isinstance(type_, basestring):
        type_ = dns.rdatatype.from_text(type_)
    if type_ == dns.rdatatype.PTR:
        name = dns.reversename.from_address(name)
    if not resolvers:
        resolvers = dns.resolver.get_default_resolver().nameservers
    elif isinstance(resolvers, basestring):
        resolvers = [resolvers]

    if type_ in [dns.rdatatype.AXFR, dns.rdatatype.IXFR]:
        try:
            discovered_names = []
            for ns in dns.resolver.query(name, dns.rdatatype.NS):
                xfr(ns.to_text(),
                    name,
                    response,
                    discovered_names=discovered_names)
            return True
        except dns.resolver.NXDOMAIN:
            response += UIMessage("DNS records for %s do not exist." %
                                  repr(name))
        except dns.resolver.NoNameservers:
            response += UIMessage("No nameservers found for %s." % repr(name))
        except dns.resolver.Timeout:
            response += UIMessage("DNS request for %s timed out." % repr(name))
        except dns.resolver.NoAnswer:
            response += UIMessage(
                "DNS request for %s resulted in no response." % repr(name))
        except socket.error:
            response += UIMessage(
                "A socket error has occurred. Make sure you are connected or the traffic is allowed."
            )
        return False

    try:
        request = dns.message.make_query(name, type_, dns.rdataclass.IN)
        if not recursive:
            request.flags ^= dns.flags.RD
        for resolver in resolvers:
            ans = dns.query.udp(request, resolver).answer
            if ans:
                for rrset in ans:
                    for rr in rrset:
                        if rr.rdtype == type_:
                            if type_ == dns.rdatatype.A:
                                response += IPv4Address(rr.to_text(True))
                            elif type_ == dns.rdatatype.NS:
                                response += UIMessage(repr(rr))
                                response += NSRecord(rr.to_text()[:-1])
                            elif type_ == dns.rdatatype.CNAME:
                                response += DNSName(rr.to_text())
                            elif type_ == dns.rdatatype.SOA:
                                e = NSRecord(rr.mname.to_text(True))
                                e += Field('mailaddr',
                                           rr.rname.to_text(True),
                                           displayname='Authority')
                                response += e
                            elif type_ == dns.rdatatype.PTR:
                                response += DNSName(rr.to_text()[:-1])
                            elif type_ == dns.rdatatype.MX:
                                e = MXRecord(rr.exchange.to_text(True))
                                e.mxpriority = rr.preference
                                response += e
                            elif type_ == dns.rdatatype.TXT:
                                response += Phrase(rr.to_text(True))
                            elif type_ == dns.rdatatype.AAAA:
                                response += IPv6Address(rr.to_text(True))
                            else:
                                response += Phrase(rr.to_text(True))
                return True
    except dns.resolver.NXDOMAIN:
        response += UIMessage("DNS records for %s do not exist." % repr(name))
    except dns.resolver.Timeout:
        response += UIMessage("DNS request for %s timed out." % repr(name))
    except dns.resolver.NoNameservers:
        response += UIMessage("No name servers found for %s." % repr(name))
    except dns.resolver.NoAnswer:
        response += UIMessage(
            "The DNS server returned with no response for %s." % repr(name))
    except socket.error:
        response += UIMessage(
            "A socket error has occurred. Make sure you are connected or the traffic is allowed."
        )
    return False