Merge branch 'master' of https://code.grnet.gr/git/flowspy
[flowspy] / utils / whois.py
1 import socket
2 from ipaddr import *
3 import re
4 import settings
5
6 def query(query, hostname, flags):
7     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
8     s.connect((hostname, 43))
9     # as IPv6 is not supported by flowspec for the time ommit -T route6 
10     s.send(" -i origin -r -K -T route " + query + "\r\n")
11     response = ''
12     while True:
13         d = s.recv(4096)
14         response += d
15         if not d:
16             break
17     s.close()
18     query = response.splitlines()
19     routes4 = []
20     routes6 = []
21     final_routes4 = []
22     final_routes6 = []
23     for line in query:
24         m = re.match(r"(^route6?\:\s+)(?P<subnets>\S+)", line)
25         if m:
26             if IPNetwork(m.group('subnets')).version == 4:
27                 routes4.append(IPNetwork(m.group('subnets')))
28             if IPNetwork(m.group('subnets')).version == 6:
29                 routes6.append(IPNetwork(m.group('subnets')))
30     final_routes = []
31     if len(routes4):
32         final_routes4 = collapse_address_list(routes4)
33     if len(routes6):
34         final_routes6 = collapse_address_list(routes6)
35     final_routes = final_routes4 + final_routes6
36     return final_routes
37
38 def whois(queryas):
39     routes = query(queryas,settings.PRIMARY_WHOIS, None)
40     if not routes:
41         routes = query(queryas,settings.ALTERNATE_WHOIS, None)
42     return routes