diff --git a/gaseous-server/Controllers/V1.0/SystemController.cs b/gaseous-server/Controllers/V1.0/SystemController.cs index cba567b..46690ac 100644 --- a/gaseous-server/Controllers/V1.0/SystemController.cs +++ b/gaseous-server/Controllers/V1.0/SystemController.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; +using System.Security.Cryptography.X509Certificates; using System.Text; using System.Text.Json; using System.Threading.Tasks; @@ -10,6 +11,7 @@ using gaseous_server.Classes; using gaseous_server.Classes.Metadata; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Razor.Hosting; namespace gaseous_server.Controllers { @@ -99,6 +101,75 @@ namespace gaseous_server.Controllers return File(bytes, "text/javascript"); } + [MapToApiVersion("1.0")] + [MapToApiVersion("1.1")] + [HttpGet] + [Route("Settings/BackgroundTasks/Intervals")] + [Authorize(Roles = "Admin")] + [ProducesResponseType(StatusCodes.Status200OK)] + public ActionResult GetBackgroundTasks() + { + Dictionary Intervals = new Dictionary(); + Intervals.Add(ProcessQueue.QueueItemType.SignatureIngestor.ToString(), new BackgroundTaskItem(ProcessQueue.QueueItemType.SignatureIngestor)); + Intervals.Add(ProcessQueue.QueueItemType.TitleIngestor.ToString(), new BackgroundTaskItem(ProcessQueue.QueueItemType.TitleIngestor)); + Intervals.Add(ProcessQueue.QueueItemType.MetadataRefresh.ToString(), new BackgroundTaskItem(ProcessQueue.QueueItemType.MetadataRefresh)); + Intervals.Add(ProcessQueue.QueueItemType.OrganiseLibrary.ToString(), new BackgroundTaskItem(ProcessQueue.QueueItemType.OrganiseLibrary)); + Intervals.Add(ProcessQueue.QueueItemType.LibraryScan.ToString(), new BackgroundTaskItem(ProcessQueue.QueueItemType.LibraryScan)); + Intervals.Add(ProcessQueue.QueueItemType.Rematcher.ToString(), new BackgroundTaskItem(ProcessQueue.QueueItemType.Rematcher)); + Intervals.Add(ProcessQueue.QueueItemType.Maintainer.ToString(), new BackgroundTaskItem(ProcessQueue.QueueItemType.Maintainer)); + + return Ok(Intervals); + } + + [MapToApiVersion("1.0")] + [MapToApiVersion("1.1")] + [HttpPost] + [Route("Settings/BackgroundTasks/Intervals")] + [Authorize(Roles = "Admin")] + [ProducesResponseType(StatusCodes.Status200OK)] + public ActionResult SetBackgroundTasks(Dictionary Intervals) + { + foreach (KeyValuePair Interval in Intervals) + { + if (Enum.IsDefined(typeof(ProcessQueue.QueueItemType), Interval.Key)) + { + try + { + BackgroundTaskItem taskItem = new BackgroundTaskItem( + (ProcessQueue.QueueItemType)Enum.Parse(typeof(ProcessQueue.QueueItemType), Interval.Key) + ); + + if (Interval.Value >= taskItem.MinimumAllowedValue) + { + Logging.Log(Logging.LogType.Information, "Update Background Task", "Updating task " + Interval.Key + " with new interval " + Interval.Value); + + Config.SetSetting("Interval_" + Interval.Key, Interval.Value.ToString()); + + // update existing process + foreach (ProcessQueue.QueueItem item in ProcessQueue.QueueItems) + { + if (item.ItemType.ToString().ToLower() == Interval.Key.ToLower()) + { + item.Interval = Interval.Value; + } + } + } + else + { + Logging.Log(Logging.LogType.Warning, "Update Background Task", "Interval " + Interval.Value + " for task " + Interval.Key + " is below the minimum allowed value of " + taskItem.MinimumAllowedValue + ". Skipping."); + } + } + catch + { + // task name not defined + Logging.Log(Logging.LogType.Warning, "Update Background Task", "Task " + Interval.Key + " is not user definable. Skipping."); + } + } + } + + return Ok(); + } + private SystemInfo.PathItem GetDisk(string Path) { SystemInfo.PathItem pathItem = new SystemInfo.PathItem { @@ -139,4 +210,63 @@ namespace gaseous_server.Controllers } } } + + public class BackgroundTaskItem + { + public BackgroundTaskItem(ProcessQueue.QueueItemType TaskName) + { + this.Task = TaskName.ToString(); + + switch (TaskName) + { + case ProcessQueue.QueueItemType.SignatureIngestor: + this.DefaultInterval = 60; + this.MinimumAllowedValue = 20; + break; + + case ProcessQueue.QueueItemType.TitleIngestor: + this.DefaultInterval = 1; + this.MinimumAllowedValue = 1; + break; + + case ProcessQueue.QueueItemType.MetadataRefresh: + this.DefaultInterval = 360; + this.MinimumAllowedValue = 360; + break; + + case ProcessQueue.QueueItemType.OrganiseLibrary: + this.DefaultInterval = 1440; + this.MinimumAllowedValue = 120; + break; + + case ProcessQueue.QueueItemType.LibraryScan: + this.DefaultInterval = 1440; + this.MinimumAllowedValue = 120; + break; + + case ProcessQueue.QueueItemType.Rematcher: + this.DefaultInterval = 1440; + this.MinimumAllowedValue = 360; + break; + + case ProcessQueue.QueueItemType.Maintainer: + this.DefaultInterval = 10080; + this.MinimumAllowedValue = 10080; + break; + + default: + throw new Exception("Invalid task"); + } + } + + public string Task { get; set; } + public int Interval { + get + { + return int.Parse(Config.ReadSetting("Interval_" + Task, DefaultInterval.ToString())); + } + } + public int DefaultInterval { get; set; } + public int MinimumAllowedValue { get; set; } + } } \ No newline at end of file diff --git a/gaseous-server/ProcessQueue.cs b/gaseous-server/ProcessQueue.cs index 9a73fe0..34b04a5 100644 --- a/gaseous-server/ProcessQueue.cs +++ b/gaseous-server/ProcessQueue.cs @@ -67,7 +67,17 @@ namespace gaseous_server return LastRunTime.AddMinutes(Interval); } } - public int Interval => _Interval; + public int Interval + { + get + { + return _Interval; + } + set + { + _Interval = value; + } + } public string LastResult => _LastResult; public string? LastError => _LastError; public bool Force => _ForceExecute; diff --git a/gaseous-server/wwwroot/pages/settings/settings.html b/gaseous-server/wwwroot/pages/settings/settings.html index 910f478..e3113c0 100644 --- a/gaseous-server/wwwroot/pages/settings/settings.html +++ b/gaseous-server/wwwroot/pages/settings/settings.html @@ -8,6 +8,15 @@
+

Advanced Settings

+

Warning Do not modify the below settings unless you know what you're doing.

+

Background Task Timers

+

All intervals are in minutes.

+ + +
+
+ \ No newline at end of file diff --git a/gaseous-server/wwwroot/pages/settings/system.html b/gaseous-server/wwwroot/pages/settings/system.html index 2689ebd..1cf23ef 100644 --- a/gaseous-server/wwwroot/pages/settings/system.html +++ b/gaseous-server/wwwroot/pages/settings/system.html @@ -34,34 +34,8 @@ if (result) { for (var i = 0; i < result.length; i++) { - var itemTypeName; - switch (result[i].itemType) { - case 'SignatureIngestor': - itemTypeName = "Signature import"; - break; - case 'TitleIngestor': - itemTypeName = "Title import"; - break; - case 'MetadataRefresh': - itemTypeName = "Metadata refresh" - break; - case 'OrganiseLibrary': - itemTypeName = "Organise library"; - break; - case 'LibraryScan': - itemTypeName = "Library scan"; - break; - case 'CollectionCompiler': - itemTypeName = "Compress collection id: " + result[i].options; - break; - case 'BackgroundDatabaseUpgrade': - itemTypeName = "Background database upgrade"; - break; - default: - itemTypeName = result[i].itemType; - break; - } - + var itemTypeName = GetTaskFriendlyName(result[i].itemType, result[i].options); + var itemStateName; var itemLastStart; if (result[i].isBlocked == false) { diff --git a/gaseous-server/wwwroot/scripts/main.js b/gaseous-server/wwwroot/scripts/main.js index 86ab2a0..6c2aba3 100644 --- a/gaseous-server/wwwroot/scripts/main.js +++ b/gaseous-server/wwwroot/scripts/main.js @@ -388,4 +388,25 @@ function CreateBadge(BadgeText, ColourOverride) { badgeItem.style.borderColor = ColourOverride; } return badgeItem; +} + +function GetTaskFriendlyName(TaskName, options) { + switch (TaskName) { + case 'SignatureIngestor': + return "Signature import"; + case 'TitleIngestor': + return "Title import"; + case 'MetadataRefresh': + return "Metadata refresh"; + case 'OrganiseLibrary': + return "Organise library"; + case 'LibraryScan': + return "Library scan"; + case 'CollectionCompiler': + return "Compress collection id: " + options; + case 'BackgroundDatabaseUpgrade': + return "Background database upgrade"; + default: + return TaskName; + } } \ No newline at end of file