using System.ServiceProcess; using NLog; using NzbDrone.Common; using NzbDrone.Common.EnvironmentInfo; namespace NzbDrone.Host { public class Router { private readonly INzbDroneServiceFactory _nzbDroneServiceFactory; private readonly IServiceProvider _serviceProvider; private readonly IStartupArguments _startupArguments; private readonly IConsoleService _consoleService; private readonly IRuntimeInfo _runtimeInfo; private readonly Logger _logger; public Router(INzbDroneServiceFactory nzbDroneServiceFactory, IServiceProvider serviceProvider, IStartupArguments startupArguments, IConsoleService consoleService, IRuntimeInfo runtimeInfo, Logger logger) { _nzbDroneServiceFactory = nzbDroneServiceFactory; _serviceProvider = serviceProvider; _startupArguments = startupArguments; _consoleService = consoleService; _runtimeInfo = runtimeInfo; _logger = logger; } public void Route() { var appMode = GetApplicationMode(); Route(appMode); } public void Route(ApplicationModes applicationModes) { _logger.Info("Application mode: {0}", applicationModes); switch (applicationModes) { case ApplicationModes.Service: { _logger.Trace("Service selected"); _serviceProvider.Run(_nzbDroneServiceFactory.Build()); break; } case ApplicationModes.Interactive: { _logger.Trace("Console selected"); _nzbDroneServiceFactory.Start(); break; } case ApplicationModes.InstallService: { _logger.Trace("Install Service selected"); if (_serviceProvider.ServiceExist(ServiceProvider.NZBDRONE_SERVICE_NAME)) { _consoleService.PrintServiceAlreadyExist(); } else { _serviceProvider.Install(ServiceProvider.NZBDRONE_SERVICE_NAME); _serviceProvider.Start(ServiceProvider.NZBDRONE_SERVICE_NAME); } break; } case ApplicationModes.UninstallService: { _logger.Trace("Uninstall Service selected"); if (!_serviceProvider.ServiceExist(ServiceProvider.NZBDRONE_SERVICE_NAME)) { _consoleService.PrintServiceDoesNotExist(); } else { _serviceProvider.UnInstall(ServiceProvider.NZBDRONE_SERVICE_NAME); } break; } default: { _consoleService.PrintHelp(); break; } } } private ApplicationModes GetApplicationMode() { if (!_runtimeInfo.IsUserInteractive && OsInfo.IsWindows && _serviceProvider.ServiceExist(ServiceProvider.NZBDRONE_SERVICE_NAME) && _serviceProvider.GetStatus(ServiceProvider.NZBDRONE_SERVICE_NAME) == ServiceControllerStatus.StartPending) { return ApplicationModes.Service; } if (_startupArguments.Flags.Contains(StartupArguments.HELP)) { return ApplicationModes.Help; } if (!OsInfo.IsLinux && _startupArguments.Flags.Contains(StartupArguments.INSTALL_SERVICE)) { return ApplicationModes.InstallService; } if (!OsInfo.IsLinux && _startupArguments.Flags.Contains(StartupArguments.UNINSTALL_SERVICE)) { return ApplicationModes.UninstallService; } return ApplicationModes.Interactive; } } }