Skip to content

Commit

Permalink
fix(#5215): Adding port, process check, basic_info and connection
Browse files Browse the repository at this point in the history
  • Loading branch information
pro-akim committed Apr 16, 2024
1 parent fb7f85d commit 427f465
Show file tree
Hide file tree
Showing 10 changed files with 312 additions and 20 deletions.
80 changes: 79 additions & 1 deletion deployability/modules/testing/tests/helpers/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,18 @@ def register_agent(inventory_path, manager_path):
]

Executor.execute_commands(inventory_path, commands)
assert internal_ip in Executor.execute_command(inventory_path, f'cat {WAZUH_CONF}'), logger.error(f'Error configuring the Manager IP ({internal_ip})in: {HostInformation.get_os_name_and_version_from_inventory(inventory_path)} agent')
assert internal_ip in Executor.execute_command(inventory_path, f'cat {WAZUH_CONF}'), logger.error(f'Error configuring the Manager IP ({internal_ip}) in: {HostInformation.get_os_name_and_version_from_inventory(inventory_path)} agent')


@staticmethod
def set_protocol_agent_connection(inventory_path, protocol):
commands = [
f"sed -i 's/<protocol>[^<]*<\/protocol>/<protocol>{protocol}<\/protocol>/g' {WAZUH_CONF}",
"systemctl restart wazuh-agent"
]

Executor.execute_commands(inventory_path, commands)
assert protocol in Executor.execute_command(inventory_path, f'cat {WAZUH_CONF}'), logger.error(f'Error configuring the protocol ({protocol}) in: {HostInformation.get_os_name_and_version_from_inventory(inventory_path)} agent')


@staticmethod
Expand Down Expand Up @@ -284,6 +295,32 @@ def assert_results(result) -> None:
assert result[category][action] == [], logger.error(f'{result[category][action]} was found in: {category}{action}')


def areAgent_processes_active(agent_params):
"""
Check if agent processes are active
Args:
agent_name (str): Agent name.
Returns:
str: Os name.
"""
return bool([int(numero) for numero in Executor.execute_command(agent_params, 'pgrep wazuh').splitlines()])


def isAgent_port_open(agent_params):
"""
Check if agent port is open
Args:
agent_name (str): Agent name.
Returns:
str: Os name.
"""
return 'ESTABLISHED' in Executor.execute_command(agent_params, 'lsof -i -P | grep ESTABLISHED | grep 1514')


def get_agents_information(wazuh_api: WazuhAPI) -> list:
"""
Get information about agents.
Expand Down Expand Up @@ -359,6 +396,47 @@ def get_agent_ip_status_and_name_by_id(wazuh_api: WazuhAPI, identifier):
return [None, None, None]


def get_agent_os_version_by_name(wazuh_api: WazuhAPI, agent_name):
"""
Get Agent os version by Agent name
Args:
agent_name (str): Agent name.
Returns:
str: Os version.
"""
response = requests.get(f"{wazuh_api.api_url}/agents", headers=wazuh_api.headers, verify=False)
try:
for agent_data in eval(response.text)['data']['affected_items']:
if agent_data.get('name') == agent_name:
return agent_data.get('os', {}).get('version')
except Exception as e:
logger.error(f"Unexpected error: {e}")
return f"Unexpected error: {e}"


def get_agent_os_name_by_name(wazuh_api: WazuhAPI, agent_name):
"""
Get Agent os name by Agent name
Args:
agent_name (str): Agent name.
Returns:
str: Os name.
"""
response = requests.get(f"{wazuh_api.api_url}/agents", headers=wazuh_api.headers, verify=False)
try:
for agent_data in eval(response.text)['data']['affected_items']:
if agent_data.get('name') == agent_name:
return agent_data.get('os', {}).get('name').lower()
except Exception as e:
logger.error(f"Unexpected error: {e}")
return f"Unexpected error: {e}"
return None


def add_agent_to_manager(wazuh_api: WazuhAPI, name, ip) -> str:
"""
Add an agent to the manager.
Expand Down
11 changes: 11 additions & 0 deletions deployability/modules/testing/tests/helpers/generic.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,17 @@ def get_os_name_and_version_from_inventory(inventory_path) -> tuple:
else:
return None

