Timeout in python

28 views
Skip to first unread message

Veronica

unread,
May 15, 2011, 4:17:30 PM5/15/11
to hack-labs-hub
Buenas, como andan? Quería compartirles un dato que encontré acerca de los timeout en python por si a alguien le sirve!

Ahora estaba programando un poco en python y usando la librería urllib2 para hacer peticiones http. Probando con cierta página, en vez de devolver un http error no me devolvía nada y mi programita quedaba colgado eternamente....
Leyendo un poco vi que cuando uso OpenerDirector.open(url[, data][, timeout]), ese timeout no está seteado por default y no pude setearlo porque no me toma ese parámetro como válido... al menos a mi..
La solución que encontré es directamente setear un timeout a nivel socket.
Basicamente:
import socket
socket.setdefaulttimeout(segundos)

Con esto problema resuelto! :)


Saludos!

vero


--
---------------------------------------------------------------
http://keyserver.veridis.com:11371/export?id=5229491868415998346&created=1256222534000

Agustín Gugliotta

unread,
May 15, 2011, 4:22:10 PM5/15/11
to hack-l...@googlegroups.com
Ah genial!.. a mi me pasaba eso y lo resolvi usando urllib2.urlopen dentro de un try y listo :P si pasa es que la web está online y/o existe por ahora me viene funcionando "bien"

Saludos.

2011/5/15 Veronica <vero.v...@gmail.com>

Veronica

unread,
May 15, 2011, 4:32:55 PM5/15/11
to hack-l...@googlegroups.com
Si, cuando usaba urllib2.urlopen no me pasaba... pero ahroa uso un OpenerDirector porque me permite cambiar el user agent en la petición!

El equivalente al urlopen que uso sería:

request = urllib2.Request(URL_STRING)
#request.add_header('User-Agent','Mozilla/4.0 (compatible;MSIE 5.5; Windows NT 5.0)')
opener_web = urllib2.build_opener()
response = opener_web.open(request)

y en este caso el timeout fallaba...

solucionaste lo del dns?

saludos!

vero

2011/5/15 Agustín Gugliotta <agustin...@gmail.com>

Agustín Gugliotta

unread,
May 15, 2011, 4:38:57 PM5/15/11
to hack-l...@googlegroups.com
No... no entiendo que pasa la verdad, me devuelve esto

Getting NS records from:  autre.org
    Found name server:  ns1.zoneedit.com
    Found name server:  ns14.zoneedit.com
Trying a zone transfer from name server(ns1.zoneedit.com.) for autre.org
Traceback (most recent call last):
  File "./dscanner.py", line 119, in <module>
    main()
  File "./dscanner.py", line 113, in main
    zone_transfer(url,ns_list)
  File "./dscanner.py", line 86, in zone_transfer
    ztfr = dns.zone.from_xfr(dns.query.xfr(nameserver,url))
  File "/usr/lib/pymodules/python2.6/dns/zone.py", line 835, in from_xfr
    for r in xfr:
  File "/usr/lib/pymodules/python2.6/dns/query.py", line 346, in xfr
    _connect(s, destination)
  File "/usr/lib/pymodules/python2.6/dns/query.py", line 183, in _connect
    s.connect(address)
  File "<string>", line 1, in connect
TypeError: coercing to Unicode: need string or buffer, NS found

Este error no es el que les conte ayer este es otro que me paso hoy xD....me parece que tengo problemas en el formato que trae una variable de otra función que uso para la transferencia de zona (puede ser producto de una desorganización de codigo jajajaja)

2011/5/15 Veronica <vero.v...@gmail.com>

Veronica

unread,
May 15, 2011, 4:43:42 PM5/15/11
to hack-l...@googlegroups.com
Y que comando y librería usas?

2011/5/15 Agustín Gugliotta <agustin...@gmail.com>

Agustín Gugliotta

unread,
May 15, 2011, 4:48:51 PM5/15/11
to hack-l...@googlegroups.com
def dns_records(url):
    print "Getting NS records from: ", url
    ns_records = dns.resolver.query(url, 'NS')
    ns = []
    for rdata in ns_records :
        print "    Found name server: ", rdata.to_text()[:-1]
        ns.append(rdata)
    return ns

def zone_transfer(url,ns_list):
    for nameserver in ns_list :
        print "Trying a zone transfer from name server(%s) for %s"%(nameserver,url)
        try:
            ztfr = dns.zone.from_xfr(dns.query.xfr(nameserver,url))
            for name, node in ztfr.nodes.items():
                rdataset = node.rdatasets
                for record in rdataset:
                    print >> sys.stdout, "\n%s\t%s" % (name, record)
        except DNSException, e:
            print "ERROR ",e

ns_list sería lo que devolvio la función dns_records y librerías para lo del dns uso:

import dns.resolver
import dns.query
import dns.zone
from dns.exception import DNSException
from dns.rdataclass import *
from dns.rdatatype import *

2011/5/15 Veronica <vero.v...@gmail.com>

Veronica

unread,
May 15, 2011, 5:14:24 PM5/15/11
to hack-l...@googlegroups.com
probé de hacer lo mismo que vos solo que cambié el print del zone transfer y no me tiró excepciones....

for nameserver in ns_list:
    print "Trying a zone transfer from name server: {0}".format(nameserver)
    try:
        ztfr = dns.zone.from_xfr(dns.query.xfr(nameservers[0],'autre.org'))

        for name, node in ztfr.nodes.items():
            rdataset = node.rdatasets
            #for record in rdataset:
            print '{0} {1}'.format(name, record)
    except DNSException,e:
        print 'Error: {0}'.format(e)

no será el print que te está tirando cualquier cosa?

genial como sacás la transferencia de zona!

Veronica

