From 84c2b0c8b90393045e3e0597f3ecdc64351b51d9 Mon Sep 17 00:00:00 2001 From: KZ Date: Fri, 24 Jul 2015 00:07:36 +0100 Subject: [PATCH] Command line args. Superceade pull #102 from sdesbure:master --- Installer.iss | 10 +- src/Jackett.Console/ConsoleOptions.cs | 51 +++++++ src/Jackett.Console/Jackett.Console.csproj | 5 + src/Jackett.Console/Program.cs | 158 ++++++++++++++++----- src/Jackett.Console/packages.config | 1 + src/Jackett.Tray/Main.cs | 4 +- src/Jackett/Controllers/AdminController.cs | 2 +- src/Jackett/Engine.cs | 5 +- src/Jackett/Services/ServerService.cs | 1 + 9 files changed, 194 insertions(+), 43 deletions(-) create mode 100644 src/Jackett.Console/ConsoleOptions.cs diff --git a/Installer.iss b/Installer.iss index cae6ef11d..852a8de14 100644 --- a/Installer.iss +++ b/Installer.iss @@ -49,12 +49,12 @@ Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent [Run] -Filename: "{app}\JackettConsole.exe"; Parameters: "/u"; Flags: waituntilterminated; -Filename: "{app}\JackettConsole.exe"; Parameters: "/r"; Flags: waituntilterminated; -Filename: "{app}\JackettConsole.exe"; Parameters: "/i"; Flags: waituntilterminated; Tasks: windowsService -Filename: "{app}\JackettConsole.exe"; Parameters: "/start"; Flags: waituntilterminated; Tasks: windowsService +Filename: "{app}\JackettConsole.exe"; Parameters: "--Uninstall"; Flags: waituntilterminated; +Filename: "{app}\JackettConsole.exe"; Parameters: "--ReserveUrls"; Flags: waituntilterminated; +Filename: "{app}\JackettConsole.exe"; Parameters: "--Install"; Flags: waituntilterminated; Tasks: windowsService +Filename: "{app}\JackettConsole.exe"; Parameters: "--Start"; Flags: waituntilterminated; Tasks: windowsService [UninstallRun] -Filename: "{app}\JackettConsole.exe"; Parameters: "/u"; Flags: waituntilterminated skipifdoesntexist +Filename: "{app}\JackettConsole.exe"; Parameters: "--Uninstall"; Flags: waituntilterminated skipifdoesntexist diff --git a/src/Jackett.Console/ConsoleOptions.cs b/src/Jackett.Console/ConsoleOptions.cs new file mode 100644 index 000000000..5614b888f --- /dev/null +++ b/src/Jackett.Console/ConsoleOptions.cs @@ -0,0 +1,51 @@ +using CommandLine; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Jackett.Console +{ + public class ConsoleOptions + { + private bool listenPublic = false; + + [Option('i', "Install", HelpText = "Install Jackett windows service (Must be admin)")] + public bool Install { get; set; } + + [Option('r', "ReserveUrls", HelpText = "(Re)Register windows port reservations (Required for listening on all interfaces).")] + public bool ReserveUrls { get; set; } + + [Option('u', "Uninstall", HelpText = "Uninstall Jackett windows service (Must be admin).")] + public bool Uninstall { get; set; } + + [Option('l', "Logging", DefaultValue = false, HelpText = "Log all requests/responses to Jackett")] + public bool Logging { get; set; } + + [Option('t', "Tracing", DefaultValue = false, HelpText = "Enable tracing")] + public bool Tracing { get; set; } + + [Option('c', "UseCurlExec", DefaultValue = false, HelpText = "Execute curl rather than libcurl for all outgoing requests.")] + public bool UseCurlExec { get; set; } + + [Option('s', "Start", HelpText = "Start the Jacket Windows service (Must be admin)")] + public bool StartService { get; set; } + + [Option('k', "Stop", HelpText = "Stop the Jacket Windows service (Must be admin)")] + public bool StopService { get; set; } + + [Option('l', "ListenPublic", HelpText = "Listen publicly")] + public bool? ListenPublic { get; set; } + + [Option('h', "Help", HelpText = "Show Help")] + public bool ShowHelp { get; set; } + + [Option('v', "Version", HelpText = "Show Version")] + public bool ShowVersion { get; set; } + + [Option('p', "Port", HelpText = "Web server port")] + public int Port { get; set; } + + } +} diff --git a/src/Jackett.Console/Jackett.Console.csproj b/src/Jackett.Console/Jackett.Console.csproj index bf9675a02..63fbb1843 100644 --- a/src/Jackett.Console/Jackett.Console.csproj +++ b/src/Jackett.Console/Jackett.Console.csproj @@ -55,6 +55,10 @@ ..\packages\Autofac.WebApi2.Owin.3.2.0\lib\net45\Autofac.Integration.WebApi.Owin.dll + + ..\packages\CommandLineParser.1.9.71\lib\net45\CommandLine.dll + True + ..\packages\Microsoft.AspNet.Identity.Core.2.2.1\lib\net45\Microsoft.AspNet.Identity.Core.dll @@ -127,6 +131,7 @@ + diff --git a/src/Jackett.Console/Program.cs b/src/Jackett.Console/Program.cs index f948fab86..9d794a088 100644 --- a/src/Jackett.Console/Program.cs +++ b/src/Jackett.Console/Program.cs @@ -1,5 +1,9 @@ -using Jackett; +using CommandLine; +using CommandLine.Text; +using Jackett; +using Jackett.Console; using Jackett.Indexers; +using Jackett.Utils; using System; using System.Collections.Generic; using System.Diagnostics; @@ -18,44 +22,132 @@ namespace JackettConsole { try { - foreach (var arg in args) + var options = new ConsoleOptions(); + if (!Parser.Default.ParseArguments(args, options) || options.ShowHelp == true) { - switch (arg.ToLowerInvariant()) + var text = HelpText.AutoBuild(options, (HelpText current) => HelpText.DefaultParsingErrorsHandler(options, current)); + text.Copyright = " "; + text.Heading = "Jackett v" + Engine.ConfigService.GetVersion() + " options:"; + Console.WriteLine(text); + Environment.ExitCode = 1; + return; + } + else + { + /* ====== Actions ===== */ + + // Install service + if (options.Install) { - case "/i": // Install - Engine.ServiceConfig.Install(); - return; - case "/r": // Reserve port/url & install - Engine.Server.ReserveUrls(doInstall: true); - return; - case "/c": // Change port - Engine.Server.ReserveUrls(doInstall: false); - return; - case "/u": // Uninstall - Engine.Server.ReserveUrls(doInstall: false); - Engine.ServiceConfig.Uninstall(); - return; - case "/l": // Logging - Startup.LogRequests = true; - break; - case "/t": // Tracing - Startup.TracingEnabled = true; - break; - case "/curlsafe": // Curl safe mode - Startup.CurlSafe = true; - break; - case "/start": // Start Service - if (!Engine.ServiceConfig.ServiceRunning()) + Engine.ServiceConfig.Install(); + return; + } + + // Uninstall service + if (options.Uninstall) + { + Engine.Server.ReserveUrls(doInstall: false); + Engine.ServiceConfig.Uninstall(); + return; + } + + // Reserve urls + if (options.ReserveUrls) + { + Engine.Server.ReserveUrls(doInstall: true); + return; + } + + // Start Service + if (options.StartService) + { + if (!Engine.ServiceConfig.ServiceRunning()) + { + Engine.ServiceConfig.Start(); + } + return; + } + + // Stop Service + if (options.StopService) + { + if (Engine.ServiceConfig.ServiceRunning()) + { + Engine.ServiceConfig.Stop(); + } + return; + } + + + // Show Version + if (options.ShowVersion) + { + Console.WriteLine("Jackett v" + Engine.ConfigService.GetVersion()); + return; + } + + /* ====== Options ===== */ + + // Logging + if (options.Logging) + { + Startup.LogRequests = true; + } + + // Tracing + if (options.Tracing) + { + Startup.TracingEnabled = true; + } + + // Use curl + if (options.UseCurlExec) + { + Startup.CurlSafe = true; + } + + // Override listen public + if(options.ListenPublic.HasValue) + { + if(Engine.Server.Config.AllowExternal != options.ListenPublic) + { + Engine.Server.Config.AllowExternal = options.ListenPublic.Value; + if (System.Environment.OSVersion.Platform != PlatformID.Unix) { - Engine.ServiceConfig.Start(); + if (ServerUtil.IsUserAdministrator()) + { + Engine.Server.ReserveUrls(doInstall: true); + } + else + { + Engine.Logger.Error("Unable to switch to public listening without admin rights."); + Environment.ExitCode = 1; + return; + } } - return; - case "/stop": // Stop Service - if (Engine.ServiceConfig.ServiceRunning()) + } + } + + // Override port + if(options.Port != 0) + { + if (Engine.Server.Config.Port != options.Port) + { + Engine.Server.Config.Port = options.Port; + if (System.Environment.OSVersion.Platform != PlatformID.Unix) { - Engine.ServiceConfig.Stop(); + if (ServerUtil.IsUserAdministrator()) + { + Engine.Server.ReserveUrls(doInstall: true); + } + else + { + Engine.Logger.Error("Unable to switch ports when not running as administrator"); + Environment.ExitCode = 1; + return; + } } - return; + } } } diff --git a/src/Jackett.Console/packages.config b/src/Jackett.Console/packages.config index 2b7546d65..30ec668de 100644 --- a/src/Jackett.Console/packages.config +++ b/src/Jackett.Console/packages.config @@ -4,6 +4,7 @@ + diff --git a/src/Jackett.Tray/Main.cs b/src/Jackett.Tray/Main.cs index 252e241de..fee4ca124 100644 --- a/src/Jackett.Tray/Main.cs +++ b/src/Jackett.Tray/Main.cs @@ -141,7 +141,7 @@ namespace JackettTray { try { - Engine.ProcessService.StartProcessAndLog(consolePath, "/stop", true); + Engine.ProcessService.StartProcessAndLog(consolePath, "--Stop", true); } catch { @@ -159,7 +159,7 @@ namespace JackettTray { try { - Engine.ProcessService.StartProcessAndLog(consolePath, "/start", true); + Engine.ProcessService.StartProcessAndLog(consolePath, "--Start", true); } catch { diff --git a/src/Jackett/Controllers/AdminController.cs b/src/Jackett/Controllers/AdminController.cs index 5adbb205b..1b4079843 100644 --- a/src/Jackett/Controllers/AdminController.cs +++ b/src/Jackett/Controllers/AdminController.cs @@ -306,7 +306,7 @@ namespace Jackett.Controllers if (!ServerUtil.IsUserAdministrator()) { try { - processService.StartProcessAndLog(Application.ExecutablePath, "/r", true); + processService.StartProcessAndLog(Application.ExecutablePath, "--ReserveUrls", true); } catch { diff --git a/src/Jackett/Engine.cs b/src/Jackett/Engine.cs index c1340871e..0ed8daf81 100644 --- a/src/Jackett/Engine.cs +++ b/src/Jackett/Engine.cs @@ -19,7 +19,7 @@ namespace Jackett static Engine() { BuildContainer(); - Logger.Info("Starting Jackett " + ConfigService.GetVersion()); + } public static void BuildContainer() @@ -121,8 +121,9 @@ namespace Jackett var logFileRule = new LoggingRule("*", LogLevel.Info, logFile); logConfig.LoggingRules.Add(logFileRule); - var logConsole = new ConsoleTarget(); + var logConsole = new ColoredConsoleTarget(); logConfig.AddTarget("console", logConsole); + logConsole.Layout = "${longdate} ${level} ${message} ${exception:format=ToString}"; var logConsoleRule = new LoggingRule("*", Startup.TracingEnabled ? LogLevel.Debug : LogLevel.Info, logConsole); logConfig.LoggingRules.Add(logConsoleRule); diff --git a/src/Jackett/Services/ServerService.cs b/src/Jackett/Services/ServerService.cs index 3ac03aaa0..6bda024f9 100644 --- a/src/Jackett/Services/ServerService.cs +++ b/src/Jackett/Services/ServerService.cs @@ -103,6 +103,7 @@ namespace Jackett.Services public void Initalize() { + logger.Info("Starting Jackett " + configService.GetVersion()); CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US"); // Allow all SSL.. sucks I know but mono on linux is having problems without it..