Why is Qt Designer not displaying my network scan

31 views Asked by At

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)`

0

There are 0 answers