diff --git a/src/NzbDrone.Core/Jobs/TaskManager.cs b/src/NzbDrone.Core/Jobs/TaskManager.cs index d80aa136b..6e64bcee8 100644 --- a/src/NzbDrone.Core/Jobs/TaskManager.cs +++ b/src/NzbDrone.Core/Jobs/TaskManager.cs @@ -63,7 +63,7 @@ namespace NzbDrone.Core.Jobs { new ScheduledTask{ Interval = 1, TypeName = typeof(RefreshMonitoredDownloadsCommand).FullName}, new ScheduledTask{ Interval = 5, TypeName = typeof(MessagingCleanupCommand).FullName}, - new ScheduledTask{ Interval = 6*60, TypeName = typeof(ApplicationUpdateCommand).FullName}, + new ScheduledTask{ Interval = 6*60, TypeName = typeof(ApplicationUpdateCheckCommand).FullName}, new ScheduledTask{ Interval = 3*60, TypeName = typeof(UpdateSceneMappingCommand).FullName}, new ScheduledTask{ Interval = 6*60, TypeName = typeof(CheckHealthCommand).FullName}, new ScheduledTask{ Interval = 12*60, TypeName = typeof(RefreshSeriesCommand).FullName}, diff --git a/src/NzbDrone.Core/Update/Commands/ApplicationUpdateCheckCommand.cs b/src/NzbDrone.Core/Update/Commands/ApplicationUpdateCheckCommand.cs new file mode 100644 index 000000000..ece18a111 --- /dev/null +++ b/src/NzbDrone.Core/Update/Commands/ApplicationUpdateCheckCommand.cs @@ -0,0 +1,11 @@ +using NzbDrone.Core.Messaging.Commands; + +namespace NzbDrone.Core.Update.Commands +{ + public class ApplicationUpdateCheckCommand : Command + { + public override bool SendUpdatesToClient => true; + + public override string CompletionMessage => null; + } +} diff --git a/src/NzbDrone.Core/Update/InstallUpdateService.cs b/src/NzbDrone.Core/Update/InstallUpdateService.cs index 19c28a6ab..10a5af94a 100644 --- a/src/NzbDrone.Core/Update/InstallUpdateService.cs +++ b/src/NzbDrone.Core/Update/InstallUpdateService.cs @@ -20,12 +20,12 @@ using NzbDrone.Core.Update.Commands; namespace NzbDrone.Core.Update { - public class InstallUpdateService : IExecute, IHandle + public class InstallUpdateService : IExecute, IExecute, IHandle { private readonly ICheckUpdateService _checkUpdateService; private readonly Logger _logger; private readonly IAppFolderInfo _appFolderInfo; - + private readonly IManageCommandQueue _commandQueueManager; private readonly IDiskProvider _diskProvider; private readonly IDiskTransferService _diskTransferService; private readonly IHttpClient _httpClient; @@ -41,6 +41,7 @@ namespace NzbDrone.Core.Update public InstallUpdateService(ICheckUpdateService checkUpdateService, IAppFolderInfo appFolderInfo, + IManageCommandQueue commandQueueManager, IDiskProvider diskProvider, IDiskTransferService diskTransferService, IHttpClient httpClient, @@ -60,6 +61,7 @@ namespace NzbDrone.Core.Update } _checkUpdateService = checkUpdateService; _appFolderInfo = appFolderInfo; + _commandQueueManager = commandQueueManager; _diskProvider = diskProvider; _diskTransferService = diskTransferService; _httpClient = httpClient; @@ -206,7 +208,7 @@ namespace NzbDrone.Core.Update } } - public void Execute(ApplicationUpdateCommand message) + private UpdatePackage GetUpdatePackage(CommandTrigger updateTrigger) { _logger.ProgressDebug("Checking for updates"); @@ -215,13 +217,13 @@ namespace NzbDrone.Core.Update if (latestAvailable == null) { _logger.ProgressDebug("No update available"); - return; + return null; } - if (OsInfo.IsNotWindows && !_configFileProvider.UpdateAutomatically && message.Trigger != CommandTrigger.Manual) + if (OsInfo.IsNotWindows && !_configFileProvider.UpdateAutomatically && updateTrigger != CommandTrigger.Manual) { _logger.ProgressDebug("Auto-update not enabled, not installing available update"); - return; + return null; } @@ -229,33 +231,51 @@ namespace NzbDrone.Core.Update if (_configFileProvider.UpdateMechanism == UpdateMechanism.BuiltIn && _deploymentInfoProvider.IsExternalUpdateMechanism) { _logger.ProgressDebug("Built-In updater disabled, please use {0} to install", _deploymentInfoProvider.PackageUpdateMechanism); - return; + return null; } else if (_configFileProvider.UpdateMechanism != UpdateMechanism.Script && _deploymentInfoProvider.IsExternalUpdateMechanism) { _logger.ProgressDebug("Update available, please use {0} to install", _deploymentInfoProvider.PackageUpdateMechanism); - return; + return null; } - try - { - InstallUpdate(latestAvailable); - _logger.ProgressDebug("Restarting Sonarr to apply updates"); - } - catch (UpdateFolderNotWritableException ex) - { - _logger.Error(ex, "Update process failed"); - throw new CommandFailedException("Startup folder not writable by user '{0}'", ex, Environment.UserName); - } - catch (UpdateVerificationFailedException ex) + return latestAvailable; + } + + public void Execute(ApplicationUpdateCheckCommand message) + { + if (GetUpdatePackage(message.Trigger) != null) { - _logger.Error(ex, "Update process failed"); - throw new CommandFailedException("Downloaded update package is corrupt", ex); + _commandQueueManager.Push(new ApplicationUpdateCommand(), trigger: message.Trigger); } - catch (UpdateFailedException ex) + } + + public void Execute(ApplicationUpdateCommand message) + { + var latestAvailable = GetUpdatePackage(message.Trigger); + + if (latestAvailable != null) { - _logger.Error(ex, "Update process failed"); - throw new CommandFailedException(ex); + try + { + InstallUpdate(latestAvailable); + _logger.ProgressDebug("Restarting Sonarr to apply updates"); + } + catch (UpdateFolderNotWritableException ex) + { + _logger.Error(ex, "Update process failed"); + throw new CommandFailedException("Startup folder not writable by user '{0}'", ex, Environment.UserName); + } + catch (UpdateVerificationFailedException ex) + { + _logger.Error(ex, "Update process failed"); + throw new CommandFailedException("Downloaded update package is corrupt", ex); + } + catch (UpdateFailedException ex) + { + _logger.Error(ex, "Update process failed"); + throw new CommandFailedException(ex); + } } }