Error status at run custom script from NetBox WebUI #11838

Closed
opened 2025-12-29 21:50:29 +01:00 by adam · 0 comments
Owner

Originally created by @spot62 on GitHub (Nov 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 GitHub (Nov 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
adam added the netbox label 2025-12-29 21:50:29 +01:00
adam closed this issue 2025-12-29 21:50:29 +01:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/netbox#11838