From a81587dc57d7730a8a2adcf48efa90005f2d30ca Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 28 Apr 2019 11:50:18 -0700 Subject: [PATCH] New: Show health warning if system time is off expected time Closes #1422 --- .../Cloud/LidarrCloudRequestBuilder.cs | 2 +- .../Checks/SystemTimeCheckFixture.cs | 49 +++++++++++++++++++ .../HealthCheck/Checks/SystemTimeCheck.cs | 47 ++++++++++++++++++ 3 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 src/NzbDrone.Core.Test/HealthCheck/Checks/SystemTimeCheckFixture.cs create mode 100644 src/NzbDrone.Core/HealthCheck/Checks/SystemTimeCheck.cs diff --git a/src/NzbDrone.Common/Cloud/LidarrCloudRequestBuilder.cs b/src/NzbDrone.Common/Cloud/LidarrCloudRequestBuilder.cs index bbb007fcb..348c82c57 100644 --- a/src/NzbDrone.Common/Cloud/LidarrCloudRequestBuilder.cs +++ b/src/NzbDrone.Common/Cloud/LidarrCloudRequestBuilder.cs @@ -13,7 +13,7 @@ namespace NzbDrone.Common.Cloud { public LidarrCloudRequestBuilder() { - Services = new HttpRequestBuilder("https://services.lidarr.audio/v1/") + Services = new HttpRequestBuilder("https://lidarr.servarr.com/v1/") .CreateFactory(); Search = new HttpRequestBuilder("https://api.lidarr.audio/api/v0.4/{route}") diff --git a/src/NzbDrone.Core.Test/HealthCheck/Checks/SystemTimeCheckFixture.cs b/src/NzbDrone.Core.Test/HealthCheck/Checks/SystemTimeCheckFixture.cs new file mode 100644 index 000000000..e4084e714 --- /dev/null +++ b/src/NzbDrone.Core.Test/HealthCheck/Checks/SystemTimeCheckFixture.cs @@ -0,0 +1,49 @@ +using System; +using System.Text; +using Moq; +using NUnit.Framework; +using NzbDrone.Common.Cloud; +using NzbDrone.Common.Http; +using NzbDrone.Common.Serializer; +using NzbDrone.Core.HealthCheck.Checks; +using NzbDrone.Core.Test.Framework; +using NzbDrone.Test.Common; + +namespace NzbDrone.Core.Test.HealthCheck.Checks +{ + [TestFixture] + public class SystemTimeCheckFixture : CoreTest + { + [SetUp] + public void Setup() + { + Mocker.SetConstant(new SonarrCloudRequestBuilder()); + } + + private void GivenServerTime(DateTime dateTime) + { + var json = new ServiceTimeResponse {DateTimeUtc = dateTime}.ToJson(); + + Mocker.GetMock() + .Setup(s => s.Execute(It.IsAny())) + .Returns(r => new HttpResponse(r, new HttpHeader(), Encoding.ASCII.GetBytes(json))); + } + + [Test] + public void should_not_return_error_when_system_time_is_close_to_server_time() + { + GivenServerTime(DateTime.UtcNow); + + Subject.Check().ShouldBeOk(); + } + + [Test] + public void should_return_error_when_system_time_is_more_than_one_day_from_server_time() + { + GivenServerTime(DateTime.UtcNow.AddDays(2)); + + Subject.Check().ShouldBeError(); + ExceptionVerification.ExpectedErrors(1); + } + } +} diff --git a/src/NzbDrone.Core/HealthCheck/Checks/SystemTimeCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/SystemTimeCheck.cs new file mode 100644 index 000000000..e0b79513a --- /dev/null +++ b/src/NzbDrone.Core/HealthCheck/Checks/SystemTimeCheck.cs @@ -0,0 +1,47 @@ +using System; +using NLog; +using NzbDrone.Common.Cloud; +using NzbDrone.Common.Http; +using NzbDrone.Common.Serializer; + +namespace NzbDrone.Core.HealthCheck.Checks +{ + public class SystemTimeCheck : HealthCheckBase + { + private readonly IHttpClient _client; + private readonly IHttpRequestBuilderFactory _cloudRequestBuilder; + private readonly Logger _logger; + + public SystemTimeCheck(IHttpClient client, ILidarrCloudRequestBuilder cloudRequestBuilder, Logger logger) + { + _client = client; + _cloudRequestBuilder = cloudRequestBuilder.Services; + _logger = logger; + } + + public override HealthCheck Check() + { + var request = _cloudRequestBuilder.Create() + .Resource("/time") + .Build(); + + var response = _client.Execute(request); + var result = Json.Deserialize(response.Content); + var systemTime = DateTime.UtcNow; + + // +/- more than 1 day + 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, $"System time is off by more than 1 day. Scheduled tasks may not run correctly until the time is corrected"); + } + + return new HealthCheck(GetType()); + } + } + + public class ServiceTimeResponse + { + public DateTime DateTimeUtc { get; set; } + } +}