using Autofac; using AutoMapper; using Jackett.Common; using Jackett.Common.Models; using Jackett.Common.Models.Config; using Jackett.Common.Services; using Jackett.Common.Services.Interfaces; using Jackett.Common.Utils.Clients; using NLog; using NLog.Config; using NLog.Targets; using System.IO; using System.Linq; using System.Text; namespace Jackett.Server { public class Initialisation { public static IContainer ApplicationContainer { get; set; } private static bool _automapperInitialised = false; public static void Initialize() { if (_automapperInitialised == false) { //Automapper only likes being initialized once per app domain. //Since we can restart Jackett from the command line it's possible that we'll build the container more than once. (tests do this too) InitAutomapper(); _automapperInitialised = true; } //Load the indexers ServerService.Initalize(); } private static void InitAutomapper() { Mapper.Initialize(cfg => { cfg.CreateMap().ForMember(x => x.Content, opt => opt.Ignore()).AfterMap((be, str) => { var encoding = be.Request.Encoding ?? Encoding.UTF8; str.Content = encoding.GetString(be.Content); }); cfg.CreateMap().ForMember(x => x.Content, opt => opt.Ignore()).AfterMap((str, be) => { if (!string.IsNullOrEmpty(str.Content)) { var encoding = str.Request.Encoding ?? Encoding.UTF8; be.Content = encoding.GetBytes(str.Content); } }); cfg.CreateMap(); cfg.CreateMap(); cfg.CreateMap(); cfg.CreateMap().AfterMap((r, t) => { if (r.Category != null) { var CategoryDesc = string.Join(", ", r.Category.Select(x => TorznabCatType.GetCatDesc(x)).Where(x => !string.IsNullOrEmpty(x))); t.CategoryDesc = CategoryDesc; } else { t.CategoryDesc = ""; } }); }); } public static IConfigurationService ConfigService { get { return ApplicationContainer.Resolve(); } } public static IServerService ServerService { get { return ApplicationContainer.Resolve(); } } public static void SetupLogging(RuntimeSettings settings, ContainerBuilder builder) { 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); LogManager.Configuration = logConfig; if (builder != null) { builder.RegisterInstance(LogManager.GetCurrentClassLogger()).SingleInstance(); } } 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(); } } }