New: Health check for import lists with missing root folders

New: Show missing root folder path in edit for Import List

(cherry picked from commit ae196af2ad368d49fde2358f0987ed7650c7f29c)

Closes #821
This commit is contained in:
Mark McDowall
2021-02-08 23:12:23 -08:00
committed by Bogdan
parent 44673eb4ee
commit b7fb42345c
6 changed files with 107 additions and 4 deletions

View File

@@ -0,0 +1,70 @@
using System.Collections.Generic;
using System.Linq;
using NzbDrone.Common.Disk;
using NzbDrone.Core.Books.Events;
using NzbDrone.Core.ImportLists;
using NzbDrone.Core.Localization;
using NzbDrone.Core.MediaFiles.Events;
namespace NzbDrone.Core.HealthCheck.Checks
{
[CheckOn(typeof(AuthorDeletedEvent))]
[CheckOn(typeof(AuthorMovedEvent))]
[CheckOn(typeof(BookImportedEvent), CheckOnCondition.FailedOnly)]
[CheckOn(typeof(TrackImportedEvent), CheckOnCondition.FailedOnly)]
[CheckOn(typeof(TrackImportFailedEvent), CheckOnCondition.SuccessfulOnly)]
public class ImportListRootFolderCheck : HealthCheckBase
{
private readonly IImportListFactory _importListFactory;
private readonly IDiskProvider _diskProvider;
public ImportListRootFolderCheck(IImportListFactory importListFactory, IDiskProvider diskProvider, ILocalizationService localizationService)
: base(localizationService)
{
_importListFactory = importListFactory;
_diskProvider = diskProvider;
}
public override HealthCheck Check()
{
var importLists = _importListFactory.All();
var missingRootFolders = new Dictionary<string, List<ImportListDefinition>>();
foreach (var importList in importLists)
{
var rootFolderPath = importList.RootFolderPath;
if (missingRootFolders.ContainsKey(rootFolderPath))
{
missingRootFolders[rootFolderPath].Add(importList);
continue;
}
if (!_diskProvider.FolderExists(rootFolderPath))
{
missingRootFolders.Add(rootFolderPath, new List<ImportListDefinition> { importList });
}
}
if (missingRootFolders.Any())
{
if (missingRootFolders.Count == 1)
{
var missingRootFolder = missingRootFolders.First();
return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("ImportListMissingRoot"), FormatRootFolder(missingRootFolder.Key, missingRootFolder.Value)), "#import-list-missing-root-folder");
}
var message = string.Format(_localizationService.GetLocalizedString("ImportListMultipleMissingRoots"), string.Join(" | ", missingRootFolders.Select(m => FormatRootFolder(m.Key, m.Value))));
return new HealthCheck(GetType(), HealthCheckResult.Error, message, "#import_list_missing_root_folder");
}
return new HealthCheck(GetType());
}
private string FormatRootFolder(string rootFolderPath, List<ImportListDefinition> importLists)
{
return $"{rootFolderPath} ({string.Join(", ", importLists.Select(l => l.Name))})";
}
}
}

View File

@@ -348,6 +348,8 @@
"ImportFailedInterp": "Import failed: {0}",
"ImportFailures": "Import failures",
"ImportListExclusions": "Import List Exclusions",
"ImportListMissingRoot": "Missing root folder for import list(s): {0}",
"ImportListMultipleMissingRoots": "Multiple root folders are missing for import lists: {0}",
"ImportListSettings": "General Import List Settings",
"ImportListSpecificSettings": "Import List Specific Settings",
"ImportListStatusCheckAllClientMessage": "All lists are unavailable due to failures",