I'm working on building a network detection application using python3. I'm working in Pycharm. I'm scanning using nmap. I'm having trouble displaying the scan results in QT designer. I've gotten as far as clicking my scan button however nothing displays as the scan completes. Here's my code below:
Main page main.py
`class Home(QtWidgets.QMainWindow):
def __init__(self):
super(Home, self).__init__()
self.stacked_widget = QtWidgets.QStackedWidget()
self.setCentralWidget(self.stacked_widget)
self.pages = {}
self.home_page(Dashboard(self), 'dashboard')
self.home_page(Stats(), 'stats')
self.home_page(Details(), 'details')
self.home_page(Data(), 'data')
self.home_page(Threats(), 'threats')
self.goto('dashboard')
def home_page(self, page, name):
self.pages[name] = page
self.stacked_widget.addWidget(page)
if isinstance(page, PageWindow):
page.gotoSignal.connect(self.goto)
@QtCore.pyqtSlot(str)
def goto(self, name):
if name in self.pages:
self.stacked_widget.setCurrentWidget(self.pages[name])
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
home = Home()
dashboard = Dashboard(home)
dashboard.show()
dashboard.showMaximized()
sys.exit(app.exec_())`
My scanner page scan_thread.py
`
class ScanThread(QtCore.QThread):
scan_complete = QtCore.pyqtSignal(list)
def __init__(self, parent=None):
super(ScanThread, self).__init__(parent)
self.parent = parent
def __def__(self):
self.wait()
def run(self):
nm = nmap.PortScanner()
nm.scan(hosts='192.168.1.0/24', arguments='-p- --open -sV')
self.results = []
for host in nm.all_hosts():
for proto in nm[host].all_protocols():
lport = nm[host][proto].keys()
sorted(lport)
for port in lport:
result = dict()
result['Host'] = host
result['Port'] = port
result['Protocol'] = proto
result['State'] = nm[host][proto][port]['state']
result['Address'] = ', '.join(nm[host][proto][port].get('addresses', {}).values())
result['OP System'] = nm[host][proto][port].get('osmatch', [{'name': ''}])[0]['name']
result['Product'] = nm[host][proto][port].get('product', '')
self.results.append(result)
self.scan_complete.emit(self.results)`
My dashboard page dashboard_page.py
`
class Dashboard(PageWindow):
def __init__(self, home):
super(Dashboard, self).__init__()
self.resultsTable = None
self.scanThread = ScanThread(self)
uic.loadUi('ui/dashboard.ui', self)
self.home = home
self.display_results([])
self.statsMenu.mousePressEvent = lambda event: self.goto_page('stats')
self.detailsMenu.mousePressEvent = lambda event: self.goto_page('details')
self.dataMenu.mousePressEvent = lambda event: self.goto_page('data')
self.threatsMenu.mousePressEvent = lambda event: self.goto_page('threats')
self.scanBtn.clicked.connect(self.scan_host)
def goto_page(self, event):
self.goto(event)
def scan_host(self):
self.scanBtn.setEnabled(False)
self.scanBtn.setText('Scanning...')
self.scanThread = ScanThread(self)
self.scanThread.scan_complete.connect(self.display_results)
self.scanThread.scan_complete.connect(self.update_scan_results)
self.scanThread.scan_complete.connect(self.scan_finished)
self.scanThread.start()
def display_results(self, results):
if not self.resultsTable:
self.resultsTable = QTableWidget(self)
self.layout().addWidget(self.resultsTable)
self.resultsTable.setColumnCount(8)
self.resultsTable.setRowCount(len(results))
for i, result in enumerate(results):
self.resultsTable.setItem(i, 0, QtWidgets.QTableWidgetItem(result['Host']))
self.resultsTable.setItem(i, 1, QtWidgets.QTableWidgetItem(result['State']))
self.resultsTable.setItem(i, 5, QtWidgets.QTableWidgetItem(' '))
self.resultsTable.setItem(i, 6, QtWidgets.QTableWidgetItem(result['OP System']))
open_ports = 0
closed_ports = 0
scanned_ports = 0
for port in result.get('ports', []):
if port.get('state', '') == 'open':
open_ports += 1
elif port.get('state', '') == 'closed':
closed_ports += 1
scanned_ports = len(result.get('ports', []))
self.resultsTable.setItem(i, 2, QtWidgets.QTableWidgetItem(str(open_ports)))
self.resultsTable.setItem(i, 3, QtWidgets.QTableWidgetItem(str(closed_ports)))
self.resultsTable.setItem(i, 4, QtWidgets.QTableWidgetItem(str(scanned_ports)))
self.scanBtn.setEnabled(True)
self.scanBtn.setText('Scan')
def update_scan_results(self, results):
self.display_results(results)
# Display the new scan results
for i, result in enumerate(results):
self.resultsTable.setItem(i, 0, QtWidgets.QTableWidgetItem(result['Host']))
self.resultsTable.setItem(i, 1, QtWidgets.QTableWidgetItem(result['State']))
self.resultsTable.setItem(i, 5, QtWidgets.QTableWidgetItem(' '))
self.resultsTable.setItem(i, 6, QtWidgets.QTableWidgetItem(result['OP System']))
open_ports = 0
closed_ports = 0
scanned_ports = 0
for port in result.get('ports', []):
if port.get('state', '') == 'open':
open_ports += 1
elif port.get('state', '') == 'closed':
closed_ports += 1
scanned_ports = len(result.get('ports', []))
self.resultsTable.setItem(i, 2, QtWidgets.QTableWidgetItem(str(open_ports)))
self.resultsTable.setItem(i, 3, QtWidgets.QTableWidgetItem(str(closed_ports)))
self.resultsTable.setItem(i, 4, QtWidgets.QTableWidgetItem(str(scanned_ports)))
def scan_finished(self):
self.scanThread.scan_complete.disconnect(self.display_results)
self.scanThread.scan_complete.disconnect(self.update_scan_results)
self.scanThread.scan_complete.disconnect(self.scan_finished)
self.scanThread.deleteLater()
def clear_scan_results(self):
self.resultsTable.clearContents()
self.resultsTable.setRowCount(0)`