def test_prepare_nvt_prefs_no_prefs(self, mock_kb): w = DummyDaemon() p = PreferenceHandler('456-789', mock_kb, w.scan_collection, None) p._nvts_params = {} p.kbdb.add_scan_preferences = MagicMock() p.prepare_nvt_preferences() p.kbdb.add_scan_preferences.assert_not_called()
def test_prepare_nvt_prefs_no_prefs(self, mock_kb): dummy = DummyDaemon() p_handler = PreferenceHandler( '456-789', mock_kb, dummy.scan_collection, None ) p_handler._nvts_params = {} # pylint: disable = protected-access p_handler.kbdb.add_scan_preferences = MagicMock() p_handler.prepare_nvt_preferences() p_handler.kbdb.add_scan_preferences.assert_not_called()
def test_prepare_nvt_prefs(self, mock_kb): w = DummyDaemon() alive_test_out = [ "1.3.6.1.4.1.25623.1.0.100315:1:checkbox:Do a TCP ping|||no" ] p = PreferenceHandler('1234-1234', mock_kb, w.scan_collection, None) p._nvts_params = { "1.3.6.1.4.1.25623.1.0.100315:1:checkbox:Do a TCP ping": "no" } p.kbdb.add_scan_preferences = MagicMock() p.prepare_nvt_preferences() p.kbdb.add_scan_preferences.assert_called_with( p.scan_id, alive_test_out, )
def test_prepare_nvt_prefs(self, mock_kb): dummy = DummyDaemon() alive_test_out = [ "1.3.6.1.4.1.25623.1.0.100315:1:checkbox:Do a TCP ping|||no" ] p_handler = PreferenceHandler( '1234-1234', mock_kb, dummy.scan_collection, None ) p_handler._nvts_params = { # pylint: disable = protected-access "1.3.6.1.4.1.25623.1.0.100315:1:checkbox:Do a TCP ping": "no" } p_handler.kbdb.add_scan_preferences = MagicMock() p_handler.prepare_nvt_preferences() p_handler.kbdb.add_scan_preferences.assert_called_with( p_handler.scan_id, alive_test_out, )
def exec_scan(self, scan_id: str): """ Starts the OpenVAS scanner for scan_id scan. """ do_not_launch = False kbdb = self.main_db.get_new_kb_database() scan_prefs = PreferenceHandler(scan_id, kbdb, self.scan_collection, self.nvti) kbdb.add_scan_id(scan_id) scan_prefs.prepare_target_for_openvas() if not scan_prefs.prepare_ports_for_openvas(): self.add_scan_error(scan_id, name='', host='', value='No port list defined.') do_not_launch = True # Set credentials if not scan_prefs.prepare_credentials_for_openvas(): self.add_scan_error(scan_id, name='', host='', value='Malformed credential.') do_not_launch = True if not scan_prefs.prepare_plugins_for_openvas(): self.add_scan_error(scan_id, name='', host='', value='No VTS to run.') do_not_launch = True scan_prefs.prepare_main_kbindex_for_openvas() scan_prefs.prepare_host_options_for_openvas() scan_prefs.prepare_scan_params_for_openvas(OSPD_PARAMS) scan_prefs.prepare_reverse_lookup_opt_for_openvas() scan_prefs.prepare_alive_test_option_for_openvas() # VT preferences are stored after all preferences have been processed, # since alive tests preferences have to be able to overwrite default # preferences of ping_host.nasl for the classic method. scan_prefs.prepare_nvt_preferences() scan_prefs.prepare_boreas_alive_test() # Release memory used for scan preferences. del scan_prefs if do_not_launch or kbdb.scan_is_stopped(scan_id): self.main_db.release_database(kbdb) return result = Openvas.start_scan( scan_id, not self.is_running_as_root and self.sudo_available, self._niceness, ) if result is None: self.main_db.release_database(kbdb) return ovas_pid = result.pid kbdb.add_scan_process_id(ovas_pid) logger.debug('pid = %s', ovas_pid) # Wait until the scanner starts and loads all the preferences. while kbdb.get_status(scan_id) == 'new': res = result.poll() if res and res < 0: self.stop_scan_cleanup(scan_id) logger.error( 'It was not possible run the task %s, since openvas ended ' 'unexpectedly with errors during launching.', scan_id, ) return time.sleep(1) got_results = False while True: target_is_finished = kbdb.target_is_finished(scan_id) openvas_process_is_alive = self.is_openvas_process_alive( kbdb, ovas_pid, scan_id) if not target_is_finished and not openvas_process_is_alive: logger.error( 'Task %s was unexpectedly stopped or killed.', scan_id, ) self.add_scan_error( scan_id, name='', host='', value='Task was unexpectedly stopped or killed.', ) # check for scanner error messages before leaving. self.report_openvas_results(kbdb, scan_id) kbdb.stop_scan(scan_id) for scan_db in kbdb.get_scan_databases(): self.main_db.release_database(scan_db) self.main_db.release_database(kbdb) return # Wait a second before trying to get result from redis if there # was no results before. # Otherwise, wait 50 msec to give access other process to redis. if not got_results: time.sleep(1) else: time.sleep(0.05) got_results = False # Check if the client stopped the whole scan if kbdb.scan_is_stopped(scan_id): logger.debug('%s: Scan stopped by the client', scan_id) # clean main_db, but wait for scanner to finish. while not kbdb.target_is_finished(scan_id): logger.debug('%s: Waiting the scan to finish', scan_id) time.sleep(1) self.main_db.release_database(kbdb) return got_results = self.report_openvas_results(kbdb, scan_id) self.report_openvas_scan_status(kbdb, scan_id) # Scan end. No kb in use for this scan id if kbdb.target_is_finished(scan_id): logger.debug('%s: Target is finished', scan_id) break # Delete keys from KB related to this scan task. logger.debug('%s: End Target. Release main database', scan_id) self.main_db.release_database(kbdb)