-
Notifications
You must be signed in to change notification settings - Fork 1
/
ip_scanner.py
executable file
·105 lines (92 loc) · 3.26 KB
/
ip_scanner.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!/usr/bin/env python
import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web
import os
import re
import yaml
import iptools
import time
from sh import nmap
from dns import reversename, resolver
def config():
config_path = os.path.join(os.path.dirname(__file__), 'config.yaml')
with file(config_path, 'r') as config_file:
config_dict = yaml.load(config_file)
return config_dict
def scan_subnets(subnets):
nmap_args = ["-nsP"] + [item for item in subnets]
vlans = nmap(nmap_args)
ip_patt = '(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
p = re.compile(ip_patt)
#p.findall(vlans.stdout)
active_ips = p.findall(vlans.stdout)
#storage_ips = [iptools.IpRangeList(subnet) for subnet in subnets]
subnet_ips = {subnet: iptools.IpRangeList(subnet) for subnet in subnets}
ip_usage = {}
for subnet, ip_range in subnet_ips.iteritems():
ip_list = []
for ip in ip_range:
#print ip
try:
host = reversename.from_address(ip)
#in case there are multiple reverse entries for a
#given IP
names = [nm.to_text() for nm in resolver.query(host, 'PTR')]
name = ','.join(names)
except resolver.NXDOMAIN:
name = ''
if ip in active_ips:
ip_list.append([ip, 'ACTIVE', name])
else:
ip_list.append([ip, 'INACTIVE', name])
ip_usage[subnet] = ip_list
return ip_usage
def ip_poll():
print("ip scan start")
global ip_scan
ip_scan = scan_subnets(config()['subnets'])
print("ip scan stop")
class mainHandler(tornado.web.RequestHandler):
def get(self):
global ip_scan
if ip_scan == []:
raise tornado.web.HTTPError(504)
else:
#ip_usage = disp_storage_ips(ip_nets)
self.render('ip_table.tpl', ip_usage=ip_scan)
class JSONHandler(tornado.web.RequestHandler):
def get(self):
global ip_scan
self.write(ip_scan)
settings = {
'static_path': os.path.join(os.path.dirname(__file__), 'static'),
'template_path': os.path.join(os.path.dirname(__file__), 'templates')
}
application = tornado.web.Application([
(r'/old', mainHandler),
(r'/(index\.html)', tornado.web.StaticFileHandler,
{'path': settings['template_path']}),
(r'/', tornado.web.RedirectHandler, {'url': '/index.html'}),
(r'/ip_scan.json', JSONHandler),
], **settings)
if __name__ == '__main__':
import signal
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(config()['port_listen'])
loop = tornado.ioloop.IOLoop.instance()
def sigint_handler(signum, frame):
print('signal handler called with %s, frame %s' % (signum, frame))
periodic_cbk.stop()
loop.stop()
signal.signal(signal.SIGINT, sigint_handler)
signal.signal(signal.SIGHUP, sigint_handler)
signal.signal(signal.SIGTERM, sigint_handler)
poll_interval = config()['poll_interval']
periodic_cbk = tornado.ioloop.PeriodicCallback(ip_poll,
poll_interval*60*1000,
loop)
periodic_cbk.start()
ip_poll()
loop.start()