/
dnsbl.py
32 lines (27 loc) · 985 Bytes
/
dnsbl.py
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
import gevent
from gevent import socket
class Base(object):
"""A simple DNSBL backend."""
def __init__(self, ip=None, providers=[], timeout=2):
self.ip = ip
self.providers = providers
self.timeout = timeout
def build_query(self, provider):
reverse = '.'.join(reversed(self.ip.split('.')))
return '{reverse}.{provider}.'.format(reverse=reverse, provider=provider)
def query(self, provider):
try:
result = socket.gethostbyname(self.build_query(provider))
except socket.gaierror:
result = False
return provider, result
def check(self):
results = []
jobs = [gevent.spawn(self.query, provider) for provider in self.providers]
gevent.joinall(jobs, self.timeout)
for job in jobs:
if job.successful():
results.append(job.value)
else:
results.append((job.args[0], None))
return results