mirror of
https://github.com/Radarr/Radarr.git
synced 2024-09-11 20:12:41 +02:00
New: Option to send notification when a Health Check warning occurs
This commit is contained in:
parent
e0b6bde525
commit
4e07e3bd68
@ -42,10 +42,13 @@ function EditNotificationModalContent(props) {
|
|||||||
onDownload,
|
onDownload,
|
||||||
onUpgrade,
|
onUpgrade,
|
||||||
onRename,
|
onRename,
|
||||||
|
onHealthIssue,
|
||||||
supportsOnGrab,
|
supportsOnGrab,
|
||||||
supportsOnDownload,
|
supportsOnDownload,
|
||||||
supportsOnUpgrade,
|
supportsOnUpgrade,
|
||||||
supportsOnRename,
|
supportsOnRename,
|
||||||
|
supportsOnHealthIssue,
|
||||||
|
includeHealthWarnings,
|
||||||
tags,
|
tags,
|
||||||
fields,
|
fields,
|
||||||
message
|
message
|
||||||
@ -147,6 +150,35 @@ function EditNotificationModalContent(props) {
|
|||||||
/>
|
/>
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
|
|
||||||
|
<FormGroup>
|
||||||
|
<FormLabel>On Health Issue</FormLabel>
|
||||||
|
|
||||||
|
<FormInputGroup
|
||||||
|
type={inputTypes.CHECK}
|
||||||
|
name="onHealthIssue"
|
||||||
|
helpText="Be notified on health check failures"
|
||||||
|
isDisabled={!supportsOnHealthIssue.value}
|
||||||
|
{...onHealthIssue}
|
||||||
|
onChange={onInputChange}
|
||||||
|
/>
|
||||||
|
</FormGroup>
|
||||||
|
|
||||||
|
{
|
||||||
|
onHealthIssue.value &&
|
||||||
|
<FormGroup>
|
||||||
|
<FormLabel>Include Health Warnings</FormLabel>
|
||||||
|
|
||||||
|
<FormInputGroup
|
||||||
|
type={inputTypes.CHECK}
|
||||||
|
name="includeHealthWarnings"
|
||||||
|
helpText="Be notified on health warnings in addition to errors"
|
||||||
|
isDisabled={!supportsOnHealthIssue.value}
|
||||||
|
{...includeHealthWarnings}
|
||||||
|
onChange={onInputChange}
|
||||||
|
/>
|
||||||
|
</FormGroup>
|
||||||
|
}
|
||||||
|
|
||||||
<FormGroup>
|
<FormGroup>
|
||||||
<FormLabel>Tags</FormLabel>
|
<FormLabel>Tags</FormLabel>
|
||||||
|
|
||||||
|
@ -58,10 +58,12 @@ class Notification extends Component {
|
|||||||
onDownload,
|
onDownload,
|
||||||
onUpgrade,
|
onUpgrade,
|
||||||
onRename,
|
onRename,
|
||||||
|
onHealthIssue,
|
||||||
supportsOnGrab,
|
supportsOnGrab,
|
||||||
supportsOnDownload,
|
supportsOnDownload,
|
||||||
supportsOnUpgrade,
|
supportsOnUpgrade,
|
||||||
supportsOnRename
|
supportsOnRename,
|
||||||
|
supportsOnHealthIssue
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -102,6 +104,13 @@ class Notification extends Component {
|
|||||||
</Label>
|
</Label>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
supportsOnHealthIssue && onHealthIssue &&
|
||||||
|
<Label kind={kinds.SUCCESS}>
|
||||||
|
On Health Issue
|
||||||
|
</Label>
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
!onGrab && !onDownload && !onRename &&
|
!onGrab && !onDownload && !onRename &&
|
||||||
<Label
|
<Label
|
||||||
@ -140,10 +149,12 @@ Notification.propTypes = {
|
|||||||
onDownload: PropTypes.bool.isRequired,
|
onDownload: PropTypes.bool.isRequired,
|
||||||
onUpgrade: PropTypes.bool.isRequired,
|
onUpgrade: PropTypes.bool.isRequired,
|
||||||
onRename: PropTypes.bool.isRequired,
|
onRename: PropTypes.bool.isRequired,
|
||||||
|
onHealthIssue: PropTypes.bool.isRequired,
|
||||||
supportsOnGrab: PropTypes.bool.isRequired,
|
supportsOnGrab: PropTypes.bool.isRequired,
|
||||||
supportsOnDownload: PropTypes.bool.isRequired,
|
supportsOnDownload: PropTypes.bool.isRequired,
|
||||||
supportsOnUpgrade: PropTypes.bool.isRequired,
|
supportsOnUpgrade: PropTypes.bool.isRequired,
|
||||||
supportsOnRename: PropTypes.bool.isRequired,
|
supportsOnRename: PropTypes.bool.isRequired,
|
||||||
|
supportsOnHealthIssue: PropTypes.bool.isRequired,
|
||||||
onConfirmDeleteNotification: PropTypes.func.isRequired
|
onConfirmDeleteNotification: PropTypes.func.isRequired
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -65,6 +65,11 @@ public override void OnMovieRename(Movie movie)
|
|||||||
TestLogger.Info("OnRename was called");
|
TestLogger.Info("OnRename was called");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void OnHealthIssue(NzbDrone.Core.HealthCheck.HealthCheck artist)
|
||||||
|
{
|
||||||
|
TestLogger.Info("OnHealthIssue was called");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class TestNotificationWithNoEvents : NotificationBase<TestSetting>
|
class TestNotificationWithNoEvents : NotificationBase<TestSetting>
|
||||||
@ -102,6 +107,7 @@ public void should_support_all_if_implemented()
|
|||||||
notification.SupportsOnDownload.Should().BeTrue();
|
notification.SupportsOnDownload.Should().BeTrue();
|
||||||
notification.SupportsOnUpgrade.Should().BeTrue();
|
notification.SupportsOnUpgrade.Should().BeTrue();
|
||||||
notification.SupportsOnRename.Should().BeTrue();
|
notification.SupportsOnRename.Should().BeTrue();
|
||||||
|
notification.SupportsOnHealthIssue.Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -114,6 +120,7 @@ public void should_support_none_if_none_are_implemented()
|
|||||||
notification.SupportsOnDownload.Should().BeFalse();
|
notification.SupportsOnDownload.Should().BeFalse();
|
||||||
notification.SupportsOnUpgrade.Should().BeFalse();
|
notification.SupportsOnUpgrade.Should().BeFalse();
|
||||||
notification.SupportsOnRename.Should().BeFalse();
|
notification.SupportsOnRename.Should().BeFalse();
|
||||||
|
notification.SupportsOnHealthIssue.Should().BeFalse();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
using FluentMigrator;
|
||||||
|
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Datastore.Migration
|
||||||
|
{
|
||||||
|
[Migration(160)]
|
||||||
|
public class health_issue_notification : NzbDroneMigrationBase
|
||||||
|
{
|
||||||
|
protected override void MainDbUpgrade()
|
||||||
|
{
|
||||||
|
Alter.Table("Notifications").AddColumn("OnHealthIssue").AsBoolean().WithDefaultValue(0);
|
||||||
|
Alter.Table("Notifications").AddColumn("IncludeHealthWarnings").AsBoolean().WithDefaultValue(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -74,7 +74,8 @@ public static void Map()
|
|||||||
.Ignore(i => i.SupportsOnGrab)
|
.Ignore(i => i.SupportsOnGrab)
|
||||||
.Ignore(i => i.SupportsOnDownload)
|
.Ignore(i => i.SupportsOnDownload)
|
||||||
.Ignore(i => i.SupportsOnUpgrade)
|
.Ignore(i => i.SupportsOnUpgrade)
|
||||||
.Ignore(i => i.SupportsOnRename);
|
.Ignore(i => i.SupportsOnRename)
|
||||||
|
.Ignore(i => i.SupportsOnHealthIssue);
|
||||||
|
|
||||||
Mapper.Entity<MetadataDefinition>().RegisterDefinition("Metadata")
|
Mapper.Entity<MetadataDefinition>().RegisterDefinition("Metadata")
|
||||||
.Ignore(d => d.Tags);
|
.Ignore(d => d.Tags);
|
||||||
|
14
src/NzbDrone.Core/HealthCheck/HealthCheckFailedEvent.cs
Normal file
14
src/NzbDrone.Core/HealthCheck/HealthCheckFailedEvent.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
using NzbDrone.Common.Messaging;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.HealthCheck
|
||||||
|
{
|
||||||
|
public class HealthCheckFailedEvent : IEvent
|
||||||
|
{
|
||||||
|
public HealthCheck HealthCheck { get; private set; }
|
||||||
|
|
||||||
|
public HealthCheckFailedEvent(HealthCheck healthCheck)
|
||||||
|
{
|
||||||
|
HealthCheck = healthCheck;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -80,6 +80,11 @@ private void PerformHealthCheck(IProvideHealthCheck[] healthChecks)
|
|||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (_healthCheckResults.Find(result.Source.Name) == null)
|
||||||
|
{
|
||||||
|
_eventAggregator.PublishEvent(new HealthCheckFailedEvent(result));
|
||||||
|
}
|
||||||
|
|
||||||
_healthCheckResults.Set(result.Source.Name, result);
|
_healthCheckResults.Set(result.Source.Name, result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,11 @@ public override void OnDownload(DownloadMessage message)
|
|||||||
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE , message.Message, Settings);
|
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE , message.Message, Settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void OnHealthIssue(HealthCheck.HealthCheck message)
|
||||||
|
{
|
||||||
|
_proxy.SendNotification(HEALTH_ISSUE_TITLE, message.Message, Settings);
|
||||||
|
}
|
||||||
|
|
||||||
public override ValidationResult Test()
|
public override ValidationResult Test()
|
||||||
{
|
{
|
||||||
var failures = new List<ValidationFailure>();
|
var failures = new List<ValidationFailure>();
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
using NzbDrone.Common.Disk;
|
using NzbDrone.Common.Disk;
|
||||||
using NzbDrone.Common.Extensions;
|
using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Processes;
|
using NzbDrone.Common.Processes;
|
||||||
|
using NzbDrone.Core.HealthCheck;
|
||||||
using NzbDrone.Core.ThingiProvider;
|
using NzbDrone.Core.ThingiProvider;
|
||||||
using NzbDrone.Core.Movies;
|
using NzbDrone.Core.Movies;
|
||||||
using NzbDrone.Core.Validation;
|
using NzbDrone.Core.Validation;
|
||||||
@ -112,6 +113,18 @@ public override void OnMovieRename(Movie movie)
|
|||||||
ExecuteScript(environmentVariables);
|
ExecuteScript(environmentVariables);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
|
||||||
|
{
|
||||||
|
var environmentVariables = new StringDictionary();
|
||||||
|
|
||||||
|
environmentVariables.Add("Radarr_EventType", "HealthIssue");
|
||||||
|
environmentVariables.Add("Radarr_Health_Issue_Level", nameof(healthCheck.Type));
|
||||||
|
environmentVariables.Add("Radarr_Health_Issue_Message", healthCheck.Message);
|
||||||
|
environmentVariables.Add("Radarr_Health_Issue_Type", healthCheck.Source.Name);
|
||||||
|
environmentVariables.Add("Radarr_Health_Issue_Wiki", healthCheck.WikiUrl.ToString() ?? string.Empty);
|
||||||
|
|
||||||
|
ExecuteScript(environmentVariables);
|
||||||
|
}
|
||||||
public override ValidationResult Test()
|
public override ValidationResult Test()
|
||||||
{
|
{
|
||||||
var failures = new List<ValidationFailure>();
|
var failures = new List<ValidationFailure>();
|
||||||
|
@ -53,6 +53,23 @@ public override void OnDownload(DownloadMessage message)
|
|||||||
_proxy.SendPayload(payload, Settings);
|
_proxy.SendPayload(payload, Settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
|
||||||
|
{
|
||||||
|
var attachments = new List<Embed>
|
||||||
|
{
|
||||||
|
new Embed
|
||||||
|
{
|
||||||
|
Title = healthCheck.Source.Name,
|
||||||
|
Text = healthCheck.Message,
|
||||||
|
Color = healthCheck.Type == HealthCheck.HealthCheckResult.Warning ? (int)DiscordColors.Warning : (int)DiscordColors.Success
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var payload = CreatePayload("Health Issue", attachments);
|
||||||
|
|
||||||
|
_proxy.SendPayload(payload, Settings);
|
||||||
|
}
|
||||||
|
|
||||||
public override ValidationResult Test()
|
public override ValidationResult Test()
|
||||||
{
|
{
|
||||||
var failures = new List<ValidationFailure>();
|
var failures = new List<ValidationFailure>();
|
||||||
|
@ -32,6 +32,10 @@ public override void OnDownload(DownloadMessage message)
|
|||||||
_emailService.SendEmail(Settings, MOVIE_DOWNLOADED_TITLE_BRANDED, body);
|
_emailService.SendEmail(Settings, MOVIE_DOWNLOADED_TITLE_BRANDED, body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void OnHealthIssue(HealthCheck.HealthCheck message)
|
||||||
|
{
|
||||||
|
_emailService.SendEmail(Settings, HEALTH_ISSUE_TITLE_BRANDED, message.Message);
|
||||||
|
}
|
||||||
|
|
||||||
public override ValidationResult Test()
|
public override ValidationResult Test()
|
||||||
{
|
{
|
||||||
|
@ -29,6 +29,11 @@ public override void OnDownload(DownloadMessage message)
|
|||||||
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings);
|
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
|
||||||
|
{
|
||||||
|
_proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings);
|
||||||
|
}
|
||||||
|
|
||||||
public override ValidationResult Test()
|
public override ValidationResult Test()
|
||||||
{
|
{
|
||||||
var failures = new List<ValidationFailure>();
|
var failures = new List<ValidationFailure>();
|
||||||
|
@ -10,9 +10,11 @@ public interface INotification : IProvider
|
|||||||
void OnGrab(GrabMessage grabMessage);
|
void OnGrab(GrabMessage grabMessage);
|
||||||
void OnDownload(DownloadMessage message);
|
void OnDownload(DownloadMessage message);
|
||||||
void OnMovieRename(Movie movie);
|
void OnMovieRename(Movie movie);
|
||||||
|
void OnHealthIssue(HealthCheck.HealthCheck healthCheck);
|
||||||
bool SupportsOnGrab { get; }
|
bool SupportsOnGrab { get; }
|
||||||
bool SupportsOnDownload { get; }
|
bool SupportsOnDownload { get; }
|
||||||
bool SupportsOnUpgrade { get; }
|
bool SupportsOnUpgrade { get; }
|
||||||
bool SupportsOnRename { get; }
|
bool SupportsOnRename { get; }
|
||||||
|
bool SupportsOnHealthIssue { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,11 @@ public override void OnDownload(DownloadMessage message)
|
|||||||
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE_BRANDED, message.Message, Settings);
|
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE_BRANDED, message.Message, Settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void OnHealthIssue(HealthCheck.HealthCheck message)
|
||||||
|
{
|
||||||
|
_proxy.SendNotification(HEALTH_ISSUE_TITLE_BRANDED, message.Message, Settings);
|
||||||
|
}
|
||||||
|
|
||||||
public override ValidationResult Test()
|
public override ValidationResult Test()
|
||||||
{
|
{
|
||||||
var failures = new List<ValidationFailure>();
|
var failures = new List<ValidationFailure>();
|
||||||
|
@ -47,6 +47,13 @@ public override void OnMovieRename(Movie movie)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void OnHealthIssue(HealthCheck.HealthCheck message)
|
||||||
|
{
|
||||||
|
if (Settings.Notify)
|
||||||
|
{
|
||||||
|
_mediaBrowserService.Notify(Settings, HEALTH_ISSUE_TITLE_BRANDED, message.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override ValidationResult Test()
|
public override ValidationResult Test()
|
||||||
{
|
{
|
||||||
|
@ -10,9 +10,11 @@ namespace NzbDrone.Core.Notifications
|
|||||||
{
|
{
|
||||||
protected const string MOVIE_GRABBED_TITLE = "Movie Grabbed";
|
protected const string MOVIE_GRABBED_TITLE = "Movie Grabbed";
|
||||||
protected const string MOVIE_DOWNLOADED_TITLE = "Movie Downloaded";
|
protected const string MOVIE_DOWNLOADED_TITLE = "Movie Downloaded";
|
||||||
|
protected const string HEALTH_ISSUE_TITLE = "Health Check Failure";
|
||||||
|
|
||||||
protected const string MOVIE_GRABBED_TITLE_BRANDED = "Radarr - " + MOVIE_GRABBED_TITLE;
|
protected const string MOVIE_GRABBED_TITLE_BRANDED = "Radarr - " + MOVIE_GRABBED_TITLE;
|
||||||
protected const string MOVIE_DOWNLOADED_TITLE_BRANDED = "Radarr - " + MOVIE_DOWNLOADED_TITLE;
|
protected const string MOVIE_DOWNLOADED_TITLE_BRANDED = "Radarr - " + MOVIE_DOWNLOADED_TITLE;
|
||||||
|
protected const string HEALTH_ISSUE_TITLE_BRANDED = "Radarr - " + HEALTH_ISSUE_TITLE;
|
||||||
|
|
||||||
public abstract string Name { get; }
|
public abstract string Name { get; }
|
||||||
|
|
||||||
@ -42,10 +44,16 @@ public virtual void OnMovieRename(Movie movie)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public bool SupportsOnGrab => HasConcreteImplementation("OnGrab");
|
public bool SupportsOnGrab => HasConcreteImplementation("OnGrab");
|
||||||
public bool SupportsOnRename => HasConcreteImplementation("OnMovieRename");
|
public bool SupportsOnRename => HasConcreteImplementation("OnMovieRename");
|
||||||
public bool SupportsOnDownload => HasConcreteImplementation("OnDownload");
|
public bool SupportsOnDownload => HasConcreteImplementation("OnDownload");
|
||||||
public bool SupportsOnUpgrade => SupportsOnDownload;
|
public bool SupportsOnUpgrade => SupportsOnDownload;
|
||||||
|
public bool SupportsOnHealthIssue => HasConcreteImplementation("OnHealthIssue");
|
||||||
|
|
||||||
protected TSettings Settings => (TSettings)Definition.Settings;
|
protected TSettings Settings => (TSettings)Definition.Settings;
|
||||||
|
|
||||||
|
@ -8,11 +8,14 @@ public class NotificationDefinition : ProviderDefinition
|
|||||||
public bool OnDownload { get; set; }
|
public bool OnDownload { get; set; }
|
||||||
public bool OnUpgrade { get; set; }
|
public bool OnUpgrade { get; set; }
|
||||||
public bool OnRename { get; set; }
|
public bool OnRename { get; set; }
|
||||||
|
public bool OnHealthIssue { get; set; }
|
||||||
public bool SupportsOnGrab { get; set; }
|
public bool SupportsOnGrab { get; set; }
|
||||||
public bool SupportsOnDownload { get; set; }
|
public bool SupportsOnDownload { get; set; }
|
||||||
public bool SupportsOnUpgrade { get; set; }
|
public bool SupportsOnUpgrade { get; set; }
|
||||||
public bool SupportsOnRename { get; set; }
|
public bool SupportsOnRename { get; set; }
|
||||||
|
public bool SupportsOnHealthIssue { get; set; }
|
||||||
|
public bool IncludeHealthWarnings { get; set; }
|
||||||
|
|
||||||
public override bool Enable => OnGrab || OnDownload || (OnDownload && OnUpgrade);
|
public override bool Enable => OnGrab || OnDownload || (OnDownload && OnUpgrade) || OnHealthIssue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ public interface INotificationFactory : IProviderFactory<INotification, Notifica
|
|||||||
List<INotification> OnDownloadEnabled();
|
List<INotification> OnDownloadEnabled();
|
||||||
List<INotification> OnUpgradeEnabled();
|
List<INotification> OnUpgradeEnabled();
|
||||||
List<INotification> OnRenameEnabled();
|
List<INotification> OnRenameEnabled();
|
||||||
|
List<INotification> OnHealthIssueEnabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
public class NotificationFactory : ProviderFactory<INotification, NotificationDefinition>, INotificationFactory
|
public class NotificationFactory : ProviderFactory<INotification, NotificationDefinition>, INotificationFactory
|
||||||
@ -42,6 +43,11 @@ public List<INotification> OnRenameEnabled()
|
|||||||
return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnRename).ToList();
|
return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnRename).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<INotification> OnHealthIssueEnabled()
|
||||||
|
{
|
||||||
|
return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnHealthIssue).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
public override void SetProviderCharacteristics(INotification provider, NotificationDefinition definition)
|
public override void SetProviderCharacteristics(INotification provider, NotificationDefinition definition)
|
||||||
{
|
{
|
||||||
base.SetProviderCharacteristics(provider, definition);
|
base.SetProviderCharacteristics(provider, definition);
|
||||||
@ -50,6 +56,7 @@ public override void SetProviderCharacteristics(INotification provider, Notifica
|
|||||||
definition.SupportsOnDownload = provider.SupportsOnDownload;
|
definition.SupportsOnDownload = provider.SupportsOnDownload;
|
||||||
definition.SupportsOnUpgrade = provider.SupportsOnUpgrade;
|
definition.SupportsOnUpgrade = provider.SupportsOnUpgrade;
|
||||||
definition.SupportsOnRename = provider.SupportsOnRename;
|
definition.SupportsOnRename = provider.SupportsOnRename;
|
||||||
|
definition.SupportsOnHealthIssue = provider.SupportsOnHealthIssue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -4,6 +4,7 @@
|
|||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Extensions;
|
using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Core.Download;
|
using NzbDrone.Core.Download;
|
||||||
|
using NzbDrone.Core.HealthCheck;
|
||||||
using NzbDrone.Core.MediaFiles.Events;
|
using NzbDrone.Core.MediaFiles.Events;
|
||||||
using NzbDrone.Core.Messaging.Events;
|
using NzbDrone.Core.Messaging.Events;
|
||||||
using NzbDrone.Core.Qualities;
|
using NzbDrone.Core.Qualities;
|
||||||
@ -15,7 +16,8 @@ namespace NzbDrone.Core.Notifications
|
|||||||
public class NotificationService
|
public class NotificationService
|
||||||
: IHandle<MovieRenamedEvent>,
|
: IHandle<MovieRenamedEvent>,
|
||||||
IHandle<MovieGrabbedEvent>,
|
IHandle<MovieGrabbedEvent>,
|
||||||
IHandle<MovieDownloadedEvent>
|
IHandle<MovieDownloadedEvent>,
|
||||||
|
IHandle<HealthCheckFailedEvent>
|
||||||
|
|
||||||
{
|
{
|
||||||
private readonly INotificationFactory _notificationFactory;
|
private readonly INotificationFactory _notificationFactory;
|
||||||
@ -63,6 +65,21 @@ private bool ShouldHandleMovie(ProviderDefinition definition, Movie movie)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool ShouldHandleHealthFailure(HealthCheck.HealthCheck healthCheck, bool includeWarnings)
|
||||||
|
{
|
||||||
|
if (healthCheck.Type == HealthCheckResult.Error)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (healthCheck.Type == HealthCheckResult.Warning && includeWarnings)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public void Handle(MovieGrabbedEvent message)
|
public void Handle(MovieGrabbedEvent message)
|
||||||
{
|
{
|
||||||
var grabMessage = new GrabMessage
|
var grabMessage = new GrabMessage
|
||||||
@ -138,5 +155,24 @@ public void Handle(MovieRenamedEvent message)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Handle(HealthCheckFailedEvent message)
|
||||||
|
{
|
||||||
|
foreach (var notification in _notificationFactory.OnHealthIssueEnabled())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (ShouldHandleHealthFailure(message.HealthCheck, ((NotificationDefinition)notification.Definition).IncludeHealthWarnings))
|
||||||
|
{
|
||||||
|
notification.OnHealthIssue(message.HealthCheck);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.Warn(ex, "Unable to send OnHealthIssue notification to: " + notification.Definition.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,11 @@ public override void OnDownload(DownloadMessage message)
|
|||||||
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE_BRANDED, message.Message, Settings);
|
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE_BRANDED, message.Message, Settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
|
||||||
|
{
|
||||||
|
_proxy.SendNotification(HEALTH_ISSUE_TITLE_BRANDED, healthCheck.Message, Settings);
|
||||||
|
}
|
||||||
|
|
||||||
public override ValidationResult Test()
|
public override ValidationResult Test()
|
||||||
{
|
{
|
||||||
var failures = new List<ValidationFailure>();
|
var failures = new List<ValidationFailure>();
|
||||||
|
@ -26,6 +26,11 @@ public override void OnDownload(DownloadMessage message)
|
|||||||
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings);
|
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
|
||||||
|
{
|
||||||
|
_proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings);
|
||||||
|
}
|
||||||
|
|
||||||
public override ValidationResult Test()
|
public override ValidationResult Test()
|
||||||
{
|
{
|
||||||
var failures = new List<ValidationFailure>();
|
var failures = new List<ValidationFailure>();
|
||||||
|
@ -70,6 +70,23 @@ public override void OnMovieRename(Movie movie)
|
|||||||
_proxy.SendPayload(payload, Settings);
|
_proxy.SendPayload(payload, Settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
|
||||||
|
{
|
||||||
|
var attachments = new List<Attachment>
|
||||||
|
{
|
||||||
|
new Attachment
|
||||||
|
{
|
||||||
|
Title = healthCheck.Source.Name,
|
||||||
|
Text = healthCheck.Message,
|
||||||
|
Color = healthCheck.Type == HealthCheck.HealthCheckResult.Warning ? "warning" : "danger"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var payload = CreatePayload("Health Issue", attachments);
|
||||||
|
|
||||||
|
_proxy.SendPayload(payload, Settings);
|
||||||
|
}
|
||||||
|
|
||||||
public override ValidationResult Test()
|
public override ValidationResult Test()
|
||||||
{
|
{
|
||||||
var failures = new List<ValidationFailure>();
|
var failures = new List<ValidationFailure>();
|
||||||
|
@ -26,6 +26,11 @@ public override void OnDownload(DownloadMessage message)
|
|||||||
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings);
|
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
|
||||||
|
{
|
||||||
|
_proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings);
|
||||||
|
}
|
||||||
|
|
||||||
public override ValidationResult Test()
|
public override ValidationResult Test()
|
||||||
{
|
{
|
||||||
var failures = new List<ValidationFailure>();
|
var failures = new List<ValidationFailure>();
|
||||||
|
@ -29,6 +29,11 @@ public override void OnDownload(DownloadMessage message)
|
|||||||
_twitterService.SendNotification($"[Radarr] Imported: {message.Message}", Settings);
|
_twitterService.SendNotification($"[Radarr] Imported: {message.Message}", Settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
|
||||||
|
{
|
||||||
|
_twitterService.SendNotification($"Health Issue: {healthCheck.Message}", Settings);
|
||||||
|
}
|
||||||
|
|
||||||
public override object RequestAction(string action, IDictionary<string, string> query)
|
public override object RequestAction(string action, IDictionary<string, string> query)
|
||||||
{
|
{
|
||||||
if (action == "startOAuth")
|
if (action == "startOAuth")
|
||||||
|
@ -41,7 +41,12 @@ public override void OnMovieRename(Movie movie)
|
|||||||
UpdateAndCleanMovie(movie);
|
UpdateAndCleanMovie(movie);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string Name => "Kodi (XBMC)";
|
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
|
||||||
|
{
|
||||||
|
Notify(Settings, HEALTH_ISSUE_TITLE_BRANDED, healthCheck.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string Name => "Kodi";
|
||||||
|
|
||||||
public override ValidationResult Test()
|
public override ValidationResult Test()
|
||||||
{
|
{
|
||||||
|
@ -9,10 +9,13 @@ public class NotificationResource : ProviderResource
|
|||||||
public bool OnDownload { get; set; }
|
public bool OnDownload { get; set; }
|
||||||
public bool OnUpgrade { get; set; }
|
public bool OnUpgrade { get; set; }
|
||||||
public bool OnRename { get; set; }
|
public bool OnRename { get; set; }
|
||||||
|
public bool OnHealthIssue { get; set; }
|
||||||
public bool SupportsOnGrab { get; set; }
|
public bool SupportsOnGrab { get; set; }
|
||||||
public bool SupportsOnDownload { get; set; }
|
public bool SupportsOnDownload { get; set; }
|
||||||
public bool SupportsOnUpgrade { get; set; }
|
public bool SupportsOnUpgrade { get; set; }
|
||||||
public bool SupportsOnRename { get; set; }
|
public bool SupportsOnRename { get; set; }
|
||||||
|
public bool SupportsOnHealthIssue { get; set; }
|
||||||
|
public bool IncludeHealthWarnings { get; set; }
|
||||||
public string TestCommand { get; set; }
|
public string TestCommand { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -28,10 +31,13 @@ public override NotificationResource ToResource(NotificationDefinition definitio
|
|||||||
resource.OnDownload = definition.OnDownload;
|
resource.OnDownload = definition.OnDownload;
|
||||||
resource.OnUpgrade = definition.OnUpgrade;
|
resource.OnUpgrade = definition.OnUpgrade;
|
||||||
resource.OnRename = definition.OnRename;
|
resource.OnRename = definition.OnRename;
|
||||||
|
resource.OnHealthIssue = definition.OnHealthIssue;
|
||||||
resource.SupportsOnGrab = definition.SupportsOnGrab;
|
resource.SupportsOnGrab = definition.SupportsOnGrab;
|
||||||
resource.SupportsOnDownload = definition.SupportsOnDownload;
|
resource.SupportsOnDownload = definition.SupportsOnDownload;
|
||||||
resource.SupportsOnUpgrade = definition.SupportsOnUpgrade;
|
resource.SupportsOnUpgrade = definition.SupportsOnUpgrade;
|
||||||
resource.SupportsOnRename = definition.SupportsOnRename;
|
resource.SupportsOnRename = definition.SupportsOnRename;
|
||||||
|
resource.SupportsOnHealthIssue = definition.SupportsOnHealthIssue;
|
||||||
|
resource.IncludeHealthWarnings = definition.IncludeHealthWarnings;
|
||||||
|
|
||||||
return resource;
|
return resource;
|
||||||
}
|
}
|
||||||
@ -46,10 +52,13 @@ public override NotificationDefinition ToModel(NotificationResource resource)
|
|||||||
definition.OnDownload = resource.OnDownload;
|
definition.OnDownload = resource.OnDownload;
|
||||||
definition.OnUpgrade = resource.OnUpgrade;
|
definition.OnUpgrade = resource.OnUpgrade;
|
||||||
definition.OnRename = resource.OnRename;
|
definition.OnRename = resource.OnRename;
|
||||||
|
definition.OnHealthIssue = resource.OnHealthIssue;
|
||||||
definition.SupportsOnGrab = resource.SupportsOnGrab;
|
definition.SupportsOnGrab = resource.SupportsOnGrab;
|
||||||
definition.SupportsOnDownload = resource.SupportsOnDownload;
|
definition.SupportsOnDownload = resource.SupportsOnDownload;
|
||||||
definition.SupportsOnUpgrade = resource.SupportsOnUpgrade;
|
definition.SupportsOnUpgrade = resource.SupportsOnUpgrade;
|
||||||
definition.SupportsOnRename = resource.SupportsOnRename;
|
definition.SupportsOnRename = resource.SupportsOnRename;
|
||||||
|
definition.SupportsOnHealthIssue = resource.SupportsOnHealthIssue;
|
||||||
|
definition.IncludeHealthWarnings = resource.IncludeHealthWarnings;
|
||||||
|
|
||||||
return definition;
|
return definition;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user