-
Notifications
You must be signed in to change notification settings - Fork 0
/
Visual.py
119 lines (101 loc) · 4.88 KB
/
Visual.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
106
107
108
109
110
111
112
113
114
115
116
117
#Traffic flow
#!Author: Sacco Giuseppe
from threading import Thread, Lock, Condition
import threading
from tabulate import tabulate
from scapy.all import *
from socket import *
import psutil
from datetime import datetime
import os
from subprocess import Popen, PIPE
class Visual(Thread):
def __init__(self, pkt_str):
threading.Thread.__init__(self)
self.term = threading.Event()
self.pkt_str = pkt_str
# This threads is responsible to create flows and show it.
# At each iteration the thread scann all the port to find new
# processes activated.
# When new packets arrive, the thread use the function
# "tryUpdateFlows" which update the statistics of the flow with
# the information about the packet, if the correspective flow exists.
# If this flow there isn't then new bidirectional flow is created.
def run(self):
keys = self.pkt_str.flowStyle.keys()
while not self.term.is_set():
self.pkt_str._lockPkts.acquire()
while len(self.pkt_str.unanalizedPkt) == 0 and not self.term.is_set():
self.pkt_str._lockPkts.wait()
newlist = self.pkt_str.unanalizedPkt.copy()
self.pkt_str.unanalizedPkt.clear()
self.pkt_str._lockPkts.release()
connections = psutil.net_connections()
#for c in connections:
# print(psutil.Process(c.pid).name(), c.pid, c.status)
#subprocess.call('clear', shell=True)
#for proc in psutil.process_iter(['pid', 'name']):
#print(proc.info)
#op = os.popen("netstat -tupn").readlines()
#for p in op:
# print(p)
if not self.term.is_set():
for p in newlist:
insert = 0
if p['in/out'] == 'in':
port = p['port dst']
elif p['in/out'] == 'out':
port = p['port src']
insert = self.pkt_str.tryUpdateFlow(p, port)
if not insert :
t=0
for c in connections:
if port == c.laddr[1]:
flow = self.pkt_str.flowStyle.copy()
if p['in/out'] == 'in':
flow['Name'] = psutil.Process(c.pid).name()
flow['PID'] = c.pid
flow['protocol'] = p['protocol']
flow['bytes in'] = p['bytes']
flow['bytes out'] = 0
flow['packets'] = 1
flow['local IP'] = p['IP dst']
flow['local port'] = port
flow['remote IP'] = p['IP src']
flow['remote port'] = p['port src']
flow['last update'] = datetime.now()
self.pkt_str.flows.append(flow)
t=1
break
elif p['in/out'] == 'out':
flow['Name'] = psutil.Process(c.pid).name()
flow['PID'] = c.pid
flow['protocol'] = p['protocol']
flow['bytes in'] = 0
flow['bytes out'] = p['bytes']
flow['packets'] = 1
flow['local IP'] = p['IP src']
flow['local port'] = port
flow['remote IP'] = p['IP dst']
flow['remote port'] = p['port dst']
flow['last update'] = datetime.now()
self.pkt_str.flows.append(flow)
t=1
break
if t == 0:
with self.pkt_str._lockPkts :
self.pkt_str.insertPkt(p)
#purge of flows inactive for 15 seconds
self.pkt_str.flows = [f for f in self.pkt_str.flows
if not (datetime.now() - f['last update']).seconds >= 15
]
newlist.clear()
#-------------------------------------------------------------------------------------------#
#print information about flows
subprocess.call('clear', shell=True)
table = []
for i in self.pkt_str.flows :
d = i.values()
table.append(d)
print(tabulate(table, keys))
time.sleep(0.5)