diff --git a/src/NzbDrone.Core.Test/HealthCheck/HealthCheckFixture.cs b/src/NzbDrone.Core.Test/HealthCheck/HealthCheckFixture.cs index 72814e422..e804c42d8 100644 --- a/src/NzbDrone.Core.Test/HealthCheck/HealthCheckFixture.cs +++ b/src/NzbDrone.Core.Test/HealthCheck/HealthCheckFixture.cs @@ -14,7 +14,7 @@ namespace NzbDrone.Core.Test.HealthCheck [TestCase("I blew up because of some weird user mistake", "custom_page#my-health-check", WikiRoot + "sonarr/custom_page#my-health-check")] public void should_format_wiki_url(string message, string wikiFragment, string expectedUrl) { - var subject = new NzbDrone.Core.HealthCheck.HealthCheck(typeof(HealthCheckBase), HealthCheckResult.Warning, message, wikiFragment); + var subject = new NzbDrone.Core.HealthCheck.HealthCheck(typeof(HealthCheckBase), HealthCheckResult.Warning, HealthCheckReason.ServerNotification, message, wikiFragment); subject.WikiUrl.Should().Be(expectedUrl); } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/ApiKeyValidationCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/ApiKeyValidationCheck.cs index d3198b111..9dc6c9c9a 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/ApiKeyValidationCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/ApiKeyValidationCheck.cs @@ -29,7 +29,12 @@ namespace NzbDrone.Core.HealthCheck.Checks { _logger.Warn("Please update your API key to be at least {0} characters long. You can do this via settings or the config file", MinimumLength); - return new HealthCheck(GetType(), HealthCheckResult.Warning, _localizationService.GetLocalizedString("ApiKeyValidationHealthCheckMessage", new Dictionary { { "length", MinimumLength } }), "#invalid-api-key"); + return new HealthCheck(GetType(), + HealthCheckResult.Warning, + HealthCheckReason.MinimumApiKeyLength, + _localizationService.GetLocalizedString("ApiKeyValidationHealthCheckMessage", + new Dictionary { { "length", MinimumLength } }), + "#invalid-api-key"); } return new HealthCheck(GetType()); diff --git a/src/NzbDrone.Core/HealthCheck/Checks/AppDataLocationCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/AppDataLocationCheck.cs index bfddc3896..15440de6c 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/AppDataLocationCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/AppDataLocationCheck.cs @@ -19,7 +19,11 @@ namespace NzbDrone.Core.HealthCheck.Checks if (_appFolderInfo.StartUpFolder.IsParentPath(_appFolderInfo.AppDataFolder) || _appFolderInfo.StartUpFolder.PathEquals(_appFolderInfo.AppDataFolder)) { - return new HealthCheck(GetType(), HealthCheckResult.Warning, _localizationService.GetLocalizedString("AppDataLocationHealthCheckMessage"), "#updating-will-not-be-possible-to-prevent-deleting-appdata-on-update"); + return new HealthCheck(GetType(), + HealthCheckResult.Warning, + HealthCheckReason.AppDataLocation, + _localizationService.GetLocalizedString("AppDataLocationHealthCheckMessage"), + "#updating-will-not-be-possible-to-prevent-deleting-appdata-on-update"); } return new HealthCheck(GetType()); diff --git a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientCheck.cs index 5d9cd4b7f..848cbe464 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientCheck.cs @@ -30,7 +30,11 @@ namespace NzbDrone.Core.HealthCheck.Checks if (!downloadClients.Any()) { - return new HealthCheck(GetType(), HealthCheckResult.Warning, _localizationService.GetLocalizedString("DownloadClientCheckNoneAvailableHealthCheckMessage"), "#no-download-client-is-available"); + return new HealthCheck(GetType(), + HealthCheckResult.Warning, + HealthCheckReason.DownloadClientCheckNoneAvailable, + _localizationService.GetLocalizedString("DownloadClientCheckNoneAvailableHealthCheckMessage"), + "#no-download-client-is-available"); } foreach (var downloadClient in downloadClients) @@ -45,6 +49,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.DownloadClientCheckUnableToCommunicate, _localizationService.GetLocalizedString("DownloadClientCheckUnableToCommunicateWithHealthCheckMessage", new Dictionary { { "downloadClientName", downloadClient.Definition.Name }, diff --git a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRemovesCompletedDownloadsCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRemovesCompletedDownloadsCheck.cs index 1e1be0a26..2b3faf0f7 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRemovesCompletedDownloadsCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRemovesCompletedDownloadsCheck.cs @@ -45,6 +45,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Warning, + HealthCheckReason.DownloadClientRemovesCompletedDownloads, _localizationService.GetLocalizedString("DownloadClientRemovesCompletedDownloadsHealthCheckMessage", new Dictionary { { "downloadClientName", clientName } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRootFolderCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRootFolderCheck.cs index 77d2fc9d5..b34761292 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRootFolderCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRootFolderCheck.cs @@ -54,6 +54,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Warning, + HealthCheckReason.DownloadClientRootFolder, _localizationService.GetLocalizedString("DownloadClientRootFolderHealthCheckMessage", new Dictionary { { "downloadClientName", client.Definition.Name }, diff --git a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientSortingCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientSortingCheck.cs index d6474bcb4..7652d08b8 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientSortingCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientSortingCheck.cs @@ -46,6 +46,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Warning, + HealthCheckReason.DownloadClientSorting, _localizationService.GetLocalizedString("DownloadClientSortingHealthCheckMessage", new Dictionary { { "downloadClientName", clientName }, diff --git a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientStatusCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientStatusCheck.cs index 01e190475..472757d2d 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientStatusCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientStatusCheck.cs @@ -40,12 +40,14 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.DownloadClientStatusAllClients, _localizationService.GetLocalizedString("DownloadClientStatusAllClientHealthCheckMessage"), "#download-clients-are-unavailable-due-to-failures"); } return new HealthCheck(GetType(), HealthCheckResult.Warning, + HealthCheckReason.DownloadClientStatusSingleClient, _localizationService.GetLocalizedString("DownloadClientStatusSingleClientHealthCheckMessage", new Dictionary { { "downloadClientNames", string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name)) } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/ImportListRootFolderCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/ImportListRootFolderCheck.cs index ea9ceffbc..b7a64d910 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/ImportListRootFolderCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/ImportListRootFolderCheck.cs @@ -68,6 +68,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.ImportListRootFolderMissing, _localizationService.GetLocalizedString("ImportListRootFolderMissingRootHealthCheckMessage", new Dictionary { { "rootFolderInfo", FormatRootFolder(missingRootFolder.Key, missingRootFolder.Value) } @@ -77,6 +78,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.ImportListRootFolderMultipleMissing, _localizationService.GetLocalizedString("ImportListRootFolderMultipleMissingRootsHealthCheckMessage", new Dictionary { { "rootFoldersInfo", string.Join(" | ", missingRootFolders.Select(m => FormatRootFolder(m.Key, m.Value))) } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/ImportListStatusCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/ImportListStatusCheck.cs index e11efc27c..bb8ea1ba7 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/ImportListStatusCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/ImportListStatusCheck.cs @@ -40,12 +40,14 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.ImportListStatusAllUnavailable, _localizationService.GetLocalizedString("ImportListStatusAllUnavailableHealthCheckMessage"), "#import-lists-are-unavailable-due-to-failures"); } return new HealthCheck(GetType(), HealthCheckResult.Warning, + HealthCheckReason.ImportListStatusUnavailable, _localizationService.GetLocalizedString("ImportListStatusUnavailableHealthCheckMessage", new Dictionary { { "importListNames", string.Join(", ", backOffProviders.Select(v => v.ImportList.Definition.Name)) } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/ImportMechanismCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/ImportMechanismCheck.cs index c83203089..a58cb43a3 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/ImportMechanismCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/ImportMechanismCheck.cs @@ -53,6 +53,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Warning, + HealthCheckReason.ImportMechanismEnableCompletedDownloadHandlingIfPossibleMultiComputer, _localizationService.GetLocalizedString("ImportMechanismEnableCompletedDownloadHandlingIfPossibleMultiComputerHealthCheckMessage"), "#completedfailed-download-handling"); } @@ -61,6 +62,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Warning, + HealthCheckReason.ImportMechanismEnableCompletedDownloadHandlingIfPossible, $"{_localizationService.GetLocalizedString("ImportMechanismEnableCompletedDownloadHandlingIfPossibleHealthCheckMessage")} (Sabnzbd)", "#completedfailed-download-handling"); } @@ -69,12 +71,14 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Warning, + HealthCheckReason.ImportMechanismEnableCompletedDownloadHandlingIfPossible, $"{_localizationService.GetLocalizedString("ImportMechanismEnableCompletedDownloadHandlingIfPossibleHealthCheckMessage")} (Nzbget)", "#completedfailed-download-handling"); } return new HealthCheck(GetType(), HealthCheckResult.Warning, + HealthCheckReason.ImportMechanismEnableCompletedDownloadHandlingIfPossible, _localizationService.GetLocalizedString("ImportMechanismEnableCompletedDownloadHandlingIfPossibleHealthCheckMessage"), "#completedfailed-download-handling"); } @@ -83,6 +87,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Warning, + HealthCheckReason.ImportMechanismHandlingDisabled, _localizationService.GetLocalizedString("ImportMechanismHandlingDisabledHealthCheckMessage"), "#completed-download-handling-is-disabled"); } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/IndexerDownloadClientCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/IndexerDownloadClientCheck.cs index a7b17dbd8..b814af82c 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/IndexerDownloadClientCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/IndexerDownloadClientCheck.cs @@ -36,6 +36,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Warning, + HealthCheckReason.IndexerDownloadClient, _localizationService.GetLocalizedString("IndexerDownloadClientHealthCheckMessage", new Dictionary { { "indexerNames", string.Join(", ", invalidIndexers.Select(v => v.Name).ToArray()) } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/IndexerJackettAllCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/IndexerJackettAllCheck.cs index f01a59437..d68d7c18b 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/IndexerJackettAllCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/IndexerJackettAllCheck.cs @@ -42,6 +42,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck(GetType(), HealthCheckResult.Warning, + HealthCheckReason.IndexerJackettAll, _localizationService.GetLocalizedString("IndexerJackettAllHealthCheckMessage", new Dictionary { { "indexerNames", string.Join(", ", jackettAllProviders.Select(i => i.Name)) } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/IndexerLongTermStatusCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/IndexerLongTermStatusCheck.cs index f419cf205..bf9321359 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/IndexerLongTermStatusCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/IndexerLongTermStatusCheck.cs @@ -43,12 +43,14 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.IndexerLongTermStatusAllUnavailable, _localizationService.GetLocalizedString("IndexerLongTermStatusAllUnavailableHealthCheckMessage"), "#indexers-are-unavailable-due-to-failures"); } return new HealthCheck(GetType(), HealthCheckResult.Warning, + HealthCheckReason.IndexerLongTermStatusUnavailable, _localizationService.GetLocalizedString("IndexerLongTermStatusUnavailableHealthCheckMessage", new Dictionary { { "indexerNames", string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name)) } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/IndexerRssCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/IndexerRssCheck.cs index 1453de1bc..3195fb375 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/IndexerRssCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/IndexerRssCheck.cs @@ -25,14 +25,22 @@ namespace NzbDrone.Core.HealthCheck.Checks if (enabled.Empty()) { - return new HealthCheck(GetType(), HealthCheckResult.Error, _localizationService.GetLocalizedString("IndexerRssNoIndexersEnabledHealthCheckMessage"), "#no-indexers-available-with-rss-sync-enabled-sonarr-will-not-grab-new-releases-automatically"); + return new HealthCheck(GetType(), + HealthCheckResult.Error, + HealthCheckReason.IndexerRssNoIndexersEnabled, + _localizationService.GetLocalizedString("IndexerRssNoIndexersEnabledHealthCheckMessage"), + "#no-indexers-available-with-rss-sync-enabled-sonarr-will-not-grab-new-releases-automatically"); } var active = _indexerFactory.RssEnabled(true); if (active.Empty()) { - return new HealthCheck(GetType(), HealthCheckResult.Warning, _localizationService.GetLocalizedString("IndexerRssNoIndexersAvailableHealthCheckMessage"), "#indexers-are-unavailable-due-to-failures"); + return new HealthCheck(GetType(), + HealthCheckResult.Warning, + HealthCheckReason.IndexerRssNoIndexersAvailable, + _localizationService.GetLocalizedString("IndexerRssNoIndexersAvailableHealthCheckMessage"), + "#indexers-are-unavailable-due-to-failures"); } return new HealthCheck(GetType()); diff --git a/src/NzbDrone.Core/HealthCheck/Checks/IndexerSearchCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/IndexerSearchCheck.cs index 27ccc825a..8d52e37f8 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/IndexerSearchCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/IndexerSearchCheck.cs @@ -25,21 +25,33 @@ namespace NzbDrone.Core.HealthCheck.Checks if (automaticSearchEnabled.Empty()) { - return new HealthCheck(GetType(), HealthCheckResult.Warning, _localizationService.GetLocalizedString("IndexerSearchNoAutomaticHealthCheckMessage"), "#no-indexers-available-with-automatic-search-enabled-sonarr-will-not-provide-any-automatic-search-results"); + return new HealthCheck(GetType(), + HealthCheckResult.Warning, + HealthCheckReason.IndexerSearchNoAutomatic, + _localizationService.GetLocalizedString("IndexerSearchNoAutomaticHealthCheckMessage"), + "#no-indexers-available-with-automatic-search-enabled-sonarr-will-not-provide-any-automatic-search-results"); } var interactiveSearchEnabled = _indexerFactory.InteractiveSearchEnabled(false); if (interactiveSearchEnabled.Empty()) { - return new HealthCheck(GetType(), HealthCheckResult.Warning, _localizationService.GetLocalizedString("IndexerSearchNoInteractiveHealthCheckMessage"), "#no-indexers-available-with-interactive-search-enabled"); + return new HealthCheck(GetType(), + HealthCheckResult.Warning, + HealthCheckReason.IndexerSearchNoInteractive, + _localizationService.GetLocalizedString("IndexerSearchNoInteractiveHealthCheckMessage"), + "#no-indexers-available-with-interactive-search-enabled"); } var active = _indexerFactory.AutomaticSearchEnabled(true); if (active.Empty()) { - return new HealthCheck(GetType(), HealthCheckResult.Warning, _localizationService.GetLocalizedString("IndexerSearchNoAvailableIndexersHealthCheckMessage"), "#indexers-are-unavailable-due-to-failures"); + return new HealthCheck(GetType(), + HealthCheckResult.Warning, + HealthCheckReason.IndexerSearchNoAvailableIndexers, + _localizationService.GetLocalizedString("IndexerSearchNoAvailableIndexersHealthCheckMessage"), + "#indexers-are-unavailable-due-to-failures"); } return new HealthCheck(GetType()); diff --git a/src/NzbDrone.Core/HealthCheck/Checks/IndexerStatusCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/IndexerStatusCheck.cs index fa861fb94..fe06111ae 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/IndexerStatusCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/IndexerStatusCheck.cs @@ -43,12 +43,14 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.IndexerStatusAllUnavailable, _localizationService.GetLocalizedString("IndexerStatusAllUnavailableHealthCheckMessage"), "#indexers-are-unavailable-due-to-failures"); } return new HealthCheck(GetType(), HealthCheckResult.Warning, + HealthCheckReason.IndexerStatusUnavailable, _localizationService.GetLocalizedString("IndexerStatusUnavailableHealthCheckMessage", new Dictionary { { "indexerNames", string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name)) } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/MountCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/MountCheck.cs index a37200e6c..d99ed17fb 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/MountCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/MountCheck.cs @@ -31,6 +31,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.MountSeries, $"{_localizationService.GetLocalizedString("MountSeriesHealthCheckMessage")}{string.Join(", ", mounts.Select(m => $"{m.Item1.Name} ({m.Item2})"))}", "#series-mount-ro"); } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/NotificationStatusCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/NotificationStatusCheck.cs index daf5ee725..7b28cccd8 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/NotificationStatusCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/NotificationStatusCheck.cs @@ -40,12 +40,14 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.NotificationStatusAll, _localizationService.GetLocalizedString("NotificationStatusAllClientHealthCheckMessage"), "#notifications-are-unavailable-due-to-failures"); } return new HealthCheck(GetType(), HealthCheckResult.Warning, + HealthCheckReason.NotificationStatusSingle, _localizationService.GetLocalizedString("NotificationStatusSingleClientHealthCheckMessage", new Dictionary { { "notificationNames", string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name)) } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/PackageGlobalMessageCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/PackageGlobalMessageCheck.cs index 18e1a9d0d..4b084e4eb 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/PackageGlobalMessageCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/PackageGlobalMessageCheck.cs @@ -35,7 +35,11 @@ namespace NzbDrone.Core.HealthCheck.Checks result = HealthCheckResult.Warning; } - return new HealthCheck(GetType(), result, message, "#package-maintainer-message"); + return new HealthCheck(GetType(), + result, + HealthCheckReason.Package, + message, + "#package-maintainer-message"); } } } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/ProxyCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/ProxyCheck.cs index f09033370..a87d2658c 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/ProxyCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/ProxyCheck.cs @@ -43,6 +43,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.ProxyResolveIp, _localizationService.GetLocalizedString("ProxyResolveIpHealthCheckMessage", new Dictionary { { "proxyHostName", _configService.ProxyHostname } @@ -65,6 +66,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.ProxyBadRequest, _localizationService.GetLocalizedString("ProxyBadRequestHealthCheckMessage", new Dictionary { { "statusCode", response.StatusCode } @@ -78,6 +80,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.ProxyFailed, _localizationService.GetLocalizedString("ProxyFailedToTestHealthCheckMessage", new Dictionary { { "url", request.Url } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/RecyclingBinCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/RecyclingBinCheck.cs index ad30a74f7..09e71848b 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/RecyclingBinCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/RecyclingBinCheck.cs @@ -34,6 +34,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.RecycleBinUnableToWrite, _localizationService.GetLocalizedString("RecycleBinUnableToWriteHealthCheckMessage", new Dictionary { { "path", recycleBin } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/RemotePathMappingCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/RemotePathMappingCheck.cs index 576c79e86..7171ed476 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/RemotePathMappingCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/RemotePathMappingCheck.cs @@ -72,6 +72,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck( GetType(), HealthCheckResult.Error, + HealthCheckReason.RemotePathMappingWrongOSPath, _localizationService.GetLocalizedString( "RemotePathMappingWrongOSPathHealthCheckMessage", new Dictionary { @@ -87,6 +88,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck( GetType(), HealthCheckResult.Error, + HealthCheckReason.RemotePathMappingBadDockerPath, _localizationService.GetLocalizedString( "RemotePathMappingBadDockerPathHealthCheckMessage", new Dictionary @@ -101,6 +103,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck( GetType(), HealthCheckResult.Error, + HealthCheckReason.RemotePathMappingLocalWrongOSPath, _localizationService.GetLocalizedString( "RemotePathMappingLocalWrongOSPathHealthCheckMessage", new Dictionary @@ -119,6 +122,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck( GetType(), HealthCheckResult.Error, + HealthCheckReason.RemotePathMappingDockerFolderMissing, _localizationService.GetLocalizedString( "RemotePathMappingDockerFolderMissingHealthCheckMessage", new Dictionary @@ -134,6 +138,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck( GetType(), HealthCheckResult.Error, + HealthCheckReason.RemotePathMappingLocalFolderMissing, _localizationService.GetLocalizedString( "RemotePathMappingLocalFolderMissingHealthCheckMessage", new Dictionary @@ -147,6 +152,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck( GetType(), HealthCheckResult.Error, + HealthCheckReason.RemotePathMappingGenericPermissions, _localizationService.GetLocalizedString( "RemotePathMappingGenericPermissionsHealthCheckMessage", new Dictionary @@ -194,6 +200,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.RemotePathMappingDownloadPermissionsEpisode, _localizationService.GetLocalizedString( "RemotePathMappingDownloadPermissionsEpisodeHealthCheckMessage", new Dictionary @@ -207,6 +214,7 @@ namespace NzbDrone.Core.HealthCheck.Checks // ImportApprovedEpisodes and the file must have been removed part way through processing return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.RemotePathMappingFileRemoved, _localizationService.GetLocalizedString( "RemotePathMappingFileRemovedHealthCheckMessage", new Dictionary @@ -238,6 +246,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck( GetType(), HealthCheckResult.Error, + HealthCheckReason.RemotePathMappingImportEpisodeFailed, _localizationService.GetLocalizedString("RemotePathMappingImportEpisodeFailedHealthCheckMessage"), "#remote-path-import-failed"); } @@ -249,6 +258,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck( GetType(), HealthCheckResult.Error, + HealthCheckReason.RemotePathMappingFilesWrongOSPath, _localizationService.GetLocalizedString( "RemotePathMappingFilesWrongOSPathHealthCheckMessage", new Dictionary @@ -265,6 +275,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck( GetType(), HealthCheckResult.Error, + HealthCheckReason.RemotePathMappingFilesBadDockerPath, _localizationService.GetLocalizedString( "RemotePathMappingFilesBadDockerPathHealthCheckMessage", new Dictionary @@ -279,6 +290,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck( GetType(), HealthCheckResult.Error, + HealthCheckReason.RemotePathMappingFilesLocalWrongOSPath, _localizationService.GetLocalizedString( "RemotePathMappingFilesLocalWrongOSPathHealthCheckMessage", new Dictionary @@ -295,6 +307,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck( GetType(), HealthCheckResult.Error, + HealthCheckReason.RemotePathMappingFolderPermissions, _localizationService.GetLocalizedString( "RemotePathMappingFolderPermissionsHealthCheckMessage", new Dictionary @@ -310,6 +323,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck( GetType(), HealthCheckResult.Error, + HealthCheckReason.RemotePathMappingFolderPermissions, _localizationService.GetLocalizedString( "RemotePathMappingFolderPermissionsHealthCheckMessage", new Dictionary @@ -325,6 +339,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck( GetType(), HealthCheckResult.Error, + HealthCheckReason.RemotePathMappingRemoteDownloadClient, _localizationService.GetLocalizedString( "RemotePathMappingRemoteDownloadClientHealthCheckMessage", new Dictionary @@ -340,6 +355,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck( GetType(), HealthCheckResult.Error, + HealthCheckReason.RemotePathMappingFilesGenericPermissions, _localizationService.GetLocalizedString( "RemotePathMappingFilesGenericPermissionsHealthCheckMessage", new Dictionary diff --git a/src/NzbDrone.Core/HealthCheck/Checks/RemovedSeriesCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/RemovedSeriesCheck.cs index 363d3010d..427ead63f 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/RemovedSeriesCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/RemovedSeriesCheck.cs @@ -35,6 +35,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.RemovedSeriesSingle, _localizationService.GetLocalizedString("RemovedSeriesSingleRemovedHealthCheckMessage", new Dictionary { { "series", seriesText } @@ -44,6 +45,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.RemovedSeriesMultiple, _localizationService.GetLocalizedString("RemovedSeriesMultipleRemovedHealthCheckMessage", new Dictionary { { "series", seriesText } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs index 0b0016f52..ab5a995da 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs @@ -43,6 +43,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.RootFolderMissing, _localizationService.GetLocalizedString( "RootFolderMissingHealthCheckMessage", new Dictionary @@ -54,6 +55,7 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.RootFolderMultipleMissing, _localizationService.GetLocalizedString( "RootFolderMultipleMissingHealthCheckMessage", new Dictionary diff --git a/src/NzbDrone.Core/HealthCheck/Checks/SystemTimeCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/SystemTimeCheck.cs index 10498b831..278ed7f80 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/SystemTimeCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/SystemTimeCheck.cs @@ -37,7 +37,11 @@ namespace NzbDrone.Core.HealthCheck.Checks if (Math.Abs(result.DateTimeUtc.Subtract(systemTime).TotalDays) >= 1) { _logger.Error("System time mismatch. SystemTime: {0} Expected Time: {1}. Update system time", systemTime, result.DateTimeUtc); - return new HealthCheck(GetType(), HealthCheckResult.Error, _localizationService.GetLocalizedString("SystemTimeHealthCheckMessage"), "#system-time-off"); + return new HealthCheck(GetType(), + HealthCheckResult.Error, + HealthCheckReason.SystemTime, + _localizationService.GetLocalizedString("SystemTimeHealthCheckMessage"), + "#system-time-off"); } } catch (Exception e) diff --git a/src/NzbDrone.Core/HealthCheck/Checks/UpdateCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/UpdateCheck.cs index c7239b88a..f82572413 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/UpdateCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/UpdateCheck.cs @@ -48,6 +48,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.UpdateStartupTranslocation, _localizationService.GetLocalizedString( "UpdateStartupTranslocationHealthCheckMessage", new Dictionary @@ -61,6 +62,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.UpdateStartupNotWritable, _localizationService.GetLocalizedString( "UpdateStartupNotWritableHealthCheckMessage", new Dictionary @@ -75,6 +77,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, + HealthCheckReason.UpdateUiNotWritable, _localizationService.GetLocalizedString( "UpdateUiNotWritableHealthCheckMessage", new Dictionary @@ -94,6 +97,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Warning, + HealthCheckReason.UpdateAvailable, _localizationService.GetLocalizedString("UpdateAvailableHealthCheckMessage", new Dictionary { { "version", $"v{latestAvailable.Version}" } diff --git a/src/NzbDrone.Core/HealthCheck/HealthCheck.cs b/src/NzbDrone.Core/HealthCheck/HealthCheck.cs index 99a127425..598c05619 100644 --- a/src/NzbDrone.Core/HealthCheck/HealthCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/HealthCheck.cs @@ -11,6 +11,7 @@ namespace NzbDrone.Core.HealthCheck public Type Source { get; set; } public HealthCheckResult Type { get; set; } + public HealthCheckReason Reason { get; set; } public string Message { get; set; } public HttpUri WikiUrl { get; set; } @@ -24,10 +25,11 @@ namespace NzbDrone.Core.HealthCheck Type = HealthCheckResult.Ok; } - public HealthCheck(Type source, HealthCheckResult type, string message, string wikiFragment = null) + public HealthCheck(Type source, HealthCheckResult type, HealthCheckReason reason, string message, string wikiFragment = null) { Source = source; Type = type; + Reason = reason; Message = message; WikiUrl = MakeWikiUrl(wikiFragment ?? MakeWikiFragment(message)); } @@ -50,4 +52,68 @@ namespace NzbDrone.Core.HealthCheck Warning = 2, Error = 3 } + + public enum HealthCheckReason + { + AppDataLocation, + DownloadClientCheckNoneAvailable, + DownloadClientCheckUnableToCommunicate, + DownloadClientRemovesCompletedDownloads, + DownloadClientRootFolder, + DownloadClientSorting, + DownloadClientStatusAllClients, + DownloadClientStatusSingleClient, + ImportListRootFolderMissing, + ImportListRootFolderMultipleMissing, + ImportListStatusAllUnavailable, + ImportListStatusUnavailable, + ImportMechanismEnableCompletedDownloadHandlingIfPossible, + ImportMechanismEnableCompletedDownloadHandlingIfPossibleMultiComputer, + ImportMechanismHandlingDisabled, + IndexerDownloadClient, + IndexerJackettAll, + IndexerLongTermStatusAllUnavailable, + IndexerLongTermStatusUnavailable, + IndexerRssNoIndexersAvailable, + IndexerRssNoIndexersEnabled, + IndexerSearchNoAutomatic, + IndexerSearchNoAvailableIndexers, + IndexerSearchNoInteractive, + IndexerStatusAllUnavailable, + IndexerStatusUnavailable, + MinimumApiKeyLength, + MountSeries, + NotificationStatusAll, + NotificationStatusSingle, + Package, + ProxyBadRequest, + ProxyFailed, + ProxyResolveIp, + RecycleBinUnableToWrite, + RemotePathMappingBadDockerPath, + RemotePathMappingDockerFolderMissing, + RemotePathMappingDownloadPermissionsEpisode, + RemotePathMappingFileRemoved, + RemotePathMappingFilesBadDockerPath, + RemotePathMappingFilesGenericPermissions, + RemotePathMappingFilesLocalWrongOSPath, + RemotePathMappingFilesWrongOSPath, + RemotePathMappingFolderPermissions, + RemotePathMappingGenericPermissions, + RemotePathMappingImportEpisodeFailed, + RemotePathMappingLocalFolderMissing, + RemotePathMappingLocalWrongOSPath, + RemotePathMappingRemoteDownloadClient, + RemotePathMappingWrongOSPath, + RemovedSeriesMultiple, + RemovedSeriesSingle, + RootFolderMissing, + RootFolderMultipleMissing, + ServerNotification, + SystemTime, + UpdateAvailable, + UpdateStartupNotWritable, + UpdateStartupTranslocation, + UpdateUiNotWritable + } } diff --git a/src/NzbDrone.Core/HealthCheck/ServerSideNotificationService.cs b/src/NzbDrone.Core/HealthCheck/ServerSideNotificationService.cs index f0739917f..d249adac2 100644 --- a/src/NzbDrone.Core/HealthCheck/ServerSideNotificationService.cs +++ b/src/NzbDrone.Core/HealthCheck/ServerSideNotificationService.cs @@ -45,7 +45,11 @@ namespace NzbDrone.Core.HealthCheck var response = _client.Execute(request); var result = Json.Deserialize>(response.Content); - var checks = result.Select(x => new HealthCheck(GetType(), x.Type, x.Message, x.WikiUrl)).ToList(); + var checks = result.Select(x => new HealthCheck(GetType(), + x.Type, + HealthCheckReason.ServerNotification, + x.Message, + x.WikiUrl)).ToList(); // Only one health check is supported, services returns an ordered list, so use the first one return checks.FirstOrDefault() ?? new HealthCheck(GetType());