Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stopping agents ungracefully feature #72

Merged
merged 7 commits into from
Nov 22, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/wazuh_qa_framework/global_variables/daemons.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
WAZUH_DB_DAEMON = 'wazuh-db'
AGENT_DAEMON = 'wazuh-agentd'

WAZUH_ANGENT_WINDOWS_SERVICE_NAME = 'WazuhSvc'
WAZUH_AGENT_WINDOWS_SERVICE_NAME = 'WazuhSvc'


WAZUH_AGENT_DAEMONS = [LOGCOLLECTOR_DAEMON, SYSCHECK_DAEMON, EXEC_DAEMON, MODULES_DAEMON, AGENT_DAEMON]
Expand Down
16 changes: 16 additions & 0 deletions src/wazuh_qa_framework/system/host_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -632,6 +632,22 @@ def install_package(self, host, package_name, become=None, ignore_errors=False):

return result

def stop_ungracefully_process(self, host, process):
Rebits marked this conversation as resolved.
Show resolved Hide resolved
Rebits marked this conversation as resolved.
Show resolved Hide resolved
"""Stop ungracefully a process.

Args:
host (str): Hostname.
process (str): Name of the process to be stopped.
"""
try:
if self.is_windows(host):
self.run_command(host, f'taskkill /F /IM {process}')
else:
self.run_command(host, f'pkill -9 {process}')
Rebits marked this conversation as resolved.
Show resolved Hide resolved

except Exception as e:
raise Exception(f"An error occurred while stopping the process. {e}")

def uninstall_package(self, host, package_name, become=None, ignore_errors=False):
"""Uninstall a package on a host.

Expand Down
56 changes: 33 additions & 23 deletions src/wazuh_qa_framework/system/wazuh_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@

import os
import re
from functools import partial
Rebits marked this conversation as resolved.
Show resolved Hide resolved
from multiprocessing.pool import ThreadPool

from wazuh_qa_framework.generic_modules.logging.base_logger import BaseLogger
from wazuh_qa_framework.global_variables.daemons import WAZUH_ANGENT_WINDOWS_SERVICE_NAME
from wazuh_qa_framework.global_variables.daemons import WAZUH_AGENT_WINDOWS_SERVICE_NAME
from wazuh_qa_framework.system.host_manager import HostManager


Expand Down Expand Up @@ -518,7 +519,7 @@ def restart_agent(self, host):
host (str): Hostname
"""
self.logger.debug(f'Restarting agent {host}')
service_name = WAZUH_ANGENT_WINDOWS_SERVICE_NAME if self.is_windows(host) else 'wazuh-agent'
service_name = WAZUH_AGENT_WINDOWS_SERVICE_NAME if self.is_windows(host) else 'wazuh-agent'
if self.is_agent(host):
self.control_service(host, service_name, 'restarted')
self.logger.debug(f'Agent {host} restarted successfully')
Expand Down Expand Up @@ -557,7 +558,7 @@ def restart_managers(self, manager_list, parallel=True):
"""Restart managers

Args:
manager_list (list): Managers list
manager_list (list): Managers list.
parallel (bool, optional): Parallel execution. Defaults to True.
"""
self.logger.info(f'Restarting managers: {manager_list}')
Expand All @@ -568,34 +569,43 @@ def restart_managers(self, manager_list, parallel=True):
self.restart_manager(manager)
self.logger.info(f'Managers restarted successfully: {manager_list}')

def stop_agent(self, host):
"""Stop agent
def stop_agent(self, host, gracefully=True):
Rebits marked this conversation as resolved.
Show resolved Hide resolved
"""Stop agent.

Args:
host (str): Hostname
host (str): Hostname.
gracefully (bool): Stop gracefully. Defaults to True.
"""
self.logger.debug(f'Stopping agent {host}')
service_name = WAZUH_ANGENT_WINDOWS_SERVICE_NAME if is_windows(host) else 'wazuh-agent'
type = 'gracefully' if gracefully else 'ungracefully'
self.logger.debug(f'Stopping {type} {host}')
service_name = WAZUH_AGENT_WINDOWS_SERVICE_NAME if self.is_windows(host) else 'wazuh-agent'
if self.is_agent(host):
self.control_service(host, service_name, 'stopped')
self.logger.debug(f'Agent {host} stopped successfully')
if gracefully:
self.control_service(host, service_name, 'stopped')

Rebits marked this conversation as resolved.
Show resolved Hide resolved
if not gracefully:
Rebits marked this conversation as resolved.
Show resolved Hide resolved
process = 'wazuh-agent.exe' if self.is_windows(host) else 'wazuh-agent'
self.stop_ungracefully_process(host, process)

self.logger.info(f'Agent {host} stopped {type}')
Rebits marked this conversation as resolved.
Show resolved Hide resolved

else:
raise ValueError(f'Host {host} is not an agent')
raise ValueError(f'Host {host} is not an Agent')
Rebits marked this conversation as resolved.
Show resolved Hide resolved

def stop_agents(self, agent_list=None, parallel=True):
"""Stop agents
def stop_agents(self, agent_list=None, parallel=True, gracefully=True):
"""Stop agents.

Args:
agent_list(list, optional): Agents list. Defaults to None
agent_list (list, optional): Agents list. Defaults to None.
parallel (bool, optional): Parallel execution. Defaults to True.
gracefully (bool): Stop gracefully. Defaults to True.
"""
self.logger.info(f'Stopping agents: {agent_list}')
if parallel:
self.pool.map(self.stop_agent, agent_list)
stop_agent_with_type = partial(self.stop_agent, gracefully=gracefully)
self.pool.map(stop_agent_with_type, agent_list)
Rebits marked this conversation as resolved.
Show resolved Hide resolved
else:
for agent in agent_list:
self.restart_agent(agent)
self.logger.info(f'Agents stopped successfully: {agent_list}')
Rebits marked this conversation as resolved.
Show resolved Hide resolved
self.stop_agent(agent, gracefully)

def stop_manager(self, host):
"""Stop manager
Expand Down Expand Up @@ -632,7 +642,7 @@ def start_agent(self, host):
host (str): Hostname
"""
self.logger.debug(f'Starting agent {host}')
service_name = WAZUH_ANGENT_WINDOWS_SERVICE_NAME if is_windows(host) else 'wazuh-agent'
service_name = WAZUH_AGENT_WINDOWS_SERVICE_NAME if self.is_windows(host) else 'wazuh-agent'
if self.is_agent(host):
self.control_service(host, service_name, 'started')
self.logger.debug(f'Agent {host} started successfully')
Expand Down Expand Up @@ -727,11 +737,11 @@ def stop_environment(self, parallel=True):
self.pool.map(self.stop_agent, agent_list)
else:
self.logger.info(message='Stopping environment: Managers')
for manager in get_managers():
for manager in agent_list:
Rebits marked this conversation as resolved.
Show resolved Hide resolved
self.stop_manager(manager)

self.logger.info(message='Stopping environment: Agents')
for agent in get_agents():
for agent in agent_list:
self.stop_agent(agent)

self.logger.info('Stopping environment')
Expand All @@ -754,11 +764,11 @@ def start_environment(self, parallel=True):
self.pool.map(self.start_agent, agent_list)
else:
self.logger.info(message='Starting environment: Managers')
for manager in get_managers():
for manager in manager_list:
self.start_manager(manager)

self.logger.info(message='Starting environment: Agents')
for agent in get_agents():
for agent in agent_list:
self.start_agent(agent)

self.logger.info('Environment started successfully')
Expand Down
Loading