@staticmethod
def get_os_version_from_inventory(inventory_path) -> str:
if 'manager' in inventory_path:
os_version = re.search(r".*?/manager-linux-.*?-(.*?)-.*?/inventory.yaml", inventory_path).group(1)
elif 'agent' in inventory_path:
os_version = re.search(r".*?/agent-linux-.*?-(.*?)-.*?/inventory.yaml", inventory_path).group(1)
return os_version
else:
return None


@staticmethod
def get_current_dir(inventory_path) -> str:
"""
Expand Down
83 changes: 83 additions & 0 deletions deployability/modules/testing/tests/test_agent/test_basic_info.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Copyright (C) 2015, Wazuh Inc.
# Created by Wazuh, Inc. <[email protected]>.
# This program is a free software; you can redistribute it and/or modify it under the terms of GPLv2

import pytest
import re

from ..helpers.agent import WazuhAgent, WazuhAPI
from ..helpers.constants import WAZUH_ROOT
from ..helpers.generic import HostConfiguration, HostInformation, GeneralComponentActions, Waits
from ..helpers.logger.logger import logger
from ..helpers.manager import WazuhManager
from ..helpers.utils import Utils


@pytest.fixture(scope="module", autouse=True)
def wazuh_params(request):
wazuh_version = request.config.getoption('--wazuh_version')
wazuh_revision = request.config.getoption('--wazuh_revision')
dependencies = request.config.getoption('--dependencies')
targets = request.config.getoption('--targets')
live = request.config.getoption('--live')

return {
'wazuh_version': wazuh_version,
'wazuh_revision': wazuh_revision,
'dependencies': dependencies,
'targets': targets,
'live': live
}


@pytest.fixture(scope="module", autouse=True)
def setup_test_environment(wazuh_params):
targets = wazuh_params['targets']
# Clean the string and split it into key-value pairs
targets = targets.replace(' ', '')
targets = targets.replace(' ', '')
pairs = [pair.strip() for pair in targets.strip('{}').split(',')]
targets_dict = dict(pair.split(':') for pair in pairs)

wazuh_params['master'] = targets_dict.get('wazuh-1')
wazuh_params['workers'] = [value for key, value in targets_dict.items() if key.startswith('wazuh-') and key != 'wazuh-1']
wazuh_params['agents'] = [value for key, value in targets_dict.items() if key.startswith('agent')]
wazuh_params['indexers'] = [value for key, value in targets_dict.items() if key.startswith('node-')]
wazuh_params['dashboard'] = targets_dict.get('dashboard', wazuh_params['master'])

# If there are no indexers, we choose wazuh-1 by default
if not wazuh_params['indexers']:
wazuh_params['indexers'].append(wazuh_params['master'])
wazuh_params['managers'] = {key: value for key, value in targets_dict.items() if key.startswith('wazuh-')}
wazuh_params['agents'] = {key + '-' + re.findall(r'agent-(.*?)/', value)[0].replace('.',''): value for key, value in targets_dict.items() if key.startswith('agent')}

updated_agents = {}
for agent_name, agent_params in wazuh_params['agents'].items():
Utils.check_inventory_connection(agent_params)
if GeneralComponentActions.isComponentActive(agent_params, 'wazuh-agent') and GeneralComponentActions.hasAgentClientKeys(agent_params):
if HostInformation.get_client_keys(agent_params) != []:
client_name = HostInformation.get_client_keys(agent_params)[0]['name']
updated_agents[client_name] = agent_params
else:
updated_agents[agent_name] = agent_params
if updated_agents != {}:
wazuh_params['agents'] = updated_agents

def test_wazuh_os_version(wazuh_params):
wazuh_api = WazuhAPI(wazuh_params['master'])
for agent_names, agent_params in wazuh_params['agents'].items():
assert HostInformation.dir_exists(agent_params, WAZUH_ROOT), logger.error(f'The {WAZUH_ROOT} is not present in {HostInformation.get_os_name_and_version_from_inventory(agent_params)}')
expected_condition_func = lambda: 'active' == WazuhAgent.get_agent_status(wazuh_api, agent_names)
Waits.dynamic_wait(expected_condition_func, cycles=20, waiting_time=30)
assert HostInformation.get_os_version_from_inventory(agent_params) in WazuhAgent.get_agent_os_version_by_name(wazuh_api, agent_names), logger.error('There is a mismatch between the OS and the OS of the installed agent')
assert HostInformation.get_os_name_from_inventory(agent_params) in WazuhAgent.get_agent_os_name_by_name(wazuh_api, agent_names), logger.error('There is a mismatch between the OS version and the OS version of the installed agent')


def test_wazuh_version(wazuh_params):
for agent_names, agent_params in wazuh_params['agents'].items():
assert wazuh_params['wazuh_version'] in GeneralComponentActions.get_component_version(agent_params), logger.error(f"The version {HostInformation.get_os_name_and_version_from_inventory(agent_params)} is not {wazuh_params['wazuh_version']} by command")


def test_wazuh_revision(wazuh_params):
for agent_names, agent_params in wazuh_params['agents'].items():
assert wazuh_params['wazuh_revision'] in GeneralComponentActions.get_component_revision(agent_params), logger.error(f"The revision {HostInformation.get_os_name_and_version_from_inventory(agent_params)} is not {wazuh_params['wazuh_revision']} by command")
100 changes: 100 additions & 0 deletions deployability/modules/testing/tests/test_agent/test_connection.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
# Copyright (C) 2015, Wazuh Inc.
# Created by Wazuh, Inc. <[email protected]>.
# This program is a free software; you can redistribute it and/or modify it under the terms of GPLv2

import pytest
import re

from ..helpers.agent import WazuhAgent, WazuhAPI
from ..helpers.generic import HostInformation, GeneralComponentActions, Waits
from ..helpers.manager import WazuhManager, WazuhAPI
from ..helpers.logger.logger import logger
from ..helpers.utils import Utils


@pytest.fixture(scope="module", autouse=True)
def wazuh_params(request):
wazuh_version = request.config.getoption('--wazuh_version')
wazuh_revision = request.config.getoption('--wazuh_revision')
dependencies = request.config.getoption('--dependencies')
targets = request.config.getoption('--targets')
live = request.config.getoption('--live')

return {
'wazuh_version': wazuh_version,
'wazuh_revision': wazuh_revision,
'dependencies': dependencies,
'targets': targets,
'live': live
}


@pytest.fixture(scope="module", autouse=True)
def setup_test_environment(wazuh_params):
targets = wazuh_params['targets']
# Clean the string and split it into key-value pairs
targets = targets.replace(' ', '')
targets = targets.replace(' ', '')
pairs = [pair.strip() for pair in targets.strip('{}').split(',')]
targets_dict = dict(pair.split(':') for pair in pairs)

wazuh_params['master'] = targets_dict.get('wazuh-1')
wazuh_params['workers'] = [value for key, value in targets_dict.items() if key.startswith('wazuh-') and key != 'wazuh-1']
wazuh_params['agents'] = [value for key, value in targets_dict.items() if key.startswith('agent')]
wazuh_params['indexers'] = [value for key, value in targets_dict.items() if key.startswith('node-')]
wazuh_params['dashboard'] = targets_dict.get('dashboard', wazuh_params['master'])

# If there are no indexers, we choose wazuh-1 by default
if not wazuh_params['indexers']:
wazuh_params['indexers'].append(wazuh_params['master'])
wazuh_params['managers'] = {key: value for key, value in targets_dict.items() if key.startswith('wazuh-')}
wazuh_params['agents'] = {key + '-' + re.findall(r'agent-(.*?)/', value)[0].replace('.',''): value for key, value in targets_dict.items() if key.startswith('agent')}

updated_agents = {}
for agent_name, agent_params in wazuh_params['agents'].items():
Utils.check_inventory_connection(agent_params)
if GeneralComponentActions.isComponentActive(agent_params, 'wazuh-agent') and GeneralComponentActions.hasAgentClientKeys(agent_params):
if HostInformation.get_client_keys(agent_params) != []:
client_name = HostInformation.get_client_keys(agent_params)[0]['name']
updated_agents[client_name] = agent_params
else:
updated_agents[agent_name] = agent_params
if updated_agents != {}:
wazuh_params['agents'] = updated_agents


def test_connection(wazuh_params):
for agent_names, agent_params in wazuh_params['agents'].items():
WazuhAgent.set_protocol_agent_connection(agent_params, 'tcp')
assert agent_names in WazuhManager.get_agent_control_info(wazuh_params['master']), f'The {agent_names} is not present in the master by command'
wazuh_api = WazuhAPI(wazuh_params['master'])
assert any(d.get('name') == agent_names for d in WazuhAgent.get_agents_information(wazuh_api)), logger.error(f'The {agent_names} is not present in the master by API')


def test_status(wazuh_params):
for agent in wazuh_params['agents'].values():
assert 'active' in GeneralComponentActions.get_component_status(agent, 'wazuh-agent'), logger.error(f'The {HostInformation.get_os_name_and_version_from_inventory(agent)} is not active')


def test_service(wazuh_params):
wazuh_api = WazuhAPI(wazuh_params['master'])
for agent_names, agent_params in wazuh_params['agents'].items():
assert GeneralComponentActions.isComponentActive(agent_params, 'wazuh-agent'), logger.error(f'{agent_names} is not active by API')

expected_condition_func = lambda: 'active' == WazuhAgent.get_agent_status(wazuh_api, agent_names)
Waits.dynamic_wait(expected_condition_func, cycles=20, waiting_time=30)


def test_clientKeys(wazuh_params):
for agent_names, agent_params in wazuh_params['agents'].items():
assert GeneralComponentActions.hasAgentClientKeys(agent_params), logger.error(f'{agent_names} has not ClientKeys file')


def test_port(wazuh_params):
for agent_names, agent_params in wazuh_params['agents'].items():
assert WazuhAgent.isAgent_port_open(agent_params), logger.error('Port is closed')


def test_processes(wazuh_params):
for agent_names, agent_params in wazuh_params['agents'].items():
assert WazuhAgent.areAgent_processes_active(agent_params), logger.error('Agent processes are not active')
Original file line number Diff line number Diff line change
Expand Up @@ -95,11 +95,3 @@ def test_status(wazuh_params):
assert 'loaded' in agent_status, logger.error(f'The {HostInformation.get_os_name_and_version_from_inventory(agent)} status is not loaded')


def test_version(wazuh_params):
for agent_names, agent_params in wazuh_params['agents'].items():
assert wazuh_params['wazuh_version'] in GeneralComponentActions.get_component_version(agent_params), logger.error(f"The version {HostInformation.get_os_name_and_version_from_inventory(agent_params)} is not {wazuh_params['wazuh_version']} by command")


def test_revision(wazuh_params):
for agent_names, agent_params in wazuh_params['agents'].items():
assert wazuh_params['wazuh_revision'] in GeneralComponentActions.get_component_revision(agent_params), logger.error(f"The revision {HostInformation.get_os_name_and_version_from_inventory(agent_params)} is not {wazuh_params['wazuh_revision']} by command")
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,10 @@ def setup_test_environment(wazuh_params):
if updated_agents != {}:
wazuh_params['agents'] = updated_agents

def test_registration(wazuh_params):
for agent_names, agent_params in wazuh_params['agents'].items():
WazuhAgent.register_agent(agent_params, wazuh_params['master'])


def test_status(wazuh_params):
for agent_names, agent_params in wazuh_params['agents'].items():
WazuhAgent.register_agent(agent_params, wazuh_params['master'])
for agent in wazuh_params['agents'].values():
assert 'active' in GeneralComponentActions.get_component_status(agent, 'wazuh-agent'), logger.error(f'The {HostInformation.get_os_name_and_version_from_inventory(agent)} is not active')

Expand All @@ -79,7 +77,7 @@ def test_connection(wazuh_params):
assert any(d.get('name') == agent_names for d in WazuhAgent.get_agents_information(wazuh_api)), logger.error(f'The {agent_names} is not present in the master by API')


def test_isActive(wazuh_params):
def test_service(wazuh_params):
wazuh_api = WazuhAPI(wazuh_params['master'])
for agent_names, agent_params in wazuh_params['agents'].items():
assert GeneralComponentActions.isComponentActive(agent_params, 'wazuh-agent'), logger.error(f'{agent_names} is not active by API')
Expand Down
11 changes: 11 additions & 0 deletions deployability/modules/testing/tests/test_agent/test_restart.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import pytest
import re

from ..helpers.agent import WazuhAgent, WazuhAPI
from ..helpers.generic import GeneralComponentActions, HostInformation
from ..helpers.logger.logger import logger
from ..helpers.manager import WazuhManager
Expand Down Expand Up @@ -84,3 +85,13 @@ def test_isActive(wazuh_params):
def test_clientKeys(wazuh_params):
for agent_names, agent_params in wazuh_params['agents'].items():
assert GeneralComponentActions.hasAgentClientKeys(agent_params), logger.error(f'{agent_names} has not ClientKeys file')


def test_port(wazuh_params):
for agent_names, agent_params in wazuh_params['agents'].items():
assert WazuhAgent.isAgent_port_open(agent_params), logger.error('Port is closed')


def test_processes(wazuh_params):
for agent_names, agent_params in wazuh_params['agents'].items():
assert WazuhAgent.areAgent_processes_active(agent_params), logger.error('Agent processes are not active')
15 changes: 12 additions & 3 deletions deployability/modules/testing/tests/test_agent/test_stop.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,23 @@ def setup_test_environment(wazuh_params):
if updated_agents != {}:
wazuh_params['agents'] = updated_agents

def test_stop(wazuh_params):

def test_service(wazuh_params):
wazuh_api = WazuhAPI(wazuh_params['master'])
for agent_names, agent_params in wazuh_params['agents'].items():
GeneralComponentActions.component_stop(agent_params, 'wazuh-agent')

for agent_names, agent_params in wazuh_params['agents'].items():
assert 'inactive' in GeneralComponentActions.get_component_status(agent_params, 'wazuh-agent'), logger.error(f'{agent_names} is still active by command')
assert not GeneralComponentActions.isComponentActive(agent_params, 'wazuh-agent'), logger.error(f'{agent_names} is still active by command')

expected_condition_func = lambda: 'disconnected' == WazuhAgent.get_agent_status(wazuh_api, agent_names)
Waits.dynamic_wait(expected_condition_func, cycles=20, waiting_time=30)


def test_port(wazuh_params):
for agent_names, agent_params in wazuh_params['agents'].items():
assert not WazuhAgent.isAgent_port_open(agent_params), logger.error('Port is still opened')


def test_processes(wazuh_params):
for agent_names, agent_params in wazuh_params['agents'].items():
assert not WazuhAgent.areAgent_processes_active(agent_params), logger.error('Agent processes are still active')
Loading

0 comments on commit 427f465

Please sign in to comment.