11 |
log("No ADNS library found, using synchronous name lookups.") |
log("No ADNS library found, using synchronous name lookups.") |
12 |
_have_adns = False |
_have_adns = False |
13 |
|
|
14 |
|
MAX_TIMES = 3 |
15 |
|
|
16 |
class NameFormatException(Exception): |
class NameFormatException(Exception): |
17 |
pass |
pass |
18 |
|
|
41 |
self.queryengine.lookup_a_record(name, callback, cbw) |
self.queryengine.lookup_a_record(name, callback, cbw) |
42 |
|
|
43 |
def lookup(self, name, callback, data=None): |
def lookup(self, name, callback, data=None): |
|
cbw = CBWrapper(name, callback, data) |
|
44 |
try: |
try: |
45 |
name = name.encode('ascii') |
name = name.encode('ascii') |
46 |
except UnicodeError: |
except UnicodeError: |
47 |
raise NameFormatException, "Host names must be ASCII" |
raise NameFormatException, "Host names must be ASCII" |
48 |
|
cbw = CBWrapper(name, callback, data) |
49 |
self._lookup(name, self.adns_callback, cbw) |
self._lookup(name, self.adns_callback, cbw) |
50 |
|
|
51 |
def adns_callback(self, answer, qname, rr, flags, cbwrapper): |
def adns_callback(self, answer, qname, rr, flags, cbwrapper): |
60 |
ip = ips[0] |
ip = ips[0] |
61 |
self.namecache[qname] = (ip, now+random.randint(self.mintime, |
self.namecache[qname] = (ip, now+random.randint(self.mintime, |
62 |
self.maxtime)) |
self.maxtime)) |
63 |
|
else: |
64 |
|
# try again |
65 |
|
if cbwrapper.times < MAX_TIMES: |
66 |
|
cbwrapper.times += 1 |
67 |
|
self._lookup(cbwrapper.name, self.adns_callback, cbwrapper) |
68 |
cbwrapper.cb(ip) |
cbwrapper.cb(ip) |
69 |
|
|
70 |
def poll(self, timeout=0.1): |
def poll(self, timeout=0.1): |
71 |
self.queryengine.run(timeout) |
self.queryengine.run(timeout) |
72 |
|
|
73 |
class CBWrapper: |
class CBWrapper: |
74 |
def __init__(self, name, callback, data): |
def __init__(self, name, callback, data, times = 0): |
75 |
self.name = name |
self.name = name |
76 |
self.data = data |
self.data = data |
77 |
self.callback = callback |
self.callback = callback |
78 |
|
self.times = 0 |
79 |
|
|
80 |
def cb(self, ip): |
def cb(self, ip): |
81 |
self.callback(self.name, ip, self.data) |
self.callback(self.name, ip, self.data) |