From 4de5046109fafa20fd6173128f9ed5aeebbc5ee6 Mon Sep 17 00:00:00 2001 From: renatoalmeidaoliveira Date: Tue, 6 Feb 2024 11:47:38 +0000 Subject: [PATCH 1/4] Render Action Data as Jinja2 --- netbox/extras/events.py | 11 ++++++++++- netbox/extras/models/models.py | 9 +++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/netbox/extras/events.py b/netbox/extras/events.py index c50f4488df..0c7bd09b5e 100644 --- a/netbox/extras/events.py +++ b/netbox/extras/events.py @@ -119,13 +119,22 @@ def process_event_rules(event_rules, model_name, event, data, username=None, sna script_name = event_rule.action_parameters['script_name'] script = script_module.scripts[script_name]() + context = { + 'event': event, + 'timestamp': timezone.now().isoformat(), + 'model': model_name, + 'username': username, + 'request_id': request_id, + 'model': data, + } + # Enqueue a Job to record the script's execution Job.enqueue( "extras.scripts.run_script", instance=script_module, name=script.class_name, user=user, - data=data + data=event_rule.render_script_data(context) ) else: diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 4ac36a3ac8..46ddc6d39e 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -171,6 +171,15 @@ def eval_conditions(self, data): return True return ConditionSet(self.conditions).eval(data) + + def render_script_data(self, context): + """ + Render Script Data, if defined. Otherwise, jump the context as a JSON object. + """ + if self.action_data: + return render_jinja2(str(self.action_data), context) + else: + return json.dumps(context, cls=JSONEncoder) class Webhook(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedModel): From 1ed09806327fac07d09d8b6da2426ae4f8987e80 Mon Sep 17 00:00:00 2001 From: renatoalmeidaoliveira Date: Tue, 6 Feb 2024 21:16:30 +0000 Subject: [PATCH 2/4] Fix json string sent by render_script_data, and setups run_script to process the input data inside the script form --- netbox/extras/models/models.py | 2 +- netbox/extras/scripts.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 46ddc6d39e..0e59c74e7f 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -177,7 +177,7 @@ def render_script_data(self, context): Render Script Data, if defined. Otherwise, jump the context as a JSON object. """ if self.action_data: - return render_jinja2(str(self.action_data), context) + return render_jinja2(json.dumps(self.action_data), context) else: return json.dumps(context, cls=JSONEncoder) diff --git a/netbox/extras/scripts.py b/netbox/extras/scripts.py index f28465547b..fa92acfe1d 100644 --- a/netbox/extras/scripts.py +++ b/netbox/extras/scripts.py @@ -488,6 +488,12 @@ def run_script(data, job, request=None, commit=True, **kwargs): module = ScriptModule.objects.get(pk=job.object_id) script = module.scripts.get(job.name)() + if isinstance(data, str): + data = json.loads(data) + form = script.as_form(data) + if form.is_valid(): + data = form.cleaned_data + logger = logging.getLogger(f"netbox.scripts.{script.full_name}") logger.info(f"Running script (commit={commit})") From 17ad376fce7b453b523c903d61af2b3e1d26b475 Mon Sep 17 00:00:00 2001 From: renatoalmeidaoliveira Date: Tue, 6 Feb 2024 21:23:47 +0000 Subject: [PATCH 3/4] Lint PEP8 --- netbox/extras/models/models.py | 2 +- netbox/extras/scripts.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 0e59c74e7f..3a72d183e5 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -171,7 +171,7 @@ def eval_conditions(self, data): return True return ConditionSet(self.conditions).eval(data) - + def render_script_data(self, context): """ Render Script Data, if defined. Otherwise, jump the context as a JSON object. diff --git a/netbox/extras/scripts.py b/netbox/extras/scripts.py index fa92acfe1d..60d81a3149 100644 --- a/netbox/extras/scripts.py +++ b/netbox/extras/scripts.py @@ -491,7 +491,7 @@ def run_script(data, job, request=None, commit=True, **kwargs): if isinstance(data, str): data = json.loads(data) form = script.as_form(data) - if form.is_valid(): + if form.is_valid(): data = form.cleaned_data logger = logging.getLogger(f"netbox.scripts.{script.full_name}") From ae828adc7a58a54a3373d7881eac29da932bbea5 Mon Sep 17 00:00:00 2001 From: renatoalmeidaoliveira Date: Wed, 14 Feb 2024 23:24:35 +0000 Subject: [PATCH 4/4] Join changes in process_event_rule and limit to process and send action data to Script --- netbox/extras/events.py | 28 ++++++++++++++++++---------- netbox/extras/models/models.py | 9 --------- netbox/extras/scripts.py | 6 ------ 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/netbox/extras/events.py b/netbox/extras/events.py index 0c7bd09b5e..d90da1ae7c 100644 --- a/netbox/extras/events.py +++ b/netbox/extras/events.py @@ -1,4 +1,5 @@ import logging +import json from django.conf import settings from django.contrib.auth import get_user_model @@ -14,7 +15,7 @@ from netbox.registry import registry from utilities.api import get_serializer_for_model from utilities.rqworker import get_rq_retry -from utilities.utils import serialize_object +from utilities.utils import serialize_object, render_jinja2 from .choices import * from .models import EventRule, ScriptModule @@ -119,14 +120,21 @@ def process_event_rules(event_rules, model_name, event, data, username=None, sna script_name = event_rule.action_parameters['script_name'] script = script_module.scripts[script_name]() - context = { - 'event': event, - 'timestamp': timezone.now().isoformat(), - 'model': model_name, - 'username': username, - 'request_id': request_id, - 'model': data, - } + # Process Action Data + + if event_rule.action_data: + context = { + 'event': event, + 'timestamp': timezone.now().isoformat(), + 'model': model_name, + 'username': username, + 'request_id': request_id, + 'model': data, + } + rendered_data = render_jinja2(json.dumps(event_rule.action_data), context) + form = script.as_form(json.loads(rendered_data)) + if form.is_valid(): + data = form.cleaned_data # Enqueue a Job to record the script's execution Job.enqueue( @@ -134,7 +142,7 @@ def process_event_rules(event_rules, model_name, event, data, username=None, sna instance=script_module, name=script.class_name, user=user, - data=event_rule.render_script_data(context) + data=data ) else: diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 3a72d183e5..4ac36a3ac8 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -172,15 +172,6 @@ def eval_conditions(self, data): return ConditionSet(self.conditions).eval(data) - def render_script_data(self, context): - """ - Render Script Data, if defined. Otherwise, jump the context as a JSON object. - """ - if self.action_data: - return render_jinja2(json.dumps(self.action_data), context) - else: - return json.dumps(context, cls=JSONEncoder) - class Webhook(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedModel): """ diff --git a/netbox/extras/scripts.py b/netbox/extras/scripts.py index 60d81a3149..f28465547b 100644 --- a/netbox/extras/scripts.py +++ b/netbox/extras/scripts.py @@ -488,12 +488,6 @@ def run_script(data, job, request=None, commit=True, **kwargs): module = ScriptModule.objects.get(pk=job.object_id) script = module.scripts.get(job.name)() - if isinstance(data, str): - data = json.loads(data) - form = script.as_form(data) - if form.is_valid(): - data = form.cleaned_data - logger = logging.getLogger(f"netbox.scripts.{script.full_name}") logger.info(f"Running script (commit={commit})")