From a6690da5a02436b2466fde8e2a96996e4b2a3f76 Mon Sep 17 00:00:00 2001 From: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com> Date: Tue, 8 Jun 2021 17:29:27 +0100 Subject: [PATCH] Adds a setup wizard + more tweaks --- src/Tgstation.Server.Host/Core/Application.cs | 4 +- .../Extensions/ServiceCollectionExtensions.cs | 14 ++--- .../Setup/SetupWizard.cs | 51 +++++++++++++++++++ 3 files changed, 60 insertions(+), 9 deletions(-) diff --git a/src/Tgstation.Server.Host/Core/Application.cs b/src/Tgstation.Server.Host/Core/Application.cs index 0e2433be42..c28dc4a6f2 100644 --- a/src/Tgstation.Server.Host/Core/Application.cs +++ b/src/Tgstation.Server.Host/Core/Application.cs @@ -120,7 +120,6 @@ namespace Tgstation.Server.Host.Core services.UseStandardConfig(Configuration); services.UseStandardConfig(Configuration); services.UseStandardConfig(Configuration); - services.UseStandardConfig(Configuration); // enable options which give us config reloading services.AddOptions(); @@ -179,7 +178,8 @@ namespace Tgstation.Server.Host.Core flushToDiskInterval: TimeSpan.FromSeconds(2), rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true); - }, postSetupServices.ElasticsearchConfiguration); + }, + postSetupServices.ElasticsearchConfiguration); // configure bearer token validation services diff --git a/src/Tgstation.Server.Host/Extensions/ServiceCollectionExtensions.cs b/src/Tgstation.Server.Host/Extensions/ServiceCollectionExtensions.cs index 752c2e9459..bc6ed50c5a 100644 --- a/src/Tgstation.Server.Host/Extensions/ServiceCollectionExtensions.cs +++ b/src/Tgstation.Server.Host/Extensions/ServiceCollectionExtensions.cs @@ -60,13 +60,13 @@ namespace Tgstation.Server.Host.Extensions /// The to configure. /// Additional configuration for a given . /// Additional configuration for a given . - /// Configuration for a given . + /// Configuration for a given . /// The updated . public static IServiceCollection SetupLogging( this IServiceCollection serviceCollection, Action configurationAction, Action sinkConfigurationAction = null, - ElasticsearchConfiguration esc = null) + ElasticsearchConfiguration elasticsearchConfiguration = null) => serviceCollection.AddLogging(builder => { builder.ClearProviders(); @@ -89,18 +89,18 @@ namespace Tgstation.Server.Host.Extensions sinkConfigurationAction?.Invoke(sinkConfiguration); }); - if (esc != null) + if (elasticsearchConfiguration != null) { - if (esc.Enable) + if (elasticsearchConfiguration.Enable) { - if (esc.Host == null) + if (elasticsearchConfiguration.Host == null) throw new InvalidOperationException("Elasticsearch endpoint is null!"); - configuration.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(esc.Host)) + configuration.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(elasticsearchConfiguration.Host)) { // Yes I know this means they cannot use a self signed cert unless they also have authentication, but lets be real here // No one is going to be doing one of thsoe but not the other - ModifyConnectionSettings = x => (!string.IsNullOrEmpty(esc.Username) && !string.IsNullOrEmpty(esc.Password)) ? x.BasicAuthentication(esc.Username, esc.Password).ServerCertificateValidationCallback((o, certificate, arg3, arg4) => { return true; }) : null, + ModifyConnectionSettings = x => (!string.IsNullOrEmpty(elasticsearchConfiguration.Username) && !string.IsNullOrEmpty(elasticsearchConfiguration.Password)) ? x.BasicAuthentication(elasticsearchConfiguration.Username, elasticsearchConfiguration.Password).ServerCertificateValidationCallback((o, certificate, arg3, arg4) => { return true; }) : null, CustomFormatter = new EcsTextFormatter(), AutoRegisterTemplate = true, AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv7, diff --git a/src/Tgstation.Server.Host/Setup/SetupWizard.cs b/src/Tgstation.Server.Host/Setup/SetupWizard.cs index 92b0f13d14..a351ff363e 100644 --- a/src/Tgstation.Server.Host/Setup/SetupWizard.cs +++ b/src/Tgstation.Server.Host/Setup/SetupWizard.cs @@ -740,6 +740,51 @@ namespace Tgstation.Server.Host.Setup return fileLoggingConfiguration; } + /// + /// Prompts the user to create a . + /// + /// The for the operation. + /// A resulting in the new . + async Task ConfigureElasticsearch(CancellationToken cancellationToken) { + var elasticsearchConfiguration = new ElasticsearchConfiguration(); + await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false); + elasticsearchConfiguration.Enable = await PromptYesNo("Enable logging to an external ElasticSearch server? (y/n): ", cancellationToken).ConfigureAwait(false); + + if (elasticsearchConfiguration.Enable) + { + do + { + await console.WriteAsync("ElasticSearch server endpoint (Include protocol and port, leave blank for http://127.0.0.1:9200): ", false, cancellationToken).ConfigureAwait(false); + elasticsearchConfiguration.Host = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false); + if (!String.IsNullOrWhiteSpace(elasticsearchConfiguration.Host)) + { + break; + } + } + while (true); + + do + { + await console.WriteAsync("Enter Elasticsearch username: ", false, cancellationToken).ConfigureAwait(false); + elasticsearchConfiguration.Username = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false); + if (!String.IsNullOrWhiteSpace(elasticsearchConfiguration.Username)) { + break; + } + } while (true); + + do + { + await console.WriteAsync("Enter password: ", false, cancellationToken).ConfigureAwait(false); + elasticsearchConfiguration.Password = await console.ReadLineAsync(true, cancellationToken).ConfigureAwait(false); + if (!String.IsNullOrWhiteSpace(elasticsearchConfiguration.Username)) { + break; + } + } while (true); + } + + return elasticsearchConfiguration; + } + /// /// Prompts the user to create a . /// @@ -834,6 +879,7 @@ namespace Tgstation.Server.Host.Setup /// The to save. /// The to save. /// The to save. + /// The to save. /// The to save. /// The to save. /// The for the operation. @@ -844,6 +890,7 @@ namespace Tgstation.Server.Host.Setup DatabaseConfiguration databaseConfiguration, GeneralConfiguration newGeneralConfiguration, FileLoggingConfiguration fileLoggingConfiguration, + ElasticsearchConfiguration elasticsearchConfiguration, ControlPanelConfiguration controlPanelConfiguration, SwarmConfiguration swarmConfiguration, CancellationToken cancellationToken) @@ -857,6 +904,7 @@ namespace Tgstation.Server.Host.Setup { DatabaseConfiguration.Section, databaseConfiguration }, { GeneralConfiguration.Section, newGeneralConfiguration }, { FileLoggingConfiguration.Section, fileLoggingConfiguration }, + { ElasticsearchConfiguration.Section, elasticsearchConfiguration }, { ControlPanelConfiguration.Section, controlPanelConfiguration }, { SwarmConfiguration.Section, swarmConfiguration }, }; @@ -931,6 +979,8 @@ namespace Tgstation.Server.Host.Setup var fileLoggingConfiguration = await ConfigureLogging(cancellationToken).ConfigureAwait(false); + var elasticSearchConfiguration = await ConfigureElasticsearch(cancellationToken).ConfigureAwait(false); + var controlPanelConfiguration = await ConfigureControlPanel(cancellationToken).ConfigureAwait(false); var swarmConfiguration = await ConfigureSwarm(cancellationToken).ConfigureAwait(false); @@ -943,6 +993,7 @@ namespace Tgstation.Server.Host.Setup databaseConfiguration, newGeneralConfiguration, fileLoggingConfiguration, + elasticSearchConfiguration, controlPanelConfiguration, swarmConfiguration, cancellationToken)