Connected devices, ping

This commit is contained in:
Kaushik 2021-12-31 01:18:20 +05:30
parent 732246ecc8
commit 400a685eac
4 changed files with 79 additions and 42 deletions

View File

@ -2,25 +2,32 @@ from PyQt5.QtGui import *
from PyQt5.QtCore import * from PyQt5.QtCore import *
from PyQt5.QtWidgets import * from PyQt5.QtWidgets import *
from scapy.all import * from scapy.all import *
from scapy.layers.l2 import ARP, Ether from network_monitor import InterfacePick
class NetworkDevices(QWidget): class NetworkDevices(QWidget):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.networkIP = ''
self.layout = QGridLayout() self.layout = QGridLayout()
self.header = QLabel("Connected hosts on the network:") self.header = QLabel("Connected hosts on the network:")
self.interfbtn = QPushButton()
self.interfbtn.setFixedSize(300, 40)
self.interfbtn.setText('[Select Network]')
self.interfbtn.clicked.connect(self.networkInterface)
self.refreshbtn = QPushButton() self.refreshbtn = QPushButton()
self.refreshbtn.setFixedSize(350, 40) self.refreshbtn.setFixedSize(350, 40)
self.refreshbtn.setText('Refresh Status') self.refreshbtn.setText('Refresh Status')
self.refreshbtn.clicked.connect(self.refreshStatus) self.refreshbtn.clicked.connect(self.getConnectedDevices)
self._createTable() self._createTable()
self.layout.addWidget(self.header, 0, 0) self.layout.addWidget(self.header, 0, 0)
self.layout.addWidget(self.refreshbtn, 0, 1) self.layout.addWidget(self.interfbtn, 0, 1)
self.layout.addWidget(self.tableWidget, 1, 0, 1, 2) self.layout.addWidget(self.refreshbtn, 0, 2)
self.layout.addWidget(self.tableWidget, 1, 0, 1, 3)
self.setLayout(self.layout) self.setLayout(self.layout)
@ -36,8 +43,8 @@ class NetworkDevices(QWidget):
self.tableWidget.setShowGrid(True) self.tableWidget.setShowGrid(True)
self.tableWidget.setGridStyle(Qt.NoPen) self.tableWidget.setGridStyle(Qt.NoPen)
self.tableWidget.setRowCount(0) self.tableWidget.setRowCount(0)
self.tableWidget.setColumnCount(3) self.tableWidget.setColumnCount(2)
self.tableWidget.setHorizontalHeaderLabels(["IP", "MAC", "Status"]) self.tableWidget.setHorizontalHeaderLabels(["IP", "MAC"])
self.tableWidget.horizontalHeader().setVisible(True) self.tableWidget.horizontalHeader().setVisible(True)
self.tableWidget.horizontalHeader().setCascadingSectionResizes(True) self.tableWidget.horizontalHeader().setCascadingSectionResizes(True)
self.tableWidget.horizontalHeader().setHighlightSections(False) self.tableWidget.horizontalHeader().setHighlightSections(False)
@ -54,21 +61,47 @@ class NetworkDevices(QWidget):
sizePolicy.setHeightForWidth( sizePolicy.setHeightForWidth(
self.tableWidget.sizePolicy().hasHeightForWidth()) self.tableWidget.sizePolicy().hasHeightForWidth())
self.tableWidget.setSizePolicy(sizePolicy) self.tableWidget.setSizePolicy(sizePolicy)
def getConnectedDevices(self):
while self.networkIP is '':
sys.stdout.write('\a')
sys.stdout.flush()
self.networkInterface()
output = subprocess.check_output(["arp", "-a"]) #get ARP table
output = output.partition(bytes(f"Interface: {self.networkIP}", 'utf-8'))[2]
output = output.split(b'Interface')[0]
output = output.split()[7:]
self.tableWidget.clearContents()
self.tableWidget.setRowCount(0)
def refreshStatus(self): for i in range(0, len(output), 3):
target_ip = "192.168.1.1/16" entry_ip = str(output[i], encoding='utf-8')
packet = Ether("ff:ff:ff:ff:ff:ff")/ARP(pdst=target_ip) entry_mac = str(output[i+1], encoding='utf-8').replace("-",":")
mul_addr = int(entry_ip.split('.')[0])
if mul_addr >= 224 and mul_addr < 240:
continue
result = srp1(packet, timeout=2, verbose=0) arpData = dict()
arpData['IP'] = entry_ip
arpData['MAC'] = entry_mac
if result is not None: self.addArpToTableWidget(arpData)
devices = []
for sent, received in result: def addArpToTableWidget(self, arpData):
# for each response, append ip and mac address to `clients` list rowpos = self.tableWidget.rowCount()
devices.append({'ip': received.psrc, 'mac': received.hwsrc}) self.tableWidget.insertRow(rowpos)
self.tableWidget.setItem(rowpos, 0, QTableWidgetItem(arpData['IP']))
self.tableWidget.setItem(rowpos, 1, QTableWidgetItem(arpData['MAC']))
# print clients self.vbar = self.tableWidget.verticalScrollBar()
print("Available devices in the network:") self._scroll = self.vbar.value() == self.vbar.maximum()
print("IP" + " "*18+"MAC")
for client in devices: def networkInterface(self):
print("{:16} {}".format(client['ip'], client['mac'])) self.interfaceDiag = InterfacePick()
self.interfaceDiag.exec_()
if hasattr(self.interfaceDiag, 'interfaceIP') and hasattr(self.interfaceDiag, 'interfaceName'):
self.networkIP = self.interfaceDiag.interfaceIP
self.interfbtn.setText(self.interfaceDiag.interfaceName)

