1# -*- coding: utf-8 -*-
2
3try:
4    from dns import resolver
5    HAVE_DNSPYTHON=True
6except ImportError:
7    resolver = None
8    HAVE_DNSPYTHON=False
9
10try:
11    import DNS
12    HAVE_PYDNS=True
13    DNS.DiscoverNameServers()
14except ImportError:
15    DNS = None
16    HAVE_PYDNS=False
17
18ENABLED = DNSQUERY_EXTENSION_ENABLED = HAVE_DNSPYTHON or HAVE_PYDNS
19
20
21def lookup(hostname, qtype='A'):
22    try:
23        if HAVE_DNSPYTHON:
24            arecs = []
25            arequest = resolver.query(hostname, qtype)
26            for rec in arequest:
27                arecs.append(rec.to_text())
28            return arecs
29
30        elif HAVE_PYDNS:
31            return DNS.dnslookup(hostname, qtype)
32
33    except Exception:
34        return None
35
36    return None
37
38
39
40def mxlookup(domain):
41    try:
42        if HAVE_DNSPYTHON:
43            mxrecs = []
44            mxrequest = resolver.query(domain, 'MX')
45            for rec in mxrequest:
46                mxrecs.append(rec.to_text())
47            mxrecs.sort() #automatically sorts by priority
48            return [x.split(None,1)[-1] for x in mxrecs]
49
50        elif HAVE_PYDNS:
51            mxrecs=[]
52            mxrequest = DNS.mxlookup(domain)
53            for dataset in mxrequest:
54                if type(dataset) == tuple:
55                    mxrecs.append(dataset)
56
57            mxrecs.sort() #automatically sorts by priority
58            return [x[1] for x in mxrecs]
59
60    except Exception:
61        return None
62
63    return None
64
65
66
67def revlookup(ip):
68    a = ip.split('.')
69    a.reverse()
70    revip = '.'.join(a)+'.in-addr.arpa'
71    return lookup(revip, qtype='PTR')
72
73
74