Skip to content

vendor update - ModuleNotFoundError: No module named 'device' #1080

@thezoggy

Description

@thezoggy

Is there an existing issue for this?

The issue occurs in the following browsers. Select at least 2.

  • Firefox
  • Chrome
  • Edge
  • Safari (unsupported) - PRs welcome
  • N/A - This is an issue with the backend

Current Behavior

running container,

Built on: 2025-06-09 | Version: v25.6.7

23:32:33 [2025-06-09 23:32:33-05:00] START Run: VNDRPDT
23:32:33 [Plugins] Timeout: 600
23:32:33 [Plugin utils] Pre-Resolved CMD: python3/app/front/plugins/vendor_update/script.py
23:32:33 [Plugins] Executing: python3 /app/front/plugins/vendor_update/script.py
23:32:33 [Plugins] Resolved : ['python3', '/app/front/plugins/vendor_update/script.py']
23:32:33 [plugin_helper] reading config file
Traceback (most recent call last):
  File "/app/front/plugins/vendor_update/script.py", line 22, in <module>
    from device import query_MAC_vendor
ModuleNotFoundError: No module named 'device'

23:32:33 [Plugins] ⚠ ERROR - enable LOG_LEVEL=debug and check logs
23:32:33 [Plugins] No output received from the plugin "VNDRPDT"
23:32:33 [2025-06-09 23:32:33-05:00] END Run: VNDRPDT

looks like function is in /app/server/scan/device_handling.py ?

Expected Behavior

work?

Steps To Reproduce

  1. Run container
  2. Let it scan and find devices, then run vendor update manually

app.conf

#-----------------AUTOGENERATED FILE-----------------#
#                                                    #
#         Generated:  2025-06-09_23-29-03            #
#                                                    #
#   Config file for the LAN intruder detection app:  #
#      https://github.com/jokob-sk/NetAlertX         #
#                                                    #
#-----------------AUTOGENERATED FILE-----------------#


# General
#---------------------------
LOADED_PLUGINS=['ARPSCAN','CSVBCKP','DBCLNP','DIGSCAN','INTRNT','MAINT','NEWDEV','NBTSCAN','NSLOOKUP','NTFPRCS','AVAHISCAN','SETPWD','SMTP','SYNC','VNDRPDT','WORKFLOWS','UI','CUSTPROP']
LOADED_PLUGINS__metadata="{}"
DISCOVER_PLUGINS=True
DISCOVER_PLUGINS__metadata="{}"
SCAN_SUBNETS=['--localnet','192.168.0.0/24 --interface=eth0']
SCAN_SUBNETS__metadata="{}"
LOG_LEVEL='debug'
LOG_LEVEL__metadata="{}"
TIMEZONE='America/Chicago'
TIMEZONE__metadata="{}"
PLUGINS_KEEP_HIST=250
PLUGINS_KEEP_HIST__metadata="{}"
REPORT_DASHBOARD_URL='http://192.168.0.11:20211'
REPORT_DASHBOARD_URL__metadata="{}"
DAYS_TO_KEEP_EVENTS=90
DAYS_TO_KEEP_EVENTS__metadata="{}"
HRS_TO_KEEP_NEWDEV=0
HRS_TO_KEEP_NEWDEV__metadata="{}"
HRS_TO_KEEP_OFFDEV=0
HRS_TO_KEEP_OFFDEV__metadata="{}"
CLEAR_NEW_FLAG=0
CLEAR_NEW_FLAG__metadata="{}"
REFRESH_FQDN=False
REFRESH_FQDN__metadata="{}"
API_CUSTOM_SQL='SELECT * FROM Devices WHERE devPresentLastScan = 0'
API_CUSTOM_SQL__metadata="{}"
VERSION='1749502292'
VERSION__metadata="{}"
NETWORK_DEVICE_TYPES=['AP','Gateway','Firewall','Hypervisor','Powerline','Switch','WLAN','PLC','Router','USB LAN Adapter','USB WIFI Adapter','Internet']
NETWORK_DEVICE_TYPES__metadata="{}"
GRAPHQL_PORT=20212
GRAPHQL_PORT__metadata="{}"
API_TOKEN='t_lVipr0u5GXyezRETOQJV'
API_TOKEN__metadata="{}"

