Add fragment type in application form
[flowspy] / utils / whois.py
1 #
2 # -*- coding: utf-8 -*- vim:fileencoding=utf-8:
3 #Copyright © 2011-2013 Greek Research and Technology Network (GRNET S.A.)
4
5 #Developed by Leonidas Poulopoulos (leopoul-at-noc-dot-grnet-dot-gr),
6 #GRNET NOC
7 #
8 #Permission to use, copy, modify, and/or distribute this software for any
9 #purpose with or without fee is hereby granted, provided that the above
10 #copyright notice and this permission notice appear in all copies.
11 #
12 #THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD
13 #TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
14 #FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
15 #CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
16 #DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
17 #ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
18 #SOFTWARE.
19 #
20 import socket
21 from ipaddr import *
22 import re
23 import settings
24
25 def query(query, hostname, flags):
26     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
27     s.connect((hostname, 43))
28     # as IPv6 is not supported by flowspec for the time ommit -T route6 
29     s.send(" -i origin -r -K -T route " + query + "\r\n")
30     response = ''
31     while True:
32         d = s.recv(4096)
33         response += d
34         if not d:
35             break
36     s.close()
37     query = response.splitlines()
38     routes4 = []
39     routes6 = []
40     final_routes4 = []
41     final_routes6 = []
42     for line in query:
43         m = re.match(r"(^route6?\:\s+)(?P<subnets>\S+)", line)
44         if m:
45             if IPNetwork(m.group('subnets')).version == 4:
46                 routes4.append(IPNetwork(m.group('subnets')))
47             if IPNetwork(m.group('subnets')).version == 6:
48                 routes6.append(IPNetwork(m.group('subnets')))
49     final_routes = []
50     if len(routes4):
51         final_routes4 = collapse_address_list(routes4)
52     if len(routes6):
53         final_routes6 = collapse_address_list(routes6)
54     final_routes = final_routes4 + final_routes6
55     return final_routes
56
57 def whois(queryas):
58     routes = query(queryas,settings.PRIMARY_WHOIS, None)
59     if not routes:
60         routes = query(queryas,settings.ALTERNATE_WHOIS, None)
61     return routes