aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Common.Implementations/ScheduledTasks
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Common.Implementations/ScheduledTasks')
-rw-r--r--MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs538
-rw-r--r--MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs202
-rw-r--r--MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs29
-rw-r--r--MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs29
-rw-r--r--MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/ReloadLoggerTask.cs36
-rw-r--r--MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/SystemUpdateTask.cs36
6 files changed, 666 insertions, 204 deletions
diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
new file mode 100644
index 000000000..7fa30f4ae
--- /dev/null
+++ b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
@@ -0,0 +1,538 @@
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Serialization;
+using MediaBrowser.Model.Tasks;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Common.Implementations.ScheduledTasks
+{
+ /// <summary>
+ /// Class ScheduledTaskWorker
+ /// </summary>
+ public class ScheduledTaskWorker : IScheduledTaskWorker
+ {
+ /// <summary>
+ /// Gets or sets the scheduled task.
+ /// </summary>
+ /// <value>The scheduled task.</value>
+ public IScheduledTask ScheduledTask { get; private set; }
+
+ /// <summary>
+ /// Gets or sets the json serializer.
+ /// </summary>
+ /// <value>The json serializer.</value>
+ private IJsonSerializer JsonSerializer { get; set; }
+
+ /// <summary>
+ /// Gets or sets the application paths.
+ /// </summary>
+ /// <value>The application paths.</value>
+ private IApplicationPaths ApplicationPaths { get; set; }
+
+ /// <summary>
+ /// Gets the logger.
+ /// </summary>
+ /// <value>The logger.</value>
+ private ILogger Logger { get; set; }
+
+ /// <summary>
+ /// Gets the task manager.
+ /// </summary>
+ /// <value>The task manager.</value>
+ private ITaskManager TaskManager { get; set; }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="ScheduledTaskWorker" /> class.
+ /// </summary>
+ /// <param name="scheduledTask">The scheduled task.</param>
+ /// <param name="applicationPaths">The application paths.</param>
+ /// <param name="taskManager">The task manager.</param>
+ /// <param name="jsonSerializer">The json serializer.</param>
+ /// <param name="logger">The logger.</param>
+ public ScheduledTaskWorker(IScheduledTask scheduledTask, IApplicationPaths applicationPaths, ITaskManager taskManager, IJsonSerializer jsonSerializer, ILogger logger)
+ {
+ ScheduledTask = scheduledTask;
+ ApplicationPaths = applicationPaths;
+ TaskManager = taskManager;
+ JsonSerializer = jsonSerializer;
+ Logger = logger;
+ }
+
+ /// <summary>
+ /// The _last execution result
+ /// </summary>
+ private TaskResult _lastExecutionResult;
+ /// <summary>
+ /// The _last execution resultinitialized
+ /// </summary>
+ private bool _lastExecutionResultinitialized;
+ /// <summary>
+ /// The _last execution result sync lock
+ /// </summary>
+ private object _lastExecutionResultSyncLock = new object();
+ /// <summary>
+ /// Gets the last execution result.
+ /// </summary>
+ /// <value>The last execution result.</value>
+ public TaskResult LastExecutionResult
+ {
+ get
+ {
+ LazyInitializer.EnsureInitialized(ref _lastExecutionResult, ref _lastExecutionResultinitialized, ref _lastExecutionResultSyncLock, () =>
+ {
+ try
+ {
+ return JsonSerializer.DeserializeFromFile<TaskResult>(GetHistoryFilePath());
+ }
+ catch (IOException)
+ {
+ // File doesn't exist. No biggie
+ return null;
+ }
+ });
+
+ return _lastExecutionResult;
+ }
+ private set
+ {
+ _lastExecutionResult = value;
+
+ _lastExecutionResultinitialized = value != null;
+ }
+ }
+
+ /// <summary>
+ /// Gets the name.
+ /// </summary>
+ /// <value>The name.</value>
+ public string Name
+ {
+ get { return ScheduledTask.Name; }
+ }
+
+ /// <summary>
+ /// Gets the description.
+ /// </summary>
+ /// <value>The description.</value>
+ public string Description
+ {
+ get { return ScheduledTask.Description; }
+ }
+
+ /// <summary>
+ /// Gets the category.
+ /// </summary>
+ /// <value>The category.</value>
+ public string Category
+ {
+ get { return ScheduledTask.Category; }
+ }
+
+ /// <summary>
+ /// Gets the current cancellation token
+ /// </summary>
+ /// <value>The current cancellation token source.</value>
+ private CancellationTokenSource CurrentCancellationTokenSource { get; set; }
+
+ /// <summary>
+ /// Gets or sets the current execution start time.
+ /// </summary>
+ /// <value>The current execution start time.</value>
+ private DateTime CurrentExecutionStartTime { get; set; }
+
+ /// <summary>
+ /// Gets the state.
+ /// </summary>
+ /// <value>The state.</value>
+ public TaskState State
+ {
+ get
+ {
+ if (CurrentCancellationTokenSource != null)
+ {
+ return CurrentCancellationTokenSource.IsCancellationRequested
+ ? TaskState.Cancelling
+ : TaskState.Running;
+ }
+
+ return TaskState.Idle;
+ }
+ }
+
+ /// <summary>
+ /// Gets the current progress.
+ /// </summary>
+ /// <value>The current progress.</value>
+ public double? CurrentProgress { get; private set; }
+
+ /// <summary>
+ /// The _triggers
+ /// </summary>
+ private IEnumerable<ITaskTrigger> _triggers;
+ /// <summary>
+ /// The _triggers initialized
+ /// </summary>
+ private bool _triggersInitialized;
+ /// <summary>
+ /// The _triggers sync lock
+ /// </summary>
+ private object _triggersSyncLock = new object();
+ /// <summary>
+ /// Gets the triggers that define when the task will run
+ /// </summary>
+ /// <value>The triggers.</value>
+ /// <exception cref="System.ArgumentNullException">value</exception>
+ public IEnumerable<ITaskTrigger> Triggers
+ {
+ get
+ {
+ LazyInitializer.EnsureInitialized(ref _triggers, ref _triggersInitialized, ref _triggersSyncLock, () => LoadTriggers());
+
+ return _triggers;
+ }
+ set
+ {
+ if (value == null)
+ {
+ throw new ArgumentNullException("value");
+ }
+
+ // Cleanup current triggers
+ if (_triggers != null)
+ {
+ DisposeTriggers();
+ }
+
+ _triggers = value.ToList();
+
+ _triggersInitialized = true;
+
+ ReloadTriggerEvents(false);
+
+ SaveTriggers(_triggers);
+ }
+ }
+
+ /// <summary>
+ /// The _id
+ /// </summary>
+ private Guid? _id;
+
+ /// <summary>
+ /// Gets the unique id.
+ /// </summary>
+ /// <value>The unique id.</value>
+ public Guid Id
+ {
+ get
+ {
+ if (!_id.HasValue)
+ {
+ _id = ScheduledTask.GetType().FullName.GetMD5();
+ }
+
+ return _id.Value;
+ }
+ }
+
+ /// <summary>
+ /// Reloads the trigger events.
+ /// </summary>
+ /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param>
+ private void ReloadTriggerEvents(bool isApplicationStartup)
+ {
+ foreach (var trigger in Triggers)
+ {
+ trigger.Stop();
+
+ trigger.Triggered -= trigger_Triggered;
+ trigger.Triggered += trigger_Triggered;
+ trigger.Start(isApplicationStartup);
+ }
+ }
+
+ /// <summary>
+ /// Handles the Triggered event of the trigger control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
+ async void trigger_Triggered(object sender, EventArgs e)
+ {
+ var trigger = (ITaskTrigger)sender;
+
+ Logger.Info("{0} fired for task: {1}", trigger.GetType().Name, Name);
+
+ trigger.Stop();
+
+ TaskManager.QueueScheduledTask(ScheduledTask);
+
+ await Task.Delay(1000).ConfigureAwait(false);
+
+ trigger.Start(false);
+ }
+
+ /// <summary>
+ /// Executes the task
+ /// </summary>
+ /// <returns>Task.</returns>
+ /// <exception cref="System.InvalidOperationException">Cannot execute a Task that is already running</exception>
+ public async Task Execute()
+ {
+ // Cancel the current execution, if any
+ if (CurrentCancellationTokenSource != null)
+ {
+ throw new InvalidOperationException("Cannot execute a Task that is already running");
+ }
+
+ CurrentCancellationTokenSource = new CancellationTokenSource();
+
+ Logger.Info("Executing {0}", Name);
+
+ var progress = new Progress<double>();
+
+ progress.ProgressChanged += progress_ProgressChanged;
+
+ TaskCompletionStatus status;
+ CurrentExecutionStartTime = DateTime.UtcNow;
+
+ //Kernel.TcpManager.SendWebSocketMessage("ScheduledTaskBeginExecute", Name);
+
+ try
+ {
+ await System.Threading.Tasks.Task.Run(async () => await ScheduledTask.Execute(CurrentCancellationTokenSource.Token, progress).ConfigureAwait(false)).ConfigureAwait(false);
+
+ status = TaskCompletionStatus.Completed;
+ }
+ catch (OperationCanceledException)
+ {
+ status = TaskCompletionStatus.Cancelled;
+ }
+ catch (Exception ex)
+ {
+ Logger.ErrorException("Error", ex);
+
+ status = TaskCompletionStatus.Failed;
+ }
+
+ var startTime = CurrentExecutionStartTime;
+ var endTime = DateTime.UtcNow;
+
+ //Kernel.TcpManager.SendWebSocketMessage("ScheduledTaskEndExecute", LastExecutionResult);
+
+ progress.ProgressChanged -= progress_ProgressChanged;
+ CurrentCancellationTokenSource.Dispose();
+ CurrentCancellationTokenSource = null;
+ CurrentProgress = null;
+
+ OnTaskCompleted(startTime, endTime, status);
+ }
+
+ /// <summary>
+ /// Progress_s the progress changed.
+ /// </summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The e.</param>
+ void progress_ProgressChanged(object sender, double e)
+ {
+ CurrentProgress = e;
+ }
+
+ /// <summary>
+ /// Stops the task if it is currently executing
+ /// </summary>
+ /// <exception cref="System.InvalidOperationException">Cannot cancel a Task unless it is in the Running state.</exception>
+ public void Cancel()
+ {
+ if (State != TaskState.Running)
+ {
+ throw new InvalidOperationException("Cannot cancel a Task unless it is in the Running state.");
+ }
+
+ CancelIfRunning();
+ }
+
+ /// <summary>
+ /// Cancels if running.
+ /// </summary>
+ public void CancelIfRunning()
+ {
+ if (State == TaskState.Running)
+ {
+ Logger.Info("Attempting to cancel Scheduled Task {0}", Name);
+ CurrentCancellationTokenSource.Cancel();
+ }
+ }
+
+ /// <summary>
+ /// The _scheduled tasks configuration directory
+ /// </summary>
+ private string _scheduledTasksConfigurationDirectory;
+ /// <summary>
+ /// Gets the scheduled tasks configuration directory.
+ /// </summary>
+ /// <value>The scheduled tasks configuration directory.</value>
+ private string ScheduledTasksConfigurationDirectory
+ {
+ get
+ {
+ if (_scheduledTasksConfigurationDirectory == null)
+ {
+ _scheduledTasksConfigurationDirectory = Path.Combine(ApplicationPaths.ConfigurationDirectoryPath, "ScheduledTasks");
+
+ if (!Directory.Exists(_scheduledTasksConfigurationDirectory))
+ {
+ Directory.CreateDirectory(_scheduledTasksConfigurationDirectory);
+ }
+ }
+ return _scheduledTasksConfigurationDirectory;
+ }
+ }
+
+ /// <summary>
+ /// The _scheduled tasks data directory
+ /// </summary>
+ private string _scheduledTasksDataDirectory;
+ /// <summary>
+ /// Gets the scheduled tasks data directory.
+ /// </summary>
+ /// <value>The scheduled tasks data directory.</value>
+ private string ScheduledTasksDataDirectory
+ {
+ get
+ {
+ if (_scheduledTasksDataDirectory == null)
+ {
+ _scheduledTasksDataDirectory = Path.Combine(ApplicationPaths.DataPath, "ScheduledTasks");
+
+ if (!Directory.Exists(_scheduledTasksDataDirectory))
+ {
+ Directory.CreateDirectory(_scheduledTasksDataDirectory);
+ }
+ }
+ return _scheduledTasksDataDirectory;
+ }
+ }
+
+ /// <summary>
+ /// Gets the history file path.
+ /// </summary>
+ /// <value>The history file path.</value>
+ private string GetHistoryFilePath()
+ {
+ return Path.Combine(ScheduledTasksDataDirectory, Id + ".js");
+ }
+
+ /// <summary>
+ /// Gets the configuration file path.
+ /// </summary>
+ /// <returns>System.String.</returns>
+ private string GetConfigurationFilePath()
+ {
+ return Path.Combine(ScheduledTasksConfigurationDirectory, Id + ".js");
+ }
+
+ /// <summary>
+ /// Loads the triggers.
+ /// </summary>
+ /// <returns>IEnumerable{BaseTaskTrigger}.</returns>
+ private IEnumerable<ITaskTrigger> LoadTriggers()
+ {
+ try
+ {
+ return JsonSerializer.DeserializeFromFile<IEnumerable<TaskTriggerInfo>>(GetConfigurationFilePath())
+ .Select(ScheduledTaskHelpers.GetTrigger)
+ .ToList();
+ }
+ catch (IOException)
+ {
+ // File doesn't exist. No biggie. Return defaults.
+ return ScheduledTask.GetDefaultTriggers();
+ }
+ }
+
+ /// <summary>
+ /// Saves the triggers.
+ /// </summary>
+ /// <param name="triggers">The triggers.</param>
+ private void SaveTriggers(IEnumerable<ITaskTrigger> triggers)
+ {
+ JsonSerializer.SerializeToFile(triggers.Select(ScheduledTaskHelpers.GetTriggerInfo), GetConfigurationFilePath());
+ }
+
+ /// <summary>
+ /// Called when [task completed].
+ /// </summary>
+ /// <param name="startTime">The start time.</param>
+ /// <param name="endTime">The end time.</param>
+ /// <param name="status">The status.</param>
+ private void OnTaskCompleted(DateTime startTime, DateTime endTime, TaskCompletionStatus status)
+ {
+ var elapsedTime = endTime - startTime;
+
+ Logger.Info("{0} {1} after {2} minute(s) and {3} seconds", Name, status, Math.Truncate(elapsedTime.TotalMinutes), elapsedTime.Seconds);
+
+ var result = new TaskResult
+ {
+ StartTimeUtc = startTime,
+ EndTimeUtc = endTime,
+ Status = status,
+ Name = Name,
+ Id = Id
+ };
+
+ JsonSerializer.SerializeToFile(result, GetHistoryFilePath());
+
+ LastExecutionResult = result;
+ }
+
+ /// <summary>
+ /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+ /// </summary>
+ public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ /// <summary>
+ /// Releases unmanaged and - optionally - managed resources.
+ /// </summary>
+ /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
+ protected virtual void Dispose(bool dispose)
+ {
+ if (dispose)
+ {
+ DisposeTriggers();
+
+ if (State == TaskState.Running)
+ {
+ OnTaskCompleted(CurrentExecutionStartTime, DateTime.UtcNow, TaskCompletionStatus.Aborted);
+ }
+
+ if (CurrentCancellationTokenSource != null)
+ {
+ CurrentCancellationTokenSource.Dispose();
+ }
+ }
+ }
+
+ /// <summary>
+ /// Disposes each trigger
+ /// </summary>
+ private void DisposeTriggers()
+ {
+ foreach (var trigger in Triggers)
+ {
+ trigger.Triggered -= trigger_Triggered;
+ trigger.Stop();
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs
index c6eca29d1..4b61492d6 100644
--- a/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs
+++ b/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs
@@ -5,7 +5,6 @@ using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Tasks;
using System;
using System.Collections.Generic;
-using System.IO;
using System.Linq;
namespace MediaBrowser.Common.Implementations.ScheduledTasks
@@ -19,7 +18,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
/// Gets the list of Scheduled Tasks
/// </summary>
/// <value>The scheduled tasks.</value>
- public IScheduledTask[] ScheduledTasks { get; private set; }
+ public IScheduledTaskWorker[] ScheduledTasks { get; private set; }
/// <summary>
/// The _task queue
@@ -27,19 +26,22 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
private readonly List<Type> _taskQueue = new List<Type>();
/// <summary>
- /// The _logger
+ /// Gets or sets the json serializer.
/// </summary>
- private readonly ILogger _logger;
+ /// <value>The json serializer.</value>
+ private IJsonSerializer JsonSerializer { get; set; }
/// <summary>
- /// The _application paths
+ /// Gets or sets the application paths.
/// </summary>
- private readonly IApplicationPaths _applicationPaths;
+ /// <value>The application paths.</value>
+ private IApplicationPaths ApplicationPaths { get; set; }
/// <summary>
- /// The _json serializer
+ /// Gets the logger.
/// </summary>
- private readonly IJsonSerializer _jsonSerializer;
+ /// <value>The logger.</value>
+ private ILogger Logger { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="TaskManager" /> class.
@@ -50,24 +52,11 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
/// <exception cref="System.ArgumentException">kernel</exception>
public TaskManager(IApplicationPaths applicationPaths, IJsonSerializer jsonSerializer, ILogger logger)
{
- if (applicationPaths == null)
- {
- throw new ArgumentException("applicationPaths");
- }
- if (jsonSerializer == null)
- {
- throw new ArgumentException("jsonSerializer");
- }
- if (logger == null)
- {
- throw new ArgumentException("logger");
- }
+ ApplicationPaths = applicationPaths;
+ JsonSerializer = jsonSerializer;
+ Logger = logger;
- _applicationPaths = applicationPaths;
- _jsonSerializer = jsonSerializer;
- _logger = logger;
-
- ScheduledTasks = new IScheduledTask[] {};
+ ScheduledTasks = new IScheduledTaskWorker[] { };
}
/// <summary>
@@ -77,7 +66,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
public void CancelIfRunningAndQueue<T>()
where T : IScheduledTask
{
- ScheduledTasks.OfType<T>().First().CancelIfRunning();
+ ScheduledTasks.First(t => t.ScheduledTask.GetType() == typeof(T)).CancelIfRunning();
QueueScheduledTask<T>();
}
@@ -88,7 +77,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
public void QueueScheduledTask<T>()
where T : IScheduledTask
{
- var scheduledTask = ScheduledTasks.OfType<T>().First();
+ var scheduledTask = ScheduledTasks.First(t => t.ScheduledTask.GetType() == typeof(T));
QueueScheduledTask(scheduledTask);
}
@@ -99,27 +88,36 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
/// <param name="task">The task.</param>
public void QueueScheduledTask(IScheduledTask task)
{
- var type = task.GetType();
+ var scheduledTask = ScheduledTasks.First(t => t.ScheduledTask.GetType() == task.GetType());
- var scheduledTask = ScheduledTasks.First(t => t.GetType() == type);
+ QueueScheduledTask(scheduledTask);
+ }
+
+ /// <summary>
+ /// Queues the scheduled task.
+ /// </summary>
+ /// <param name="task">The task.</param>
+ private void QueueScheduledTask(IScheduledTaskWorker task)
+ {
+ var type = task.GetType();
lock (_taskQueue)
{
// If it's idle just execute immediately
- if (scheduledTask.State == TaskState.Idle)
+ if (task.State == TaskState.Idle)
{
- scheduledTask.Execute();
+ task.Execute();
return;
}
if (!_taskQueue.Contains(type))
{
- _logger.Info("Queueing task {0}", type.Name);
+ Logger.Info("Queueing task {0}", type.Name);
_taskQueue.Add(type);
}
else
{
- _logger.Info("Task already queued: {0}", type.Name);
+ Logger.Info("Task already queued: {0}", type.Name);
}
}
}
@@ -157,148 +155,12 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
{
var myTasks = ScheduledTasks.ToList();
- myTasks.AddRange(tasks);
+ myTasks.AddRange(tasks.Select(t => new ScheduledTaskWorker(t, ApplicationPaths, this, JsonSerializer, Logger)));
ScheduledTasks = myTasks.ToArray();
}
/// <summary>
- /// The _scheduled tasks configuration directory
- /// </summary>
- private string _scheduledTasksConfigurationDirectory;
- /// <summary>
- /// Gets the scheduled tasks configuration directory.
- /// </summary>
- /// <value>The scheduled tasks configuration directory.</value>
- private string ScheduledTasksConfigurationDirectory
- {
- get
- {
- if (_scheduledTasksConfigurationDirectory == null)
- {
- _scheduledTasksConfigurationDirectory = Path.Combine(_applicationPaths.ConfigurationDirectoryPath, "ScheduledTasks");
-
- if (!Directory.Exists(_scheduledTasksConfigurationDirectory))
- {
- Directory.CreateDirectory(_scheduledTasksConfigurationDirectory);
- }
- }
- return _scheduledTasksConfigurationDirectory;
- }
- }
-
- /// <summary>
- /// The _scheduled tasks data directory
- /// </summary>
- private string _scheduledTasksDataDirectory;
- /// <summary>
- /// Gets the scheduled tasks data directory.
- /// </summary>
- /// <value>The scheduled tasks data directory.</value>
- private string ScheduledTasksDataDirectory
- {
- get
- {
- if (_scheduledTasksDataDirectory == null)
- {
- _scheduledTasksDataDirectory = Path.Combine(_applicationPaths.DataPath, "ScheduledTasks");
-
- if (!Directory.Exists(_scheduledTasksDataDirectory))
- {
- Directory.CreateDirectory(_scheduledTasksDataDirectory);
- }
- }
- return _scheduledTasksDataDirectory;
- }
- }
-
- /// <summary>
- /// Gets the history file path.
- /// </summary>
- /// <value>The history file path.</value>
- private string GetHistoryFilePath(IScheduledTask task)
- {
- return Path.Combine(ScheduledTasksDataDirectory, task.Id + ".js");
- }
-
- /// <summary>
- /// Gets the configuration file path.
- /// </summary>
- /// <param name="task">The task.</param>
- /// <returns>System.String.</returns>
- private string GetConfigurationFilePath(IScheduledTask task)
- {
- return Path.Combine(ScheduledTasksConfigurationDirectory, task.Id + ".js");
- }
-
- /// <summary>
- /// Called when [task completed].
- /// </summary>
- /// <param name="task">The task.</param>
- /// <param name="startTime">The start time.</param>
- /// <param name="endTime">The end time.</param>
- /// <param name="status">The status.</param>
- public void OnTaskCompleted(IScheduledTask task, DateTime startTime, DateTime endTime, TaskCompletionStatus status)
- {
- var elapsedTime = endTime - startTime;
-
- _logger.Info("{0} {1} after {2} minute(s) and {3} seconds", task.Name, status, Math.Truncate(elapsedTime.TotalMinutes), elapsedTime.Seconds);
-
- var result = new TaskResult
- {
- StartTimeUtc = startTime,
- EndTimeUtc = endTime,
- Status = status,
- Name = task.Name,
- Id = task.Id
- };
-
- _jsonSerializer.SerializeToFile(result, GetHistoryFilePath(task));
-
- //task.LastExecutionResult = result;
- }
-
- /// <summary>
- /// Gets the last execution result.
- /// </summary>
- /// <param name="task">The task.</param>
- /// <returns>TaskResult.</returns>
- public TaskResult GetLastExecutionResult(IScheduledTask task)
- {
- return _jsonSerializer.DeserializeFromFile<TaskResult>(GetHistoryFilePath(task));
- }
-
- /// <summary>
- /// Loads the triggers.
- /// </summary>
- /// <param name="task">The task.</param>
- /// <returns>IEnumerable{BaseTaskTrigger}.</returns>
- public IEnumerable<ITaskTrigger> LoadTriggers(IScheduledTask task)
- {
- try
- {
- return _jsonSerializer.DeserializeFromFile<IEnumerable<TaskTriggerInfo>>(GetConfigurationFilePath(task))
- .Select(ScheduledTaskHelpers.GetTrigger)
- .ToList();
- }
- catch (IOException)
- {
- // File doesn't exist. No biggie. Return defaults.
- return task.GetDefaultTriggers();
- }
- }
-
- /// <summary>
- /// Saves the triggers.
- /// </summary>
- /// <param name="task">The task.</param>
- /// <param name="triggers">The triggers.</param>
- public void SaveTriggers(IScheduledTask task, IEnumerable<ITaskTrigger> triggers)
- {
- _jsonSerializer.SerializeToFile(triggers.Select(ScheduledTaskHelpers.GetTriggerInfo), GetConfigurationFilePath(task));
- }
-
- /// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
public void Dispose()
diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs
index 2ef056658..a9c82c357 100644
--- a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs
+++ b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs
@@ -13,24 +13,35 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// <summary>
/// Deletes old cache files
/// </summary>
- public class DeleteCacheFileTask : BaseScheduledTask<IKernel>
+ public class DeleteCacheFileTask : IScheduledTask
{
/// <summary>
+ /// Gets or sets the kernel.
+ /// </summary>
+ /// <value>The kernel.</value>
+ private IKernel Kernel { get; set; }
+ /// <summary>
+ /// Gets or sets the logger.
+ /// </summary>
+ /// <value>The logger.</value>
+ private ILogger Logger { get; set; }
+
+ /// <summary>
/// Initializes a new instance of the <see cref="DeleteCacheFileTask" /> class.
/// </summary>
/// <param name="kernel">The kernel.</param>
- /// <param name="taskManager">The task manager.</param>
/// <param name="logger">The logger.</param>
- public DeleteCacheFileTask(IKernel kernel, ITaskManager taskManager, ILogger logger)
- : base(kernel, taskManager, logger)
+ public DeleteCacheFileTask(IKernel kernel, ILogger logger)
{
+ Kernel = kernel;
+ Logger = logger;
}
/// <summary>
/// Creates the triggers that define when the task will run
/// </summary>
/// <returns>IEnumerable{BaseTaskTrigger}.</returns>
- public override IEnumerable<ITaskTrigger> GetDefaultTriggers()
+ public IEnumerable<ITaskTrigger> GetDefaultTriggers()
{
var trigger = new DailyTrigger { TimeOfDay = TimeSpan.FromHours(2) }; //2am
@@ -43,7 +54,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress.</param>
/// <returns>Task.</returns>
- protected override Task ExecuteInternal(CancellationToken cancellationToken, IProgress<double> progress)
+ public Task Execute(CancellationToken cancellationToken, IProgress<double> progress)
{
return Task.Run(() =>
{
@@ -90,7 +101,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// Gets the name of the task
/// </summary>
/// <value>The name.</value>
- public override string Name
+ public string Name
{
get { return "Cache file cleanup"; }
}
@@ -99,7 +110,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// Gets the description.
/// </summary>
/// <value>The description.</value>
- public override string Description
+ public string Description
{
get { return "Deletes cache files no longer needed by the system"; }
}
@@ -108,7 +119,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// Gets the category.
/// </summary>
/// <value>The category.</value>
- public override string Category
+ public string Category
{
get
{
diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs
index dd00a7148..a7d8a68a0 100644
--- a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs
+++ b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs
@@ -13,24 +13,35 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// <summary>
/// Deletes old log files
/// </summary>
- public class DeleteLogFileTask : BaseScheduledTask<IKernel>
+ public class DeleteLogFileTask : IScheduledTask
{
/// <summary>
+ /// Gets or sets the kernel.
+ /// </summary>
+ /// <value>The kernel.</value>
+ private IKernel Kernel { get; set; }
+ /// <summary>
+ /// Gets or sets the logger.
+ /// </summary>
+ /// <value>The logger.</value>
+ private ILogger Logger { get; set; }
+
+ /// <summary>
/// Initializes a new instance of the <see cref="DeleteLogFileTask" /> class.
/// </summary>
/// <param name="kernel">The kernel.</param>
- /// <param name="taskManager">The task manager.</param>
/// <param name="logger">The logger.</param>
- public DeleteLogFileTask(IKernel kernel, ITaskManager taskManager, ILogger logger)
- : base(kernel, taskManager, logger)
+ public DeleteLogFileTask(IKernel kernel, ILogger logger)
{
+ Kernel = kernel;
+ Logger = logger;
}
/// <summary>
/// Creates the triggers that define when the task will run
/// </summary>
/// <returns>IEnumerable{BaseTaskTrigger}.</returns>
- public override IEnumerable<ITaskTrigger> GetDefaultTriggers()
+ public IEnumerable<ITaskTrigger> GetDefaultTriggers()
{
var trigger = new DailyTrigger { TimeOfDay = TimeSpan.FromHours(2) }; //2am
@@ -43,7 +54,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress.</param>
/// <returns>Task.</returns>
- protected override Task ExecuteInternal(CancellationToken cancellationToken, IProgress<double> progress)
+ public Task Execute(CancellationToken cancellationToken, IProgress<double> progress)
{
return Task.Run(() =>
{
@@ -78,7 +89,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// Gets the name of the task
/// </summary>
/// <value>The name.</value>
- public override string Name
+ public string Name
{
get { return "Log file cleanup"; }
}
@@ -87,7 +98,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// Gets the description.
/// </summary>
/// <value>The description.</value>
- public override string Description
+ public string Description
{
get { return string.Format("Deletes log files that are more than {0} days old.", Kernel.Configuration.LogFileRetentionDays); }
}
@@ -96,7 +107,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// Gets the category.
/// </summary>
/// <value>The category.</value>
- public override string Category
+ public string Category
{
get
{
diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/ReloadLoggerTask.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/ReloadLoggerTask.cs
index 79c633c76..ac06f111a 100644
--- a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/ReloadLoggerTask.cs
+++ b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/ReloadLoggerTask.cs
@@ -11,24 +11,35 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// <summary>
/// Class ReloadLoggerFileTask
/// </summary>
- public class ReloadLoggerFileTask : BaseScheduledTask<IKernel>
+ public class ReloadLoggerFileTask : IScheduledTask
{
/// <summary>
+ /// Gets or sets the kernel.
+ /// </summary>
+ /// <value>The kernel.</value>
+ private IKernel Kernel { get; set; }
+ /// <summary>
+ /// Gets or sets the logger.
+ /// </summary>
+ /// <value>The logger.</value>
+ private ILogger Logger { get; set; }
+
+ /// <summary>
/// Initializes a new instance of the <see cref="ReloadLoggerFileTask" /> class.
/// </summary>
/// <param name="kernel">The kernel.</param>
- /// <param name="taskManager">The task manager.</param>
/// <param name="logger">The logger.</param>
- public ReloadLoggerFileTask(IKernel kernel, ITaskManager taskManager, ILogger logger)
- : base(kernel, taskManager, logger)
+ public ReloadLoggerFileTask(IKernel kernel, ILogger logger)
{
+ Kernel = kernel;
+ Logger = logger;
}
/// <summary>
/// Gets the default triggers.
/// </summary>
/// <returns>IEnumerable{BaseTaskTrigger}.</returns>
- public override IEnumerable<ITaskTrigger> GetDefaultTriggers()
+ public IEnumerable<ITaskTrigger> GetDefaultTriggers()
{
var trigger = new DailyTrigger { TimeOfDay = TimeSpan.FromHours(0) }; //12am
@@ -41,7 +52,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress.</param>
/// <returns>Task.</returns>
- protected override Task ExecuteInternal(CancellationToken cancellationToken, IProgress<double> progress)
+ public Task Execute(CancellationToken cancellationToken, IProgress<double> progress)
{
cancellationToken.ThrowIfCancellationRequested();
@@ -54,7 +65,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// Gets the name.
/// </summary>
/// <value>The name.</value>
- public override string Name
+ public string Name
{
get { return "Start new log file"; }
}
@@ -63,9 +74,18 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// Gets the description.
/// </summary>
/// <value>The description.</value>
- public override string Description
+ public string Description
{
get { return "Moves logging to a new file to help reduce log file sizes."; }
}
+
+ /// <summary>
+ /// Gets the category.
+ /// </summary>
+ /// <value>The category.</value>
+ public string Category
+ {
+ get { return "Application"; }
+ }
}
}
diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/SystemUpdateTask.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/SystemUpdateTask.cs
index a101ad3dd..18fcdbbda 100644
--- a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/SystemUpdateTask.cs
+++ b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/SystemUpdateTask.cs
@@ -11,7 +11,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// <summary>
/// Plugin Update Task
/// </summary>
- public class SystemUpdateTask : BaseScheduledTask<IKernel>
+ public class SystemUpdateTask : IScheduledTask
{
/// <summary>
/// The _app host
@@ -19,23 +19,34 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
private readonly IApplicationHost _appHost;
/// <summary>
+ /// Gets or sets the kernel.
+ /// </summary>
+ /// <value>The kernel.</value>
+ private IKernel Kernel { get; set; }
+ /// <summary>
+ /// Gets or sets the logger.
+ /// </summary>
+ /// <value>The logger.</value>
+ private ILogger Logger { get; set; }
+
+ /// <summary>
/// Initializes a new instance of the <see cref="SystemUpdateTask" /> class.
/// </summary>
/// <param name="appHost">The app host.</param>
- /// <param name="taskManager">The task manager.</param>
/// <param name="kernel">The kernel.</param>
/// <param name="logger">The logger.</param>
- public SystemUpdateTask(IApplicationHost appHost, ITaskManager taskManager, IKernel kernel, ILogger logger)
- : base(kernel, taskManager, logger)
+ public SystemUpdateTask(IApplicationHost appHost, IKernel kernel, ILogger logger)
{
_appHost = appHost;
+ Kernel = kernel;
+ Logger = logger;
}
/// <summary>
/// Creates the triggers that define when the task will run
/// </summary>
/// <returns>IEnumerable{BaseTaskTrigger}.</returns>
- public override IEnumerable<ITaskTrigger> GetDefaultTriggers()
+ public IEnumerable<ITaskTrigger> GetDefaultTriggers()
{
return new ITaskTrigger[] {
@@ -52,7 +63,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress.</param>
/// <returns>Task.</returns>
- protected override async Task ExecuteInternal(CancellationToken cancellationToken, IProgress<double> progress)
+ public async Task Execute(CancellationToken cancellationToken, IProgress<double> progress)
{
if (!_appHost.CanSelfUpdate) return;
@@ -105,7 +116,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// Gets the name of the task
/// </summary>
/// <value>The name.</value>
- public override string Name
+ public string Name
{
get { return "Check for application updates"; }
}
@@ -114,9 +125,18 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// Gets the description.
/// </summary>
/// <value>The description.</value>
- public override string Description
+ public string Description
{
get { return "Downloads and installs application updates."; }
}
+
+ /// <summary>
+ /// Gets the category.
+ /// </summary>
+ /// <value>The category.</value>
+ public string Category
+ {
+ get { return "Application"; }
+ }
}
}