diff --git a/NzbDrone.App.Test/CentralDispatchTests.cs b/NzbDrone.App.Test/CentralDispatchTests.cs index 67d1790c8..7cf1d74db 100644 --- a/NzbDrone.App.Test/CentralDispatchTests.cs +++ b/NzbDrone.App.Test/CentralDispatchTests.cs @@ -1,12 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text; -using FluentAssertions; +using FluentAssertions; using NUnit.Framework; using Ninject; -using NzbDrone.Providers; namespace NzbDrone.App.Test { @@ -36,5 +30,14 @@ namespace NzbDrone.App.Test appServer.Should().NotBeNull(); } + [Test] + public void Kernel_should_resolve_same_ApplicationServer_instance() + { + var appServer1 = CentralDispatch.Kernel.Get(); + var appServer2 = CentralDispatch.Kernel.Get(); + + appServer1.Should().BeSameAs(appServer2); + } + } } diff --git a/NzbDrone.App.Test/NzbDrone.App.Test.csproj b/NzbDrone.App.Test/NzbDrone.App.Test.csproj index fe0aa62d4..84d8ce7d7 100644 --- a/NzbDrone.App.Test/NzbDrone.App.Test.csproj +++ b/NzbDrone.App.Test/NzbDrone.App.Test.csproj @@ -50,7 +50,9 @@ ..\packages\Moq.4.0.10827\lib\NET40\Moq.dll - + + ..\packages\Ninject.2.2.1.4\lib\net40-Full\Ninject.dll + ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll @@ -75,7 +77,7 @@ - + diff --git a/NzbDrone.App.Test/ProgramTest.cs b/NzbDrone.App.Test/ProgramTest.cs deleted file mode 100644 index 464fad9d4..000000000 --- a/NzbDrone.App.Test/ProgramTest.cs +++ /dev/null @@ -1,43 +0,0 @@ -using FluentAssertions; -using Moq; -using NUnit.Framework; -using NzbDrone.Model; -using NzbDrone.Providers; - -namespace NzbDrone.App.Test -{ - [TestFixture] - public class ProgramTest - { - - [TestCase(null, ApplicationMode.Console)] - [TestCase("", ApplicationMode.Console)] - [TestCase("1", ApplicationMode.Help)] - [TestCase("ii", ApplicationMode.Help)] - [TestCase("uu", ApplicationMode.Help)] - [TestCase("i", ApplicationMode.InstallService)] - [TestCase("I", ApplicationMode.InstallService)] - [TestCase("/I", ApplicationMode.InstallService)] - [TestCase("/i", ApplicationMode.InstallService)] - [TestCase("-I", ApplicationMode.InstallService)] - [TestCase("-i", ApplicationMode.InstallService)] - [TestCase("u", ApplicationMode.UninstallService)] - [TestCase("U", ApplicationMode.UninstallService)] - [TestCase("/U", ApplicationMode.UninstallService)] - [TestCase("/u", ApplicationMode.UninstallService)] - [TestCase("-U", ApplicationMode.UninstallService)] - [TestCase("-u", ApplicationMode.UninstallService)] - public void GetApplicationMode_single_arg(string arg, ApplicationMode mode) - { - NzbDroneConsole.GetApplicationMode(new[] { arg }).Should().Be(mode); - } - - [TestCase("", "", ApplicationMode.Console)] - [TestCase("", null, ApplicationMode.Console)] - [TestCase("i", "n", ApplicationMode.Help)] - public void GetApplicationMode_two_args(string a, string b, ApplicationMode mode) - { - NzbDroneConsole.GetApplicationMode(new[] { a, b }).Should().Be(mode); - } - } -} diff --git a/NzbDrone.App.Test/RouterTest.cs b/NzbDrone.App.Test/RouterTest.cs new file mode 100644 index 000000000..264277990 --- /dev/null +++ b/NzbDrone.App.Test/RouterTest.cs @@ -0,0 +1,142 @@ +using System.ServiceProcess; +using AutoMoq; +using FluentAssertions; +using Moq; +using NUnit.Framework; +using NzbDrone.Model; +using NzbDrone.Providers; + +namespace NzbDrone.App.Test +{ + [TestFixture] + public class RouterTest + { + + [TestCase(null, ApplicationMode.Console)] + [TestCase("", ApplicationMode.Console)] + [TestCase("1", ApplicationMode.Help)] + [TestCase("ii", ApplicationMode.Help)] + [TestCase("uu", ApplicationMode.Help)] + [TestCase("i", ApplicationMode.InstallService)] + [TestCase("I", ApplicationMode.InstallService)] + [TestCase("/I", ApplicationMode.InstallService)] + [TestCase("/i", ApplicationMode.InstallService)] + [TestCase("-I", ApplicationMode.InstallService)] + [TestCase("-i", ApplicationMode.InstallService)] + [TestCase("u", ApplicationMode.UninstallService)] + [TestCase("U", ApplicationMode.UninstallService)] + [TestCase("/U", ApplicationMode.UninstallService)] + [TestCase("/u", ApplicationMode.UninstallService)] + [TestCase("-U", ApplicationMode.UninstallService)] + [TestCase("-u", ApplicationMode.UninstallService)] + public void GetApplicationMode_single_arg(string arg, ApplicationMode mode) + { + Router.GetApplicationMode(new[] { arg }).Should().Be(mode); + } + + [TestCase("", "", ApplicationMode.Console)] + [TestCase("", null, ApplicationMode.Console)] + [TestCase("i", "n", ApplicationMode.Help)] + public void GetApplicationMode_two_args(string a, string b, ApplicationMode mode) + { + Router.GetApplicationMode(new[] { a, b }).Should().Be(mode); + } + + [Test] + public void Route_should_call_install_service_when_application_mode_is_install() + { + var mocker = new AutoMoqer(MockBehavior.Strict); + var serviceProviderMock = mocker.GetMock(); + serviceProviderMock.Setup(c => c.Install()); + serviceProviderMock.Setup(c => c.ServiceExist(ServiceProvider.NzbDroneServiceName)).Returns(false); + mocker.GetMock().SetupGet(c => c.IsUserInteractive).Returns(true); + + mocker.Resolve().Route(ApplicationMode.InstallService); + + serviceProviderMock.Verify(c => c.Install(), Times.Once()); + } + + + [Test] + public void Route_should_call_uninstall_service_when_application_mode_is_uninstall() + { + var mocker = new AutoMoqer(MockBehavior.Strict); + var serviceProviderMock = mocker.GetMock(); + serviceProviderMock.Setup(c => c.UnInstall()); + mocker.GetMock().SetupGet(c => c.IsUserInteractive).Returns(true); + serviceProviderMock.Setup(c => c.ServiceExist(ServiceProvider.NzbDroneServiceName)).Returns(true); + + mocker.Resolve().Route(ApplicationMode.UninstallService); + + serviceProviderMock.Verify(c => c.UnInstall(), Times.Once()); + } + + [Test] + public void Route_should_call_console_service_when_application_mode_is_console() + { + var mocker = new AutoMoqer(MockBehavior.Strict); + var consoleProvider = mocker.GetMock(); + var appServerProvider = mocker.GetMock(); + consoleProvider.Setup(c => c.WaitForClose()); + appServerProvider.Setup(c => c.Start()); + mocker.GetMock().SetupGet(c => c.IsUserInteractive).Returns(true); + + mocker.Resolve().Route(ApplicationMode.Console); + + consoleProvider.Verify(c => c.WaitForClose(), Times.Once()); + appServerProvider.Verify(c => c.Start(), Times.Once()); + } + + [TestCase(ApplicationMode.Console)] + [TestCase(ApplicationMode.InstallService)] + [TestCase(ApplicationMode.UninstallService)] + [TestCase(ApplicationMode.Help)] + public void Route_should_call_service_start_when_run_in_service_more(ApplicationMode applicationMode) + { + var mocker = new AutoMoqer(MockBehavior.Strict); + var envMock = mocker.GetMock(); + var serviceProvider = mocker.GetMock(); + + envMock.SetupGet(c => c.IsUserInteractive).Returns(false); + + serviceProvider.Setup(c => c.Run(It.IsAny())); + + mocker.Resolve().Route(applicationMode); + + serviceProvider.Verify(c => c.Run(It.IsAny()), Times.Once()); + } + + + [Test] + public void show_error_on_install_if_service_already_exist() + { + var mocker = new AutoMoqer(MockBehavior.Strict); + var consoleMock = mocker.GetMock(); + var serviceMock = mocker.GetMock(); + mocker.GetMock().SetupGet(c => c.IsUserInteractive).Returns(true); + + consoleMock.Setup(c => c.PrintServiceAlreadyExist()); + serviceMock.Setup(c => c.ServiceExist(ServiceProvider.NzbDroneServiceName)).Returns(true); + + mocker.Resolve().Route(ApplicationMode.InstallService); + + mocker.VerifyAllMocks(); + } + + [Test] + public void show_error_on_uninstall_if_service_doesnt_exist() + { + var mocker = new AutoMoqer(MockBehavior.Strict); + var consoleMock = mocker.GetMock(); + var serviceMock = mocker.GetMock(); + mocker.GetMock().SetupGet(c => c.IsUserInteractive).Returns(true); + + consoleMock.Setup(c => c.PrintServiceDoestExist()); + serviceMock.Setup(c => c.ServiceExist(ServiceProvider.NzbDroneServiceName)).Returns(false); + + mocker.Resolve().Route(ApplicationMode.UninstallService); + + mocker.VerifyAllMocks(); + } + } +} diff --git a/NzbDrone.App.Test/ServiceControllerTests.cs b/NzbDrone.App.Test/ServiceControllerTests.cs index 9fcc1b33a..05cab1154 100644 --- a/NzbDrone.App.Test/ServiceControllerTests.cs +++ b/NzbDrone.App.Test/ServiceControllerTests.cs @@ -40,11 +40,22 @@ namespace NzbDrone.App.Test var serviceController = new ServiceProvider(); //Act - serviceController.ServiceExist(ServiceProvider.NzbDroneServiceName).Should().BeFalse(); + serviceController.ServiceExist(ServiceProvider.NzbDroneServiceName).Should().BeFalse("Service already installed"); serviceController.Install(); serviceController.ServiceExist(ServiceProvider.NzbDroneServiceName).Should().BeTrue(); serviceController.UnInstall(); serviceController.ServiceExist(ServiceProvider.NzbDroneServiceName).Should().BeFalse(); } + + [Test] + [Explicit] + public void UnInstallService() + { + var serviceController = new ServiceProvider(); + + //Act + serviceController.UnInstall(); + serviceController.ServiceExist(ServiceProvider.NzbDroneServiceName).Should().BeFalse(); + } } } diff --git a/NzbDrone.App.Test/packages.config b/NzbDrone.App.Test/packages.config index 0132851a6..d52a9cd18 100644 --- a/NzbDrone.App.Test/packages.config +++ b/NzbDrone.App.Test/packages.config @@ -4,6 +4,7 @@ + \ No newline at end of file diff --git a/NzbDrone.Web/log.config b/NzbDrone.Web/log.config index 3e9e0b3a6..e1a578687 100644 --- a/NzbDrone.Web/log.config +++ b/NzbDrone.Web/log.config @@ -1,6 +1,6 @@  - + diff --git a/NzbDrone/AppMain.cs b/NzbDrone/AppMain.cs new file mode 100644 index 000000000..801ffae68 --- /dev/null +++ b/NzbDrone/AppMain.cs @@ -0,0 +1,31 @@ +using System; +using System.Reflection; +using NLog; +using Ninject; + +namespace NzbDrone +{ + public static class AppMain + { + + + private static readonly Logger Logger = LogManager.GetLogger("Host.Main"); + + public static void Main(string[] args) + { + try + { + Console.WriteLine("Starting NzbDrone Console. Version " + Assembly.GetExecutingAssembly().GetName().Version); + + CentralDispatch.Kernel.Get().Route(args); + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + Logger.Fatal(e.ToString()); + } + } + + + } +} \ No newline at end of file diff --git a/NzbDrone/ApplicationServer.cs b/NzbDrone/ApplicationServer.cs index 41665b52d..3da83013c 100644 --- a/NzbDrone/ApplicationServer.cs +++ b/NzbDrone/ApplicationServer.cs @@ -1,13 +1,13 @@ using System; using System.Net; -using System.Threading; +using System.ServiceProcess; using NLog; using Ninject; using NzbDrone.Providers; namespace NzbDrone { - public class ApplicationServer + public class ApplicationServer : ServiceBase { private static readonly Logger Logger = LogManager.GetLogger("Host.App"); @@ -16,12 +16,13 @@ namespace NzbDrone private readonly EnviromentProvider _enviromentProvider; private readonly IISProvider _iisProvider; private readonly ProcessProvider _processProvider; + private readonly MonitoringProvider _monitoringProvider; private readonly WebClient _webClient; [Inject] public ApplicationServer(ConfigProvider configProvider, WebClient webClient, IISProvider iisProvider, DebuggerProvider debuggerProvider, EnviromentProvider enviromentProvider, - ProcessProvider processProvider) + ProcessProvider processProvider, MonitoringProvider monitoringProvider) { _configProvider = configProvider; _webClient = webClient; @@ -29,10 +30,17 @@ namespace NzbDrone _debuggerProvider = debuggerProvider; _enviromentProvider = enviromentProvider; _processProvider = processProvider; + _monitoringProvider = monitoringProvider; } public ApplicationServer() { + + } + + protected override void OnStart(string[] args) + { + Start(); } public virtual void Start() @@ -65,9 +73,11 @@ namespace NzbDrone Logger.ErrorException("Failed to load home page.", e); } } + + _monitoringProvider.Start(); } - public virtual void Stop() + protected override void OnStop() { Logger.Info("Attempting to stop application."); _iisProvider.StopServer(); diff --git a/NzbDrone/CentralDispatch.cs b/NzbDrone/CentralDispatch.cs index bc2df874f..bff41dd9b 100644 --- a/NzbDrone/CentralDispatch.cs +++ b/NzbDrone/CentralDispatch.cs @@ -1,11 +1,5 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using NLog; +using NLog; using Ninject; -using NzbDrone.Model; using NzbDrone.Providers; namespace NzbDrone @@ -18,10 +12,10 @@ namespace NzbDrone static CentralDispatch() { _kernel = new StandardKernel(); + BindKernel(); + InitilizeApp(); } - public static ApplicationMode ApplicationMode { get; set; } - public static StandardKernel Kernel { get @@ -33,6 +27,7 @@ namespace NzbDrone private static void BindKernel() { _kernel = new StandardKernel(); + _kernel.Bind().ToSelf().InSingletonScope(); _kernel.Bind().ToSelf().InSingletonScope(); _kernel.Bind().ToSelf().InSingletonScope(); _kernel.Bind().ToSelf().InSingletonScope(); @@ -42,14 +37,14 @@ namespace NzbDrone _kernel.Bind().ToSelf().InSingletonScope(); _kernel.Bind().ToSelf().InSingletonScope(); _kernel.Bind().ToSelf().InSingletonScope(); + } private static void InitilizeApp() { _kernel.Get().ConfigureNlog(); _kernel.Get().CreateDefaultConfigFile(); - Logger.Info("Starting NZBDrone. Start-up Path:'{0}'", _kernel.Get().ApplicationPath); - Thread.CurrentThread.Name = "Host"; + Logger.Info("Start-up Path:'{0}'", _kernel.Get().ApplicationPath); } } } diff --git a/NzbDrone/NzbDrone.csproj b/NzbDrone/NzbDrone.csproj index 329dde2c8..e9dfb5e0e 100644 --- a/NzbDrone/NzbDrone.csproj +++ b/NzbDrone/NzbDrone.csproj @@ -53,6 +53,9 @@ NzbDrone.ico + + NzbDrone.AppMain + True @@ -85,7 +88,9 @@ - + + Component + @@ -93,13 +98,10 @@ - - Component - - + diff --git a/NzbDrone/NzbDroneConsole.cs b/NzbDrone/NzbDroneConsole.cs deleted file mode 100644 index a0f6f1422..000000000 --- a/NzbDrone/NzbDroneConsole.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using NLog; -using Ninject; -using NzbDrone.Model; - -namespace NzbDrone -{ - public static class NzbDroneConsole - { - - - private static readonly Logger Logger = LogManager.GetLogger("Host.Main"); - - private static void Main(string[] args) - { - try - { - Console.WriteLine("Starting NzbDrone Console. Version " + Assembly.GetExecutingAssembly().GetName().Version); - - CentralDispatch.ApplicationMode = GetApplicationMode(args); - - CentralDispatch.Kernel.Get().Route(); - } - catch (Exception e) - { - Console.WriteLine(e.ToString()); - Logger.Fatal(e.ToString()); - } - - Console.WriteLine("Press enter to exit."); - Console.ReadLine(); - } - - public static ApplicationMode GetApplicationMode(IEnumerable args) - { - if (args == null) return ApplicationMode.Console; - - var cleanArgs = args.Where(c => c != null && !String.IsNullOrWhiteSpace(c)).ToList(); - if (cleanArgs.Count == 0) return ApplicationMode.Console; - if (cleanArgs.Count != 1) return ApplicationMode.Help; - - var arg = cleanArgs.First().Trim('/', '\\', '-').ToLower(); - - if (arg == "i") return ApplicationMode.InstallService; - if (arg == "u") return ApplicationMode.UninstallService; - - return ApplicationMode.Help; - } - } -} \ No newline at end of file diff --git a/NzbDrone/NzbDroneService.cs b/NzbDrone/NzbDroneService.cs deleted file mode 100644 index c2d41b092..000000000 --- a/NzbDrone/NzbDroneService.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.ServiceProcess; -using Ninject; - -namespace NzbDrone -{ - internal class NzbDroneService : ServiceBase - { - protected override void OnStart(string[] args) - { - CentralDispatch.Kernel.Get().Start(); - } - - protected override void OnStop() - { - CentralDispatch.Kernel.Get().Stop(); - } - } -} \ No newline at end of file diff --git a/NzbDrone/Providers/ConsoleProvider.cs b/NzbDrone/Providers/ConsoleProvider.cs index e5b98643d..cd45ce4f4 100644 --- a/NzbDrone/Providers/ConsoleProvider.cs +++ b/NzbDrone/Providers/ConsoleProvider.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics; namespace NzbDrone.Providers { @@ -8,13 +9,28 @@ namespace NzbDrone.Providers { while (true) { - System.Console.ReadLine(); + Console.ReadLine(); } } public virtual void PrintHelp() { - System.Console.WriteLine("Help"); + Console.WriteLine(); + Console.WriteLine(" Usage: {0} ", Process.GetCurrentProcess().MainModule.ModuleName); + Console.WriteLine(" Commands:"); + Console.WriteLine(" /i Install the application as a Windows Service ({0}).", ServiceProvider.NzbDroneServiceName); + Console.WriteLine(" /u Uninstall already installed Windows Service ({0}).", ServiceProvider.NzbDroneServiceName); + Console.WriteLine(" Run application in console mode."); + } + + public virtual void PrintServiceAlreadyExist() + { + Console.WriteLine("A service with the same name ({0}) already exists. Aborting installation", ServiceProvider.NzbDroneServiceName); + } + + public virtual void PrintServiceDoestExist() + { + Console.WriteLine("Can't find service ({0})", ServiceProvider.NzbDroneServiceName); } } } \ No newline at end of file diff --git a/NzbDrone/Providers/EnviromentProvider.cs b/NzbDrone/Providers/EnviromentProvider.cs index 2659806bc..3373d37ae 100644 --- a/NzbDrone/Providers/EnviromentProvider.cs +++ b/NzbDrone/Providers/EnviromentProvider.cs @@ -20,9 +20,19 @@ namespace NzbDrone.Providers { get { - var dir = new FileInfo(Assembly.GetExecutingAssembly().Location).Directory; + var dir = new FileInfo(Environment.CurrentDirectory).Directory; - while (dir.GetDirectories("iisexpress").Length == 0) + while (!ContainsIIS(dir)) + { + if (dir.Parent == null) break; + dir = dir.Parent; + } + + if (ContainsIIS(dir)) return dir.FullName; + + dir = new FileInfo(Assembly.GetExecutingAssembly().Location).Directory; + + while (!ContainsIIS(dir)) { if (dir.Parent == null) throw new ApplicationException("Can't fine IISExpress folder."); dir = dir.Parent; @@ -31,5 +41,10 @@ namespace NzbDrone.Providers return dir.FullName; } } + + private static bool ContainsIIS(DirectoryInfo dir) + { + return dir.GetDirectories("iisexpress").Length != 0; + } } } \ No newline at end of file diff --git a/NzbDrone/Providers/IISProvider.cs b/NzbDrone/Providers/IISProvider.cs index 0e78fd8b3..ce2478f7d 100644 --- a/NzbDrone/Providers/IISProvider.cs +++ b/NzbDrone/Providers/IISProvider.cs @@ -120,7 +120,7 @@ namespace NzbDrone.Providers if (e.Data.Contains(" NzbDrone.")) { - System.Console.WriteLine(e.Data); + Console.WriteLine(e.Data); return; } diff --git a/NzbDrone/Providers/MonitoringProvider.cs b/NzbDrone/Providers/MonitoringProvider.cs index fecd3de10..55c80d0af 100644 --- a/NzbDrone/Providers/MonitoringProvider.cs +++ b/NzbDrone/Providers/MonitoringProvider.cs @@ -103,7 +103,7 @@ namespace NzbDrone.Providers private static void AppDomainException(object excepion) { - System.Console.WriteLine("EPIC FAIL: {0}", excepion); + Console.WriteLine("EPIC FAIL: {0}", excepion); Logger.Fatal("EPIC FAIL: {0}", excepion); #if RELEASE diff --git a/NzbDrone/Providers/ServiceProvider.cs b/NzbDrone/Providers/ServiceProvider.cs index 63d54bb2f..8667b28ad 100644 --- a/NzbDrone/Providers/ServiceProvider.cs +++ b/NzbDrone/Providers/ServiceProvider.cs @@ -15,7 +15,9 @@ namespace NzbDrone.Providers private static readonly Logger Logger = LogManager.GetLogger("Host.ServiceManager"); - public bool ServiceExist(string name) + + + public virtual bool ServiceExist(string name) { return ServiceController.GetServices().Any( @@ -30,19 +32,21 @@ namespace NzbDrone.Providers var installer = new ServiceProcessInstaller { - Account = ServiceAccount.NetworkService + Account = ServiceAccount.LocalSystem }; var serviceInstaller = new ServiceInstaller(); - String[] cmdline = {@"/assemblypath=" + Assembly.GetExecutingAssembly().Location}; + String[] cmdline = { @"/assemblypath=" + Assembly.GetExecutingAssembly().Location }; var context = new InstallContext("service_install.log", cmdline); serviceInstaller.Context = context; serviceInstaller.DisplayName = NzbDroneServiceName; serviceInstaller.ServiceName = NzbDroneServiceName; + serviceInstaller.Description = "NzbDrone Application Server"; serviceInstaller.StartType = ServiceStartMode.Automatic; + serviceInstaller.Parent = installer; serviceInstaller.Install(new ListDictionary()); @@ -54,10 +58,16 @@ namespace NzbDrone.Providers { var serviceInstaller = new ServiceInstaller(); - var context = new InstallContext("install.log", null); + var context = new InstallContext("service_uninstall.log", null); serviceInstaller.Context = context; serviceInstaller.ServiceName = NzbDroneServiceName; serviceInstaller.Uninstall(null); } + + + public virtual void Run(ServiceBase service) + { + ServiceBase.Run(service); + } } } \ No newline at end of file diff --git a/NzbDrone/Router.cs b/NzbDrone/Router.cs index bb1065bc5..7e72b3906 100644 --- a/NzbDrone/Router.cs +++ b/NzbDrone/Router.cs @@ -1,51 +1,101 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; +using NLog; using NzbDrone.Model; using NzbDrone.Providers; namespace NzbDrone { - class Router + public class Router { + private static readonly Logger Logger = LogManager.GetLogger("Host.Router"); + private readonly ApplicationServer _applicationServer; private readonly ServiceProvider _serviceProvider; private readonly ConsoleProvider _consoleProvider; + private readonly EnviromentProvider _enviromentProvider; - public Router(ApplicationServer applicationServer, ServiceProvider serviceProvider, ConsoleProvider consoleProvider) + public Router(ApplicationServer applicationServer, ServiceProvider serviceProvider, ConsoleProvider consoleProvider, EnviromentProvider enviromentProvider) { _applicationServer = applicationServer; _serviceProvider = serviceProvider; - _consoleProvider = consoleProvider; + _consoleProvider = consoleProvider; + _enviromentProvider = enviromentProvider; + } + + public void Route(IEnumerable args) + { + Route(GetApplicationMode(args)); } - public void Route() + public void Route(ApplicationMode applicationMode) { - switch (CentralDispatch.ApplicationMode) + Logger.Info("Application mode: {0}", applicationMode); + + if (!_enviromentProvider.IsUserInteractive) + { + _serviceProvider.Run(_applicationServer); + } + else { - case ApplicationMode.Console: - { - _applicationServer.Start(); - _consoleProvider.WaitForClose(); - break; - } - case ApplicationMode.InstallService: - { - _serviceProvider.Install(); - break; - } - case ApplicationMode.UninstallService: - { - _serviceProvider.UnInstall(); - break; - } - default: - { - _consoleProvider.PrintHelp(); - break; - } + switch (applicationMode) + { + + case ApplicationMode.Console: + { + _applicationServer.Start(); + _consoleProvider.WaitForClose(); + break; + } + case ApplicationMode.InstallService: + { + if (_serviceProvider.ServiceExist(ServiceProvider.NzbDroneServiceName)) + { + _consoleProvider.PrintServiceAlreadyExist(); + } + else + { + _serviceProvider.Install(); + } + break; + } + case ApplicationMode.UninstallService: + { + if (!_serviceProvider.ServiceExist(ServiceProvider.NzbDroneServiceName)) + { + _consoleProvider.PrintServiceDoestExist(); + } + else + { + _serviceProvider.UnInstall(); + } + + break; + } + default: + { + _consoleProvider.PrintHelp(); + break; + } + } } } + + public static ApplicationMode GetApplicationMode(IEnumerable args) + { + if (args == null) return ApplicationMode.Console; + + var cleanArgs = args.Where(c => c != null && !String.IsNullOrWhiteSpace(c)).ToList(); + if (cleanArgs.Count == 0) return ApplicationMode.Console; + if (cleanArgs.Count != 1) return ApplicationMode.Help; + + var arg = cleanArgs.First().Trim('/', '\\', '-').ToLower(); + + if (arg == "i") return ApplicationMode.InstallService; + if (arg == "u") return ApplicationMode.UninstallService; + + return ApplicationMode.Help; + } } }