2012-01-24 19 views
7

Ho un piccolo script che controlla un ampio elenco di domini per i loro record MX, tutto funziona bene ma quando lo script trova un dominio senza record, ci vuole un po 'di tempo per saltare a il prossimo.Dnspython: impostazione del timeout della query/lifetime

Ho provato ad aggiungere:

query.lifetime = 1.0 
or 
query.timeout = 1.0 

, ma questo non sembra di fare nulla. Qualcuno sa come è configurata questa impostazione?

La mia sceneggiatura è al di sotto, grazie per il vostro tempo.

import dns.resolver 
from dns.exception import DNSException 
import dns.query 
import csv 

domains = csv.reader(open('domains.csv', 'rU')) 
output = open('output.txt', 'w') 
for row in domains: 
    try: 
     domain = row[0] 
     query = dns.resolver.query(domain,'MX') 
     query.lifetime = 1.0 
    except DNSException: 
     print "nothing here" 
    for rdata in query: 
      print domain, " ", rdata.exchange, 'has preference', rdata.preference 
      output.writelines(domain) 
      output.writelines(",") 
      output.writelines(rdata.exchange.to_text()) 
      output.writelines("\n") 

risposta

15

Si sta impostando il timeout dopo hai già eseguito la query. Quindi non farà nulla!

Che cosa si vuole fare, invece è creare un oggetto Resolver, impostare la sua timeout, e quindi chiamare il suo metodo query(). dns.resolver.query() è solo una funzione di convenienza che crea un oggetto Resolver predefinito e invoca il suo metodo query(), quindi è necessario farlo manualmente se non si desidera un valore predefinito Resolver.

resolver = dns.resolver.Resolver() 
resolver.timeout = 1 
resolver.lifetime = 1 

Quindi utilizzare questo nel vostro ciclo:

try: 
    domain = row[0] 
    query = resolver.query(domain,'MX') 
except: 
    # etc. 

si dovrebbe essere in grado di utilizzare lo stesso oggetto Resolver per tutte le query.

+3

Grazie mille !, ho provato la risposta con timeout, ma ho ancora avuto lo stesso problema, ma usando resolver.lifetime = 1.0 ha funzionato. –

+1

Sì, non sono proprio sicuro di quale sia la differenza (non ho mai usato quella libreria) ma sono contento che tu abbia trovato l'attributo giusto. – kindall

+0

Si noti che 'timeout' è solo la metà dell'equazione. Come nell'esempio originale di OP, dovrebbe essere usato anche 'lifetime'. Vedi http://comments.gmane.org/gmane.comp.python.dnspython.user/144 –

Problemi correlati