From 4a941775be3cef4d8d7d3e9d739fa0227ebc799f Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 1 Nov 2023 07:42:02 -0700 Subject: [PATCH] 14132 fix --- netbox/extras/events_worker.py | 71 +++++++++++++++++++++++++++++++++ netbox/extras/scripts_worker.py | 20 ++++++++++ 2 files changed, 91 insertions(+) create mode 100644 netbox/extras/events_worker.py create mode 100644 netbox/extras/scripts_worker.py diff --git a/netbox/extras/events_worker.py b/netbox/extras/events_worker.py new file mode 100644 index 000000000..76534159b --- /dev/null +++ b/netbox/extras/events_worker.py @@ -0,0 +1,71 @@ +import logging + +import requests +from django.conf import settings +from django_rq import job +from jinja2.exceptions import TemplateError + +from scripts.workers import process_script +from .conditions import ConditionSet +from .constants import WEBHOOK_EVENT_TYPES, EVENT_TYPE_MODELS +from .webhooks import generate_signature +from webhooks_worker import process_webhook + +logger = logging.getLogger('netbox.events_worker') + + +def eval_conditions(event_rule, data): + """ + Test whether the given data meets the conditions of the event rule (if any). Return True + if met or no conditions are specified. + """ + if not event_rule.conditions: + return True + + logger.debug(f'Evaluating event rule conditions: {event_rule.conditions}') + if ConditionSet(event_rule.conditions).eval(data): + return True + + return False + + +def module_member(name): + mod, member = name.rsplit(".", 1) + module = import_module(mod) + return getattr(module, member) + + +def process_event_rules(event_rule, model_name, event, data, timestamp, username, request_id): + if event_rule.event_type == EVENT_TYPE_MODELS.WEBHOOK: + process_webhook(event_rule, model_name, event, data, timestamp, username, request_id) + elif event_rule.event_type == EVENT_TYPE_MODELS.SCRIPT: + process_script(event_rule, model_name, event, data, timestamp, username, request_id) + + +@job('default') +def process_event(event_rule, model_name, event, data, timestamp, username, request_id=None, snapshots=None): + """ + Make a POST request to the defined Webhook + """ + # Evaluate event rule conditions (if any) + if not eval_conditions(event_rule, data): + return + + # Prepare context data for headers & body templates + context = { + 'event': WEBHOOK_EVENT_TYPES[event], + 'timestamp': timestamp, + 'model': model_name, + 'username': username, + 'request_id': request_id, + 'data': data, + } + if snapshots: + context.update({ + 'snapshots': snapshots + }) + + # process the events pipeline + for name in settings.NETBOX_EVENTS_PIPELINE: + func = module_member(name) + func(event_rule, model_name, event, data, timestamp, username, request_id) diff --git a/netbox/extras/scripts_worker.py b/netbox/extras/scripts_worker.py new file mode 100644 index 000000000..e014463a2 --- /dev/null +++ b/netbox/extras/scripts_worker.py @@ -0,0 +1,20 @@ +import logging + +import requests +from django.conf import settings +from django_rq import job +from jinja2.exceptions import TemplateError + +from .conditions import ConditionSet +from .constants import WEBHOOK_EVENT_TYPES +from .webhooks import generate_signature + +logger = logging.getLogger('netbox.webhooks_worker') + + +def process_script(webhook, model_name, event, data, timestamp, username, request_id=None): + """ + Make a POST request to the defined Webhook + """ + + pass