~py3dns-hackers/py3dns/trunk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 
# From: KevinL <darius@bofh.net.au>
#   A simple dns answer cache - it's author notes:
#     "It's probably really bodgy code, tho - it was my early python..."
#   So don't send him abusive messages if you hate it. 
#
class DNSCache:
    """
    Covers the DNS object, keeps a cache of answers.  Clumsy as hell.
    """
    forCache = {}
    revCache = {}
    # cache failures for this long, in seconds
    negCache = 3600

    def __init__(self):
       import DNS
       DNS.ParseResolvConf()

    def lookup(self,IP = None,name = None):
        import DNS
        now = time.time()
        if (not IP) and (not name):
            return None
        if IP:
            if type(IP) != type(''):
                return None
            a = string.split(IP, '.')
            a.reverse()  
            name = string.join(a, '.')+'.in-addr.arpa'
            cache = self.revCache
            qt = 'ptr'
        else:
            if type(name) != type(''):
                return None
            cache = self.forCache
            qt = 'a'
        if name in cache:
            # Check if it's timed out or not
            if cache[name][1] < now:
                del(cache[name])
            else:
                return(cache[name][0])
        x = DNS.DnsRequest(name,qtype=qt)
        try:
            x.req()
        except:
            return 'Timeout'
        if len(x.response.answers) > 0:
            cache[name] = ( x.response.answers[0]['data'], x.time_finish + 
                            x.response.answers[0]['ttl'])
        else:
            cache[name] = (None,now+self.negCache)
        return cache[name][0]