def __init__(self, parent=None): QMainWindow.__init__(self, parent) self.ui = Ui_MainWindow() self.ui.setupUi(self) self.api = Api.ApiOS() self.baseManager = bm.BaseManager() self.scannerManager = sm.ScannerManager() self.pathBase = self.baseManager.loadSettings() if (self.pathBase is None): self.pathBase = "" self.ui.tbBasePath.setText(self.pathBase) #self.ui.btnRun.clicked.connect(lambda: self.startScan()) # Обработчик сигнала self.signalCount.connect(self.signalCountHandler, Qt.QueuedConnection) self.signalFindVirus.connect(self.signalFindVirusHandler, Qt.QueuedConnection) self.signalScanFolder.connect(self.signalScanFolderHandler, Qt.QueuedConnection) self.signalScanFile.connect(self.signalScanFileHandler, Qt.QueuedConnection) self.signalCommit.connect(self.signalCommitHandler, Qt.QueuedConnection)
class ScannerManager: isStop = False api = Api.ApiOS() def thread(my_func): def wrapper(*args, **kwargs): my_thread = threading.Thread(target=my_func, args=args, kwargs=kwargs) my_thread.start() return wrapper @thread def ScanAll(self, path, signalCount, signalFindVirus, signalScanFolder, signalScanFile, commit, virusBase, settings): gen = fm.getGeneratorForFolder(path) i = 0 countVirus = 0 for item in gen: if (self.isStop): commit.emit({"status": "commit"}) return for file in item[2]: signalScanFile.emit({"file": file}) signalScanFolder.emit({"folder": item[0]}) result = self.checkFileWithBase( { "name": file, "path": item[0] + "\\" + file }, virusBase, settings) if (result != None): countVirus += 1 signalFindVirus.emit({ "count": countVirus, "newFinds": result }) i += 1 signalCount.emit({"countScan": i}) commit.emit({"status": "commit"}) def checkFileWithBase(self, file, virusBase, settings): cm = CheckingManager.CheckingManager() for virusPattern in virusBase: if (settings['FileNameScan'] != "unused"): for name in virusPattern['fnames']: if (name == ""): continue if (cm.CheckingName( file['name'], name, settings['FileNameScan'] == "Selected")): return { "file": file, "pattern": name, "virus": virusPattern, "type": "in_name" } if (settings['FileExiptionScan'] != "unused"): for fexeption in virusPattern['fexeptions']: if (fexeption == ""): continue if (cm.CheckingExtension( file['name'], fexeption, settings['FileExiptionScan'] == "Selected")): return { "file": file, "pattern": fexeption, "virus": virusPattern, "type": "in_exeption" } if (settings['FileScan'] != "unused"): for data in virusPattern['patterns']: if (data == ""): continue if (cm.ChackingFileByBinaryPattern(file['path'], data)): return { "file": file, "pattern": data, "virus": virusPattern, "type": "in_exeption" } return None
class CheckingManager: api = Api.ApiOS() def splitFileName(self, fileName): sep = '.' vals = fileName.split(sep) name = "" extension = "" for i in range(len(vals)): if (i == 0): name = vals[i] continue if (i < len(vals) - 1): name += sep + vals[i] continue extension = vals[i] return {"name": name, "extension": extension} def CheckingName(self, fileName, pattern, deepScan=False): file = self.splitFileName(fileName) if (not deepScan): if (unicode(file['name']) == pattern and not unicode(file['extension']) in self.api.EXCEPTIONS): return True else: if (unicode(file['name']).find(pattern) > -1 and not unicode(file['extension']) in self.api.EXCEPTIONS): return True return False def CheckingExtension(self, fileName, pattern, deepScan=False): file = self.splitFileName(fileName) if (not deepScan): if (unicode(file['extension']) == pattern and not unicode(file['extension']) in self.api.EXCEPTIONS): return True else: if (unicode(file['extension']).find(pattern) > -1 and not unicode(file['extension']) in self.api.EXCEPTIONS): return True return False def ChackingFileByBinaryPattern(self, path, pattern): try: file = self.splitFileName(path) if (unicode(file['extension']) in self.api.EXCEPTIONS): return False with open(path, 'rb', 0) as file, \ closing(mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ)) as s: if (s.find(pattern) != -1): return True except: return False return False def CheckWithGenerator(): gen = FileManager.getGeneratorForFolder()