Adds a setup wizard + more tweaks

This commit is contained in:
AffectedArc07
2021-06-08 17:29:27 +01:00
parent f1f1f0b312
commit a6690da5a0
3 changed files with 60 additions and 9 deletions
@@ -120,7 +120,6 @@ namespace Tgstation.Server.Host.Core
services.UseStandardConfig<UpdatesConfiguration>(Configuration);
services.UseStandardConfig<ControlPanelConfiguration>(Configuration);
services.UseStandardConfig<SwarmConfiguration>(Configuration);
services.UseStandardConfig<ElasticsearchConfiguration>(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
@@ -60,13 +60,13 @@ namespace Tgstation.Server.Host.Extensions
/// <param name="serviceCollection">The <see cref="IServiceCollection"/> to configure.</param>
/// <param name="configurationAction">Additional configuration for a given <see cref="LoggerConfiguration"/>.</param>
/// <param name="sinkConfigurationAction">Additional configuration for a given <see cref="LoggerSinkConfiguration"/>.</param>
/// <param name="esc">Configuration for a given <see cref="ElasticsearchConfiguration"/>.</param>
/// <param name="elasticsearchConfiguration">Configuration for a given <see cref="ElasticsearchConfiguration"/>.</param>
/// <returns>The updated <paramref name="serviceCollection"/>.</returns>
public static IServiceCollection SetupLogging(
this IServiceCollection serviceCollection,
Action<LoggerConfiguration> configurationAction,
Action<LoggerSinkConfiguration> 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,
@@ -740,6 +740,51 @@ namespace Tgstation.Server.Host.Setup
return fileLoggingConfiguration;
}
/// <summary>
/// Prompts the user to create a <see cref="ElasticsearchConfiguration"/>.
/// </summary>
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation.</param>
/// <returns>A <see cref="Task{TResult}"/> resulting in the new <see cref="ElasticsearchConfiguration"/>.</returns>
async Task<ElasticsearchConfiguration> 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;
}
/// <summary>
/// Prompts the user to create a <see cref="ControlPanelConfiguration"/>.
/// </summary>
@@ -834,6 +879,7 @@ namespace Tgstation.Server.Host.Setup
/// <param name="databaseConfiguration">The <see cref="DatabaseConfiguration"/> to save.</param>
/// <param name="newGeneralConfiguration">The <see cref="GeneralConfiguration"/> to save.</param>
/// <param name="fileLoggingConfiguration">The <see cref="FileLoggingConfiguration"/> to save.</param>
/// <param name="elasticsearchConfiguration">The <see cref="ElasticsearchConfiguration"/> to save.</param>
/// <param name="controlPanelConfiguration">The <see cref="ControlPanelConfiguration"/> to save.</param>
/// <param name="swarmConfiguration">The <see cref="SwarmConfiguration"/> to save.</param>
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation.</param>
@@ -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)