From 46c4a1285106eacc2c644ddfcc109e51d604e179 Mon Sep 17 00:00:00 2001 From: victor Date: Sat, 15 Jun 2024 00:35:12 +0200 Subject: [PATCH] Configuration of add-on done --- .gitignore | 5 ++ README.md | 3 + detelete_old_clients_ds/README.md | 1 + detelete_old_clients_ds/globalConfig.json | 88 ++++++++++++++++++ detelete_old_clients_ds/package/LICENSE.txt | 0 detelete_old_clients_ds/package/README.txt | 0 detelete_old_clients_ds/package/app.manifest | 57 ++++++++++++ .../package/bin/delete_old_clients_ds.py | 39 ++++++++ .../bin/delete_old_clients_ds_helper.py | 89 +++++++++++++++++++ detelete_old_clients_ds/package/bin/main.py | 8 ++ .../package/lib/requirements.txt | 3 + 11 files changed, 293 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 detelete_old_clients_ds/README.md create mode 100644 detelete_old_clients_ds/globalConfig.json create mode 100644 detelete_old_clients_ds/package/LICENSE.txt create mode 100644 detelete_old_clients_ds/package/README.txt create mode 100644 detelete_old_clients_ds/package/app.manifest create mode 100644 detelete_old_clients_ds/package/bin/delete_old_clients_ds.py create mode 100644 detelete_old_clients_ds/package/bin/delete_old_clients_ds_helper.py create mode 100644 detelete_old_clients_ds/package/bin/main.py create mode 100644 detelete_old_clients_ds/package/lib/requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2b045cb --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +bin/* +lib/* +lib64 +include/* +pyvenv.cfg \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..a4b5f95 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Splunk Add-on to delete old clients from Deployment Server + + diff --git a/detelete_old_clients_ds/README.md b/detelete_old_clients_ds/README.md new file mode 100644 index 0000000..8f32096 --- /dev/null +++ b/detelete_old_clients_ds/README.md @@ -0,0 +1 @@ +# detelete_old_clients_ds diff --git a/detelete_old_clients_ds/globalConfig.json b/detelete_old_clients_ds/globalConfig.json new file mode 100644 index 0000000..02a0210 --- /dev/null +++ b/detelete_old_clients_ds/globalConfig.json @@ -0,0 +1,88 @@ +{ + "pages": { + "configuration": { + "tabs": [ + { + "name": "account", + "table": { + "actions": [ + "edit", + "delete", + "clone" + ], + "header": [ + { + "label": "Name", + "field": "name" + } + ] + }, + "entity": [ + { + "type": "text", + "label": "Name", + "validators": [ + { + "type": "regex", + "errorMsg": "Account Name must begin with a letter and consist exclusively of alphanumeric characters and underscores.", + "pattern": "^[a-zA-Z]\\w*$" + }, + { + "type": "string", + "errorMsg": "Length of input name should be between 1 and 100", + "minLength": 1, + "maxLength": 100 + } + ], + "field": "name", + "help": "A unique name for the account.", + "required": true + }, + { + "type": "text", + "label": "Username", + "field": "username", + "help": "Deployment server username", + "required": true + }, + { + "type": "text", + "label": "Password", + "field": "password", + "help": "Password", + "required": true, + "encrypted": true + }, + { + "type": "text", + "label": "Deployment Server URL", + "field": "url", + "help": "URL of the DS instance", + "required": true + } + ], + "title": "Accounts" + }, + { + "type": "loggingTab" + } + ], + "title": "Configuration", + "description": "Set up your add-on" + }, + "dashboard": { + "panels": [ + { + "name": "default" + } + ] + } + }, + "meta": { + "name": "detelete_old_clients_ds", + "restRoot": "detelete_old_clients_ds", + "version": "0.0.1", + "displayName": "DS Add-on Delete old clients", + "schemaVersion": "0.0.3" + } +} \ No newline at end of file diff --git a/detelete_old_clients_ds/package/LICENSE.txt b/detelete_old_clients_ds/package/LICENSE.txt new file mode 100644 index 0000000..e69de29 diff --git a/detelete_old_clients_ds/package/README.txt b/detelete_old_clients_ds/package/README.txt new file mode 100644 index 0000000..e69de29 diff --git a/detelete_old_clients_ds/package/app.manifest b/detelete_old_clients_ds/package/app.manifest new file mode 100644 index 0000000..747aef0 --- /dev/null +++ b/detelete_old_clients_ds/package/app.manifest @@ -0,0 +1,57 @@ +{ + "schemaVersion": "2.0.0", + "info": { + "title": "DS Add-on Delete old clients", + "id": { + "group": null, + "name": "detelete_old_clients_ds", + "version": "0.0.1" + }, + "author": [ + { + "name": "", + "email": null, + "company": null + } + ], + "releaseDate": null, + "description": "DS Add-on Delete old clients", + "classification": { + "intendedAudience": "IT Professionals", + "categories": [ + "Security, Fraud & Compliance" + ], + "developmentStatus": "Production/Stable" + }, + "commonInformationModels": null, + "license": { + "name": null, + "text": "LICENSE.txt", + "uri": null + }, + "privacyPolicy": { + "name": null, + "text": null, + "uri": null + }, + "releaseNotes": { + "name": "README", + "text": "README.txt", + "uri": "" + } + }, + "dependencies": null, + "tasks": null, + "inputGroups": null, + "incompatibleApps": null, + "platformRequirements": null, + "supportedDeployments": [ + "_standalone", + "_distributed", + "_search_head_clustering" + ], + "targetWorkloads": [ + "_search_heads", + "_indexers" + ] +} \ No newline at end of file diff --git a/detelete_old_clients_ds/package/bin/delete_old_clients_ds.py b/detelete_old_clients_ds/package/bin/delete_old_clients_ds.py new file mode 100644 index 0000000..173f01a --- /dev/null +++ b/detelete_old_clients_ds/package/bin/delete_old_clients_ds.py @@ -0,0 +1,39 @@ +import import_declare_test + +import sys + +from splunklib import modularinput as smi +from delete_old_clients_ds_helper import stream_events, validate_input + + +class DELETE_OLD_CLIENTS_DS(smi.Script): + def __init__(self): + super(DELETE_OLD_CLIENTS_DS, self).__init__() + + def get_scheme(self): + scheme = smi.Scheme('delete_old_clients_ds') + scheme.description = 'demo_input input' + scheme.use_external_validation = True + scheme.streaming_mode_xml = True + scheme.use_single_instance = False + + scheme.add_argument( + smi.Argument( + 'name', + title='Name', + description='Name', + required_on_create=True + ) + ) + return scheme + + def validate_input(self, definition: smi.ValidationDefinition): + return validate_input(definition) + + def stream_events(self, inputs: smi.InputDefinition, ew: smi.EventWriter): + return stream_events(inputs, ew) + + +if __name__ == '__main__': + exit_code = DELETE_OLD_CLIENTS_DS().run(sys.argv) + sys.exit(exit_code) diff --git a/detelete_old_clients_ds/package/bin/delete_old_clients_ds_helper.py b/detelete_old_clients_ds/package/bin/delete_old_clients_ds_helper.py new file mode 100644 index 0000000..7077a14 --- /dev/null +++ b/detelete_old_clients_ds/package/bin/delete_old_clients_ds_helper.py @@ -0,0 +1,89 @@ +import json +import logging + +import import_declare_test +from solnlib import conf_manager, log +from splunklib import modularinput as smi + + +ADDON_NAME = "detelete_old_clients_ds" + + +def logger_for_input(input_name: str) -> logging.Logger: + return log.Logs().get_logger(f"{ADDON_NAME.lower()}_{input_name}") + + +def get_account_api_key(session_key: str, account_name: str): + cfm = conf_manager.ConfManager( + session_key, + ADDON_NAME, + realm=f"__REST_CREDENTIAL__#{ADDON_NAME}#configs/conf-detelete_old_clients_ds_account", + ) + account_conf_file = cfm.get_conf("detelete_old_clients_ds_account") + return account_conf_file.get(account_name).get("api_key") + + +def get_data_from_api(logger: logging.Logger, api_key: str): + logger.info("Getting data from an external API") + dummy_data = [ + { + "line1": "hello", + }, + { + "line2": "world", + }, + ] + return dummy_data + + +def validate_input(definition: smi.ValidationDefinition): + return + + +def stream_events(inputs: smi.InputDefinition, event_writer: smi.EventWriter): + # inputs.inputs is a Python dictionary object like: + # { + # "delete_old_clients_ds://": { + # "account": "", + # "disabled": "0", + # "host": "$decideOnStartup", + # "index": "", + # "interval": "", + # "python.version": "python3", + # }, + # } + for input_name, input_item in inputs.inputs.items(): + normalized_input_name = input_name.split("/")[-1] + logger = logger_for_input(normalized_input_name) + try: + session_key = inputs.metadata["session_key"] + log_level = conf_manager.get_log_level( + logger=logger, + session_key=session_key, + app_name=ADDON_NAME, + conf_name=f"{ADDON_NAME}_settings", + ) + logger.setLevel(log_level) + log.modular_input_start(logger, normalized_input_name) + api_key = get_account_api_key(session_key, input_item.get("account")) + data = get_data_from_api(logger, api_key) + sourcetype = "dummy-data" + for line in data: + event_writer.write_event( + smi.Event( + data=json.dumps(line, ensure_ascii=False, default=str), + index=input_item.get("index"), + sourcetype=sourcetype, + ) + ) + log.events_ingested( + logger, + normalized_input_name, + sourcetype, + len(data), + input_item.get("index"), + account=input_item.get("account"), + ) + log.modular_input_end(logger, normalized_input_name) + except Exception as e: + log.log_exception(logger, e, "my custom error type", msg_before="Exception raised while ingesting data for demo_input: ") diff --git a/detelete_old_clients_ds/package/bin/main.py b/detelete_old_clients_ds/package/bin/main.py new file mode 100644 index 0000000..e33a599 --- /dev/null +++ b/detelete_old_clients_ds/package/bin/main.py @@ -0,0 +1,8 @@ +import requests + + +class deleteClientDS(): + def __init__(self): + deployment_server = os.getenv('SPLUNK_DS') + splunk_username = os.getenv('SPLUNK_DS_USER') + splunk_password = os.getenv('SPLUNK_DS_PASS') diff --git a/detelete_old_clients_ds/package/lib/requirements.txt b/detelete_old_clients_ds/package/lib/requirements.txt new file mode 100644 index 0000000..99f4b18 --- /dev/null +++ b/detelete_old_clients_ds/package/lib/requirements.txt @@ -0,0 +1,3 @@ +splunktaucclib +splunk-sdk +solnlib