1+ import io
12import json
23import uuid
34
78from django .contrib .contenttypes .models import ContentType
89from django .http import HttpResponse
910from django .shortcuts import redirect , render
11+ from django .utils .safestring import mark_safe
1012from django .views .generic import View
1113from extras .filtersets import ObjectChangeFilterSet
1214from extras .models import ObjectChange
2022from .choices import ScriptExecutionStatusChoices
2123from .models import ScriptExecution
2224from .scripts import run_script
25+ from .templatetags .scriptmanager import format_exception
2326
2427plugin_config = settings .PLUGINS_CONFIG .get ("netbox_script_manager" )
2528
@@ -129,7 +132,7 @@ def get_required_permission(self):
129132 def get (self , request ):
130133 scripts_found = False
131134
132- scripts = util .load_scripts ()
135+ scripts , failed_modules = util .load_scripts ()
133136 script_instances = {script_instance .script_path : script_instance for script_instance in models .ScriptInstance .objects .all ()}
134137
135138 for script_path , script in scripts .items ():
@@ -153,12 +156,45 @@ def get(self, request):
153156
154157 messages .success (request , f'Script "{ script_name } " loaded' )
155158
159+ for module_name , exception in failed_modules .items ():
160+ # This is hackish but it works. Toast messages are kinda limited in netbox.
161+ messages .error (
162+ request ,
163+ mark_safe (
164+ f'Failed to load module { module_name } : <pre style="overflow-x: scroll; width: 350px;">{ format_exception (exception )} </pre>'
165+ ),
166+ )
167+
156168 if not scripts_found :
157169 messages .info (request , "No new scripts found" )
158170
159171 return redirect ("plugins:netbox_script_manager:scriptinstance_list" )
160172
161173
174+ class ScriptInstanceSyncView (ContentTypePermissionRequiredMixin , View ):
175+ def get_required_permission (self ):
176+ return "netbox_script_manager.sync_scriptinstance"
177+
178+ def get (self , request ):
179+ try :
180+ from dulwich import porcelain
181+ except ImportError :
182+ messages .error (request , "Dulwich is not installed" )
183+ return redirect ("plugins:netbox_script_manager:scriptinstance_list" )
184+
185+ script_root = plugin_config .get ("SCRIPT_ROOT" )
186+
187+ output_io = io .StringIO ()
188+ output = porcelain .pull (script_root , outstream = output_io )
189+ message = [f"Pulled git repository: { script_root } { output_io .getvalue ()} " ]
190+
191+ if output_io :
192+ message .append (output_io .getvalue ())
193+
194+ messages .info (request , "\n " .join (message ))
195+ return redirect ("plugins:netbox_script_manager:scriptinstance_list" )
196+
197+
162198@register_model_view (models .ScriptInstance , "execution" )
163199class ScriptInstanceScriptExecutionsView (generic .ObjectChildrenView ):
164200 queryset = models .ScriptInstance .objects .all ()
0 commit comments