Error status at run custom script from NetBox WebUI #869

Closed
opened 2026-04-05 18:22:25 +02:00 by MrUnknownDE · 0 comments
Owner

Originally created by @spot62 on 11/17/2025

NetBox Edition

NetBox Community

NetBox Version

v4.4.6

Python Version

3.12

Steps to Reproduce

1 Create and upload custom script to Netbox


import sys

# Netbox artifcats
from extras.scripts import Script, ObjectVar, MultiObjectVar
from dcim.models import Site, Device

# Modules

# Classes
class DevicePing(Script):
    class Meta:
        name = "Ping devices"
        description = "A simple script to ping devices in a selected location"
        field_order = ("site", "devices")

    site = ObjectVar(
        model=Site
    )

    devices = MultiObjectVar(
        model=Device,
        query_params={
            "site_id": "$site"
        }
    )

    def run(self, data, commit) -> str:
        #print_in_nb = []

        self.log_debug('run')
        try:
            from icmplib import ping

            for device in data["devices"]:
                self.log_debug(f"{device.name} current status is {device.status}")

                if 'icmplib' in sys.modules:
                    self.log_debug("The 'icmplib' is loaded.")
                    result = ping(str(device.primary_ip.address.ip), count=3, interval=0.2, privileged=False)
                else:
                    self.log_debug("The 'icmplib' is not loaded.")
                    result = lambda: None
                    result.is_alive = True

                if result.is_alive:
                    device.status = "active"
                else:
                    device.status = "offline"

                device.save()

                self.log_info(f"{device.name} is set to {device.status}")

                # print_in_nb.append(f"{device.name} is set to {device.status}")
        except Exception as ex:
            self.log_failure(f'{type(ex).__name__}: {ex}')
            self.log_debug(sys.modules)


        # return '\n'.join(print_in_nb)
        return 'Done'

Expected Behavior

2 Run from CLI

 /opt/netbox/netbox/scripts$ ../manage.py runscript DeviceChecker.DevicePing --loglevel debug --data '{"site": 570, "devices": [1, 2, 3]}'
🧬 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-11-17 12:00:14,213][INFO] - Running script (commit=False)
[2025-11-17 12:00:14,213][DEBUG] - run
[2025-11-17 12:00:14,213][DEBUG] - n100-c1-acc1 current status is active
[2025-11-17 12:00:14,744][INFO] - n100-c1-acc1 is set to active
[2025-11-17 12:00:14,744][DEBUG] - n100-c1-acc2 current status is active
[2025-11-17 12:00:15,201][INFO] - n100-c1-acc2 is set to active
[2025-11-17 12:00:15,201][DEBUG] - n100-c1-acc3 current status is active
[2025-11-17 12:00:15,665][INFO] - n100-c1-acc3 is set to active
[2025-11-17 12:00:15,666][INFO] - Database changes have been reverted automatically.
[2025-11-17 12:00:15,910][INFO] - Script completed in 0 minutes, 1.60 seconds

it's Ok

Observed Behavior

3 Run from WebUI:
script status Error without logging.

RunScript->Error : TypeError("'NoneType' object is not callable")
RunScript->Journal: Found ScriptModel ID 5

Error: ModuleNotFoundError: No module named 'icmplib'
and icmplib is absent in sys.modules

How to fix it?

Thank you

*Originally created by @spot62 on 11/17/2025* ### NetBox Edition NetBox Community ### NetBox Version v4.4.6 ### Python Version 3.12 ### Steps to Reproduce 1 Create and upload custom script to Netbox ``` import sys # Netbox artifcats from extras.scripts import Script, ObjectVar, MultiObjectVar from dcim.models import Site, Device # Modules # Classes class DevicePing(Script): class Meta: name = "Ping devices" description = "A simple script to ping devices in a selected location" field_order = ("site", "devices") site = ObjectVar( model=Site ) devices = MultiObjectVar( model=Device, query_params={ "site_id": "$site" } ) def run(self, data, commit) -> str: #print_in_nb = [] self.log_debug('run') try: from icmplib import ping for device in data["devices"]: self.log_debug(f"{device.name} current status is {device.status}") if 'icmplib' in sys.modules: self.log_debug("The 'icmplib' is loaded.") result = ping(str(device.primary_ip.address.ip), count=3, interval=0.2, privileged=False) else: self.log_debug("The 'icmplib' is not loaded.") result = lambda: None result.is_alive = True if result.is_alive: device.status = "active" else: device.status = "offline" device.save() self.log_info(f"{device.name} is set to {device.status}") # print_in_nb.append(f"{device.name} is set to {device.status}") except Exception as ex: self.log_failure(f'{type(ex).__name__}: {ex}') self.log_debug(sys.modules) # return '\n'.join(print_in_nb) return 'Done' ``` ### Expected Behavior 2 Run from CLI ``` /opt/netbox/netbox/scripts$ ../manage.py runscript DeviceChecker.DevicePing --loglevel debug --data '{"site": 570, "devices": [1, 2, 3]}' 🧬 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-11-17 12:00:14,213][INFO] - Running script (commit=False) [2025-11-17 12:00:14,213][DEBUG] - run [2025-11-17 12:00:14,213][DEBUG] - n100-c1-acc1 current status is active [2025-11-17 12:00:14,744][INFO] - n100-c1-acc1 is set to active [2025-11-17 12:00:14,744][DEBUG] - n100-c1-acc2 current status is active [2025-11-17 12:00:15,201][INFO] - n100-c1-acc2 is set to active [2025-11-17 12:00:15,201][DEBUG] - n100-c1-acc3 current status is active [2025-11-17 12:00:15,665][INFO] - n100-c1-acc3 is set to active [2025-11-17 12:00:15,666][INFO] - Database changes have been reverted automatically. [2025-11-17 12:00:15,910][INFO] - Script completed in 0 minutes, 1.60 seconds ``` it's Ok ### Observed Behavior 3 Run from WebUI: ~~script status Error without logging.~~ ``` RunScript->Error : TypeError("'NoneType' object is not callable") RunScript->Journal: Found ScriptModel ID 5 ``` Error: ModuleNotFoundError: No module named 'icmplib' and icmplib is absent in sys.modules How to fix it? Thank you
MrUnknownDE added the netboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetbox labels 2026-04-05 18:22:58 +02:00
Sign in to join this conversation.
No Label netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github/netbox#869