View File

@ -232,6 +232,7 @@ class InterfacePick(QDialog):
def acceptInterfaceFn(self): def acceptInterfaceFn(self):
self.idx = self.interfaceList.selectedIndexes() self.idx = self.interfaceList.selectedIndexes()
self.interfaceName = self.idx[0].data().split('\t')[0].strip() self.interfaceName = self.idx[0].data().split('\t')[0].strip()
self.interfaceIP = self.idx[0].data().split('\t')[1].strip()
self.close() self.close()

39
ping.py
View File

@ -30,28 +30,27 @@ class Ping(QWidget):
if(len(self.host.text()) >= 1): if(len(self.host.text()) >= 1):
try: try:
packet = IP(dst=self.host.text())/ICMP() packet = IP(dst=self.host.text())/ICMP()
output = sr1(packet, timeout=2) result = ""
if output is not None:
res_type = icmptypes[output.type] for i in range(1, 6):
res_code = "" output = sr1(packet, timeout=3, verbose=0)
if output.type in icmpcodes: if output is not None:
res_code = " - "+icmpcodes[output.type][output.code] res_type = icmptypes[output.type]
ping_time = int((output.time - packet.sent_time)*1000) res_code = ""
if output.type in icmpcodes:
res_code = " - "+icmpcodes[output.type][output.code]
ping_time = int((output.time - packet.sent_time)*1000)
self.result.setText( result += "{}{} from {}:\ttime={}ms\tTTL={}\n".format(
"Ping results:\nSummary: {}\n\nType:\t\t{}{}\nTime:\t\t{}ms\nSource:\t\t{}\nDestination:\t{}\ res_type,
\nTTL:\t\t{}".format( res_code,
output.summary(), packet[IP].dst,
res_type, ping_time,
res_code, packet[IP].ttl
ping_time,
packet[IP].src,
packet[IP].dst,
packet[IP].ttl
) )
) else:
else: result += "Request timed out.\n"
self.result.setText("Request timed out.") self.result.setText(result)
except socket.gaierror: except socket.gaierror:
self.result.setText( self.result.setText(
"Invalid address/Could not get address info") "Invalid address/Could not get address info")

View File

@ -30,18 +30,22 @@ class TraceRoute(QWidget):
if(len(self.host.text()) >= 1): if(len(self.host.text()) >= 1):
try: try:
result, unans = traceroute( result, unans = traceroute(
target=self.host.text(), dport=80, verbose=0) target=self.host.text(), dport=80, verbose=0, timeout=3)
output = [] output = []
output.append("\tRoute path\t\tResponse time") output.append("\tRoute path\t\tResponse time")
result = sorted(result, key=lambda x: x[0].ttl) result = sorted(result, key=lambda x: x[0].ttl)
prev_rcv_src = ''
for snd, rcv in result: for snd, rcv in result:
if prev_rcv_src == rcv.src:
break
output.append( output.append(
str("{}\t{}\t\t{} ms".format( str("{}\t{}\t\t{} ms".format(
snd.ttl, snd.ttl,
rcv.src, rcv.src,
(int((rcv.time - snd.sent_time)*1000)) (int((rcv.time - snd.sent_time)*1000))
))) )))
prev_rcv_src = rcv.src
output.append("\nUnanswered packets: {}".format( output.append("\nUnanswered packets: {}".format(
len(unans) len(unans)
)) ))