class Scheduler: """Tasks Scheduler. This class is responsible for the main execution loop of the tool. It prepares the analysis machines and keep waiting and loading for new analysis tasks. Whenever a new task is available, it launches AnalysisManager which will take care of running the full analysis process and operating with the assigned analysis machine. """ def __init__(self): self.running = True self.cfg = Config() self.db = Database() def initialize(self): """Initialize the machine manager.""" global mmanager mmanager_name = self.cfg.cuckoo.machine_manager log.info("Using \"%s\" machine manager", mmanager_name) # Get registered class name. Only one machine manager is imported, # therefore there should be only one class in the list. plugin = list_plugins("machinemanagers")[0] # Initialize the machine manager. mmanager = plugin() # Find its configuration file. conf = os.path.join(CUCKOO_ROOT, "conf", "%s.conf" % mmanager_name) if not os.path.exists(conf): raise CuckooCriticalError("The configuration file for machine " "manager \"{0}\" does not exist at path: " "{1}".format(mmanager_name, conf)) # Provide a dictionary with the configuration options to the # machine manager instance. mmanager.set_options(Config(conf)) # Initialize the machine manager. mmanager.initialize(mmanager_name) # At this point all the available machines should have been identified # and added to the list. If none were found, Cuckoo needs to abort the # execution. if mmanager.machines().count() == 0: raise CuckooCriticalError("No machines available") else: log.info("Loaded %s machine/s", mmanager.machines().count()) def stop(self): """Stop scheduler.""" self.running = False # Shutdown machine manager (used to kill machines that still alive). mmanager.shutdown() def start(self): """Start scheduler.""" self.initialize() log.info("Waiting for analysis tasks...") # This loop runs forever. while self.running: time.sleep(1) # If no machines are available, it's pointless to fetch for # pending tasks. Loop over. if mmanager.availables() == 0: continue # Fetch a pending analysis task. task = self.db.fetch_and_process() if task: log.debug("Processing task #%s", task.id) # Initialize the analysis manager. analysis = AnalysisManager(task) # Start. analysis.start()
class Scheduler: """Tasks Scheduler. This class is responsible for the main execution loop of the tool. It prepares the analysis machines and keep waiting and loading for new analysis tasks. Whenever a new task is available, it launches AnalysisManager which will take care of running the full analysis process and operating with the assigned analysis machine. """ def __init__(self): self.running = True self.cfg = Config() self.db = Database() def initialize(self): """Initialize the machine manager.""" global mmanager mmanager_name = self.cfg.cuckoo.machine_manager log.info("Using \"%s\" machine manager", mmanager_name) # Get registered class name. Only one machine manager is imported, # therefore there should be only one class in the list. plugin = list_plugins("machinemanagers")[0] # Initialize the machine manager. mmanager = plugin() # Find its configuration file. conf = os.path.join(CUCKOO_ROOT, "conf", "%s.conf" % mmanager_name) if not os.path.exists(conf): raise CuckooCriticalError( "The configuration file for machine " "manager \"{0}\" does not exist at path: " "{1}".format(mmanager_name, conf)) # Provide a dictionary with the configuration options to the # machine manager instance. mmanager.set_options(Config(conf)) # Initialize the machine manager. mmanager.initialize(mmanager_name) # At this point all the available machines should have been identified # and added to the list. If none were found, Cuckoo needs to abort the # execution. if mmanager.machines().count() == 0: raise CuckooCriticalError("No machines available") else: log.info("Loaded %s machine/s", mmanager.machines().count()) def stop(self): """Stop scheduler.""" self.running = False # Shutdown machine manager (used to kill machines that still alive). mmanager.shutdown() def start(self): """Start scheduler.""" self.initialize() log.info("Waiting for analysis tasks...") # This loop runs forever. while self.running: time.sleep(1) # If no machines are available, it's pointless to fetch for # pending tasks. Loop over. if mmanager.availables() == 0: continue # Fetch a pending analysis task. task = self.db.fetch_and_process() if task: log.debug("Processing task #%s", task.id) # Initialize the analysis manager. analysis = AnalysisManager(task) # Start. analysis.start()