root/scapy/as_resolvers.py

Revision 893:28f0720f809f, 3.1 kB (checked in by Phil <phil@secdev.org>, 4 months ago)

Fix imports

Line 
1 ## This file is part of Scapy
2 ## See http://www.secdev.org/projects/scapy for more informations
3 ## Copyright (C) Philippe Biondi <phil@secdev.org>
4 ## This program is published under a GPLv2 license
5
6 import socket
7 from config import conf
8
9 class AS_resolver:
10     server = None
11     options = "-k"
12     def __init__(self, server=None, port=43, options=None):
13         if server is not None:
14             self.server = server
15         self.port = port
16         if options is not None:
17             self.options = options
18        
19     def _start(self):
20         self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
21         self.s.connect((self.server,self.port))
22         if self.options:
23             self.s.send(self.options+"\n")
24             self.s.recv(8192)
25     def _stop(self):
26         self.s.close()
27        
28     def _parse_whois(self, txt):
29         asn,desc = None,""
30         for l in txt.splitlines():
31             if not asn and l.startswith("origin:"):
32                 asn = l[7:].strip()
33             if l.startswith("descr:"):
34                 if desc:
35                     desc += r"\n"
36                 desc += l[6:].strip()
37             if asn is not None and desc:
38                 break
39         return asn,desc.strip()
40
41     def _resolve_one(self, ip):
42         self.s.send("%s\n" % ip)
43         x = ""
44         while not ("%" inor "source" in x):
45             x += self.s.recv(8192)
46         asn, desc = self._parse_whois(x)
47         return ip,asn,desc
48     def resolve(self, *ips):
49         self._start()
50         ret = []
51         for ip in ips:
52             ip,asn,desc = self._resolve_one(ip)
53             if asn is not None:
54                 ret.append((ip,asn,desc))
55         self._stop()
56         return ret
57
58 class AS_resolver_riswhois(AS_resolver):
59     server = "riswhois.ripe.net"
60     options = "-k -M -1"
61
62
63 class AS_resolver_radb(AS_resolver):
64     server = "whois.ra.net"
65     options = "-k -M"
66    
67
68 class AS_resolver_cymru(AS_resolver):
69     server = "whois.cymru.com"
70     options = None
71     def resolve(self, *ips):
72         ASNlist = []
73         s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
74         s.connect((self.server,self.port))
75         s.send("begin\r\n"+"\r\n".join(ips)+"\r\nend\r\n")
76         r = ""
77         while 1:
78             l = s.recv(8192)
79             if l == "":
80                 break
81             r += l
82         s.close()
83         for l in r.splitlines()[1:]:
84             if "|" not in l:
85                 continue
86             asn,ip,desc = map(str.strip, l.split("|"))
87             if asn == "NA":
88                 continue
89             asn = int(asn)
90             ASNlist.append((ip,asn,desc))
91         return ASNlist
92
93 class AS_resolver_multi(AS_resolver):
94     resolvers_list = ( AS_resolver_cymru(),AS_resolver_riswhois(),AS_resolver_radb() )
95     def __init__(self, *reslist):
96         if reslist:
97             self.resolvers_list = reslist
98     def resolve(self, *ips):
99         todo = ips
100         ret = []
101         for ASres in self.resolvers_list:
102             res = ASres.resolve(*todo)
103             resolved = [ ip for ip,asn,desc in res ]
104             todo = [ ip for ip in todo if ip not in resolved ]
105             ret += res
106         return ret
107
108
109 conf.AS_resolver = AS_resolver_multi()
Note: See TracBrowser for help on using the browser.