2018-06-16 08:32:08 +00:00
|
|
|
|
using Jackett.Common;
|
|
|
|
|
using Jackett.Common.Models.Config;
|
|
|
|
|
using Jackett.Common.Services;
|
2018-06-17 02:39:03 +00:00
|
|
|
|
using Jackett.Common.Services.Interfaces;
|
|
|
|
|
using Jackett.Server.Services;
|
2018-06-16 08:32:08 +00:00
|
|
|
|
using NLog;
|
|
|
|
|
using NLog.Config;
|
|
|
|
|
using NLog.Targets;
|
2018-06-17 02:39:03 +00:00
|
|
|
|
using System;
|
2018-06-16 08:32:08 +00:00
|
|
|
|
using System.IO;
|
2018-06-17 02:39:03 +00:00
|
|
|
|
using System.Linq;
|
2018-06-16 08:32:08 +00:00
|
|
|
|
|
|
|
|
|
namespace Jackett.Server
|
|
|
|
|
{
|
|
|
|
|
public static class Initialisation
|
|
|
|
|
{
|
2018-06-17 04:02:13 +00:00
|
|
|
|
|
|
|
|
|
public static void ProcessSettings(RuntimeSettings runtimeSettings, Logger logger)
|
2018-06-16 08:32:08 +00:00
|
|
|
|
{
|
2018-06-17 04:02:13 +00:00
|
|
|
|
if (runtimeSettings.ClientOverride != "httpclient" && runtimeSettings.ClientOverride != "httpclient2")
|
|
|
|
|
{
|
|
|
|
|
logger.Error($"Client override ({runtimeSettings.ClientOverride}) has been deprecated, please remove it from your start arguments");
|
|
|
|
|
Environment.Exit(1);
|
|
|
|
|
}
|
2018-06-16 08:32:08 +00:00
|
|
|
|
|
2018-06-17 04:02:13 +00:00
|
|
|
|
if (runtimeSettings.DoSSLFix != null)
|
|
|
|
|
{
|
|
|
|
|
logger.Error("SSLFix has been deprecated, please remove it from your start arguments");
|
|
|
|
|
Environment.Exit(1);
|
|
|
|
|
}
|
2018-06-16 08:32:08 +00:00
|
|
|
|
|
2018-06-17 04:02:13 +00:00
|
|
|
|
if (runtimeSettings.LogRequests)
|
|
|
|
|
{
|
|
|
|
|
logger.Info("Logging enabled.");
|
|
|
|
|
}
|
2018-06-16 08:32:08 +00:00
|
|
|
|
|
2018-06-17 04:02:13 +00:00
|
|
|
|
if (runtimeSettings.TracingEnabled)
|
|
|
|
|
{
|
|
|
|
|
logger.Info("Tracing enabled.");
|
|
|
|
|
}
|
2018-06-16 08:32:08 +00:00
|
|
|
|
|
2018-06-17 04:02:13 +00:00
|
|
|
|
if (runtimeSettings.IgnoreSslErrors == true)
|
|
|
|
|
{
|
|
|
|
|
logger.Info("Jackett will ignore SSL certificate errors.");
|
|
|
|
|
}
|
2018-06-16 08:32:08 +00:00
|
|
|
|
|
2018-06-17 04:02:13 +00:00
|
|
|
|
if (!string.IsNullOrWhiteSpace(runtimeSettings.CustomDataFolder))
|
2018-06-16 08:32:08 +00:00
|
|
|
|
{
|
2018-06-17 04:02:13 +00:00
|
|
|
|
logger.Info("Jackett Data will be stored in: " + runtimeSettings.CustomDataFolder);
|
2018-06-16 08:32:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-17 04:02:13 +00:00
|
|
|
|
if (runtimeSettings.ProxyConnection != null)
|
|
|
|
|
{
|
|
|
|
|
logger.Info("Proxy enabled. " + runtimeSettings.ProxyConnection);
|
|
|
|
|
}
|
2018-06-16 08:32:08 +00:00
|
|
|
|
}
|
2018-06-17 02:39:03 +00:00
|
|
|
|
|
|
|
|
|
public static void ProcessWindowsSpecificArgs(ConsoleOptions consoleOptions, IProcessService processService, ServerConfig serverConfig, Logger logger)
|
|
|
|
|
{
|
|
|
|
|
IServiceConfigService serviceConfigService = new ServiceConfigService();
|
|
|
|
|
|
|
|
|
|
/* ====== Actions ===== */
|
|
|
|
|
|
|
|
|
|
// Install service
|
|
|
|
|
if (consoleOptions.Install)
|
|
|
|
|
{
|
|
|
|
|
logger.Info("Initiating Jackett service install");
|
|
|
|
|
serviceConfigService.Install();
|
|
|
|
|
Environment.Exit(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Uninstall service
|
|
|
|
|
if (consoleOptions.Uninstall)
|
|
|
|
|
{
|
|
|
|
|
logger.Info("Initiating Jackett service uninstall");
|
|
|
|
|
ReserveUrls(processService, serverConfig, logger, doInstall: false);
|
|
|
|
|
serviceConfigService.Uninstall();
|
|
|
|
|
Environment.Exit(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Start Service
|
|
|
|
|
if (consoleOptions.StartService)
|
|
|
|
|
{
|
|
|
|
|
if (!serviceConfigService.ServiceRunning())
|
|
|
|
|
{
|
|
|
|
|
logger.Info("Initiating Jackett service start");
|
|
|
|
|
serviceConfigService.Start();
|
|
|
|
|
}
|
|
|
|
|
Environment.Exit(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Stop Service
|
|
|
|
|
if (consoleOptions.StopService)
|
|
|
|
|
{
|
|
|
|
|
if (serviceConfigService.ServiceRunning())
|
|
|
|
|
{
|
|
|
|
|
logger.Info("Initiating Jackett service stop");
|
|
|
|
|
serviceConfigService.Stop();
|
|
|
|
|
}
|
|
|
|
|
Environment.Exit(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Reserve urls
|
|
|
|
|
if (consoleOptions.ReserveUrls)
|
|
|
|
|
{
|
|
|
|
|
logger.Info("Initiating ReserveUrls");
|
|
|
|
|
ReserveUrls(processService, serverConfig, logger, doInstall: true);
|
|
|
|
|
Environment.Exit(1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void ReserveUrls(IProcessService processService, ServerConfig serverConfig, Logger logger, bool doInstall = true)
|
|
|
|
|
{
|
|
|
|
|
logger.Debug("Unreserving Urls");
|
|
|
|
|
serverConfig.GetListenAddresses(false).ToList().ForEach(u => RunNetSh(processService, string.Format("http delete urlacl {0}", u)));
|
|
|
|
|
serverConfig.GetListenAddresses(true).ToList().ForEach(u => RunNetSh(processService, string.Format("http delete urlacl {0}", u)));
|
|
|
|
|
if (doInstall)
|
|
|
|
|
{
|
|
|
|
|
logger.Debug("Reserving Urls");
|
|
|
|
|
serverConfig.GetListenAddresses(serverConfig.AllowExternal).ToList().ForEach(u => RunNetSh(processService, string.Format("http add urlacl {0} sddl=D:(A;;GX;;;S-1-1-0)", u)));
|
|
|
|
|
logger.Debug("Urls reserved");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void RunNetSh(IProcessService processService, string args)
|
|
|
|
|
{
|
|
|
|
|
processService.StartProcessAndLog("netsh.exe", args);
|
|
|
|
|
}
|
2018-06-17 04:02:13 +00:00
|
|
|
|
|
|
|
|
|
public static LoggingConfiguration SetupLogging(RuntimeSettings settings)
|
|
|
|
|
{
|
|
|
|
|
var logFileName = settings.CustomLogFileName ?? "log.txt";
|
|
|
|
|
var logLevel = settings.TracingEnabled ? NLog.LogLevel.Debug : NLog.LogLevel.Info;
|
|
|
|
|
// Add custom date time format renderer as the default is too long
|
|
|
|
|
ConfigurationItemFactory.Default.LayoutRenderers.RegisterDefinition("simpledatetime", typeof(SimpleDateTimeRenderer));
|
|
|
|
|
|
|
|
|
|
var logConfig = new LoggingConfiguration();
|
|
|
|
|
var logFile = new FileTarget();
|
|
|
|
|
logConfig.AddTarget("file", logFile);
|
|
|
|
|
logFile.Layout = "${longdate} ${level} ${message} ${exception:format=ToString}";
|
|
|
|
|
logFile.FileName = Path.Combine(settings.DataFolder, logFileName);
|
|
|
|
|
logFile.ArchiveFileName = "log.{#####}.txt";
|
|
|
|
|
logFile.ArchiveAboveSize = 500000;
|
|
|
|
|
logFile.MaxArchiveFiles = 5;
|
|
|
|
|
logFile.KeepFileOpen = false;
|
|
|
|
|
logFile.ArchiveNumbering = ArchiveNumberingMode.DateAndSequence;
|
|
|
|
|
var logFileRule = new LoggingRule("*", logLevel, logFile);
|
|
|
|
|
logConfig.LoggingRules.Add(logFileRule);
|
|
|
|
|
|
|
|
|
|
var logConsole = new ColoredConsoleTarget();
|
|
|
|
|
logConfig.AddTarget("console", logConsole);
|
|
|
|
|
|
|
|
|
|
logConsole.Layout = "${simpledatetime} ${level} ${message} ${exception:format=ToString}";
|
|
|
|
|
var logConsoleRule = new LoggingRule("*", logLevel, logConsole);
|
|
|
|
|
logConfig.LoggingRules.Add(logConsoleRule);
|
|
|
|
|
|
|
|
|
|
var logService = new LogCacheService();
|
|
|
|
|
logConfig.AddTarget("service", logService);
|
|
|
|
|
var serviceRule = new LoggingRule("*", logLevel, logService);
|
|
|
|
|
logConfig.LoggingRules.Add(serviceRule);
|
|
|
|
|
|
|
|
|
|
return logConfig;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void SetLogLevel(LogLevel level)
|
|
|
|
|
{
|
|
|
|
|
foreach (var rule in LogManager.Configuration.LoggingRules)
|
|
|
|
|
{
|
|
|
|
|
if (level == LogLevel.Debug)
|
|
|
|
|
{
|
|
|
|
|
if (!rule.Levels.Contains(LogLevel.Debug))
|
|
|
|
|
{
|
|
|
|
|
rule.EnableLoggingForLevel(LogLevel.Debug);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (rule.Levels.Contains(LogLevel.Debug))
|
|
|
|
|
{
|
|
|
|
|
rule.DisableLoggingForLevel(LogLevel.Debug);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LogManager.ReconfigExistingLoggers();
|
|
|
|
|
}
|
2018-06-16 08:32:08 +00:00
|
|
|
|
}
|
|
|
|
|
}
|