def searchExitNodes(self, numberOfScans, scanIdentifier): if self.cursor is None: self.initDatabase() exitNodes = [] if scanIdentifier is None: self.cursor.execute(database.selectTorScan, (numberOfScans,)) else: self.cursor.execute(database.selectTorScanIdentifier, (scanIdentifier,)) for row in self.cursor.fetchall(): scanId, scanDate = row self.cursor.execute(database.selectTorNodeData, (scanId,)) for node in self.cursor.fetchall(): torNodeId, host, state, reason, nickName = node nodeData = TorNodeData() nodeData.id = torNodeId nodeData.host = host nodeData.state = state nodeData.reason = reason nodeData.nickName = nickName ports = self.cursor.execute(database.selectTorNodePort, (torNodeId,) ) for port in ports.fetchall(): (portId, portState, portReason, portNumber, portName, portVersion, torNode) = port nodePort = TorNodePort() nodePort.id = portId nodePort.state = portState nodePort.reason = portReason nodePort.port = portNumber nodePort.name = portName nodePort.version = portVersion nodePort.torNodeId = torNode if "open" in portState: nodeData.openPorts.append(nodePort) else: nodeData.closedFilteredPorts.append(nodePort) exitNodes.append(nodeData) return exitNodes