1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Add lock around script loading to prevent race condition

This commit is contained in:
kkthxbye-code
2022-04-22 21:21:01 +02:00
parent 8315883db9
commit 84e4156259

View File

@ -5,6 +5,7 @@ import os
import pkgutil import pkgutil
import sys import sys
import traceback import traceback
import threading
from collections import OrderedDict from collections import OrderedDict
import yaml import yaml
@ -42,6 +43,8 @@ __all__ = [
'TextVar', 'TextVar',
] ]
lock = threading.Lock()
# #
# Script variables # Script variables
@ -491,11 +494,14 @@ def get_scripts(use_names=False):
# Iterate through all modules within the scripts path. These are the user-created files in which reports are # Iterate through all modules within the scripts path. These are the user-created files in which reports are
# defined. # defined.
for importer, module_name, _ in pkgutil.iter_modules([settings.SCRIPTS_ROOT]): for importer, module_name, _ in pkgutil.iter_modules([settings.SCRIPTS_ROOT]):
# Remove cached module to ensure consistency with filesystem # Use a lock as removing and loading modules is not thread safe
if module_name in sys.modules: with lock:
del sys.modules[module_name] # Remove cached module to ensure consistency with filesystem
if module_name in sys.modules:
del sys.modules[module_name]
module = importer.find_module(module_name).load_module(module_name)
module = importer.find_module(module_name).load_module(module_name)
if use_names and hasattr(module, 'name'): if use_names and hasattr(module, 'name'):
module_name = module.name module_name = module.name
module_scripts = OrderedDict() module_scripts = OrderedDict()