diff --git a/netbox/core/models/jobs.py b/netbox/core/models/jobs.py index 1a35e5906..af8191df5 100644 --- a/netbox/core/models/jobs.py +++ b/netbox/core/models/jobs.py @@ -13,7 +13,6 @@ from django.utils.translation import gettext as _ from core.choices import JobStatusChoices from core.models import ContentType from extras.constants import EVENT_JOB_END, EVENT_JOB_START -from extras.utils import process_event_rules from netbox.config import get_config from netbox.constants import RQ_QUEUE_DEFAULT from utilities.querysets import RestrictedQuerySet @@ -230,6 +229,7 @@ class Job(models.Model): Process any EventRules relevant to the passed job event (i.e. start or stop). """ from extras.models import EventRule + from extras.events import process_event_rules # Fetch any event rules matching this object type and action event_rules = EventRule.objects.filter( diff --git a/netbox/extras/events.py b/netbox/extras/events.py index 6e1f07684..a0e03c42d 100644 --- a/netbox/extras/events.py +++ b/netbox/extras/events.py @@ -9,7 +9,6 @@ from utilities.api import get_serializer_for_model from utilities.utils import serialize_object from .choices import * from .models import EventRule -from .utils import process_event_rules logger = logging.getLogger('netbox.events_processor') @@ -64,6 +63,40 @@ def enqueue_object(queue, instance, user, request_id, action): }) +def process_event_rules(event_rules, model_name, event, data, username, snapshots=None, request_id=None): + rq_queue_name = get_config().QUEUE_MAPPINGS.get('webhook', RQ_QUEUE_DEFAULT) + rq_queue = get_queue(rq_queue_name) + + for event_rule in event_rules: + if event_rule.action_type == EventRuleActionChoices.WEBHOOK: + processor = "extras.webhooks_worker.process_webhook" + elif event_rule.action_type == EventRuleActionChoices.SCRIPT: + processor = "extras.scripts_worker.process_script" + else: + raise ValueError(f"Unknown action type for an event rule: {event_rule.action_type}") + + params = { + "event_rule": event_rule, + "model_name": model_name, + "event": event, + "data": data, + "snapshots": snapshots, + "timestamp": str(timezone.now()), + "username": username, + "retry": get_rq_retry() + } + + if snapshots: + params["snapshots"] = snapshots + if request_id: + params["request_id"] = request_id + + rq_queue.enqueue( + processor, + **params + ) + + def process_event_queue(events): """ Flush a list of object representation to RQ for EventRule processing. diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 055d30237..da9d31443 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -284,7 +284,7 @@ class EventRuleForm(NetBoxModelForm): 'action_parameters': forms.HiddenInput, } - def get_script_choices(self): + def init_script_choice(self): choices = [] for module in ScriptModule.objects.all(): scripts = [] @@ -298,7 +298,7 @@ class EventRuleForm(NetBoxModelForm): self.fields['action_choice'].choices = choices self.fields['action_choice'].initial = get_field_value(self, 'action_parameters') - def get_webhook_choices(self): + def init_webhook_choice(self): initial = None if self.fields['action_object_type'] and get_field_value(self, 'action_object_id'): initial = Webhook.objects.get(pk=get_field_value(self, 'action_object_id')) @@ -318,9 +318,9 @@ class EventRuleForm(NetBoxModelForm): action_type = get_field_value(self, 'action_type') if action_type == EventRuleActionChoices.WEBHOOK: - self.get_webhook_choices() + self.init_webhook_choice() elif action_type == EventRuleActionChoices.SCRIPT: - self.get_script_choices() + self.init_script_choice() val = get_field_value(self, 'conditions')