diff --git a/src/NzbDrone.Common.Test/ServiceFactoryFixture.cs b/src/NzbDrone.Common.Test/ServiceFactoryFixture.cs index 9c348316f..4132d5260 100644 --- a/src/NzbDrone.Common.Test/ServiceFactoryFixture.cs +++ b/src/NzbDrone.Common.Test/ServiceFactoryFixture.cs @@ -29,6 +29,7 @@ namespace NzbDrone.Common.Test .AddNzbDroneLogger() .AutoAddServices(Bootstrap.ASSEMBLIES) .AddDummyDatabase() + .AddDummyLogDatabase() .AddStartupContext(new StartupContext("first", "second")); container.RegisterInstance(new Mock().Object); diff --git a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs index 6cb6a803d..ef39c401d 100644 --- a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs +++ b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs @@ -61,6 +61,7 @@ namespace NzbDrone.Core.Configuration string PostgresMainDb { get; } string PostgresLogDb { get; } string Theme { get; } + bool LogDbEnabled { get; } } public class ConfigFileProvider : IConfigFileProvider @@ -202,6 +203,7 @@ namespace NzbDrone.Core.Configuration public string LogLevel => GetValue("LogLevel", "info").ToLowerInvariant(); public string ConsoleLogLevel => GetValue("ConsoleLogLevel", string.Empty, persist: false); public string Theme => GetValue("Theme", "auto", persist: false); + public bool LogDbEnabled => GetValueBoolean("LogDbEnabled", true, false); public string PostgresHost => _postgresOptions?.Host ?? GetValue("PostgresHost", string.Empty, persist: false); public string PostgresUser => _postgresOptions?.User ?? GetValue("PostgresUser", string.Empty, persist: false); public string PostgresPassword => _postgresOptions?.Password ?? GetValue("PostgresPassword", string.Empty, persist: false); diff --git a/src/NzbDrone.Core/Datastore/Extensions/CompositionExtensions.cs b/src/NzbDrone.Core/Datastore/Extensions/CompositionExtensions.cs index c5e31f92c..6c4beeaab 100644 --- a/src/NzbDrone.Core/Datastore/Extensions/CompositionExtensions.cs +++ b/src/NzbDrone.Core/Datastore/Extensions/CompositionExtensions.cs @@ -8,14 +8,24 @@ namespace NzbDrone.Core.Datastore.Extensions public static IContainer AddDatabase(this IContainer container) { container.RegisterDelegate(f => new MainDatabase(f.Create()), Reuse.Singleton); - container.RegisterDelegate(f => new LogDatabase(f.Create(MigrationType.Log)), Reuse.Singleton); + return container; + } + public static IContainer AddLogDatabase(this IContainer container) + { + container.RegisterDelegate(f => new LogDatabase(f.Create(MigrationType.Log)), Reuse.Singleton); return container; } public static IContainer AddDummyDatabase(this IContainer container) { container.RegisterInstance(new MainDatabase(null)); + + return container; + } + + public static IContainer AddDummyLogDatabase(this IContainer container) + { container.RegisterInstance(new LogDatabase(null)); return container; diff --git a/src/NzbDrone.Core/Update/History/UpdateHistoryService.cs b/src/NzbDrone.Core/Update/History/UpdateHistoryService.cs index 09cf70602..df4642d81 100644 --- a/src/NzbDrone.Core/Update/History/UpdateHistoryService.cs +++ b/src/NzbDrone.Core/Update/History/UpdateHistoryService.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using NLog; using NzbDrone.Common.EnvironmentInfo; +using NzbDrone.Core.Configuration; using NzbDrone.Core.Lifecycle; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Update.History.Events; @@ -19,13 +20,15 @@ namespace NzbDrone.Core.Update.History private readonly IUpdateHistoryRepository _repository; private readonly IEventAggregator _eventAggregator; private readonly Logger _logger; + private readonly IConfigFileProvider _configFileProvider; private Version _prevVersion; - public UpdateHistoryService(IUpdateHistoryRepository repository, IEventAggregator eventAggregator, Logger logger) + public UpdateHistoryService(IUpdateHistoryRepository repository, IEventAggregator eventAggregator, Logger logger, IConfigFileProvider configFileProvider) { _repository = repository; _eventAggregator = eventAggregator; _logger = logger; + _configFileProvider = configFileProvider; } public Version PreviouslyInstalled() @@ -58,7 +61,7 @@ namespace NzbDrone.Core.Update.History public void Handle(ApplicationStartedEvent message) { - if (BuildInfo.Version.Major == 10) + if (BuildInfo.Version.Major == 10 || !_configFileProvider.LogDbEnabled) { // Don't save dev versions, they change constantly return; diff --git a/src/NzbDrone.Host.Test/ContainerFixture.cs b/src/NzbDrone.Host.Test/ContainerFixture.cs index b73665459..86df98af4 100644 --- a/src/NzbDrone.Host.Test/ContainerFixture.cs +++ b/src/NzbDrone.Host.Test/ContainerFixture.cs @@ -41,6 +41,7 @@ namespace NzbDrone.App.Test .AutoAddServices(Bootstrap.ASSEMBLIES) .AddNzbDroneLogger() .AddDummyDatabase() + .AddDummyLogDatabase() .AddStartupContext(args); // dummy lifetime and broadcaster so tests resolve diff --git a/src/NzbDrone.Host/Bootstrap.cs b/src/NzbDrone.Host/Bootstrap.cs index f5f6f5a5f..4951ce81f 100644 --- a/src/NzbDrone.Host/Bootstrap.cs +++ b/src/NzbDrone.Host/Bootstrap.cs @@ -83,23 +83,31 @@ namespace NzbDrone.Host // Utility mode default: { - new HostBuilder() - .UseServiceProviderFactory(new DryIocServiceProviderFactory(new Container(rules => rules.WithNzbDroneRules()))) - .ConfigureContainer(c => - { - c.AutoAddServices(Bootstrap.ASSEMBLIES) - .AddNzbDroneLogger() - .AddDatabase() - .AddStartupContext(startupContext) - .Resolve() - .Route(appMode); - }) - .ConfigureServices(services => - { - services.Configure(config.GetSection("Radarr:Postgres")); - }).Build(); + new HostBuilder() + .UseServiceProviderFactory(new DryIocServiceProviderFactory(new Container(rules => rules.WithNzbDroneRules()))) + .ConfigureContainer(c => + { + c.AutoAddServices(Bootstrap.ASSEMBLIES) + .AddNzbDroneLogger() + .AddDatabase() + .AddStartupContext(startupContext) + .Resolve() + .Route(appMode); + if (config.GetValue(nameof(ConfigFileProvider.LogDbEnabled), true)) + { + c.AddLogDatabase(); + } + else + { + c.AddDummyLogDatabase(); + } + }) + .ConfigureServices(services => + { + services.Configure(config.GetSection("Radarr:Postgres")); + }).Build(); - break; + break; } } } @@ -130,6 +138,7 @@ namespace NzbDrone.Host var enableSsl = config.GetValue(nameof(ConfigFileProvider.EnableSsl), false); var sslCertPath = config.GetValue(nameof(ConfigFileProvider.SslCertPath)); var sslCertPassword = config.GetValue(nameof(ConfigFileProvider.SslCertPassword)); + var logDbEnabled = config.GetValue(nameof(ConfigFileProvider.LogDbEnabled), true); var urls = new List { BuildUrl("http", bindAddress, port) }; @@ -147,6 +156,14 @@ namespace NzbDrone.Host .AddNzbDroneLogger() .AddDatabase() .AddStartupContext(context); + if (logDbEnabled) + { + c.AddLogDatabase(); + } + else + { + c.AddDummyLogDatabase(); + } SchemaBuilder.Initialize(c); }) diff --git a/src/NzbDrone.Host/Startup.cs b/src/NzbDrone.Host/Startup.cs index 253e1abee..19593d01a 100644 --- a/src/NzbDrone.Host/Startup.cs +++ b/src/NzbDrone.Host/Startup.cs @@ -236,9 +236,12 @@ namespace NzbDrone.Host // instantiate the databases to initialize/migrate them _ = mainDatabaseFactory.Value; - _ = logDatabaseFactory.Value; - dbTarget.Register(); + if (configFileProvider.LogDbEnabled) + { + _ = logDatabaseFactory.Value; + dbTarget.Register(); + } if (OsInfo.IsNotWindows) { diff --git a/src/Radarr.Api.V3/Logs/LogController.cs b/src/Radarr.Api.V3/Logs/LogController.cs index a8ba1f14e..cc95fb78b 100644 --- a/src/Radarr.Api.V3/Logs/LogController.cs +++ b/src/Radarr.Api.V3/Logs/LogController.cs @@ -3,10 +3,12 @@ using NzbDrone.Common.Extensions; using NzbDrone.Core.Instrumentation; using Radarr.Http; using Radarr.Http.Extensions; +using Radarr.Http.REST.Filters; namespace Radarr.Api.V3.Logs { [V3ApiController] + [LogDatabaseDisabledActionFilter] public class LogController : Controller { private readonly ILogService _logService; diff --git a/src/Radarr.Api.V3/Update/UpdateController.cs b/src/Radarr.Api.V3/Update/UpdateController.cs index a40c7d266..9a451ef20 100644 --- a/src/Radarr.Api.V3/Update/UpdateController.cs +++ b/src/Radarr.Api.V3/Update/UpdateController.cs @@ -5,10 +5,12 @@ using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Core.Update; using NzbDrone.Core.Update.History; using Radarr.Http; +using Radarr.Http.REST.Filters; namespace Radarr.Api.V3.Update { [V3ApiController] + [LogDatabaseDisabledActionFilter] public class UpdateController : Controller { private readonly IRecentUpdateProvider _recentUpdateProvider; diff --git a/src/Radarr.Http/REST/Filters/LogDatabaseDisabledActionFilterAttribute.cs b/src/Radarr.Http/REST/Filters/LogDatabaseDisabledActionFilterAttribute.cs new file mode 100644 index 000000000..313766053 --- /dev/null +++ b/src/Radarr.Http/REST/Filters/LogDatabaseDisabledActionFilterAttribute.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; +using Microsoft.Extensions.DependencyInjection; +using NzbDrone.Core.Configuration; + +namespace Radarr.Http.REST.Filters; + +public class LogDatabaseDisabledActionFilterAttribute : ActionFilterAttribute +{ + public override void OnActionExecuting(ActionExecutingContext context) + { + var configFileProvider = context.HttpContext.RequestServices.GetService(); + if (!configFileProvider.LogDbEnabled) + { + context.Result = new NotFoundResult(); + } + } + + public override void OnActionExecuted(ActionExecutedContext context) + { + } +}