Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
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)
Пример #4
0
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)
Пример #5
0
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)
Пример #6
0
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)
Пример #7
0
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)
Пример #8
0
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)
Пример #9
0
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)
Пример #10
0
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)
Пример #11
0
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)
Пример #12
0
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)
Пример #13
0
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)
Пример #14
0
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)
Пример #15
0
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)