using System.Text.Json; using XFEEliteDangerous.Core; using XFEEliteDangerous.Client; using XFEEliteDangerous.Server; using XFEExtension.NetCore.ServerInteractive.Utilities.Extensions; using XFEExtension.NetCore.ServerInteractive.Utilities.Server; using XFEExtension.NetCore.CyberComm; var originalError=Console.Error; string? failureLog=null; try { args = AppText.ConfigureArguments(args); var options=ServerConfiguration.Load(args); Directory.CreateDirectory(options.DataRoot); Directory.SetCurrentDirectory(options.DataRoot); var runId="management-"+Guid.NewGuid().ToString("N"); Directory.CreateDirectory(Path.Combine(options.DataRoot,"logs")); failureLog=Path.Combine(options.DataRoot,"logs","startup-errors.log"); using var consoleLog=options.Background?TextWriter.Synchronized(File.AppendText(Path.Combine(options.DataRoot,"logs",runId+".console.log"))):null; if(consoleLog is not null){Console.SetOut(consoleLog);Console.SetError(consoleLog);} using var diagnostics=new OfflineDiagnosticLog(Path.Combine(options.DataRoot,"logs",runId),"management",runId); OfflineDiagnostics.Current=diagnostics; await using var workspace=new OfflineWorkspace(options.Workspace); var access=LocalAdministratorAccess.Open(options.DataRoot,options.Address); await using var online=new OnlineGameHost(workspace,access.Key,options.ArtifactsRoot); OnlineGameService.Host=online; ManagementService.EditOnlineIdle=online.EditIdleAsync; using var onlineCertificate=options.Online is {Enabled:true} onlineOptions?onlineOptions.OpenCertificate(options.DataRoot):null; if(options.Online is {Enabled:true})await workspace.InitializeSharedGalaxyAsync(); using var shutdown=new CancellationTokenSource(); ManagementService.Configure(workspace,options,access.Key,shutdown.Cancel); var builder=XFEServerBuilder.CreateBuilder().UseXFEServer() .AddServerCore(XFEServerCoreBuilder.CreateBuilder().AddService().Build(core=> { core.ServerCoreName="XFEEliteDangerous.Management";core.MainEntryPoint="api"; core.AcceptGet=true;core.AcceptPost=true;core.AcceptNonStandardJson=false; core.BindIP($"http://127.0.0.1:{options.Port}/"); core.TransportLimits=new(){MaxHttpBodyBytes=8*1024*1024}; })); if(options.Online is {Enabled:true} gameOptions) { if(gameOptions.Port==options.Port)throw new InvalidDataException(AppText.Get("Program.Text457")); builder.AddServerCore(XFEServerCoreBuilder.CreateBuilder().AddService().Build(core=> { core.ServerCoreName="XFEEliteDangerous.Game";core.MainEntryPoint="game";core.AcceptGet=true;core.AcceptPost=true;core.AcceptNonStandardJson=false; core.BindIP($"https://{gameOptions.BindAddress}:{gameOptions.Port}/");core.Tls=new(){Certificate=onlineCertificate};core.TransportLimits=new(){MaxHttpBodyBytes=16*1024*1024}; })); } await using var server=builder.Build(); ConsoleCancelEventHandler cancelHandler=(_,eventArgs)=>{eventArgs.Cancel=true;shutdown.Cancel();}; EventHandler exitHandler=(_,_)=>shutdown.Cancel(); Console.CancelKeyPress+=cancelHandler; AppDomain.CurrentDomain.ProcessExit+=exitHandler; Console.WriteLine(AppText.Get("Program.Text458")+options.Address); Console.WriteLine(AppText.Get("Program.Text459")+options.Workspace); Console.WriteLine(AppText.Get("Program.Text460")+Path.Combine(options.DataRoot,"logs")); diagnostics.Write("info","management","server.start","Local ServerInteractive management host starting.",new Dictionary{["address"]=options.Address,["workspace"]=options.Workspace}); try{await server.RunAsync(shutdown.Token);}catch(OperationCanceledException)when(shutdown.IsCancellationRequested){} finally{Console.CancelKeyPress-=cancelHandler;AppDomain.CurrentDomain.ProcessExit-=exitHandler;OfflineDiagnostics.Current=null;} return 0; } catch(Exception error) { if(failureLog is not null)try{File.AppendAllText(failureLog,DateTimeOffset.UtcNow.ToString("O")+" "+error+Environment.NewLine);}catch(IOException){} try{originalError.WriteLine(error.ToString());}catch(IOException){} return 1; }