unread,
May 15, 2011, 5:15:59 PM5/15/11
to hack-l...@googlegroups.com
donde dice:
ztfr = dns.zone.from_xfr(dns.query.xfr(nameservers[0],'autre.org'))
debería decir:
ztfr = dns.zone.from_xfr(dns.query.xfr(nameserver,URL))

sorry, me quedó del copy paste...

saludos!

2011/5/15 Veronica <vero.v...@gmail.com>

Agustín Gugliotta

unread,
May 15, 2011, 5:16:48 PM5/15/11
to hack-l...@googlegroups.com
El print!?...no se me hubiera ocurrido pero ahora lo miro y te cuento! Gracias!

2011/5/15 Veronica <vero.v...@gmail.com>

Veronica

unread,
May 15, 2011, 5:24:54 PM5/15/11
to hack-labs-hub
y la exception del dns no es: 'except DNSException,e:' o al menos a mi me tira que no existe...
esta si anda: 'except dns.exception.DNSException, e:'

espero que soluciones! contanos después!

Veronica

unread,
May 15, 2011, 5:33:42 PM5/15/11
to hack-labs-hub
Ahhhh yyy otra cosa!
viste en tu dns_records(url)?

yo cargaba el array ns así:

for rdata in ns_records:
    ns.append(str(rdata))

y no:
    ns.append(rdata)

saludos!


vero

2011/5/15 Veronica <vero.v...@gmail.com>

Agustín Gugliotta

unread,
May 15, 2011, 5:35:42 PM5/15/11
to hack-l...@googlegroups.com
>>> import getopt
>>> import sys
>>> import re
>>> import urllib2

>>> import dns.resolver
>>> import dns.query
>>> import dns.zone
>>> from urlparse import urlsplit

>>> from dns.exception import DNSException
>>> from dns.rdataclass import *
>>> from dns.rdatatype import *
>>>
>>>
>>> def dns_records(url):
...     print "Getting NS records from: ", url
...     ns_records = dns.resolver.query(url, 'NS')
...     ns = []
...     for rdata in ns_records :
...         print "     Found name server: ", rdata.to_text()[:-1]
...         ns.append(rdata)
...     return ns
...
>>> url = 'autre.org'
>>> n = dns_records(url)

Getting NS records from:  autre.org
    Found name server:  ns1.zoneedit.com
    Found name server:  ns14.zoneedit.com

>>> def zone_transfer(url,ns_list):
...     for nameserver in ns_list:
...             print "Trying a zone transfer from name server: {0}".format(nameserver)
...             try:
...                     ztfr = dns.zone.from_xfr(dns.query.xfr(nameserver,url))
...                     for name, node in ztfr.nodes.items():
...                             rdataset = node.rdatasets
...                             #for record in rdataset:
...                             print '{0} {1}'.format(name, record)
...             except dns.exception.DNSException, e:
...                     print 'Error: {0}'.format(e)
...
>>> zone_transfer(url,n)
Trying a zone transfer from name server: ns1.zoneedit.com.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in zone_transfer

  File "/usr/lib/pymodules/python2.6/dns/zone.py", line 835, in from_xfr
    for r in xfr:
  File "/usr/lib/pymodules/python2.6/dns/query.py", line 346, in xfr
    _connect(s, destination)
  File "/usr/lib/pymodules/python2.6/dns/query.py", line 183, in _connect
    s.connect(address)
  File "<string>", line 1, in connect
TypeError: coercing to Unicode: need string or buffer, NS found
>>>

Parece que sigue con el mismo error...acabo de hacer un upgrade en el debian por las dudas que tenga desactualizada la libreria pero nop (estoy con squeezy)

sudo aptitude search python | grep -i dns
p   python-adns                     - Python bindings to the asynchronous DNS re
p   python-dns                      - DNS client module for Python             
i   python-dnspython                - DNS toolkit for Python                   
p   python-easyzone                 - DNS Zone abstraction Python module       
p   python-ldns                     - Python bindings for the ldns library for D
p   python-twisted-names            - A DNS protocol implementation with client
v   python2.5-adns                  -                                          
v   python2.5-dnspython             -                                          
v   python2.5-ldns                  -                                          
v   python2.6-adns                  -                                          
v   python2.6-dnspython             -                                          
v   python2.6-ldns 

Seguiré intentando! ... Saludos!

2011/5/15 Veronica <vero.v...@gmail.com>

Agustín Gugliotta

unread,
May 15, 2011, 5:51:35 PM5/15/11
to hack-l...@googlegroups.com
Está vivo!!!!!!!! xD

Esas dos funciones quedaron así:


def dns_records(url):
    print "Getting NS records from: ", url
    ns_records = dns.resolver.query(url, 'NS')
    ns = []
    for rdata in ns_records :
        print "    Found name server: ", str(rdata)
        ns.append(str(rdata))

    return ns

def zone_transfer(url,ns_list):
    for nameserver in ns_list:
        print "Trying a zone transfer from name server: {0}".format(nameserver)
        try:
            ztfr = dns.zone.from_xfr(dns.query.xfr(nameserver,url))
            for name, node in ztfr.nodes.items():
                rdataset = node.rdatasets
                for record in rdataset:
                    print '{0} {1}'.format(name, record)
        except dns.exception.DNSException, e:
            print 'Error: {0}'.format(e)

Efectivamente había que agregar al rdata el str() como dijiste Vero... Gracias!

2011/5/15 Agustín Gugliotta <agustin...@gmail.com>

Veronica

unread,
May 15, 2011, 6:01:59 PM5/15/11
to hack-l...@googlegroups.com
genial!

2011/5/15 Agustín Gugliotta <agustin...@gmail.com>
Reply all
Reply to author
Forward
0 new messages