Skip to content

Custom scripts failures #18722

@iamjpy

Description

@iamjpy

Deployment Type

Self-hosted

NetBox Version

v4.2.3

Python Version

3.12

Steps to Reproduce

  1. Upload custom script to UI
from extras.scripts import Script
class Test(Script):
    def run(self, data, commit):
        
        self.log_info("Netbox Test")

Expected Behavior

The script should execute properly and accurate results show be rendered in UI

Observed Behavior

One of two outcomes can occur:

  1. When running the script via the UI, the script execution completes with an incorrect Error result in the UI
Image

log:

netbox-worker-f9bb66977-p75nj netbox-worker 15:41:08 Successfully completed handle(commit=True, data={}, job=<Job: f78c9970-15e2-4afa-bc99-a5c2a0ef9f92>, request=<utilities.request.NetBoxFakeRequest object at 0x7fc1cdbf90d0>) job in 0:00:00.050665s on worker 49aec44fc373495eb3b5f05233990f88
netbox-worker-f9bb66977-p75nj netbox-worker 15:41:08 default: Job OK (f78c9970-15e2-4afa-bc99-a5c2a0ef9f92)
netbox-worker-f9bb66977-p75nj netbox-worker 15:41:08 Result is kept for 500 seconds
  1. When running the script via the UI, a server error occurs
Image

Backtrace:

netbox-556b8d659f-zlg9p netbox Internal Server Error: /extras/scripts/results/61/
netbox-556b8d659f-zlg9p netbox Traceback (most recent call last):
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
netbox-556b8d659f-zlg9p netbox     response = get_response(request)
netbox-556b8d659f-zlg9p netbox                ^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
netbox-556b8d659f-zlg9p netbox     response = wrapped_callback(request, *callback_args, **callback_kwargs)
netbox-556b8d659f-zlg9p netbox                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/views/generic/base.py", line 104, in view
netbox-556b8d659f-zlg9p netbox     return self.dispatch(request, *args, **kwargs)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/netbox/netbox/views/generic/base.py", line 26, in dispatch
netbox-556b8d659f-zlg9p netbox     return super().dispatch(request, *args, **kwargs)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/netbox/utilities/views.py", line 125, in dispatch
netbox-556b8d659f-zlg9p netbox     return super().dispatch(request, *args, **kwargs)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/netbox/utilities/views.py", line 39, in dispatch
netbox-556b8d659f-zlg9p netbox     return super().dispatch(request, *args, **kwargs)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/views/generic/base.py", line 143, in dispatch
netbox-556b8d659f-zlg9p netbox     return handler(request, *args, **kwargs)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/netbox/extras/views.py", line 1409, in get
netbox-556b8d659f-zlg9p netbox     return render(request, 'extras/script_result.html', context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/shortcuts.py", line 25, in render
netbox-556b8d659f-zlg9p netbox     content = loader.render_to_string(template_name, context, request, using=using)
netbox-556b8d659f-zlg9p netbox               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/loader.py", line 62, in render_to_string
netbox-556b8d659f-zlg9p netbox     return template.render(context, request)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render
netbox-556b8d659f-zlg9p netbox     return self.template.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render
netbox-556b8d659f-zlg9p netbox     return self._render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render
netbox-556b8d659f-zlg9p netbox     return self.nodelist.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render
netbox-556b8d659f-zlg9p netbox     return SafeString("".join([node.render_annotated(context) for node in self]))
netbox-556b8d659f-zlg9p netbox                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated
netbox-556b8d659f-zlg9p netbox     return self.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render
netbox-556b8d659f-zlg9p netbox     return compiled_parent._render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render
netbox-556b8d659f-zlg9p netbox     return self.nodelist.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render
netbox-556b8d659f-zlg9p netbox     return SafeString("".join([node.render_annotated(context) for node in self]))
netbox-556b8d659f-zlg9p netbox                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated
netbox-556b8d659f-zlg9p netbox     return self.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render
netbox-556b8d659f-zlg9p netbox     return compiled_parent._render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render
netbox-556b8d659f-zlg9p netbox     return self.nodelist.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render
netbox-556b8d659f-zlg9p netbox     return SafeString("".join([node.render_annotated(context) for node in self]))
netbox-556b8d659f-zlg9p netbox                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated
netbox-556b8d659f-zlg9p netbox     return self.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render
netbox-556b8d659f-zlg9p netbox     return compiled_parent._render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render
netbox-556b8d659f-zlg9p netbox     return self.nodelist.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render
netbox-556b8d659f-zlg9p netbox     return SafeString("".join([node.render_annotated(context) for node in self]))
netbox-556b8d659f-zlg9p netbox                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated
netbox-556b8d659f-zlg9p netbox     return self.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render
netbox-556b8d659f-zlg9p netbox     result = block.nodelist.render(context)
netbox-556b8d659f-zlg9p netbox              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render
netbox-556b8d659f-zlg9p netbox     return SafeString("".join([node.render_annotated(context) for node in self]))
netbox-556b8d659f-zlg9p netbox                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated
netbox-556b8d659f-zlg9p netbox     return self.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render
netbox-556b8d659f-zlg9p netbox     result = block.nodelist.render(context)
netbox-556b8d659f-zlg9p netbox              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render
netbox-556b8d659f-zlg9p netbox     return SafeString("".join([node.render_annotated(context) for node in self]))
netbox-556b8d659f-zlg9p netbox                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated
netbox-556b8d659f-zlg9p netbox     return self.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 327, in render
netbox-556b8d659f-zlg9p netbox     return nodelist.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render
netbox-556b8d659f-zlg9p netbox     return SafeString("".join([node.render_annotated(context) for node in self]))
netbox-556b8d659f-zlg9p netbox                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated
netbox-556b8d659f-zlg9p netbox     return self.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/library.py", line 258, in render
netbox-556b8d659f-zlg9p netbox     _dict = self.func(*resolved_args, **resolved_kwargs)
netbox-556b8d659f-zlg9p netbox             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/netbox/utilities/templatetags/helpers.py", line 263, in table_config_form
netbox-556b8d659f-zlg9p netbox     'form': TableConfigForm(table=table),
netbox-556b8d659f-zlg9p netbox             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/netbox/utilities/forms/forms.py", line 135, in __init__
netbox-556b8d659f-zlg9p netbox     self.fields['available_columns'].choices = table.available_columns
netbox-556b8d659f-zlg9p netbox                                                ^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox AttributeError: 'NoneType' object has no attribute 'available_columns'

The script runs successfully via the CLI and the results are displayed properly in the UI, but does not run successfully in the UI

$ python /opt/netbox/netbox/manage.py runscript netbox_test.Test
🧬 loaded config '/etc/netbox/config/configuration.py'
🧬 loaded config '/etc/netbox/config/extra.py'
🧬 loaded config '/etc/netbox/config/logging.py'
🧬 loaded config '/etc/netbox/config/plugins.py'
[2025-02-24 15:25:33,732][INFO] - Running script (commit=False)
[2025-02-24 15:25:33,733][INFO] - Netbox Test
[2025-02-24 15:25:33,733][INFO] - Database changes have been reverted automatically.
[2025-02-24 15:25:33,738][INFO] - Script completed in 0 minutes, 0.01 seconds
Image

Deployed using netbox-community/netbox-chart

Metadata

Metadata

Assignees

Labels

severity: mediumResults in substantial degraded or broken functionality for specfic workflowsstatus: acceptedThis issue has been accepted for implementationtype: bugA confirmed report of unexpected behavior in the application

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions