import sys import re dominios={} i=sys.stdin.read() i=i.split("\n")[:-1] dominios=dict().fromkeys(i) from operator import add num_mensajes=reduce(add,map(lambda x: int(x.split()[-1]),i)) l=len(dominios) print "Hay %d dominios a examinar, totalizando %d mensajes" %(l,num_mensajes) import dns.resolver,dns.exception import Queue import threading dominios_pendientes=Queue.Queue() dominios_resueltos=Queue.Queue() def get_txt() : resolver=dns.resolver.Resolver() resolver.timeout=10 while True : try : i=dominios_pendientes.get_nowait() except Queue.Empty : dominios_resueltos.put(None) return j=i.split()[0] try : replies=resolver.query(j,"TXT") j=[j for j in replies] except dns.exception.Timeout : j="TIMEOUT" except dns.resolver.NoAnswer : j="Sin TXT" except dns.resolver.NXDOMAIN : j="Dominio inexistente" except : j="ERROR DESCONOCIDO" dominios_resueltos.put((i,j)) for i in dominios.keys() : dominios_pendientes.put(i) num_threads=54 for i in xrange(num_threads) : t=threading.Thread(target=get_txt) t.setDaemon(True) t.start() dominios={} while True : r=dominios_resueltos.get() if not r : num_threads-=1 if num_threads : continue break l-=1 i,j=r print l,i,j if not isinstance(j,str) : for k in j : if k.strings[0][:6]=="v=spf1" : dominios[i]=j for i,j in dominios.iteritems() : print i,j num_mensajes2=reduce(add,map(lambda x: int(x.split()[-1]),dominios.keys())) print len(dominios) print "%d mensajes en total, %d mensajes via SPF" %(num_mensajes,num_mensajes2)