... removed for brevity ...

# VNDRPDT
#---------------------------
VNDRPDT_RUN='schedule'
VNDRPDT_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"run\"], \"type\": {\"dataType\": \"string\", \"elements\": [{\"elementType\": \"select\", \"elementOptions\": [], \"transformers\": []}]}, \"default_value\": \"schedule\", \"options\": [\"disabled\", \"once\", \"schedule\", \"always_after_scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cu\\u00e1ndo ejecutar\"}, {\"language_code\": \"de_de\", \"string\": \"Wann ausf\\u00fchren\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"When the plugin should run. An overnight weekly <code>SCHEDULE</code> is recommended.\"}, {\"language_code\": \"de_de\", \"string\": \"Wann das Plugin ausgef\\u00fchrt werden soll. Eine w\\u00f6chentliche <code>SCHEDULE</code> in der Nacht wird empfohlen.\"}]}"
VNDRPDT_CMD='python3 /app/front/plugins/vendor_update/script.py'
VNDRPDT_CMD__metadata="{\"function\": \"CMD\", \"type\": {\"dataType\": \"string\", \"elements\": [{\"elementType\": \"input\", \"elementOptions\": [{\"readonly\": \"true\"}], \"transformers\": []}]}, \"default_value\": \"python3 /app/front/plugins/vendor_update/script.py\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run. This can not be changed\"}, {\"language_code\": \"es_es\", \"string\": \"Comando a ejecutar. Esto no se puede cambiar\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl zum Ausf\\u00fchren. Dies kann nicht ge\\u00e4ndert werden\"}]}"
VNDRPDT_RUN_SCHD='0 4 * * 3'
VNDRPDT_RUN_SCHD__metadata="{\"function\": \"RUN_SCHD\", \"type\": {\"dataType\": \"string\", \"elements\": [{\"elementType\": \"span\", \"elementOptions\": [{\"cssClasses\": \"input-group-addon validityCheck\"}, {\"getStringKey\": \"Gen_ValidIcon\"}], \"transformers\": []}, {\"elementType\": \"input\", \"elementOptions\": [{\"onChange\": \"validateRegex(this)\"}, {\"base64Regex\": \"Xig/OlwqfCg/OlswLTldfFsxLTVdWzAtOV18WzAtOV0rLVswLTldK3xcKi9bMC05XSspKVxzKyg/OlwqfCg/OlswLTldfDFbMC05XXwyWzAtM118WzAtOV0rLVswLTldK3xcKi9bMC05XSspKVxzKyg/OlwqfCg/OlsxLTldfFsxMl1bMC05XXwzWzAxXXxbMC05XSstWzAtOV0rfFwqL1swLTldKykpXHMrKD86XCp8KD86WzEtOV18MVswLTJdfFswLTldKy1bMC05XSt8XCovWzAtOV0rKSlccysoPzpcKnwoPzpbMC02XXxbMC02XS1bMC02XXxcKi9bMC05XSspKSQ=\"}], \"transformers\": []}]}, \"default_value\": \"0 4 * * 3\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Schedule\"}, {\"language_code\": \"es_es\", \"string\": \"Schedule\"}, {\"language_code\": \"de_de\", \"string\": \"Zeitplan\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Only enabled if you select <code>schedule</code> in the <a href=\\\"#VNDRPDT_RUN\\\"><code>VNDRPDT_RUN</code> setting</a>. Make sure you enter the schedule in the correct cron-like format (e.g. validate at <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). For example entering <code>0 4 * * *</code> will run the scan after 4 am in the <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\"><code>TIMEZONE</code> you set above</a>. Will be run NEXT time the time passes.\"}, {\"language_code\": \"es_es\", \"string\": \"Solo est\\u00e1 habilitado si selecciona <code>schedule</code> en la configuraci\\u00f3n <a href=\\\"#VNDRPDT_RUN\\\"><code>VNDRPDT_RUN</code></a>. Aseg\\u00farese de ingresar la programaci\\u00f3n en el formato similar a cron correcto (por ejemplo, valide en <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutar\\u00e1 el escaneo despu\\u00e9s de las 4 a.m. en el <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\"><code>TIMEZONE</ c\\u00f3digo> que configur\\u00f3 arriba</a>. Se ejecutar\\u00e1 la PR\\u00d3XIMA vez que pase el tiempo.\"}, {\"language_code\": \"de_de\", \"string\": \"Nur aktiv, wenn <code>schedule</code> in der <a href=\\\"#VNDRPDT_RUN\\\"><code>VNDRPDT_RUN</code> Einstellung</a> ausgew\\u00e4hlt wurde. Sichergehen, dass das Intervall in einem korrekten cron-\\u00e4hnlichen Format angegeben wurde (z.B. auf <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a> testen). <code>0 4 * * *</code> w\\u00fcrde den Scan t\\u00e4glich um 4 Uhr in der <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\">oben ausgew\\u00e4hlten <code>TIMEZONE</code></a> starten. Wird erst beim N\\u00c4CHSTEN Intervall ausgef\\u00fchrt. <br/>Es wird empfohlen, das Intervall aller Plugins, welche nach neuen Ger\\u00e4ten suchen, auf den gleichen Wert zu setzen.\"}]}"
VNDRPDT_RUN_TIMEOUT=600
VNDRPDT_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": {\"dataType\": \"integer\", \"elements\": [{\"elementType\": \"input\", \"elementOptions\": [{\"type\": \"number\"}], \"transformers\": []}]}, \"default_value\": 600, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo l\\u00edmite de ejecuci\\u00f3n\"}, {\"language_code\": \"de_de\", \"string\": \"Zeit\\u00fcberschreitung\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo m\\u00e1ximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela.\"}, {\"language_code\": \"de_de\", \"string\": \"Maximale Zeit in Sekunden, die auf den Abschluss des Skripts gewartet werden soll. Bei \\u00dcberschreitung dieser Zeit wird das Skript abgebrochen.\"}]}"
VNDRPDT_WATCH=['Watched_Value1']
VNDRPDT_WATCH__metadata="{\"function\": \"WATCH\", \"type\": {\"dataType\": \"array\", \"elements\": [{\"elementType\": \"select\", \"elementOptions\": [{\"multiple\": \"true\"}], \"transformers\": []}]}, \"default_value\": [\"Watched_Value1\"], \"options\": [\"Watched_Value1\", \"Watched_Value2\", \"Watched_Value3\", \"Watched_Value4\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Watched\"}, {\"language_code\": \"es_es\", \"string\": \"Visto\"}, {\"language_code\": \"de_de\", \"string\": \"\\u00dcberwacht\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification if selected values change. Use <code>CTRL + Click</code> to select/deselect. <ul> <li><code>Watched_Value1</code> is vendor name</li><li><code>Watched_Value2</code> is device name</li><li><code>Watched_Value3</code> unused </li><li><code>Watched_Value4</code> unused </li></ul>\"}, {\"language_code\": \"de_de\", \"string\": \"Sende eine Benachrichtigung, wenn ein ausgw\\u00e4hlter Wert sich \\u00e4ndert. <code>STRG + klicken</code> zum aus-/abw\\u00e4hlen. <ul> <li><code>Watched_Value1</code> ist der Herstellername</li><li><code>Watched_Value2</code> ist der Ger\\u00e4tename</li><li><code>Watched_Value3</code> ist nicht in Verwendung </li><li><code>Watched_Value4</code> ist nicht in Verwendung </li></ul>\"}]}"
VNDRPDT_REPORT_ON=['new','watched-changed']
VNDRPDT_REPORT_ON__metadata="{\"function\": \"REPORT_ON\", \"type\": {\"dataType\": \"array\", \"elements\": [{\"elementType\": \"select\", \"elementOptions\": [{\"multiple\": \"true\"}], \"transformers\": []}]}, \"default_value\": [\"new\", \"watched-changed\"], \"options\": [\"new\", \"watched-changed\", \"watched-not-changed\", \"missing-in-last-scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Report on\"}, {\"language_code\": \"es_es\", \"string\": \"Informar sobre\"}, {\"language_code\": \"de_de\", \"string\": \"Benachrichtige wenn\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification only on these statuses. <code>new</code> means a new unique (unique combination of PrimaryId and SecondaryId) object was discovered. <code>watched-changed</code> means that selected <code>Watched_ValueN</code> columns changed.\"}, {\"language_code\": \"es_es\", \"string\": \"Env\\u00ede una notificaci\\u00f3n solo en estos estados. <code>new</code> significa que se descubri\\u00f3 un nuevo objeto \\u00fanico (combinaci\\u00f3n \\u00fanica de PrimaryId y SecondaryId). <code>watched-changed</code> significa que seleccion\\u00f3 <code>Watched_ValueN Las columnas </code> cambiaron.\"}, {\"language_code\": \"de_de\", \"string\": \"Benachrichtige nur bei diesen Status. <code>new</code> bedeutet ein neues eindeutiges (einzigartige Kombination aus PrimaryId und SecondaryId) Objekt wurde erkennt. <code>watched-changed</code> bedeutet eine ausgew\\u00e4hlte <code>Watched_ValueN</code>-Spalte hat sich ge\\u00e4ndert.\"}]}"


