diff --git a/scapy/as_resolvers.py b/scapy/as_resolvers.py index a1f3b7961320a204477151f5e1a2f2ec4cb43900..da4df117e7053a802a974ece6b99a9a8eb2e74a1 100644 --- a/scapy/as_resolvers.py +++ b/scapy/as_resolvers.py @@ -8,7 +8,7 @@ Resolve Autonomous Systems (AS). """ -import socket +import socket, errno from scapy.config import conf class AS_resolver: @@ -91,12 +91,12 @@ class AS_resolver_cymru(AS_resolver): asn,ip,desc = map(str.strip, l.split("|")) if asn == "NA": continue - asn = int(asn) - ASNlist.append((ip,asn,desc)) + asn = "AS" + str(int(asn)) + ASNlist.append((ip, asn, desc)) return ASNlist class AS_resolver_multi(AS_resolver): - resolvers_list = ( AS_resolver_cymru(),AS_resolver_riswhois(),AS_resolver_radb() ) + resolvers_list = ( AS_resolver_riswhois(),AS_resolver_radb(),AS_resolver_cymru() ) def __init__(self, *reslist): if reslist: self.resolvers_list = reslist @@ -104,10 +104,18 @@ class AS_resolver_multi(AS_resolver): todo = ips ret = [] for ASres in self.resolvers_list: - res = ASres.resolve(*todo) + try: + res = ASres.resolve(*todo) + except socket.error as e: + if e[0] in [errno.ECONNREFUSED, errno.ETIMEDOUT, errno.ECONNRESET]: + continue resolved = [ ip for ip,asn,desc in res ] todo = [ ip for ip in todo if ip not in resolved ] ret += res + if len(todo) == 0: + break + if len(ips) != len(ret): + raise RuntimeError("Could not contact whois providers") return ret diff --git a/test/regression.uts b/test/regression.uts index d53fe23e1384ce4e60c408ff3bf577add160c33e..a432d7500bb976d28301332f60be02682d5277b1 100644 --- a/test/regression.uts +++ b/test/regression.uts @@ -481,7 +481,7 @@ success = False for i in xrange(5): try: ret = conf.AS_resolver.resolve("8.8.8.8", "8.8.4.4") - except socket.error: + except RuntimeError: time.sleep(2) else: success = True @@ -489,7 +489,7 @@ for i in xrange(5): assert (len(ret) == 2) -all(x[1] == 15169 for x in ret) +all(x[1] == "AS15169" for x in ret) ############