diff --git a/setup/lidarr.iss b/setup/lidarr.iss index c90b9d422..cdc71cb2b 100644 --- a/setup/lidarr.iss +++ b/setup/lidarr.iss @@ -62,9 +62,9 @@ Name: "{userstartup}\{#AppName}"; Filename: "{app}\Lidarr.exe"; WorkingDir: "{ap Name: "{app}"; Type: filesandordirs [Run] -Filename: "{app}\Lidarr.Console.exe"; StatusMsg: "Removing previous Windows Service"; Parameters: "/u"; Flags: runhidden waituntilterminated; -Filename: "{app}\Lidarr.Console.exe"; Description: "Enable Access from Other Devices"; StatusMsg: "Enabling Remote access"; Parameters: "/registerurl"; Flags: postinstall runascurrentuser runhidden waituntilterminated; Tasks: startupShortcut none; -Filename: "{app}\Lidarr.Console.exe"; StatusMsg: "Installing Windows Service"; Parameters: "/i"; Flags: runhidden waituntilterminated; Tasks: windowsService +Filename: "{app}\Lidarr.Console.exe"; StatusMsg: "Removing previous Windows Service"; Parameters: "/u /exitimmediately"; Flags: runhidden waituntilterminated; +Filename: "{app}\Lidarr.Console.exe"; Description: "Enable Access from Other Devices"; StatusMsg: "Enabling Remote access"; Parameters: "/registerurl /exitimmediately"; Flags: postinstall runascurrentuser runhidden waituntilterminated; Tasks: startupShortcut none; +Filename: "{app}\Lidarr.Console.exe"; StatusMsg: "Installing Windows Service"; Parameters: "/i /exitimmediately"; Flags: runhidden waituntilterminated; Tasks: windowsService Filename: "{app}\Lidarr.exe"; Description: "Open Lidarr Web UI"; Flags: postinstall skipifsilent nowait; Tasks: windowsService; Filename: "{app}\Lidarr.exe"; Description: "Start Lidarr"; Flags: postinstall skipifsilent nowait; Tasks: startupShortcut none; diff --git a/src/NzbDrone.Common/EnvironmentInfo/StartupContext.cs b/src/NzbDrone.Common/EnvironmentInfo/StartupContext.cs index e778d1879..fff01a253 100644 --- a/src/NzbDrone.Common/EnvironmentInfo/StartupContext.cs +++ b/src/NzbDrone.Common/EnvironmentInfo/StartupContext.cs @@ -25,6 +25,7 @@ namespace NzbDrone.Common.EnvironmentInfo public const string RESTART = "restart"; public const string REGISTER_URL = "registerurl"; public const string NO_SINGLE_INSTANCE_CHECK = "nosingleinstancecheck"; + public const string EXIT_IMMEDIATELY = "exitimmediately"; public StartupContext(params string[] args) { @@ -55,6 +56,7 @@ namespace NzbDrone.Common.EnvironmentInfo public bool InstallService => Flags.Contains(INSTALL_SERVICE); public bool UninstallService => Flags.Contains(UNINSTALL_SERVICE); public bool RegisterUrl => Flags.Contains(REGISTER_URL); + public bool ExitImmediately => Flags.Contains(EXIT_IMMEDIATELY); public string PreservedArguments { diff --git a/src/NzbDrone.Console/ConsoleApp.cs b/src/NzbDrone.Console/ConsoleApp.cs index 980003ff1..60ea9f204 100644 --- a/src/NzbDrone.Console/ConsoleApp.cs +++ b/src/NzbDrone.Console/ConsoleApp.cs @@ -1,5 +1,7 @@ using System; +using System.IO; using System.Net.Sockets; +using Microsoft.AspNetCore.Connections; using NLog; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Exceptions; @@ -23,9 +25,11 @@ namespace NzbDrone.Console public static void Main(string[] args) { + StartupContext startupArgs = null; + try { - var startupArgs = new StartupContext(args); + startupArgs = new StartupContext(args); try { NzbDroneLogger.Register(startupArgs, false, true); @@ -43,37 +47,50 @@ namespace NzbDrone.Console System.Console.WriteLine(""); System.Console.WriteLine(""); Logger.Fatal(ex, "EPIC FAIL!"); - Exit(ExitCodes.NonRecoverableFailure); + Exit(ExitCodes.NonRecoverableFailure, startupArgs); } catch (SocketException ex) { System.Console.WriteLine(""); System.Console.WriteLine(""); - Logger.Fatal(ex.Message + ". This can happen if another instance of Lidarr is already running another application is using the same port (default: 8686) or the user has insufficient permissions"); - Exit(ExitCodes.RecoverableFailure); + Logger.Fatal(ex.Message + ". This can happen if another instance of Lidarr is already running another application is using the same port (default: 8989) or the user has insufficient permissions"); + Exit(ExitCodes.RecoverableFailure, startupArgs); + } + catch (IOException ex) + { + if (ex.InnerException is AddressInUseException) + { + System.Console.WriteLine(""); + System.Console.WriteLine(""); + Logger.Fatal(ex.Message + " This can happen if another instance of Radarr is already running another application is using the same port (default: 7878) or the user has insufficient permissions"); + Exit(ExitCodes.RecoverableFailure, startupArgs); + } + else + { + throw; + } } catch (RemoteAccessException ex) { System.Console.WriteLine(""); System.Console.WriteLine(""); Logger.Fatal(ex, "EPIC FAIL!"); - Exit(ExitCodes.Normal); + Exit(ExitCodes.Normal, startupArgs); } catch (Exception ex) { System.Console.WriteLine(""); System.Console.WriteLine(""); Logger.Fatal(ex, "EPIC FAIL!"); - System.Console.WriteLine("EPIC FAIL! " + ex.ToString()); - Exit(ExitCodes.UnknownFailure); + Exit(ExitCodes.UnknownFailure, startupArgs); } Logger.Info("Exiting main."); - Exit(ExitCodes.Normal); + Exit(ExitCodes.Normal, startupArgs); } - private static void Exit(ExitCodes exitCode) + private static void Exit(ExitCodes exitCode, StartupContext startupArgs) { LogManager.Shutdown(); @@ -85,6 +102,13 @@ namespace NzbDrone.Console if (exitCode == ExitCodes.NonRecoverableFailure) { + if (startupArgs?.ExitImmediately == true) + { + System.Console.WriteLine("Non-recoverable failure, but set to exit immediately"); + + Environment.Exit((int)exitCode); + } + System.Console.WriteLine("Non-recoverable failure, waiting for user intervention..."); for (int i = 0; i < 3600; i++) {