def test_run_wdb_command_ko(connect_mock): with patch('wazuh.core.wdb.WazuhDBConnection._send', side_effect=[['due', 'chunk1'], ['err', 'chunk2'], ['ok', 'chunk3'], ['due', 'chunk4']]): mywdb = WazuhDBConnection() with pytest.raises(exception.WazuhInternalError, match=".* 2007 .* chunk2"): mywdb.run_wdb_command("global sync-agent-info-get ")
def remove_bulk_agents(agent_ids_list: KeysView, logger): """ Removes files created by agents in worker nodes. This function doesn't remove agents from client.keys since the client.keys file is overwritten by the master node. :param agent_ids_list: List of agents ids to remove. :param logger: Logger to use :return: None. """ def remove_agent_file_type(agent_files: List[str]): """ Removes files if they exist :param agent_files: Path regexes of the files to remove :return: None """ for filetype in agent_files: filetype_glob = filetype.format(ossec_path=common.ossec_path, id='*', name='*', ip='*') filetype_agent = {filetype.format(ossec_path=common.ossec_path, id=a['id'], name=a['name'], ip=a['ip']) for a in agent_info} for agent_file in set(glob.iglob(filetype_glob)) & filetype_agent: logger.debug2("Removing {}".format(agent_file)) if os.path.isdir(agent_file): shutil.rmtree(agent_file) else: os.remove(agent_file) if not agent_ids_list: return # the function doesn't make sense if there is no agents to remove logger.info("Removing files from {} agents".format(len(agent_ids_list))) logger.debug("Agents to remove: {}".format(', '.join(agent_ids_list))) # Remove agents in group of 500 elements (so wazuh-db socket is not saturated) for agents_ids_sublist in itertools.zip_longest(*itertools.repeat(iter(agent_ids_list), 500), fillvalue='0'): agents_ids_sublist = list(filter(lambda x: x != '0', agents_ids_sublist)) # Get info from DB agent_info = Agent.get_agents_overview(q=",".join(["id={}".format(i) for i in agents_ids_sublist]), select=['ip', 'id', 'name'], limit=None)['items'] logger.debug2("Removing files from agents {}".format(', '.join(agents_ids_sublist))) files_to_remove = ['{ossec_path}/queue/rootcheck/({name}) {ip}->rootcheck', '{ossec_path}/queue/diff/{name}', '{ossec_path}/queue/agent-groups/{id}', '{ossec_path}/queue/rids/{id}', '{ossec_path}/var/db/agents/{name}-{id}.db'] remove_agent_file_type(files_to_remove) logger.debug2("Removing agent group assigments from database") # remove agent from groups wdb_conn = WazuhDBConnection() query_to_execute = 'global sql delete from belongs where {}'.format(' or '.join([ 'id_agent = {}'.format(agent_id) for agent_id in agents_ids_sublist ])) wdb_conn.run_wdb_command(query_to_execute) logger.info("Agent files removed")
def test_run_wdb_command(connect_mock): with patch('wazuh.core.wdb.WazuhDBConnection._send', side_effect=[['due', 'chunk1'], ['due', 'chunk2'], ['ok', 'chunk3'], ['due', 'chunk4']]): mywdb = WazuhDBConnection() result = mywdb.run_wdb_command("global sync-agent-info-get ") assert result == ['chunk1', 'chunk2', 'chunk3']