From 024000275df3b2d3b884c2c2fbf0b86bd36a631a Mon Sep 17 00:00:00 2001 From: Taloth Saldono Date: Sat, 6 Mar 2021 22:47:02 +0100 Subject: [PATCH] Added mechanism for package maintainers to produce a health check error. (cherry picked from commit 7da02c236aa03e6aef011130526040c1cb8399fc) --- .../UpdateTests/UpdateServiceFixture.cs | 21 ++++++++- .../Configuration/DeploymentInfoProvider.cs | 3 ++ .../Checks/PackageGlobalMessageCheck.cs | 45 +++++++++++++++++++ .../Update/InstallUpdateService.cs | 14 ++++-- 4 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 src/NzbDrone.Core/HealthCheck/Checks/PackageGlobalMessageCheck.cs diff --git a/src/NzbDrone.Core.Test/UpdateTests/UpdateServiceFixture.cs b/src/NzbDrone.Core.Test/UpdateTests/UpdateServiceFixture.cs index c6e6c1ff3..969bd9f95 100644 --- a/src/NzbDrone.Core.Test/UpdateTests/UpdateServiceFixture.cs +++ b/src/NzbDrone.Core.Test/UpdateTests/UpdateServiceFixture.cs @@ -68,6 +68,10 @@ public void Setup() .Setup(c => c.FolderWritable(It.IsAny())) .Returns(true); + Mocker.GetMock() + .Setup(v => v.FileExists(It.Is(s => s.EndsWith("Radarr.Update.exe")))) + .Returns(true); + _sandboxFolder = Mocker.GetMock().Object.GetUpdateSandboxFolder(); } @@ -149,7 +153,7 @@ public void Should_copy_update_client_to_root_of_sandbox() } [Test] - public void should_start_update_client() + public void should_start_update_client_if_updater_exists() { Subject.Execute(new ApplicationUpdateCommand()); @@ -157,6 +161,21 @@ public void should_start_update_client() .Verify(c => c.Start(It.IsAny(), It.Is(s => s.StartsWith("12")), null, null, null), Times.Once()); } + [Test] + public void should_return_with_warning_if_updater_doesnt_exists() + { + Mocker.GetMock() + .Setup(v => v.FileExists(It.Is(s => s.EndsWith("Radarr.Update.exe")))) + .Returns(false); + + Subject.Execute(new ApplicationUpdateCommand()); + + Mocker.GetMock() + .Verify(c => c.Start(It.IsAny(), It.IsAny(), null, null, null), Times.Never()); + + ExceptionVerification.ExpectedWarns(1); + } + [Test] public void should_return_without_error_or_warnings_when_no_updates_are_available() { diff --git a/src/NzbDrone.Core/Configuration/DeploymentInfoProvider.cs b/src/NzbDrone.Core/Configuration/DeploymentInfoProvider.cs index 1f96c44b8..f5c3751b0 100644 --- a/src/NzbDrone.Core/Configuration/DeploymentInfoProvider.cs +++ b/src/NzbDrone.Core/Configuration/DeploymentInfoProvider.cs @@ -12,6 +12,7 @@ public interface IDeploymentInfoProvider { string PackageVersion { get; } string PackageAuthor { get; } + string PackageGlobalMessage { get; } string PackageBranch { get; } UpdateMechanism PackageUpdateMechanism { get; } string PackageUpdateMechanismMessage { get; } @@ -41,6 +42,7 @@ public DeploymentInfoProvider(IAppFolderInfo appFolderInfo, IDiskProvider diskPr PackageVersion = ReadValue(data, "PackageVersion"); PackageAuthor = ReadValue(data, "PackageAuthor"); + PackageGlobalMessage = ReadValue(data, "PackageGlobalMessage"); PackageUpdateMechanism = ReadEnumValue(data, "UpdateMethod", UpdateMechanism.BuiltIn); PackageUpdateMechanismMessage = ReadValue(data, "UpdateMethodMessage"); PackageBranch = ReadValue(data, "Branch"); @@ -94,6 +96,7 @@ private static T ReadEnumValue(string fileData, string key, T defaultValue) public string PackageVersion { get; private set; } public string PackageAuthor { get; private set; } + public string PackageGlobalMessage { get; private set; } public string PackageBranch { get; private set; } public UpdateMechanism PackageUpdateMechanism { get; private set; } public string PackageUpdateMechanismMessage { get; private set; } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/PackageGlobalMessageCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/PackageGlobalMessageCheck.cs new file mode 100644 index 000000000..98f46d464 --- /dev/null +++ b/src/NzbDrone.Core/HealthCheck/Checks/PackageGlobalMessageCheck.cs @@ -0,0 +1,45 @@ +using System; +using System.Linq; +using System.Text.RegularExpressions; +using NLog; +using NzbDrone.Common.Extensions; +using NzbDrone.Core.Configuration; +using NzbDrone.Core.Localization; + +namespace NzbDrone.Core.HealthCheck.Checks +{ + public class PackageGlobalMessageCheck : HealthCheckBase + { + private readonly IDeploymentInfoProvider _deploymentInfoProvider; + + public PackageGlobalMessageCheck(IDeploymentInfoProvider deploymentInfoProvider, ILocalizationService localizationService) + : base(localizationService) + { + _deploymentInfoProvider = deploymentInfoProvider; + } + + public override HealthCheck Check() + { + if (_deploymentInfoProvider.PackageGlobalMessage.IsNullOrWhiteSpace()) + { + return new HealthCheck(GetType()); + } + + var message = _deploymentInfoProvider.PackageGlobalMessage; + HealthCheckResult result = HealthCheckResult.Notice; + + if (message.StartsWith("Error:")) + { + message = message.Substring(6); + result = HealthCheckResult.Error; + } + else if (message.StartsWith("Warn:")) + { + message = message.Substring(5); + result = HealthCheckResult.Warning; + } + + return new HealthCheck(GetType(), result, message, "#package_maintainer_message"); + } + } +} diff --git a/src/NzbDrone.Core/Update/InstallUpdateService.cs b/src/NzbDrone.Core/Update/InstallUpdateService.cs index 30fe776b1..5a547a675 100644 --- a/src/NzbDrone.Core/Update/InstallUpdateService.cs +++ b/src/NzbDrone.Core/Update/InstallUpdateService.cs @@ -146,16 +146,24 @@ private bool InstallUpdate(UpdatePackage updatePackage) _logger.Info("Preparing client"); _diskTransferService.TransferFolder(_appFolderInfo.GetUpdateClientFolder(), updateSandboxFolder, TransferMode.Move); + var updateClientExePath = _appFolderInfo.GetUpdateClientExePath(updatePackage.Runtime); + + if (!_diskProvider.FileExists(updateClientExePath)) + { + _logger.Warn("Update client {0} does not exist, aborting update.", updateClientExePath); + return false; + } + // Set executable flag on update app if (OsInfo.IsOsx || (OsInfo.IsLinux && PlatformInfo.IsNetCore)) { - _diskProvider.SetFilePermissions(_appFolderInfo.GetUpdateClientExePath(updatePackage.Runtime), "755", null); + _diskProvider.SetFilePermissions(updateClientExePath, "755", null); } - _logger.Info("Starting update client {0}", _appFolderInfo.GetUpdateClientExePath(updatePackage.Runtime)); + _logger.Info("Starting update client {0}", updateClientExePath); _logger.ProgressInfo("Radarr will restart shortly."); - _processProvider.Start(_appFolderInfo.GetUpdateClientExePath(updatePackage.Runtime), GetUpdaterArgs(updateSandboxFolder)); + _processProvider.Start(updateClientExePath, GetUpdaterArgs(updateSandboxFolder)); return true; }