/DNSBL.py

http://adns-python.googlecode.com/ · Python · 82 lines · 57 code · 15 blank · 10 comment · 13 complexity · 19a4b444a7ee754248e95c893b9d1bdc MD5 · raw file

  1. #!/usr/bin/env python
  2. import os, sys, string
  3. import ADNS
  4. class DNSBL:
  5. """A class for defining various DNS-based blacklists."""
  6. def __init__(self, name, zone, URL='', results=None):
  7. """Create a DNS blacklist name, based on the given zone.
  8. If presently, URL is a template that produces a link
  9. back to information for a given address. results
  10. should map returned addresses to list codes."""
  11. self.name = name
  12. self.zone = zone
  13. self.URL = URL
  14. self.results = {}
  15. if results:
  16. for result, name in results.items(): self.result(result, name)
  17. def result(self, result, name):
  18. """Add a possible result set."""
  19. self.results[result] = name
  20. def getURL(self, ip):
  21. """Return a URL to information on the list of ip on this
  22. blacklist."""
  23. return self.URL % ip
  24. class DNSBLQueryEngine(ADNS.QueryEngine):
  25. def __init__(self, s=None, blacklists=None):
  26. ADNS.QueryEngine.__init__(self, s)
  27. self.blacklists = {}
  28. self.dnsbl_results = {}
  29. if blacklists:
  30. for l in blacklists: self.blacklist(l)
  31. def blacklist(self, dnsbl):
  32. """Add a DNSBL."""
  33. self.blacklists[dnsbl.name] = dnsbl
  34. def submit_dnsbl(self, qname):
  35. from adns import rr
  36. for l, d in self.blacklists.items():
  37. self.dnsbl_results[qname] = []
  38. self.submit_reverse_any(qname, d.zone, rr.A,
  39. callback=self.dnsbl_callback,
  40. extra=l)
  41. def dnsbl_callback(self, answer, qname, rr, flags, l):
  42. if not answer[0]:
  43. for addr in answer[3]:
  44. self.dnsbl_results[qname].append( (
  45. self.blacklists[l].results.get(addr, "%s-%s"%(l,addr)),
  46. self.blacklists[l].getURL(qname)) )
  47. if __name__ == "__main__":
  48. blacklists = [
  49. DNSBL('ORDB', 'relays.ordb.org.',
  50. 'http://ordb.org/lookup?addr=%s',
  51. {'127.0.0.2': 'ORDB'}),
  52. DNSBL('DEVNULL', 'dev.null.dk.',
  53. 'http://fabel.dk/relay/test/index.epl?ip=%s&send=Check',
  54. { '127.0.0.2': 'DEVNULL' }),
  55. ]
  56. s = DNSBLQueryEngine(blacklists=blacklists)
  57. for i in sys.argv[1:]:
  58. s.submit_dnsbl(i)
  59. s.finish()
  60. listed = s.dnsbl_results
  61. for k, v in listed.items():
  62. hits = []
  63. for l, url in v: hits.append(l)
  64. if len(listed) > 1:
  65. print "%s: %s" % (k, string.join(hits))
  66. else:
  67. print string.join(hits)