async def put_api_config(request, pretty=False, wait_for_complete=False): """Update current API configuration with the given one. :param pretty: Show results in human-readable format :param wait_for_complete: Disable timeout response """ # Check body parameters Body.validate_content_type(request, expected_content_type='application/json') try: f_kwargs = {"updated_config": await request.json()} except JSONDecodeError: raise_if_exc(WazuhError(code=1018)) dapi = DistributedAPI( f=manager.update_api_config, f_kwargs=remove_nones_to_dict(f_kwargs), request_type='local_any', is_async=False, wait_for_complete=wait_for_complete, logger=logger, rbac_permissions=request['token_info']['rbac_policies']) data = raise_if_exc(await dapi.distribute_function()) return web.json_response(data=data, status=200, dumps=prettify if pretty else dumps)
async def add_policy(request, pretty: bool = False, wait_for_complete: bool = False): """Add one specified policy. Parameters ---------- request : connexion.request pretty : bool, optional Show results in human-readable format wait_for_complete : bool, optional Disable timeout response Returns ------- Policy information """ # Get body parameters Body.validate_content_type(request, expected_content_type='application/json') f_kwargs = await PolicyModel.get_kwargs(request) dapi = DistributedAPI( f=security.add_policy, f_kwargs=remove_nones_to_dict(f_kwargs), request_type='local_master', is_async=False, wait_for_complete=wait_for_complete, logger=logger, rbac_permissions=request['token_info']['rbac_policies']) data = raise_if_exc(await dapi.distribute_function()) return web.json_response(data=data, status=200, dumps=prettify if pretty else dumps)
async def run_logtest_tool(request, pretty: bool = False, wait_for_complete: bool = False): """Get the logtest output after sending a JSON to its socket. Parameters ---------- pretty : bool Show results in human-readable format. wait_for_complete : bool Disable timeout response. Returns ------- Data Logtest result after analyzing the event. """ Body.validate_content_type(request, expected_content_type='application/json') f_kwargs = await LogtestModel.get_kwargs(request) dapi = DistributedAPI( f=logtest.run_logtest, f_kwargs=remove_nones_to_dict(f_kwargs), request_type='local_master', is_async=False, wait_for_complete=wait_for_complete, logger=logger, rbac_permissions=request['token_info']['rbac_policies']) data = raise_if_exc(await dapi.distribute_function()) return web.json_response(data=data, status=200, dumps=prettify if pretty else dumps)
async def run_command(request, agents_list='*', pretty=False, wait_for_complete=False): """Runs an Active Response command on a specified agent :param agents_list: List of Agents IDs. All possible values from 000 onwards :param pretty: Show results in human-readable format :param wait_for_complete: Disable timeout response :return: message """ # Get body parameters Body.validate_content_type(request, expected_content_type='application/json') f_kwargs = await ActiveResponseModel.get_kwargs( request, additional_kwargs={'agent_list': agents_list}) dapi = DistributedAPI( f=active_response.run_command, f_kwargs=remove_nones_to_dict(f_kwargs), request_type='distributed_master', is_async=False, wait_for_complete=wait_for_complete, logger=logger, broadcasting=agents_list == '*', rbac_permissions=request['token_info']['rbac_policies']) data = raise_if_exc(await dapi.distribute_function()) return web.json_response(data=data, status=200, dumps=prettify if pretty else dumps)
async def update_rule(request, rule_id: int, pretty: bool = False, wait_for_complete: bool = False): """Update the information of one specified rule. Parameters ---------- request : connexion.request rule_id : int Specific rule id in the system to be updated pretty : bool, optional Show results in human-readable format wait_for_complete : bool, optional Disable timeout response Returns ------- Rule information updated """ # Get body parameters Body.validate_content_type(request, expected_content_type='application/json') f_kwargs = await RuleModel.get_kwargs(request, additional_kwargs={'rule_id': rule_id}) dapi = DistributedAPI(f=security.update_rule, f_kwargs=remove_nones_to_dict(f_kwargs), request_type='local_master', is_async=False, wait_for_complete=wait_for_complete, logger=logger, rbac_permissions=request['token_info']['rbac_policies'] ) data = raise_if_exc(await dapi.distribute_function()) return web.json_response(data=data, status=200, dumps=prettify if pretty else dumps)
async def put_api_config(request, pretty=False, wait_for_complete=False, nodes_list='*'): """Update current API configuration with the given one. :param pretty: Show results in human-readable format :param wait_for_complete: Disable timeout response :param nodes_list: List of node ids """ Body.validate_content_type(request, expected_content_type='application/json') updated_conf = await APIConfigurationModel.get_kwargs(request) f_kwargs = {'node_list': nodes_list, 'updated_config': updated_conf} nodes = raise_if_exc(await get_system_nodes()) dapi = DistributedAPI( f=manager.update_api_config, f_kwargs=remove_nones_to_dict(f_kwargs), request_type='distributed_master', is_async=False, wait_for_complete=wait_for_complete, logger=logger, broadcasting=nodes_list == '*', rbac_permissions=request['token_info']['rbac_policies'], nodes=nodes) data = raise_if_exc(await dapi.distribute_function()) return web.json_response(data=data, status=200, dumps=prettify if pretty else dumps)
async def put_security_config(request, pretty=False, wait_for_complete=False): """Update current security configuration with the given one Parameters ---------- request pretty : bool Show results in human-readable format wait_for_complete : bool Disable timeout response Returns ------- dict: Status message """ Body.validate_content_type(request, expected_content_type='application/json') f_kwargs = {'updated_config': await SecurityConfigurationModel.get_kwargs(request)} dapi = DistributedAPI(f=security.update_security_config, f_kwargs=remove_nones_to_dict(f_kwargs), request_type='local_master', is_async=False, wait_for_complete=wait_for_complete, logger=logger, rbac_permissions=request['token_info']['rbac_policies'] ) data = raise_if_exc(await dapi.distribute_function()) await security_revoke_tokens() return web.json_response(data=data, status=200, dumps=prettify if pretty else dumps)
async def update_user(request, user_id: str, pretty=False, wait_for_complete=False): """Modify an existent user. Parameters ---------- request : connexion.request user_id : str User ID of the user to be updated pretty : bool, optional Show results in human-readable format wait_for_complete : bool, optional Disable timeout response Returns ------- User data """ Body.validate_content_type(request, expected_content_type='application/json') f_kwargs = await UpdateUserModel.get_kwargs(request, additional_kwargs={'user_id': user_id}) dapi = DistributedAPI(f=security.update_user, f_kwargs=remove_nones_to_dict(f_kwargs), request_type='local_master', is_async=False, logger=logger, rbac_permissions=request['token_info']['rbac_policies'], wait_for_complete=wait_for_complete ) data = raise_if_exc(await dapi.distribute_function()) return web.json_response(data=data, status=200, dumps=prettify if pretty else dumps)
async def add_agent(request, pretty=False, wait_for_complete=False): """Add a new Wazuh agent. :param pretty: Show results in human-readable format :param wait_for_complete: Disable timeout response :return: AgentIdKey """ # Get body parameters Body.validate_content_type(request, expected_content_type='application/json') f_kwargs = await AgentAddedModel.get_kwargs(request) f_kwargs['use_only_authd'] = configuration.api_conf['use_only_authd'] dapi = DistributedAPI( f=agent.add_agent, f_kwargs=remove_nones_to_dict(f_kwargs), request_type='local_master', is_async=False, wait_for_complete=wait_for_complete, logger=logger, rbac_permissions=request['token_info']['rbac_policies']) data = raise_if_exc(await dapi.distribute_function()) return web.json_response(data=data, status=200, dumps=prettify if pretty else dumps)
async def put_files(request, body, overwrite=False, pretty=False, wait_for_complete=False, path=None): """Upload file in manager or local_node. :param body: Body request with the content of the file to be uploaded :param overwrite: If set to false, an exception will be raised when updating contents of an already existing filename. :param pretty: Show results in human-readable format :param wait_for_complete: Disable timeout response :param path: Filepath to return. """ # Parse body to utf-8 Body.validate_content_type(request, expected_content_type='application/octet-stream') parsed_body = Body.decode_body(body, unicode_error=1911, attribute_error=1912) f_kwargs = {'path': path, 'overwrite': overwrite, 'content': parsed_body} dapi = DistributedAPI(f=manager.upload_file, f_kwargs=remove_nones_to_dict(f_kwargs), request_type='local_any', is_async=False, wait_for_complete=wait_for_complete, logger=logger, rbac_permissions=request['token_info']['rbac_policies'] ) data = raise_if_exc(await dapi.distribute_function()) return web.json_response(data=data, status=200, dumps=prettify if pretty else dumps)
async def put_group_config(request, body, group_id, pretty=False, wait_for_complete=False): """Update group configuration. Update an specified group's configuration. This API call expects a full valid XML file with the shared configuration tags/syntax. :param body: Body parameters :param pretty: Show results in human-readable format :param wait_for_complete: Disable timeout response :param group_id: Group ID. :return: ApiResponse """ # Parse body to utf-8 Body.validate_content_type(request, expected_content_type='application/xml') parsed_body = Body.decode_body(body, unicode_error=2006, attribute_error=2007) f_kwargs = {'group_list': [group_id], 'file_data': parsed_body} dapi = DistributedAPI(f=agent.upload_group_file, f_kwargs=remove_nones_to_dict(f_kwargs), request_type='local_master', is_async=False, wait_for_complete=wait_for_complete, logger=logger, rbac_permissions=request['token_info']['rbac_policies'] ) data = raise_if_exc(await dapi.distribute_function()) return web.json_response(data=data, status=200, dumps=prettify if pretty else dumps)
async def post_group(request, pretty=False, wait_for_complete=False): """Create a new group. Parameters ---------- pretty : bool Show results in human-readable format. wait_for_complete : bool Disable timeout response. Returns ------- ApiResponse """ # Get body parameters Body.validate_content_type(request, expected_content_type='application/json') f_kwargs = await GroupAddedModel.get_kwargs(request) dapi = DistributedAPI(f=agent.create_group, f_kwargs=remove_nones_to_dict(f_kwargs), request_type='local_master', is_async=False, wait_for_complete=wait_for_complete, logger=logger, rbac_permissions=request['token_info']['rbac_policies'] ) data = raise_if_exc(await dapi.distribute_function()) return web.json_response(data=data, status=200, dumps=prettify if pretty else dumps)
async def insert_agent(request, pretty=False, wait_for_complete=False): """Insert a new agent :param pretty: Show results in human-readable format :param wait_for_complete: Disable timeout response :return: AgentIdKey """ # Get body parameters Body.validate_content_type(request, expected_content_type='application/json') f_kwargs = await AgentInsertedModel.get_kwargs(request) # Get IP if not given if not f_kwargs['ip']: if configuration.api_conf['behind_proxy_server']: try: f_kwargs['ip'] = request.headers['X-Forwarded-For'] except KeyError: raise_if_exc(WazuhError(1120)) else: peername = request.transport.get_extra_info('peername') if peername is not None: f_kwargs['ip'], _ = peername f_kwargs['use_only_authd'] = configuration.api_conf['use_only_authd'] dapi = DistributedAPI(f=agent.add_agent, f_kwargs=remove_nones_to_dict(f_kwargs), request_type='local_master', is_async=False, wait_for_complete=wait_for_complete, logger=logger, rbac_permissions=request['token_info']['rbac_policies'] ) data = raise_if_exc(await dapi.distribute_function()) return web.json_response(data=data, status=200, dumps=prettify if pretty else dumps)
async def update_configuration(request, body, pretty=False, wait_for_complete=False): """Update manager's or local_node's configuration (ossec.conf). Parameters ---------- pretty : bool, optional Show results in human-readable format. It only works when `raw` is False (JSON format). Default `True` wait_for_complete : bool, optional Disable response timeout or not. Default `False` """ # Parse body to utf-8 Body.validate_content_type( request, expected_content_type='application/octet-stream') parsed_body = Body.decode_body(body, unicode_error=1911, attribute_error=1912) f_kwargs = {'new_conf': parsed_body} dapi = DistributedAPI( f=manager.update_ossec_conf, f_kwargs=remove_nones_to_dict(f_kwargs), request_type='local_any', is_async=False, wait_for_complete=wait_for_complete, logger=logger, rbac_permissions=request['token_info']['rbac_policies']) data = raise_if_exc(await dapi.distribute_function()) return web.json_response(data=data, status=200, dumps=prettify if pretty else dumps)
async def put_file(request, body, filename=None, overwrite=False, pretty=False, wait_for_complete=False): """Upload a rule file. Parameters ---------- body : dict Body request with the file content to be uploaded. filename : str, optional Name of the file. Default `None` overwrite : bool, optional If set to false, an exception will be raised when updating contents of an already existing file. Default `False` pretty : bool, optional Show results in human-readable format. Default `False` wait_for_complete : bool, optional Disable timeout response. Default `False` Returns ------- web.json_response """ # Parse body to utf-8 Body.validate_content_type( request, expected_content_type='application/octet-stream') parsed_body = Body.decode_body(body, unicode_error=1911, attribute_error=1912) f_kwargs = { 'filename': filename, 'overwrite': overwrite, 'content': parsed_body } dapi = DistributedAPI( f=rule_framework.upload_rule_file, f_kwargs=remove_nones_to_dict(f_kwargs), request_type='local_master', is_async=False, wait_for_complete=wait_for_complete, logger=logger, rbac_permissions=request['token_info']['rbac_policies']) data = raise_if_exc(await dapi.distribute_function()) return web.json_response(data=data, status=200, dumps=prettify if pretty else dumps)
async def put_files_node(request, body, node_id, path, overwrite=False, pretty=False, wait_for_complete=False): """Upload file contents in a specified cluster node. :param body: Body request with the content of the file to be uploaded :param node_id: Cluster node name :param path: Filepath to upload the new file :param overwrite: If set to false, an exception will be raised when uploading an already existing filename. :param pretty: Show results in human-readable format :param wait_for_complete: Disable timeout response """ # parse body to utf-8 parsed_body = Body.decode_body(body, unicode_error=1911, attribute_error=1912) f_kwargs = {'node_id': node_id, 'path': path, 'overwrite': overwrite, 'content': parsed_body} nodes = await get_system_nodes() dapi = DistributedAPI(f=manager.upload_file, f_kwargs=remove_nones_to_dict(f_kwargs), request_type='distributed_master', is_async=False, wait_for_complete=wait_for_complete, logger=logger, rbac_permissions=request['token_info']['rbac_policies'], nodes=nodes, cluster_required=True ) data = raise_if_exc(await dapi.distribute_function()) return web.json_response(data=data, status=200, dumps=prettify if pretty else dumps)