-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathjob.py
96 lines (78 loc) · 3.63 KB
/
job.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
import datetime
from django.utils import timezone
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job
from flanby.settings import FLANBY_NETWORK_SCAN_JOB, FLANBY_TIME_SCAN_JOB
from .models import Server, Port
import logging
import nmap
nmScan = nmap.PortScanner()
# Get an instance of a logger
logger = logging.getLogger("flanby")
scheduler = BackgroundScheduler()
scheduler.add_jobstore(DjangoJobStore(), "default")
@register_job(scheduler, "interval", minutes=FLANBY_TIME_SCAN_JOB)
def scan_job():
logger.debug("Starting scan job!")
latest_server_list = Server.objects.all()
# logger.debug(latest_server_list[0])
nmScan = nmap.PortScanner()
nmScan.scan(hosts=FLANBY_NETWORK_SCAN_JOB)
logger.debug(nmScan)
for host in nmScan.all_hosts():
logger.debug(host)
server_id =1
if nmScan[host].state() == 'up':
value_status = True
else:
value_status = False
try:
obj = Server.objects.get(server_ip=host)
obj.status_up = value_status
obj.last_update = timezone.now()
obj.save()
server_id = obj.pk
except Server.DoesNotExist:
date_to_save = timezone.now()
obj = Server.objects.create(server_ip=host, status_up=value_status,
creation_date=date_to_save, last_update=date_to_save)
server_id = obj.pk
try:
ports_obj = Port.objects.filter(server_id=server_id).values_list('port_number', flat=True)
except Port.DoesNotExist:
exit()
for proto in nmScan[host].all_protocols():
logger.debug('| Protocol : %s' % proto)
lport = nmScan[host][proto].keys()
# lport.sort()
for port in lport:
logger.debug('-->port : %s\tstate : %s' % (port, nmScan[host][proto][port]['state']))
comment = "product: {}, extrainfo: {}, reason: {}, version: {}, conf: {}, cpe: {}".format(
nmScan[host][proto][port]['product'],
nmScan[host][proto][port]['extrainfo'],
nmScan[host][proto][port]['reason'],
nmScan[host][proto][port]['version'],
nmScan[host][proto][port]['conf'],
nmScan[host][proto][port]['cpe'])
if port in ports_obj:
try:
port_obj = Port.objects.filter(port_number=port, server_id=server_id)[0]
port_obj.last_update = timezone.now()
port_obj.status = nmScan[host][proto][port]['state']
port_obj.port_name = nmScan[host][proto][port]['name']
port_obj.comment = comment
port_obj.protocol = proto
port_obj.save()
except Port.DoesNotExist:
pass
else:
date_to_save = timezone.now()
port_obj = Port.objects.create(port_name=nmScan[host][proto][port]['name'], protocol=proto,
port_number=port, comment=comment,
status= nmScan[host][proto][port]['state'],
creation_date=date_to_save, last_update=date_to_save,
server_id=server_id)
logger.debug("Scan job done")
register_events(scheduler)
scheduler.start()
logger.debug("Scheduler started!")