From f378d993d61c8ea95f78080f2658910ff436b897 Mon Sep 17 00:00:00 2001 From: Banu Yuceer Date: Fri, 6 Jun 2025 11:37:40 +0100 Subject: [PATCH] Add support for cli mode, update docs Issue: PLATFORMPG-820761 --- CITATION.cff | 8 +- README.md | 560 +++++++++++++++--- SECURITY.md | 10 +- SUPPORT.md | 8 +- docs/asset/cs-logo-red.png | Bin 0 -> 69833 bytes docs/asset/cs-logo.png | Bin 41245 -> 54452 bytes .../complex_inputs/complex_inputs_example.py | 16 +- pyproject.toml | 52 +- setup.py | 12 +- src/crowdstrike/__init__.py | 1 + src/crowdstrike/foundry/__init__.py | 1 + src/crowdstrike/foundry/function/__init__.py | 46 +- .../foundry/function/config_loader.py | 20 +- .../foundry/function/config_loader_fs.py | 11 +- src/crowdstrike/foundry/function/context.py | 1 + src/crowdstrike/foundry/function/loader.py | 16 +- src/crowdstrike/foundry/function/mapping.py | 29 +- src/crowdstrike/foundry/function/model.py | 23 +- src/crowdstrike/foundry/function/router.py | 27 +- src/crowdstrike/foundry/function/runner.py | 13 +- .../foundry/function/runner_cli.py | 186 ++++++ .../foundry/function/runner_http.py | 62 +- test_data/requests/cli_request1.json | 7 + test_data/requests/cli_request2.json | 7 + test_data/requests/cli_request3.json | 7 + test_data/requests/cli_request4.json | 17 + test_data/requests/cli_request5.json | 7 + test_data/requests/cli_request6.json | 7 + .../foundry/function/test__init__.py | 12 +- .../foundry/function/test_cli_runner.py | 141 +++++ 30 files changed, 1082 insertions(+), 225 deletions(-) create mode 100644 docs/asset/cs-logo-red.png create mode 100644 src/crowdstrike/foundry/function/runner_cli.py create mode 100644 test_data/requests/cli_request1.json create mode 100644 test_data/requests/cli_request2.json create mode 100644 test_data/requests/cli_request3.json create mode 100644 test_data/requests/cli_request4.json create mode 100644 test_data/requests/cli_request5.json create mode 100644 test_data/requests/cli_request6.json create mode 100644 tests/crowdstrike/foundry/function/test_cli_runner.py diff --git a/CITATION.cff b/CITATION.cff index 0e783d1..eb6afea 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -17,6 +17,12 @@ authors: - given-names: Johnny family-names: Steenbergen affiliation: CrowdStrike + - given-names: Banu + family-names: Yuceer + affiliation: CrowdStrike + - given-names: Joshua + family-names: Hiller + affiliation: CrowdStrike repository-code: 'https://github.com/CrowdStrike/foundry-fn-python' url: 'https://www.crowdstrike.com' repository-artifact: 'https://pypi.org/project/crowdstrike-foundry-function/' @@ -31,7 +37,7 @@ keywords: - crowdstrike-api - crowdstrike-falcon-api - crowdstrike-foundry - - crowdstrike-ffaas + - crowdstrike-faas - python - windows - linux diff --git a/README.md b/README.md index 7a26dc4..f04e309 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,19 @@ -![CrowdStrike Falcon](https://raw.githubusercontent.com/CrowdStrike/foundry-fn-python/main/docs/asset/cs-logo.png) + + + + CrowdStrike Logo. + -# Foundry Function as a Service Python SDK +# Falcon Foundry Function as a Service Python FDK `foundry-fn-python` is a community-driven, open source project designed to enable the authoring of functions. -While not a formal CrowdStrike product, `foundry-fn-python` is maintained by CrowdStrike and supported in partnership -with the open source developer community. +While not a formal CrowdStrike product, the `foundry-fn-python` project and the `crowdstrike-foundry-function` FDK package are maintained by CrowdStrike and supported in partnership with the open source developer community. ## Installation ⚙️ -### Via `pip` +### Installation via `pip` -The SDK can be installed or updated via `pip install`: +The FDK can be installed or updated via `pip install`: ```shell python3 -m pip install crowdstrike-foundry-function @@ -18,13 +21,12 @@ python3 -m pip install crowdstrike-foundry-function ## Quickstart 💫 -### Code +### Example Code -Add the SDK to your project by following the [installation](#installation) instructions above, -then create your `handler.py`: +Add the FDK to your project by following the [installation](#installation) instructions above, +then create your `main.py` that contains your handler implementation: ```python -import logging from crowdstrike.foundry.function import ( APIError, Request, @@ -32,138 +34,512 @@ from crowdstrike.foundry.function import ( Function, ) -func = Function.instance() # *** (1) *** +func = Function.instance() + +# An example POST handler +@func.handler(method='POST', path='/my-resource') +def on_post(request: Request) -> Response: -@func.handler(method='POST', path='/create') # *** (2) *** -def on_create(request: Request, config: [dict[str, any], None], - logger: logging.Logger) -> Response: # *** (3), (4), (5) *** - if len(request.body) == 0: + # Validate the request body + if 'name' not in request.body: + # This example expects 'name' field in the request body. + # Return an error response (400 - Bad Request) if not provided by the caller return Response( code=400, - errors=[APIError(code=400, message='empty body')] + errors=[APIError(code=400, message='name field is missing from request body')] ) - ##### - # do something useful - ##### + # Process the request + new_resource_id = 1 + # ...snip... - return Response( # *** (6) *** - body={'hello': 'world'}, + # Return a success response + return Response( + body={ + 'result': f'Resource with name {request.body["name"]} is created.', + 'id': new_resource_id + }, code=200, ) -@func.handler(method='PUT', path='/update') -def on_update(request: Request) -> Response: # *** (7) *** - # do stuff +if __name__ == '__main__': + func.run() +``` + +### Example breakdown + +#### The Function object +The `Function` class wraps the Foundry Function implementation. A `Function` instance can consist of one or more handlers, with each corresponding to an endpoint. You should only have one `Function` object defined per function implemented within your Foundry application. Multiple instances will result in unexpected behavior. + +```python +func = Function.instance() +``` + +#### The function handler decorator +The handler decorator defines a Python method as handler for a specific endpoint. This handler must have the `method` and `path` keywords defined. The `method` keyword will correspond to one of the supported HTTP methods (`GET`, `POST`, `PUT`, `PATCH` or `DELETE`). The `path` keyword will define the URL used to trigger this method, and should be unique. + +```python +@func.handler(method='POST', path='/my-resource') +``` + +#### Method details - Request +Our python handler function is decorated with `@func.handler`. The first argument to our method must be a `Request` object which defines the HTTP request payload and metadata. + +A `Request` object consists of: + +* `body`: The request payload as given in the Function Gateway `body` payload field. This will be deserialized as a dictionary (`dict[str, Any]`). +* `params`: The request headers (`params.header`) and query string parameters (`params.query`). +* `url`: The request path relative to the function. This is a string. +* `method`: The request HTTP method or verb. +* `access_token`: Caller-supplied access token. + +In this example we've named our method `on_post`, but you may name the method whatever you wish. + +```python +def on_post(request: Request) -> Response: +``` + +#### Method details - Response +The return type for our method should be a `Response` object. + +##### Successful responses +A successful response will be a `Response` object containing the fields `body` (a dictionary containing the response returned to the function) and `code` (the HTTP status code returned to the function). + +```python +# Return a success response +return Response( + body={ + 'result': f'Resource with name {request.body["name"]} is created.', + 'id': new_resource_id + }, + code=200, +) +``` + +##### Error responses +An unsuccessful response will be a `Response` object containing the fields `errors` (a list of `APIError` objects) and `code` (the HTTP status code returned to the function). + +An `APIError` object will contain a `code` indicating the type of the error and a `message` which should contain the error text. + +If no `code` is provided as part of the `Response` object, this value will be derived from the greatest valid HTTP code present within the `APIError` list. + +```python +return Response( + code=400, + errors=[APIError(code=400, message='id field is missing from request params')] +) +``` + +#### Running the function +The runner method is the general starting point for execution of your function and will be executed when your code is called by Foundry. This causes the `Function` to initialize and start execution. This should be the last line of your script as code defined after the `func.run()` statement may not be executed. You may implement code before this statement as necessary. + +```python +if __name__ == '__main__': + func.run() +``` + +#### Retrieving parameters passed to your Function +You may retrieve query string values passed to your function by accessing the `request.params.query` dictionary. + +```python +resource_id = request.params.query.get("id") +``` + + +#### Additional HTTP method examples +Different types of HTTP requests will follow the same pattern demonstrated in our `POST` request above. + +##### HTTP GET + +```python +from crowdstrike.foundry.function import ( + APIError, + Request, + Response, + Function, +) + + +func = Function.instance() + +# An example GET handler +@func.handler(method='GET', path='/my-resource') +def on_get(request: Request) -> Response: + + # Fetch the requested resources + resources = [] + # ...snip... + + # Return the requested resources return Response( - # ...snip... + body={'resources': resources}, + code=200, ) -@func.handler(method='DELETE', path='/foo') -def on_delete(request: Request, config: [dict[str, any], None]) -> Response: # *** (8) *** - # do stuff +if __name__ == '__main__': + func.run() +``` + +##### HTTP PUT + +```python +from crowdstrike.foundry.function import ( + APIError, + Request, + Response, + Function, +) + + +func = Function.instance() + +# An example PUT handler +@func.handler(method='PUT', path='/my-resource') +def on_put(request: Request) -> Response: + + # Obtain the id of the resource to update from the request query parameters + resource_id = request.params.query.get('id') + if not resource_id: + # This example expects 'id' field in the request query parameters. + # Returns an error response (400 - Bad Request) if not provided by the caller + return Response( + code=400, + errors=[APIError(code=400, message='id field is missing from request params')] + ) + + # Get the update data provided in the request body and + # Update the resource with the data provided + data = request.body.get('data') + # ...snip... + + # Return success with the updated resource info return Response( - # ...snip... + body={ + 'result': f'Resource {resource_id} is updated successfully.', + 'data': data + }, + code=200, ) if __name__ == '__main__': - func.run() # *** (9) *** -``` - -1. `Function`: The `Function` class wraps the Foundry Function implementation. - Each `Function` instance consists of a number of handlers, with each handler corresponding to an endpoint. - Only one `Function` should exist per Python implementation. - Multiple `Function`s will result in undefined behavior. -2. `@func.handler`: The handler decorator defines a Python function/method as an endpoint. - At a minimum, the `handler` must have a `method` and a `path`. - The `method` must be one of `DELETE`, `GET`, `PATCH`, `POST`, and `PUT`. - The `path` corresponds to the `url` field in the request. - The SDK will provide any loaded configuration as an argument. -3. Methods decorated with `@handler` must take arguments in the order of `Request` and `dict|None` - (i.e. the request and either the configuration or nothing; see example above), - and must return a `Response`. -4. `request`: Request payload and metadata. At the time of this writing, the `Request` object consists of: - 1. `body`: The request payload as given in the Function Gateway `body` payload field. Will be deserialized as - a `dict[str, Any]`. - 2. `params`: Contains request headers and query parameters. - 3. `url`: The request path relative to the function as a string. - 4. `method`: The request HTTP method or verb. - 5. `access_token`: Caller-supplied access token. -5. `logger`: Unless there is specific reason not to, the function author should use the `Logger` provided to the - function. - When deployed, the supplied `Logger` will be formatted in a custom manner and will have fields injected to assist - with working against our internal logging infrastructure. - Failure to use the provided `Logger` can thus make triage more difficult. -6. Return from a `@handler` function: Returns a `Response` object. - The `Response` object contains fields `body` (payload of the response as a `dict`), - `code` (an `int` representing an HTTP status code), - `errors` (a list of any `APIError`s), and `header` (a `dict[str, list[str]]` of any special HTTP headers which - should be present on the response). - If no `code` is provided but a list of `errors` is, the `code` will be derived from the greatest positive valid HTTP - code present on the given `APIError`s. -7. `on_update(request: Request)`: If only one argument is provided, only a `Request` will be provided. -8. `on_delete(request: Request, config: [dict[str, any], None])`: If two arguments are provided, a `Request` and config - will be provided. -9. `func.run()`: Runner method and general starting point of execution. - Calling `run()` causes the `Function` to finish initializing and start executing. - Any code declared following this method may not necessarily be executed. - As such, it is recommended to place this as the last line of your script. + func.run() +``` + +##### HTTP DELETE + +```python +from crowdstrike.foundry.function import ( + APIError, + Request, + Response, + Function, +) + + +func = Function.instance() + +# An example DELETE handler +@func.handler(method='DELETE', path='/my-resource') +def on_delete(request: Request) -> Response: + + # Obtain the id of the resource to update from the request query parameters + resource_id = request.params.query.get('id') + if not resource_id: + # This example expects 'id' field in the request query parameters. + # Returns an error response (400 - Bad Request) if not provided by the caller + return Response( + code=400, + errors=[APIError(code=400, message='id field is missing from request params')] + ) + + # Delete the requested resource + # ...snip... + + # Return success back to the caller + return Response( + code=200, + ) + + +if __name__ == '__main__': + func.run() +``` + ### Testing locally -The SDK provides an out-of-the-box runtime for executing the function. -A basic HTTP server will be listening on port 8081. +The FDK provides an out-of-the-box runtime for executing the function. + +#### Executing your code +> [!NOTE] +> A basic HTTP server will be started to listen on port 8081 when executing your code locally. ```shell -cd my-project && python3 main.py +cd my-project +python3 main.py ``` -Requests can now be made against the executable. +You can use `curl` or another python application to make requests to the web server that has been started. + +##### Example POST request ```shell -curl -X POST 'http://localhost:8081' \ +# Test POST /my-resource request +curl --location 'http://localhost:8081' \ -H 'Content-Type: application/json' \ --data '{ "body": { - "foo": "bar" + "name": "bar" }, "method": "POST", - "url": "/create" + "url": "/my-resource" +}' +``` + +##### Example GET request + +```shell +# Test GET /my-resource request +curl --location 'http://localhost:8081' \ + -H 'Content-Type: application/json' \ + --data '{ + "method": "GET", + "url": "/my-resource" +}' +``` + +##### Example PUT request + +```shell +# Test PUT /my-resource request +curl --location 'http://localhost:8081' \ + -H 'Content-Type: application/json' \ + --data '{ + "body": { + "name": "bar", + }, + "params": { + "query": { + "id": "12345" + } + }, + "method": "PUT", + "url": "/my-resource" }' ``` -## Working with `falconpy` +##### Example DELETE request + +```shell +# Test DELETE /my-resource request +curl --location 'http://localhost:8081' \ + -H 'Content-Type: application/json' \ + --data '{ + "params": { + "query": { + "id": "12345" + } + }, + "method": "DELETE", + "url": "/my-resource" +}' +``` + +#### Executing your code without an HTTP server + +If you prefer to test your function locally without starting an HTTP server, you can provide the request payload in a JSON file on the command line. + +First, create a JSON file containing your request payload. +Example `request_payload.json` file: +```shell +{ + "body": { + "name": "bar" + }, + "method": "POST", + "url": "/my-resource" +} +``` + +Then invoke your function handler as follows: + +```shell +python3 main.py --data ./request_payload.json +``` + +This will execute the requested function handler and print the response returned, including the response status code, body and headers. + +You can also provide request headers to your function on the command line: +```shell +python3 main.py --data request_payload.json --header "Content-Type: application/json" --header "X-CUSTOM-HEADER: testing" +``` + +## Leveraging the FalconPy SDK to interact with CrowdStrike APIs inside of your Foundry function +Foundry function authors should include `crowdstrike-falconpy` within their _requirements.txt_ file and then import `falconpy` explicitly in their function code. -Function authors should import `falconpy` explicitly as a requirement in their project when needed. +You may use any [FalconPy Service Class](https://falconpy.io/Home.html#service-collections) or the [FalconPy Uber Class](https://falconpy.io/Usage/Basic-Uber-Class-usage.html) within your function. -### General usage +### General FalconPy usage information +FalconPy implements [Context Authentication](https://falconpy.io/Usage/Authenticating-to-the-API.html#context-authentication) for use within Foundry Functions, removing the need for developers to provide their `access_token` to the class as this value is provided by context when the function is executed. -**Important:** Create a new instance of each `falconpy` client you want on each request. +> [!TIP] +> If you are instantiating a FalconPy class within your method, you will need to do this for every method you implement. If you instantiate the FalconPy class outside of your method, but before the `func.run()` statement, this object will be available to all methods defined in your function code. +To test the function locally without having to adjust your code, you can set the following environment variables in your local environment: + +| Variable Name | Purpose | +| :--- | :--- | +| `FALCON_CLIENT_ID` | CrowdStrike Falcon API client ID | +| `FALCON_CLIENT_SECRET` | CrowdStrike Falcon API client secret | + + +#### FalconPy usage example ```python -# omitting other imports -from falconpy.alerts import Alerts -from crowdstrike.foundry.function import cloud, Function + +from falconpy import Hosts +from crowdstrike.foundry.function import ( + Function, + Request, + Response, + APIError +) + func = Function.instance() -@func.handler(...) -def endpoint(request, config): - # ... omitting other code ... - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # !!! create a new client instance on each request !!! - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +@func.handler(method='POST', path='/hosts-query') +def on_hosts_query(request: Request) -> Response: + + # get the requested Host IDs from the request body + host_ids = request.body.get("ids") + if not host_ids: + return Response( + code=400, + errors=[APIError(code=400, message='Required host ids are not provided')] + ) + + # Initialize falconpy client for Hosts API + # This example uses context authentication + hosts_client = Hosts() + + # Call falconpy API to fetch the details of the requested hosts + api_result = hosts_client.get_device_details_v1(ids=host_ids) + if api_result['status_code'] != 200: + # falconpy API returned an error + response = Response( + code=api_result['status_code'], + errors=[ + APIError(code=api_result['status_code'], message="falconpy API call failed") + ] + ) + else: + # falconpy API was successful, return the requested data + response = Response( + body={ + 'hosts': api_result['body']['resources'] + }, + code=200 + ) - falconpy_alerts = Alerts(access_token=request.access_token, base_url=cloud()) + return response - # ... omitting other code ... +if __name__ == '__main__': + func.run() ``` +## Using custom configurations and debug logging +Foundry supports custom configurations and debug logging to support developers with the implementation of their functions. + +### Implementing custom configurations +Using a custom configuration within a function is optional and may be provided as a JSON file. This functionality is intended to give the developer a location to store custom configuration data, such as API keys and credentials, in a secure manner when the function is deployed on Falcon platform. + +> [!NOTE] +> The configuration is encrypted with a unique key per function in the cloud. + +To utilize a custom configuration within a function, include the `config` keyword argument as shown in the example below. + +The `config` keyword is an optional argument to the handler function and must be the second argument if provided. + +### Enabling logging +Logging for a function is optional but adding log messages to functions can make triage and debugging easier when troubleshooting problems. When a function is deployed on the Falcon platform, the messages logged with the provided `logger` are formatted in a custom manner with fields injected to assist with working within the Falcon logging infrastructure. + +> [!NOTE] +> You may use native [FalconPy logging](https://falconpy.io/Usage/Logging.html) in conjunction with your function logger config by providing the `debug` keyword when you instantiate your FalconPy class. + +To utilize logging in a function, include the `logger` parameter as shown in the example below. + +`logger` is an optional parameter to the handler function and must the third parameter if provided. + + +```python +from logging import Logger +from typing import Union, Any +from falconpy import Hosts +from crowdstrike.foundry.function import ( + Function, + Request, + Response, + APIError +) + + +func = Function.instance() + + +@func.handler(method='POST', path='/hosts-query') +def on_hosts_query(request: Request, config: Union[dict[str, Any], None], logger: Logger) -> Response: + + logger.info("POST handler for /hosts-query is invoked") + + # get the requested Host IDs from the request body + host_ids = request.body.get("ids") + if not host_ids: + logger.error("ids argument is missing from request parameters") + return Response( + code=400, + errors=[APIError(code=400, message='Required host ids are not provided')] + ) + + # Example config provided to the function + action = "Dev resource update" + if config and config.get("is_production", False): + action = "Production resource update" + + # Initialize falconpy client for Hosts API and enable debugging + hosts_client = Hosts(debug=True) + + # Call falconpy API to fetch the details of the requested hosts + api_result = hosts_client.get_device_details_v1(ids=host_ids) + if api_result['status_code'] != 200: + # FalconPy SDK returned an error + response = Response( + code=api_result['status_code'], + errors=[ + APIError(code=api_result['status_code'], message="FalconPy API call failed") + ] + ) + else: + # falconpy API was successful, return the requested data + response = Response( + body={ + 'hosts': api_result['body']['resources'], + 'action': action + }, + code=200 + ) + + return response + +if __name__ == '__main__': + func.run() +``` + + --- diff --git a/SECURITY.md b/SECURITY.md index 769fef2..b800a73 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,4 +1,8 @@ -![CrowdStrike Falcon](/docs/asset/cs-logo.png?raw=true) + + + + CrowdStrike Logo. + # Security Policy @@ -7,7 +11,7 @@ This document outlines security policy and procedures for the CrowdStrike `found + [Supported Python versions](#supported-python-versions) + [Supported Operating Systems](#supported-operating-systems) + [Supported CrowdStrike regions](#supported-crowdstrike-regions) -+ [Supported foundry-fn-python versions](#supported-foundry-fn-python-versions) ++ [Supported crowdStrike-foundry-function versions](#supported-crowdstrike-foundry-function-versions) + [Reporting a potential security vulnerability](#reporting-a-potential-security-vulnerability) + [Disclosure and Mitigation Process](#disclosure-and-mitigation-process) @@ -31,7 +35,7 @@ foundry-fn-python is unit tested for functionality across all commercial CrowdSt | US-2 | | EU-1 | -## Supported foundry-fn-python versions +## Supported crowdstrike-foundry-function versions When discovered, we release security vulnerability patches for the most recent release at an accelerated cadence. diff --git a/SUPPORT.md b/SUPPORT.md index 433461e..535029a 100644 --- a/SUPPORT.md +++ b/SUPPORT.md @@ -1,8 +1,12 @@ -![CrowdStrike Falcon](/docs/asset/cs-logo.png?raw=true) + + + + CrowdStrike Logo. + # Repository Support -`foundry-fn-python` is a community-driven, open source project designed to assist developers in leveraging the power of CrowdStrike APIs within their solutions. While not a formal CrowdStrike product, `foundry-fn-python` is maintained by CrowdStrike and supported in partnership with the open source developer community. +`foundry-fn-python` is a community-driven, open source project designed to assist developers in leveraging the power of CrowdStrike APIs within their solutions. While not a formal CrowdStrike product, `foundry-fn-python` repo and the `crowdstrike-foundry-function` FDK package are maintained by CrowdStrike and supported in partnership with the open source developer community. ## Issue Reporting and Questions 🐛 diff --git a/docs/asset/cs-logo-red.png b/docs/asset/cs-logo-red.png new file mode 100644 index 0000000000000000000000000000000000000000..50ac32b39ccc06ba1192f338e8115776478f5e60 GIT binary patch literal 69833 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

L>@{P7`JR?VxDgwT`Dh|VQ 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 E0K*y%uK)l5 literal 0 HcmV?d00001 diff --git a/docs/asset/cs-logo.png b/docs/asset/cs-logo.png index 72e2dff181b72910bf312ffbc9bd0c45d74ebac2..8efa550257cb4e0b3650d229e920c1c070e060c0 100644 GIT binary patch literal 54452 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

z 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 diff --git a/examples/complex_inputs/complex_inputs_example.py b/examples/complex_inputs/complex_inputs_example.py index 9a43e47..ec1e007 100644 --- a/examples/complex_inputs/complex_inputs_example.py +++ b/examples/complex_inputs/complex_inputs_example.py @@ -1,16 +1,20 @@ -from crowdstrike.foundry.function import Function, Request, Response, APIError -from logging import Logger +"""Example Foundry Function with POST handler.""" +from crowdstrike.foundry.function import Function, Request, Response func = Function.instance() @func.handler(method='POST', path='/my-endpoint') -def handle_complex_inputs(request: Request, config: [dict[str, any], None], logger: Logger) -> Response: - ''' - handle_complex_inputs showcases how to provide multiple inputs to a function, some of which happen to be files. +def handle_complex_inputs(request: Request) -> Response: + """Implement example function handler to showcase how to handle complex inputs. + + This example demonstrates how to provide multiple inputs to a function, some of which happen to be files. In this case, it simply echoes back the contents of those files concatenated together with spaces. This could easily be changed to something more advanced to work with arbitrary binary. - ''' + + :param request: :class:`Request` to handle. + :return: :class:`Response` + """ greeting = f'Welcome {request.body.get("name", "")}, age {request.body.get("age", "")}' file_contents = [] for v in request.files.values(): diff --git a/pyproject.toml b/pyproject.toml index 49f1903..81663b0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,9 +1,57 @@ +[build-system] +requires = ['setuptools>=67.7.2'] +build-backend = "setuptools.build_meta" + [project] name = "crowdstrike-foundry-function" description = "CrowdStrike Foundry Function Software Developer Kit for Python" requires-python = ">=3.8.0" dynamic = ['dependencies', 'version'] readme = "README.md" +authors = [ + { name = "CrowdStrike", email = "foundry-fn-python@crowdstrike.com" }, +] +maintainers = [ + { name = "John Stone", email = "foundry-fn-python@crowdstrike.com" }, + { name = "Chris Cannon", email = "foundry-fn-python@crowdstrike.com" }, + { name = "Johnny Steenbergen", email = "foundry-fn-python@crowdstrike.com" }, + { name = "Banu Yuceer", email = "foundry-fn-python@crowdstrike.com" }, + { name = "Joshua Hiller", email = "foundry-fn-python@crowdstrike.com" }, +] +keywords = [ + "crowdstrike", + "crowdstrike-falcon-foundry", + "foundry", + "foundry-functions", + "crowdstrike-faas", + "sdk" +] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Framework :: Flake8", + "Intended Audience :: Developers", + "License :: OSI Approved :: The Unlicense (Unlicense)", + "Natural Language :: English", + "Operating System :: MacOS", + "Operating System :: Microsoft :: Windows", + "Operating System :: OS Independent", + "Operating System :: POSIX", + "Operating System :: POSIX :: Linux", + "Operating System :: Unix", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Topic :: Security", + "Topic :: Software Development :: Libraries :: Python Modules", + "Topic :: System :: Systems Administration", + "Topic :: Utilities", +] -[build-system] -requires = ['setuptools>=67.7.2'] +[project.urls] +Homepage = "https://github.com/CrowdStrike/foundry-fn-python" +Tracker = "https://github.com/CrowdStrike/foundry-fn-python/issues" diff --git a/setup.py b/setup.py index 709b978..870d6b2 100644 --- a/setup.py +++ b/setup.py @@ -1,8 +1,8 @@ # !/usr/bin/env python +"""Package setup for crowdstrike-foundry-function.""" import os from setuptools import setup -from typing import List DESCRIPTION = 'CrowdStrike Foundry Function Software Developer Kit for Python' PACKAGE_NAME = 'crowdstrike.foundry.function' @@ -16,10 +16,11 @@ SETUP_REQUIRES = [ 'setuptools', ] -VERSION = '1.1.0' +VERSION = '1.1.1' def main(): + """Build crowdstrike-foundry-function package.""" setup( description=DESCRIPTION, install_requires=find_dependencies(os.path.join(os.path.dirname(__file__), "requirements.txt")), @@ -34,12 +35,14 @@ def main(): ) -def find_dependencies(requirements) -> List[str]: +def find_dependencies(requirements) -> list[str]: + """Parse the package dependencies from requirements file.""" with open(requirements, 'r') as reqs: return [line for line in sanitized_lines(reqs.readlines())] def long_description() -> str: + """Generate package long description.""" with open("README.md", "r", encoding="utf-8") as fh: descript = fh.read() @@ -53,7 +56,8 @@ def long_description() -> str: return descript -def sanitized_lines(lines: List[str]): +def sanitized_lines(lines: list[str]): + """Sanitize the lines read from requirements file.""" for line in lines: line = line.strip() if line != '' and line[0] != '#': diff --git a/src/crowdstrike/__init__.py b/src/crowdstrike/__init__.py index e69de29..bd8145c 100644 --- a/src/crowdstrike/__init__.py +++ b/src/crowdstrike/__init__.py @@ -0,0 +1 @@ +"""CrowdStrike Foundry Functions FDK.""" diff --git a/src/crowdstrike/foundry/__init__.py b/src/crowdstrike/foundry/__init__.py index e69de29..bd8145c 100644 --- a/src/crowdstrike/foundry/__init__.py +++ b/src/crowdstrike/foundry/__init__.py @@ -0,0 +1 @@ +"""CrowdStrike Foundry Functions FDK.""" diff --git a/src/crowdstrike/foundry/function/__init__.py b/src/crowdstrike/foundry/function/__init__.py index 1b93bc4..4046ddc 100644 --- a/src/crowdstrike/foundry/function/__init__.py +++ b/src/crowdstrike/foundry/function/__init__.py @@ -1,14 +1,19 @@ -from crowdstrike.foundry.function.model import * +"""CrowdStrike Foundry Functions FDK.""" import sys -import logging +from typing import Union +from crowdstrike.foundry.function.model import ( + RequestParams, + APIError, + Request, + Response, + FDKException +) class Function: - """ - Represents a Function. - """ + """Represents a Function.""" - _instance: ['Function', None] = None + _instance: Union['Function', None] = None @staticmethod def instance( @@ -19,8 +24,8 @@ def instance( router=None, runner=None, ) -> 'Function': - """ - Fetch the singleton instance of the :class:`Function`, creating one if one does not yet exist. + """Fetch the singleton instance of the :class:`Function`, creating one if one does not yet exist. + :param module: Name of the module in which code should be imported. :param config: Configuration to provide to the user's code. :param config_loader: :class:`ConfigLoaderBase` instance capable of loading configuration if `config` is None. @@ -49,7 +54,8 @@ def __init__( router=None, runner=None, ): - """ + """Construct an instance of the class. + :param module: Name of the module in which code should be imported. :param config: Configuration to provide to the user's code. :param config_loader: :class:`ConfigLoaderBase` instance capable of loading configuration if `config` is None. @@ -76,15 +82,21 @@ def __init__( self._router = Router(self._config) if self._runner is None: from crowdstrike.foundry.function.runner import Runner - from crowdstrike.foundry.function.runner_http import HTTPRunner - self._runner = Runner(HTTPRunner()) + if len(sys.argv) > 1: + # when arguments are provided to the function, + # run in CLI mode without starting an http server + from crowdstrike.foundry.function.runner_cli import CLIRunner + self._runner = Runner(CLIRunner()) + else: + from crowdstrike.foundry.function.runner_http import HTTPRunner + self._runner = Runner(HTTPRunner()) self._runner.bind_router(self._router) self._loader.register_module(module) def run(self, *args, **kwargs): - """ - Runs the function. Essentially the "main" method of the function. + """Run the function. Essentially the "main" method of the function. + Any arguments provided to this method are forwarded directly down into :class:`RunnerBase` instance. :return: Any result from the given :class:`RunnerBase` instance. """ @@ -92,8 +104,8 @@ def run(self, *args, **kwargs): return self._runner.run(*args, **kwargs) def handler(self, method: str, path: str): - """ - Decorator for handlers. + """Define the decorator for handlers. + :param method: HTTP method or verb to bind to this handler. :param path: URL path at which this handler resides. """ @@ -110,8 +122,8 @@ def call(func): def cloud() -> str: - """ - Retrieves a FalconPy-compatible identifier which identifies the cloud in which this function is running. + """Retrieve a FalconPy-compatible identifier which identifies the cloud in which this function is running. + :return: Cloud in which this function is executing. """ import os diff --git a/src/crowdstrike/foundry/function/config_loader.py b/src/crowdstrike/foundry/function/config_loader.py index fca27ab..b629954 100644 --- a/src/crowdstrike/foundry/function/config_loader.py +++ b/src/crowdstrike/foundry/function/config_loader.py @@ -1,34 +1,30 @@ +"""Config loader for CrowdStrike Foundry Functions FDK.""" from abc import ABC, abstractmethod class ConfigLoaderBase(ABC): - """ - Base class for any class which is able to load configuration. - """ + """Base class for any class which is able to load configuration.""" @abstractmethod def load(self): - """ - Loads the configuration. - """ + """Load the configuration.""" pass class ConfigLoader(ConfigLoaderBase): - """ - Middleware for loading configuration. - """ + """Middleware for loading configuration.""" def __init__(self, loader: ConfigLoaderBase): - """ + """Construct an instance of the class. + :param loader: Desired :class:`ConfigLoaderBase` instance. """ ConfigLoaderBase.__init__(self) self._loader = loader def load(self): - """ - Loads the configuration. + """Load the configuration. + :returns: Any loaded configuration. """ return self._loader.load() diff --git a/src/crowdstrike/foundry/function/config_loader_fs.py b/src/crowdstrike/foundry/function/config_loader_fs.py index c4fe2dc..e75a9c7 100644 --- a/src/crowdstrike/foundry/function/config_loader_fs.py +++ b/src/crowdstrike/foundry/function/config_loader_fs.py @@ -1,21 +1,22 @@ +"""File system config loader for CrowdStrike Foundry Functions FDK.""" import json import os from crowdstrike.foundry.function.config_loader import ConfigLoaderBase class FileSystemConfigLoader(ConfigLoaderBase): - """ - Loads configuration from the local filesystem. - """ + """Loads configuration from the local filesystem.""" def __init__(self): + """Initialize the file system config loader.""" ConfigLoaderBase.__init__(self) def load(self): - """ - Loads the configuration located at the path specified in the `CS_FN_CONFIG_PATH` environment variable. + """Load the configuration located at the path specified in the `CS_FN_CONFIG_PATH` environment variable. + The path may be either relative or absolute. If the environment variable is not provided, no configuration will be loaded. + :returns: Any loaded configuration. """ file_path = os.environ.get('CS_FN_CONFIG_PATH', None) diff --git a/src/crowdstrike/foundry/function/context.py b/src/crowdstrike/foundry/function/context.py index ced07b0..9be001a 100644 --- a/src/crowdstrike/foundry/function/context.py +++ b/src/crowdstrike/foundry/function/context.py @@ -1,3 +1,4 @@ +"""Request context for CrowdStrike Foundry Functions FDK.""" from contextvars import ContextVar # While this holds the inbound handler request, do not access them directly diff --git a/src/crowdstrike/foundry/function/loader.py b/src/crowdstrike/foundry/function/loader.py index d9ba8a4..3addcc5 100644 --- a/src/crowdstrike/foundry/function/loader.py +++ b/src/crowdstrike/foundry/function/loader.py @@ -1,14 +1,16 @@ +"""Loader for CrowdStrike Foundry Function FDK.""" + + class Loader: - """ - Module loader. - """ + """Module loader.""" def __init__(self): + """Initialize the loader.""" self._modules = set() def register_module(self, module: str): - """ - Registers a module to be loaded at function run. + """Register a module to be loaded at function run. + :param module: Name of the module. If the empty string or `__main__`, will ignore. """ if module == '' or module == '__main__': @@ -16,9 +18,7 @@ def register_module(self, module: str): self._modules.add(module) def load(self): - """ - Loads any registered modules. - """ + """Load any registered modules.""" from importlib import import_module for m in self._modules: import_module(m) diff --git a/src/crowdstrike/foundry/function/mapping.py b/src/crowdstrike/foundry/function/mapping.py index 7e94762..3b5a7a0 100644 --- a/src/crowdstrike/foundry/function/mapping.py +++ b/src/crowdstrike/foundry/function/mapping.py @@ -1,11 +1,14 @@ -from crowdstrike.foundry.function.model import Request, RequestParams, Response +"""Data mapping utilities for CrowdStrike Foundry Function FDK.""" + + from dataclasses import dataclass, fields, is_dataclass -from typing import Dict +from typing import Union +from crowdstrike.foundry.function.model import Request, RequestParams, Response -def response_to_dict(r: Response) -> Dict: - """ - Converts a :class:`Response` to a dictionary. +def response_to_dict(r: Response) -> dict: + """Convert a :class:`Response` to a dictionary. + :param r: :class:`Response` instance to convert. :return: Dictionary version of the provided instance. """ @@ -30,9 +33,9 @@ def response_to_dict(r: Response) -> Dict: return d -def dict_to_request(d: Dict) -> Request: - """ - Converts a dictionary to a :class:`Request`. +def dict_to_request(d: dict) -> Request: + """Convert a dictionary to a :class:`Request`. + :param d: Dictionary instance to attempt to map. :return: :class:`Request` instance populated by the given dictionary. """ @@ -46,9 +49,9 @@ def dict_to_request(d: Dict) -> Request: return req -def dict_to_dataclass(d: Dict, dc) -> [None, dataclass]: - """ - Maps the contents of a dictionary to a dataclass object. +def dict_to_dataclass(d: Union[dict, None], dc) -> Union[None, dataclass]: + """Map the contents of a dictionary to a dataclass object. + :param d: Dictionary from which to extract values. :param dc: Dataclass to receive the values. :return: Provided dataclass object. @@ -73,8 +76,8 @@ def dict_to_dataclass(d: Dict, dc) -> [None, dataclass]: def canonize_header(h: str) -> str: - """ - Converts a header key into its canonical version. + """Convert a header key into its canonical version. + :param h: Header key. :return: Canonized version. """ diff --git a/src/crowdstrike/foundry/function/model.py b/src/crowdstrike/foundry/function/model.py index 2755c73..e8abdd8 100644 --- a/src/crowdstrike/foundry/function/model.py +++ b/src/crowdstrike/foundry/function/model.py @@ -1,24 +1,31 @@ +"""Data models for CrowdStrike Foundry Function FDK.""" from dataclasses import dataclass, field -from typing import Dict, List +from typing import Any, Dict, List @dataclass class RequestParams: + """Defines the data model for request parameters.""" + header: Dict[str, List[str]] = field(default_factory=lambda: {}) query: Dict[str, List[str]] = field(default_factory=lambda: {}) @dataclass class APIError: + """Defines the data model for API errors.""" + code: int = field(default=0) message: str = field(default='') @dataclass class Request: + """Defines the data model for request provided to the function handler.""" + access_token: str = field(default='') - body: Dict[str, any] = field(default_factory=lambda: {}) - context: Dict[str, any] = field(default_factory=lambda: {}) + body: Dict[str, Any] = field(default_factory=lambda: {}) + context: Dict[str, Any] = field(default_factory=lambda: {}) files: Dict[str, bytes] = field(default_factory=lambda: {}) fn_id: str = field(default='') fn_version: int = field(default=0) @@ -30,15 +37,23 @@ class Request: @dataclass class Response: - body: Dict[str, any] = field(default_factory=lambda: {}) + """Defines the data model for response returned from the function handler.""" + + body: Dict[str, Any] = field(default_factory=lambda: {}) code: int = field(default=0) errors: List[APIError] = field(default_factory=lambda: []) header: Dict[str, List[str]] = field(default_factory=lambda: {}) class FDKException(Exception): + """Defines the FDKException that will be raised when an error occurs.""" def __init__(self, code: int, message: str): + """Initialize the FDKException. + + :param code: The error code. + :param message: The error message. + """ Exception.__init__(self, message) self.code = code self.message = message diff --git a/src/crowdstrike/foundry/function/router.py b/src/crowdstrike/foundry/function/router.py index 77ce072..8988501 100644 --- a/src/crowdstrike/foundry/function/router.py +++ b/src/crowdstrike/foundry/function/router.py @@ -1,30 +1,35 @@ -from crowdstrike.foundry.function.model import FDKException, Request, Response +"""Router for CrowdStrike Foundry Function FDK.""" from dataclasses import dataclass from http.client import BAD_REQUEST, METHOD_NOT_ALLOWED, NOT_FOUND, SERVICE_UNAVAILABLE from inspect import signature from logging import Logger -from typing import Callable +from typing import Callable, Union +from crowdstrike.foundry.function.model import FDKException, Request, Response @dataclass class Route: + """Defines the Route data model.""" + func: Callable method: str path: str class Router: - """ - Serves to route function requests to the appropriate handler functions. - """ + """Serves to route function requests to the appropriate handler functions.""" def __init__(self, config): + """Initialize the router. + + :param config: The config loaded from the configuration file, if provided. + """ self._config = config self._routes = {} - def route(self, req: Request, logger: [Logger, None] = None) -> Response: - """ - Given the method and path of a :class:`Request`, invokes the corresponding handler if one exists. + def route(self, req: Request, logger: Union[Logger, None] = None) -> Response: + """Given the method and path of a :class:`Request`, invokes the corresponding handler if one exists. + :param req: :class:`Request` presented to the function. :param logger: :class:`Logger` instance. Note: A CrowdStrike-specific logging instance will be provided internally. @@ -49,7 +54,7 @@ def route(self, req: Request, logger: [Logger, None] = None) -> Response: return self._call_route(r, req, logger) - def _call_route(self, route: Route, req: Request, logger: [Logger, None] = None): + def _call_route(self, route: Route, req: Request, logger: Union[Logger, None] = None): f = route.func len_params = len(signature(f).parameters) @@ -61,8 +66,8 @@ def _call_route(self, route: Route, req: Request, logger: [Logger, None] = None) return f(req) def register(self, r: Route): - """ - Registers a :class:`Route` with this instance. + """Register a :class:`Route` with this instance. + :param r: :class:`Route` to register. """ r.method = r.method.upper().strip() diff --git a/src/crowdstrike/foundry/function/runner.py b/src/crowdstrike/foundry/function/runner.py index 9baea16..9f51397 100644 --- a/src/crowdstrike/foundry/function/runner.py +++ b/src/crowdstrike/foundry/function/runner.py @@ -1,3 +1,4 @@ +"""Runner base classes for CrowdStrike Foundry Function FDK.""" import signal import sys from abc import ABC, abstractmethod @@ -5,28 +6,32 @@ class RunnerBase(ABC): + """Abstract base class for runner implementations.""" + def __init__(self): + """Initialize the runner.""" self.router = None def bind_router(self, router: Router): + """Set the router for the runner.""" self.router = router @abstractmethod def run(self, *args, **kwargs): + """Start the runtime.""" pass class Runner(RunnerBase): + """Base class for runner implementations.""" def __init__(self, runner: RunnerBase = None): + """Initialize the runner.""" RunnerBase.__init__(self) self._runner = runner def run(self, *args, **kwargs): - """ - Starts runtime. - """ - + """Start the runtime.""" signal.signal(signal.SIGINT, shutdown) signal.signal(signal.SIGTERM, shutdown) diff --git a/src/crowdstrike/foundry/function/runner_cli.py b/src/crowdstrike/foundry/function/runner_cli.py new file mode 100644 index 0000000..3ff44ba --- /dev/null +++ b/src/crowdstrike/foundry/function/runner_cli.py @@ -0,0 +1,186 @@ +"""CLI runner for CrowdStrike Foundry Functions FDK.""" +import argparse +import json +from logging import Formatter, Logger, StreamHandler, getLogger +from sys import stdout +from typing import Dict, List, Union +from crowdstrike.foundry.function.context import ctx_request +from crowdstrike.foundry.function.mapping import canonize_header, dict_to_request, response_to_dict +from crowdstrike.foundry.function.model import APIError, FDKException, Request, Response +from crowdstrike.foundry.function.runner import RunnerBase + + +INTERNAL_SERVER_ERROR = 500 + + +def _new_cli_logger() -> Logger: + f = Formatter('%(asctime)s [%(levelname)s] %(filename)s %(funcName)s:%(lineno)d -> %(message)s') + + h = StreamHandler(stdout) + h.setFormatter(f) + + logger = getLogger("cs-logger") + logger.setLevel('DEBUG') + logger.addHandler(h) + return logger + + +class CLIRunner(RunnerBase): + """Runs the user's request without starting an HTTP server.""" + + def __init__(self): + """Initialize the CLI runner.""" + RunnerBase.__init__(self) + self.logger = None + self.headers = None + self.data = None + self.args = None + + self._setup_arguments() + + def _setup_arguments(self): + self.parser = argparse.ArgumentParser( + description=( + "Invoke the function handler with the provided input without starting an HTTP server. " + "If one or more arguments are provided, the function is executed without starting an HTTP server. " + "If no arguments are provided, an HTTP server is started to listen for requests." + ) + ) + + self.parser.add_argument( + '-d', '--data', type=str, + help='Path to a JSON file containing the "method", "url", and optionally the "body" and "params" fields.' + ) + self.parser.add_argument( + '-H', '--header', type=str, action='append', nargs='*', + help="Optional HTTP request headers to provide to the function handler" + ) + # This is used to simulate file input when content-type is multipart/form-data, value must be a file + self.parser.add_argument( + '-f', '--file', type=str, action='append', nargs='*', + help='Optional file input to the function handler.' + 'The "Content-Type: multipart/form-data" header must also be specified for file input.' + ) + + def _process_headers(self, headers: list): + for header in headers: + name_value = header[0].split(":") + if len(name_value) != 2: + self.parser.error('Invalid header. Must be in "name: value" format.') + header_name = name_value[0].strip().lower() + if header_name not in self.headers: + self.headers[header_name] = name_value[1].strip().lower() + + def _add_headers(self, payload: dict): + # add request headers provided on the command line to the input + # payload to make them available to the function handler + if not self.headers: + return + payload_params = payload.setdefault('params', {}) + payload_headers = payload_params.setdefault('header', {}) + for header_name, header_value in self.headers.items(): + payload_headers[header_name] = [header_value] + + def _verify_arguments(self): + self.headers = {} + if self.args.header: + self._process_headers(self.args.header) + + if self.args.file: + content_type = self.headers.get('content-type', 'application/json') + if not content_type.startswith('multipart/form-data'): + self.parser.print_help() + self.parser.error('Also provide -H "Content-Type: multipart/form-data" to use the --file argument') + + def run(self, *args, **kwargs): + """Execute the requested function handler with the input provided on the command line.""" + self.logger = kwargs.get('logger', None) + if self.logger is None: + self.logger = _new_cli_logger() + + self.args = self.parser.parse_args() + self._verify_arguments() + + self.logger.info('Running without HTTP server') + self._exec_request() + + def _exec_request(self): + req = self._read_request() + ctx_request.set(req) + try: + resp = self.router.route(req, logger=self.logger) + except FDKException as fe: + resp = Response(errors=[APIError(code=fe.code, message=fe.message)]) + self._write_response(req, resp) + + def _read_request(self) -> Request: + payload = self._read_json_request() + self._add_headers(payload) + content_type = self.headers.get('content-type', 'application/json') + if content_type.startswith('multipart/form-data'): + payload['files'] = self._read_multipart_request() + return dict_to_request(payload) + + def _read_json_request(self) -> dict: + payload = {} + with open(self.args.data, 'r') as fd: + payload = json.load(fd) + return payload + + def _read_multipart_request(self) -> dict: + files = {} + for file in self.args.file: + with open(file[0], 'r') as fd: + files[file[0]] = fd.read().encode('utf-8') + return files + + def _write_response(self, req: Request, resp: Union[Response, None]): + if resp is None or not isinstance(resp, Response): + msg = f'Object is not of type {Response.__base__.__name__}. Got {type(resp)} instead.' + resp = Response(errors=[APIError(code=INTERNAL_SERVER_ERROR, message=msg)]) + + if resp.code == 0 and resp.errors is not None and len(resp.errors) > 0: + for e in resp.errors: + e_code = e.code + if type(e_code) is not int and e_code is not None: + e_code = int(e_code) + if type(e_code) is int and 100 <= e.code and resp.code < e.code < 600: + resp.code = e_code + + resp.header = self._resp_headers(req, resp) + payload_dict = response_to_dict(resp) + payload = json.dumps(payload_dict) + + print('') + print(f'Status code: {resp.code}') + print(f'Response Header: Content-Length: {str(len(payload))}') + print('Response Header: Content-Type: application/json') + for k, v in resp.header.items(): + print(f'Response Header: {k}: {v}') + print('Response Payload:') + print(payload) + + def _resp_headers(self, req: Request, resp: Response): + headers = {} + if resp.header is not None and len(resp.header) > 0: + for k, v in resp.header.items(): + if v is None or len(v) == 0: + continue + headers[canonize_header(k)] = v + + if req.params is None or req.params.header is None or len(req.params.header) == 0: + return headers + + req_header = req.params.header + self._take_header('X-Cs-Executionid', req_header, headers) + self._take_header('X-Cs-Origin', req_header, headers) + self._take_header('X-Cs-Traceid', req_header, headers) + + headers = {k: ';'.join(v) for k, v in headers} + return headers + + def _take_header(self, key: str, src_header: Dict[str, List[str]], dst_header: Dict[str, List[str]]): + value = src_header.get(key, []) + if len(value) == 0: + return + dst_header[key] = value diff --git a/src/crowdstrike/foundry/function/runner_http.py b/src/crowdstrike/foundry/function/runner_http.py index eebc6f9..5eda217 100644 --- a/src/crowdstrike/foundry/function/runner_http.py +++ b/src/crowdstrike/foundry/function/runner_http.py @@ -1,15 +1,17 @@ +"""HTTP runner for CrowdStrike Foundry Function FDK.""" import json import os +from sys import stdout +from http.client import INTERNAL_SERVER_ERROR +from http.server import BaseHTTPRequestHandler, HTTPServer +from logging import Formatter, Logger, StreamHandler, getLogger import python_multipart +from typing import Dict, List, Union from crowdstrike.foundry.function.context import ctx_request from crowdstrike.foundry.function.mapping import canonize_header, dict_to_request, response_to_dict from crowdstrike.foundry.function.model import APIError, FDKException, Request, Response from crowdstrike.foundry.function.router import Router from crowdstrike.foundry.function.runner import RunnerBase -from http.client import INTERNAL_SERVER_ERROR -from http.server import BaseHTTPRequestHandler, HTTPServer -from logging import Formatter, Logger, StreamHandler, getLogger -from sys import stdout def _new_http_logger() -> Logger: @@ -18,22 +20,22 @@ def _new_http_logger() -> Logger: h = StreamHandler(stdout) h.setFormatter(f) - l = getLogger("cs-logger") - l.setLevel('DEBUG') - l.addHandler(h) - return l + logger = getLogger("cs-logger") + logger.setLevel('DEBUG') + logger.addHandler(h) + return logger class HTTPRunner(RunnerBase): - """ - Runs the user's code as part of an HTTP server. - """ + """Runs the user's code as part of an HTTP server.""" def __init__(self): + """Initialize the HTTP runner.""" RunnerBase.__init__(self) self._port = int(os.environ.get('PORT', '8081')) def run(self, *args, **kwargs): + """Start the HTTP server and listen for requests.""" logger = kwargs.get('logger', None) if logger is None: logger = _new_http_logger() @@ -45,57 +47,47 @@ def run(self, *args, **kwargs): class HTTPRequestHandler(BaseHTTPRequestHandler): + """Implements the HTTP request handlers.""" + _logger = None _router = None @staticmethod def bind_logger(logger: Logger): + """Set the logger to use.""" HTTPRequestHandler._logger = logger @staticmethod def bind_router(router: Router): + """Set the router to use.""" HTTPRequestHandler._router = router def do_DELETE(self): - """ - Executes on HTTP DELETE. - """ + """Execute on HTTP DELETE.""" self._exec_request() def do_GET(self): - """ - Executes on HTTP GET. - """ + """Execute on HTTP GET.""" self._exec_request() def do_HEAD(self): - """ - Executes on HTTP HEAD. - """ + """Execute on HTTP HEAD.""" self._exec_request() def do_OPTIONS(self): - """ - Executes on HTTP OPTIONS. - """ + """Execute on HTTP OPTIONS.""" self._exec_request() def do_PATCH(self): - """ - Executes on HTTP PATCH. - """ + """Execute on HTTP PATCH.""" self._exec_request() def do_POST(self): - """ - Executes on HTTP POST. - """ + """Execute on HTTP POST.""" self._exec_request() def do_PUT(self): - """ - Executes on HTTP PUT. - """ + """Execute on HTTP PUT.""" self._exec_request() def _exec_request(self): @@ -140,7 +132,7 @@ def on_field(field): body = json.loads(value.decode('utf-8').strip()) def on_file(file): - nonlocal files + nonlocal files # noqa: F824 # Offset will currently be at the end of the buffer. # Need to reset it to the beginning so we can read it. file.file_object.seek(0) @@ -152,7 +144,7 @@ def on_file(file): req['files'] = files return req - def _write_response(self, req: Request, resp: [Response, None]): + def _write_response(self, req: Request, resp: Union[Response, None]): if resp is None or not isinstance(resp, Response): msg = f'Object is not of type {Response.__base__.__name__}. Got {type(resp)} instead.' resp = Response(errors=[APIError(code=INTERNAL_SERVER_ERROR, message=msg)]) @@ -196,7 +188,7 @@ def _resp_headers(self, req: Request, resp: Response): headers = {k: ';'.join(v) for k, v in headers} return headers - def _take_header(self, key: str, src_header: dict[str, list[str]], dst_header: dict[str, list[str]]): + def _take_header(self, key: str, src_header: Dict[str, List[str]], dst_header: Dict[str, List[str]]): value = src_header.get(key, []) if len(value) == 0: return diff --git a/test_data/requests/cli_request1.json b/test_data/requests/cli_request1.json new file mode 100644 index 0000000..8613835 --- /dev/null +++ b/test_data/requests/cli_request1.json @@ -0,0 +1,7 @@ +{ + "method": "POST", + "url": "/request1", + "body": { + "hello": "world" + } +} diff --git a/test_data/requests/cli_request2.json b/test_data/requests/cli_request2.json new file mode 100644 index 0000000..0570231 --- /dev/null +++ b/test_data/requests/cli_request2.json @@ -0,0 +1,7 @@ +{ + "method": "POST", + "url": "/request2", + "body": { + "hello": "world" + } +} diff --git a/test_data/requests/cli_request3.json b/test_data/requests/cli_request3.json new file mode 100644 index 0000000..cbf7af0 --- /dev/null +++ b/test_data/requests/cli_request3.json @@ -0,0 +1,7 @@ +{ + "method": "POST", + "url": "/request3", + "body": { + "hello": "world" + } +} diff --git a/test_data/requests/cli_request4.json b/test_data/requests/cli_request4.json new file mode 100644 index 0000000..98c4813 --- /dev/null +++ b/test_data/requests/cli_request4.json @@ -0,0 +1,17 @@ +{ + "method": "POST", + "url": "/request4", + "body": { + "hello": "world" + }, + "params": { + "query": { + "test": [ + true + ], + "test2": [ + "yes" + ] + } + } +} diff --git a/test_data/requests/cli_request5.json b/test_data/requests/cli_request5.json new file mode 100644 index 0000000..bd4affb --- /dev/null +++ b/test_data/requests/cli_request5.json @@ -0,0 +1,7 @@ +{ + "method": "GET", + "url": "/xyz", + "body": { + "hello": "world" + } +} diff --git a/test_data/requests/cli_request6.json b/test_data/requests/cli_request6.json new file mode 100644 index 0000000..5dde52b --- /dev/null +++ b/test_data/requests/cli_request6.json @@ -0,0 +1,7 @@ +{ + "method": "GET", + "url": "/request1", + "body": { + "hello": "world" + } +} diff --git a/tests/crowdstrike/foundry/function/test__init__.py b/tests/crowdstrike/foundry/function/test__init__.py index 11fdf61..1b116bd 100644 --- a/tests/crowdstrike/foundry/function/test__init__.py +++ b/tests/crowdstrike/foundry/function/test__init__.py @@ -1,10 +1,10 @@ import os -from crowdstrike.foundry.function import Function, Request, Response, FDKException, cloud -from crowdstrike.foundry.function.router import Route, Router from logging import Logger, getLogger -from tests.crowdstrike.foundry.function.utils import CapturingRunner, StaticConfigLoader from unittest import main, TestCase from unittest.mock import patch +from crowdstrike.foundry.function import Function, Request, Response, FDKException, cloud +from crowdstrike.foundry.function.router import Route, Router +from tests.crowdstrike.foundry.function.utils import CapturingRunner, StaticConfigLoader if __name__ == '__main__': main() @@ -110,12 +110,12 @@ def test_request3(self): resp = self.runner.response self.assertIsNotNone(resp, 'response is none') self.assertEqual(200, resp.code, f'expected response of 200 but got {resp.code}') - l = resp.body.get('logger', None) - self.assertIsInstance(l, Logger,'no logger present in response') + logger = resp.body.get('logger', None) + self.assertIsInstance(logger, Logger,'no logger present in response') self.assertDictEqual( { 'config': {'a': 'b'}, - 'logger': l, + 'logger': logger, 'req': {'hello': 'world'}, }, resp.body, diff --git a/tests/crowdstrike/foundry/function/test_cli_runner.py b/tests/crowdstrike/foundry/function/test_cli_runner.py new file mode 100644 index 0000000..c3447e9 --- /dev/null +++ b/tests/crowdstrike/foundry/function/test_cli_runner.py @@ -0,0 +1,141 @@ +from io import StringIO +from logging import getLogger +from unittest import main, TestCase +from unittest.mock import patch +from crowdstrike.foundry.function import Function, Response +from crowdstrike.foundry.function.router import Route, Router +from crowdstrike.foundry.function.runner_cli import CLIRunner +from tests.crowdstrike.foundry.function.utils import StaticConfigLoader + +if __name__ == '__main__': + main() + + +def do_request1(req): + return Response( + body={ + 'req': req.body, + }, + code=200, + ) + + +def do_request2(req, config): + return Response( + body={ + 'config': config, + 'req': req.body, + }, + code=200, + ) + + +def do_request3(req, config, logger): + return Response( + body={ + 'config': config, + 'logger': logger.name, + 'req': req.body, + }, + code=200, + ) + +def do_request4(req): + return Response( + body={ + 'req_body': req.body, + 'req_query': req.params.query, + 'req_headers': req.params.header, + }, + code=200, + ) + + +class TestCLIRequestLifecycle(TestCase): + def setUp(self): + config = {'a': 'b'} + router = Router(config) + router.register(Route( + method='POST', + path='/request1', + func=do_request1, + )) + router.register(Route( + method='POST', + path='/request2', + func=do_request2, + )) + router.register(Route( + method='POST', + path='/request3', + func=do_request3, + )) + router.register(Route( + method='POST', + path='/request4', + func=do_request4, + )) + self.runner = CLIRunner() + self.runner.bind_router(router) + self.function = Function( + config_loader=StaticConfigLoader(config), + router=router, + runner=self.runner, + ) + + @patch('sys.argv', ['main.py', '--data', './test_data/requests/cli_request1.json']) + def test_request1(self): + with patch('sys.stdout', new_callable=StringIO) as mock_stdout: + self.function.run() + resp = mock_stdout.getvalue() + expected_resp = '\nStatus code: 200\nResponse Header: Content-Length: 50\nResponse Header: Content-Type: application/json\nResponse Payload:\n{"code": 200, "body": {"req": {"hello": "world"}}}\n' + self.assertEqual(resp, expected_resp, 'Unexpected response received') + + @patch('sys.argv', ['main.py', '--data', './test_data/requests/cli_request2.json']) + def test_request2(self): + with patch('sys.stdout', new_callable=StringIO) as mock_stdout: + self.function.run() + resp = mock_stdout.getvalue() + expected_resp = '\nStatus code: 200\nResponse Header: Content-Length: 72\nResponse Header: Content-Type: application/json\nResponse Payload:\n{"code": 200, "body": {"config": {"a": "b"}, "req": {"hello": "world"}}}\n' + self.assertEqual(resp, expected_resp, 'Unexpected response received') + + @patch('sys.argv', ['main.py', '--data', './test_data/requests/cli_request3.json']) + def test_request3(self): + with patch('sys.stdout', new_callable=StringIO) as mock_stdout: + use_logger = getLogger('__name__') + self.function.run(logger=use_logger) + resp = mock_stdout.getvalue() + expected_resp = '\nStatus code: 200\nResponse Header: Content-Length: 94\nResponse Header: Content-Type: application/json\nResponse Payload:\n{"code": 200, "body": {"config": {"a": "b"}, "logger": "__name__", "req": {"hello": "world"}}}\n' + self.assertEqual(resp, expected_resp, 'Unexpected response received') + + @patch('sys.argv', ['main.py', '--data', './test_data/requests/cli_request4.json', '-H', 'X-TEST-HEADER: test', '--header', 'Accept: application/json']) + def test_request4(self): + with patch('sys.stdout', new_callable=StringIO) as mock_stdout: + self.function.run() + resp = mock_stdout.getvalue() + expected_resp = ( + '\nStatus code: 200\nResponse Header: Content-Length: 180\n' + 'Response Header: Content-Type: application/json\n' + 'Response Payload:\n{"code": 200, "body": {"req_body": {"hello": "world"}, ' + '"req_query": {"test": [true], "test2": ["yes"]}, ' + '"req_headers": {"X-Test-Header": ["test"], "Accept": ["application/json"]}}}\n' + ) + self.assertEqual(expected_resp, resp,'Unexpected response received') + + @patch('sys.argv', ['main.py', '--data', './test_data/requests/cli_request5.json']) + def test_unknown_endpoint(self): + with patch('sys.stdout', new_callable=StringIO) as mock_stdout: + self.function.run() + resp = mock_stdout.getvalue() + expected_resp = '\nStatus code: 404\nResponse Header: Content-Length: 86\nResponse Header: Content-Type: application/json\nResponse Payload:\n{"code": 404, "body": {}, "errors": [{"code": 404, "message": "Not Found: GET /xyz"}]}\n' + self.assertEqual(resp, expected_resp, 'Unexpected response received') + + @patch('sys.argv', ['main.py', '--data', './test_data/requests/cli_request6.json']) + def test_unknown_method(self): + with patch('sys.stdout', new_callable=StringIO) as mock_stdout: + self.function.run() + resp = mock_stdout.getvalue() + expected_resp = '\nStatus code: 405\nResponse Header: Content-Length: 102\nResponse Header: Content-Type: application/json\nResponse Payload:\n{"code": 405, "body": {}, "errors": [{"code": 405, "message": "Method Not Allowed: GET at endpoint"}]}\n' + self.assertEqual(resp, expected_resp, 'Unexpected response received') + +