From 05d24821f728190437dc9cc8ecd00a271714309a Mon Sep 17 00:00:00 2001 From: ta264 Date: Thu, 18 Nov 2021 21:19:49 +0000 Subject: [PATCH] Fixed: Restarting windows service from UI (cherry picked from commit 3ae1ccc5e25eb16420c1f4ab627f42e3f478b22e) --- src/NzbDrone.Common.Test/ServiceFactoryFixture.cs | 12 ++++++++---- src/NzbDrone.Common/EnvironmentInfo/RuntimeInfo.cs | 11 ++++------- src/NzbDrone.Common/Readarr.Common.csproj | 1 + src/NzbDrone.Host.Test/ContainerFixture.cs | 8 ++++---- src/NzbDrone.Host/AppLifetime.cs | 2 +- src/NzbDrone.Host/Bootstrap.cs | 8 +++++--- 6 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/NzbDrone.Common.Test/ServiceFactoryFixture.cs b/src/NzbDrone.Common.Test/ServiceFactoryFixture.cs index ae6785780..1a3482582 100644 --- a/src/NzbDrone.Common.Test/ServiceFactoryFixture.cs +++ b/src/NzbDrone.Common.Test/ServiceFactoryFixture.cs @@ -3,6 +3,8 @@ using DryIoc; using DryIoc.Microsoft.DependencyInjection; using FluentAssertions; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Moq; using NUnit.Framework; using NzbDrone.Common.Composition.Extensions; using NzbDrone.Common.EnvironmentInfo; @@ -25,12 +27,14 @@ namespace NzbDrone.Common.Test .AddNzbDroneLogger() .AutoAddServices(Bootstrap.ASSEMBLIES) .AddDummyDatabase() - .AddStartupContext(new StartupContext("first", "second")) - .GetServiceProvider(); + .AddStartupContext(new StartupContext("first", "second")); - container.GetRequiredService().Register(); + container.RegisterInstance(new Mock().Object); - Mocker.SetConstant(container); + var serviceProvider = container.GetServiceProvider(); + serviceProvider.GetRequiredService().Register(); + + Mocker.SetConstant(serviceProvider); var handlers = Subject.BuildAll>() .Select(c => c.GetType().FullName); diff --git a/src/NzbDrone.Common/EnvironmentInfo/RuntimeInfo.cs b/src/NzbDrone.Common/EnvironmentInfo/RuntimeInfo.cs index 094ca7a57..874bc91ee 100644 --- a/src/NzbDrone.Common/EnvironmentInfo/RuntimeInfo.cs +++ b/src/NzbDrone.Common/EnvironmentInfo/RuntimeInfo.cs @@ -1,9 +1,9 @@ using System; using System.Diagnostics; using System.IO; -using System.Reflection; using System.Security.Principal; -using System.ServiceProcess; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Hosting.WindowsServices; using NLog; using NzbDrone.Common.Processes; @@ -14,14 +14,11 @@ namespace NzbDrone.Common.EnvironmentInfo private readonly Logger _logger; private readonly DateTime _startTime = DateTime.UtcNow; - public RuntimeInfo(IServiceProvider serviceProvider, Logger logger) + public RuntimeInfo(IHostLifetime hostLifetime, Logger logger) { _logger = logger; - IsWindowsService = !IsUserInteractive && - OsInfo.IsWindows && - serviceProvider.ServiceExist(ServiceProvider.SERVICE_NAME) && - serviceProvider.GetStatus(ServiceProvider.SERVICE_NAME) == ServiceControllerStatus.StartPending; + IsWindowsService = hostLifetime is WindowsServiceLifetime; //Guarded to avoid issues when running in a non-managed process var entry = Process.GetCurrentProcess().MainModule; diff --git a/src/NzbDrone.Common/Readarr.Common.csproj b/src/NzbDrone.Common/Readarr.Common.csproj index 8e5ad4f93..61e70b85f 100644 --- a/src/NzbDrone.Common/Readarr.Common.csproj +++ b/src/NzbDrone.Common/Readarr.Common.csproj @@ -7,6 +7,7 @@ + diff --git a/src/NzbDrone.Host.Test/ContainerFixture.cs b/src/NzbDrone.Host.Test/ContainerFixture.cs index da969a093..5a658b2c1 100644 --- a/src/NzbDrone.Host.Test/ContainerFixture.cs +++ b/src/NzbDrone.Host.Test/ContainerFixture.cs @@ -4,6 +4,7 @@ using DryIoc; using DryIoc.Microsoft.DependencyInjection; using FluentAssertions; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Moq; using NUnit.Framework; using NzbDrone.Common; @@ -33,16 +34,15 @@ namespace NzbDrone.App.Test { var args = new StartupContext("first", "second"); - // set up a dummy broadcaster to allow tests to resolve - var mockBroadcaster = new Mock(); - var container = new Container(rules => rules.WithNzbDroneRules()) .AutoAddServices(Bootstrap.ASSEMBLIES) .AddNzbDroneLogger() .AddDummyDatabase() .AddStartupContext(args); - container.RegisterInstance(mockBroadcaster.Object); + // set up a dummy broadcaster and lifetime to allow tests to resolve + container.RegisterInstance(new Mock().Object); + container.RegisterInstance(new Mock().Object); _container = container.GetServiceProvider(); } diff --git a/src/NzbDrone.Host/AppLifetime.cs b/src/NzbDrone.Host/AppLifetime.cs index 0a181a7db..17f5bbcdc 100644 --- a/src/NzbDrone.Host/AppLifetime.cs +++ b/src/NzbDrone.Host/AppLifetime.cs @@ -68,7 +68,7 @@ namespace NzbDrone.Host private void OnAppStopped() { - if (_runtimeInfo.RestartPending) + if (_runtimeInfo.RestartPending && !_runtimeInfo.IsWindowsService) { var restartArgs = GetRestartArgs(); diff --git a/src/NzbDrone.Host/Bootstrap.cs b/src/NzbDrone.Host/Bootstrap.cs index b73838457..7df0e2327 100644 --- a/src/NzbDrone.Host/Bootstrap.cs +++ b/src/NzbDrone.Host/Bootstrap.cs @@ -180,15 +180,17 @@ namespace NzbDrone.Host return ApplicationModes.UninstallService; } + Logger.Debug("Getting windows service status"); + // IsWindowsService can throw sometimes, so wrap it - bool isWindowsService = false; + var isWindowsService = false; try { isWindowsService = WindowsServiceHelpers.IsWindowsService(); } - catch + catch (Exception e) { - // don't care + Logger.Error(e, "Failed to get service status"); } if (OsInfo.IsWindows && isWindowsService)