qol: impove plugin installation/update api

This commit is contained in:
Gary Sharp
2024-12-11 15:13:26 +11:00
parent f36871abe2
commit 343f20980d
13 changed files with 606 additions and 504 deletions
+9 -5
View File
@@ -505,7 +505,7 @@ namespace Disco.Services.Plugins
#region Restart App
private static object _restartTimerLock = new object();
private static Timer _restartTimer;
internal static void RestartApp(int DelayMilliseconds)
internal static void RestartApp(TimeSpan delay)
{
lock (_restartTimerLock)
{
@@ -514,11 +514,15 @@ namespace Disco.Services.Plugins
_restartTimer.Dispose();
}
_restartTimer = new Timer((state) =>
{
if (delay == TimeSpan.Zero)
HttpRuntime.UnloadAppDomain();
//AppDomain.Unload(AppDomain.CurrentDomain);
}, null, DelayMilliseconds, Timeout.Infinite);
else
{
_restartTimer = new Timer((state) =>
{
HttpRuntime.UnloadAppDomain();
}, null, (int)delay.TotalMilliseconds, Timeout.Infinite);
}
}
}
#endregion
@@ -46,7 +46,7 @@ namespace Disco.Services.Plugins
}
Status.Finished("Restarting Disco ICT, please wait...", "/Config/Plugins");
Plugins.RestartApp(2500);
Plugins.RestartApp(TimeSpan.FromSeconds(1));
}
public static ScheduledTaskStatus UninstallPlugin(PluginManifest Manifest, bool UninstallData)
+15 -10
View File
@@ -18,8 +18,9 @@ namespace Disco.Services.Plugins
protected override void ExecuteTask()
{
string pluginId = (string)ExecutionContext.JobDetail.JobDataMap["PluginId"];
string packageFilePath = (string)ExecutionContext.JobDetail.JobDataMap["PackageFilePath"];
var pluginId = (string)ExecutionContext.JobDetail.JobDataMap["PluginId"];
var packageFilePath = (string)ExecutionContext.JobDetail.JobDataMap["PackageFilePath"];
var immediateRestart = (bool)ExecutionContext.JobDetail.JobDataMap["ImmediateRestart"];
PluginLibraryManifestV2 libraryManifest;
PluginLibraryIncompatibility libraryIncompatibility;
@@ -89,7 +90,7 @@ namespace Disco.Services.Plugins
ExecuteTaskInternal(Status, pluginPackagesLocation, updatePlugins);
Status.Finished("Restarting Disco ICT, please wait...", "/Config/Plugins");
Plugins.RestartApp(2500);
Plugins.RestartApp(immediateRestart ? TimeSpan.Zero : TimeSpan.FromSeconds(1));
}
public static List<PluginManifest> OfflineInstalledPlugins(DiscoDataContext Database)
@@ -258,7 +259,7 @@ namespace Disco.Services.Plugins
}
}
private static ScheduledTaskStatus UpdateHelper(string PluginId = null, string PackageFilePath = null)
private static ScheduledTaskStatus UpdateHelper(string pluginId, string packageFilePath, bool immediateRestart)
{
if (ScheduledTasks.GetTaskStatuses(typeof(UpdatePluginTask)).Where(s => s.IsRunning).Count() > 0)
throw new InvalidOperationException("A plugin is already being Updated");
@@ -267,24 +268,28 @@ namespace Disco.Services.Plugins
if (ScheduledTasks.GetTaskStatuses(typeof(InstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
throw new InvalidOperationException("A plugin is being Installed");
JobDataMap taskData = new JobDataMap() { { "PluginId", PluginId }, { "PackageFilePath", PackageFilePath } };
JobDataMap taskData = new JobDataMap() {
{ "PluginId", pluginId },
{ "PackageFilePath", packageFilePath },
{ "ImmediateRestart", immediateRestart },
};
var instance = new UpdatePluginTask();
return instance.ScheduleTask(taskData);
}
public static ScheduledTaskStatus UpdateLocalPlugin(string PluginId, string PackageFilePath)
public static ScheduledTaskStatus UpdateLocalPlugin(string pluginId, string packageFilePath, bool immediateRestart = false)
{
return UpdateHelper(PluginId, PackageFilePath);
return UpdateHelper(pluginId, packageFilePath, immediateRestart);
}
public static ScheduledTaskStatus UpdatePlugin(string PluginId)
public static ScheduledTaskStatus UpdatePlugin(string pluginId, bool immediateRestart = false)
{
return UpdateHelper(PluginId);
return UpdateHelper(pluginId, packageFilePath: null, immediateRestart);
}
public static ScheduledTaskStatus UpdateAllPlugins()
{
return UpdateHelper();
return UpdateHelper(pluginId: null, packageFilePath: null, immediateRestart: false);
}
}
}
@@ -34,7 +34,7 @@ namespace Disco.Services.Plugins
// Restart
Status.Finished("Restarting Disco ICT, please wait...", "/");
Plugins.RestartApp(2500);
Plugins.RestartApp(TimeSpan.FromSeconds(1));
}
public static ScheduledTaskStatus UpdateDiscoPlugins(bool ReturnExistingStatusIfRunning)