56 lines
1.6 KiB
Python
56 lines
1.6 KiB
Python
#
|
|
# 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]
|
|
|