# WORKFLOWS
#---------------------------
WORKFLOWS_AppEvents_hist=100
WORKFLOWS_AppEvents_hist__metadata="{\"function\": \"AppEvents_hist\", \"type\": {\"dataType\": \"integer\", \"elements\": [{\"elementType\": \"input\", \"elementOptions\": [{\"type\": \"number\"}], \"transformers\": []}]}, \"default_value\": 100, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"App Events History\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"How many historical entries of Application Events should be kept. This influences how many entries are also available in the Workflows section in the UI.\"}]}"


#-------------------IMPORTANT INFO-------------------#
#   This file is ingested by a python script, so if  #
#        modified it needs to use python syntax      #
#-------------------IMPORTANT INFO-------------------#

docker-compose.yml

# docker run --rm -v /var/run/docker.sock:/var/run/docker.sock ghcr.io/red5d/docker-autocompose NetAlertX
services:
  NetAlertX:

    container_name: "NetAlertX"

    entrypoint:
      - "/init"

    environment:
      - "TZ=America/Chicago"
      - "HOST_OS=Unraid"
      - "TCP_PORT_20211=20211"
      - "HOST_HOSTNAME=husky"
      - "HOST_CONTAINERNAME=NetAlertX"
      - "PUID=99"
      - "PGID=100"
      - "CA_TS_FALLBACK_DIR=/app/config"
      - "PATH=/opt/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
      - "PORT=20211"
      - "LISTEN_ADDR=0.0.0.0"
      - "S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0"

    hostname: "husky"

    image: "jokobsk/netalertx"

    ipc: "private"

    labels:
      net.unraid.docker.icon: "https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/front/img/NetAlertX_logo.png"
      net.unraid.docker.managed: "dockerman"
      net.unraid.docker.webui: "http://[IP]:[PORT:20211]"
      org.opencontainers.image.created: "2025-06-06T23:45:15.328Z"
      org.opencontainers.image.description: "Network intruder and presence detector.  Scans for devices\
        \ connected to your network and alerts you if new and unknown devices are found."
      org.opencontainers.image.licenses: "GPL-3.0"
      org.opencontainers.image.revision: "6fd8c2fbd914606518cc408b515b4009b185b90c"
      org.opencontainers.image.source: "https://github.com/jokob-sk/NetAlertX"
      org.opencontainers.image.title: "NetAlertX"
      org.opencontainers.image.url: "https://github.com/jokob-sk/NetAlertX"
      org.opencontainers.image.version: "25.6.7"

    logging:
      driver: "json-file"
      options:
        max-file: "1"
        max-size: "500m"

    network_mode: "host"

    volumes:
      - "/mnt/user/appdata/netalertx/config:/app/config"
      - "/mnt/user/appdata/netalertx/db:/app/db"
      - "/mnt/user/appdata/pihole-dot-doh/pihole/pihole-FTL.db:/etc/pihole/pihole-FTL.db"

    working_dir: "/"

version: "3.6"

What installation are you running?

Production (netalertx)

app.log

No response

Debug enabled

  • I have read and followed the steps in the wiki link above and provided the required debug logs and the log section covers the time when the issue occurs.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Docker 🐋Docker relatedbug 🐛Something isn't workingnext release/in dev image 🚀This is coming in the next release or was already released if the issue is Closed.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions