Browse Source

12416 warning for missing script file (#12456)

* 12416 warning for missing script file

* 12416 widen exception catching for internal script error

* Update netbox/extras/models/scripts.py

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>

* 12416 update from review feedback

---------

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
Arthur Hanson 2 years ago
parent
commit
9909213c0d
3 changed files with 52 additions and 39 deletions
  1. 9 1
      netbox/extras/models/scripts.py
  2. 0 1
      netbox/extras/views.py
  3. 43 37
      netbox/templates/extras/script_list.html

+ 9 - 1
netbox/extras/models/scripts.py

@@ -1,4 +1,5 @@
 import inspect
+import logging
 from functools import cached_property
 
 from django.db import models
@@ -16,6 +17,8 @@ __all__ = (
     'ScriptModule',
 )
 
+logger = logging.getLogger('netbox.data_backends')
+
 
 class Script(WebhooksMixin, models.Model):
     """
@@ -53,7 +56,12 @@ class ScriptModule(PythonModuleMixin, JobsMixin, ManagedFile):
             # For child objects in submodules use the full import path w/o the root module as the name
             return cls.full_name.split(".", maxsplit=1)[1]
 
-        module = self.get_module()
+        try:
+            module = self.get_module()
+        except Exception as e:
+            logger.debug(f"Failed to load script: {self.python_name} error: {e}")
+            module = None
+
         scripts = {}
         ordered = getattr(module, 'script_order', [])
 

+ 0 - 1
netbox/extras/views.py

@@ -1033,7 +1033,6 @@ class ScriptView(ContentTypePermissionRequiredMixin, View):
         return 'extras.view_script'
 
     def get(self, request, module, name):
-        print(module)
         module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path__startswith=module)
         script = module.scripts[name]()
         form = script.as_form(initial=normalize_querydict(request.GET))

+ 43 - 37
netbox/templates/extras/script_list.html

@@ -37,43 +37,49 @@
         </h5>
         <div class="card-body">
           {% include 'inc/sync_warning.html' with object=module %}
-          <table class="table table-hover table-headings reports">
-            <thead>
-              <tr>
-                <th width="250">Name</th>
-                <th>Description</th>
-                <th>Last Run</th>
-                <th class="text-end">Status</th>
-              </tr>
-            </thead>
-            <tbody>
-              {% with jobs=module.get_latest_jobs %}
-                {% for script_name, script_class in module.scripts.items %}
-                  <tr>
-                    <td>
-                      <a href="{% url 'extras:script' module=module.python_name name=script_name %}" name="script.{{ script_name }}">{{ script_class.name }}</a>
-                    </td>
-                    <td>
-                      {{ script_class.Meta.description|markdown|placeholder }}
-                    </td>
-                    {% with last_result=jobs|get_key:script_class.name %}
-                      {% if last_result %}
-                        <td>
-                          <a href="{% url 'extras:script_result' job_pk=last_result.pk %}">{{ last_result.created|annotated_date }}</a>
-                        </td>
-                        <td class="text-end">
-                          {% badge last_result.get_status_display last_result.get_status_color %}
-                        </td>
-                      {% else %}
-                        <td class="text-muted">Never</td>
-                        <td class="text-end">{{ ''|placeholder }}</td>
-                      {% endif %}
-                    {% endwith %}
-                  </tr>
-                {% endfor %}
-              {% endwith %}
-            </tbody>
-          </table>
+          {% if not module.scripts %}
+            <div class="alert alert-warning d-flex align-items-center" role="alert">
+              <i class="mdi mdi-alert"></i>&nbsp; Script file at: {{module.full_path}} could not be loaded.
+            </div>
+          {% else %}
+            <table class="table table-hover table-headings reports">
+              <thead>
+                <tr>
+                  <th width="250">Name</th>
+                  <th>Description</th>
+                  <th>Last Run</th>
+                  <th class="text-end">Status</th>
+                </tr>
+              </thead>
+              <tbody>
+                {% with jobs=module.get_latest_jobs %}
+                  {% for script_name, script_class in module.scripts.items %}
+                    <tr>
+                      <td>
+                        <a href="{% url 'extras:script' module=module.python_name name=script_name %}" name="script.{{ script_name }}">{{ script_class.name }}</a>
+                      </td>
+                      <td>
+                        {{ script_class.Meta.description|markdown|placeholder }}
+                      </td>
+                      {% with last_result=jobs|get_key:script_class.name %}
+                        {% if last_result %}
+                          <td>
+                            <a href="{% url 'extras:script_result' job_pk=last_result.pk %}">{{ last_result.created|annotated_date }}</a>
+                          </td>
+                          <td class="text-end">
+                            {% badge last_result.get_status_display last_result.get_status_color %}
+                          </td>
+                        {% else %}
+                          <td class="text-muted">Never</td>
+                          <td class="text-end">{{ ''|placeholder }}</td>
+                        {% endif %}
+                      {% endwith %}
+                    </tr>
+                  {% endfor %}
+                {% endwith %}
+              </tbody>
+            </table>
+          {% endif %}
         </div>
       </div>
     {% empty %}