diff --git a/_application_8cs_source.html b/_application_8cs_source.html index baa4937b64..188cba67ca 100644 --- a/_application_8cs_source.html +++ b/_application_8cs_source.html @@ -413,289 +413,288 @@ $(function() {
365 }
366
367 // only global repo manager should be for the OD repo
-
368 var openDreamRepositoryDirectory = ioManager.ConcatPath(
-
369 Environment.GetFolderPath(
-
370 Environment.SpecialFolder.LocalApplicationData,
-
371 Environment.SpecialFolderOption.DoNotVerify),
-
372 assemblyInformationProvider.VersionPrefix,
-
373 "OpenDreamRepository");
-
374 services.AddSingleton(
-
375 services => services
-
376 .GetRequiredService<IRepositoryManagerFactory>()
-
377 .CreateRepositoryManager(
-
378 new ResolvingIOManager(
-
379 services.GetRequiredService<IIOManager>(),
-
380 openDreamRepositoryDirectory),
-
381 new NoopEventConsumer()));
-
382
-
383 services.AddSingleton(
-
384 serviceProvider => new Dictionary<EngineType, IEngineInstaller>
-
385 {
-
386 { EngineType.Byond, serviceProvider.GetRequiredService<ByondInstallerBase>() },
-
387 { EngineType.OpenDream, serviceProvider.GetRequiredService<OpenDreamInstaller>() },
-
388 }
-
389 .ToFrozenDictionary());
-
390 services.AddSingleton<IEngineInstaller, DelegatingEngineInstaller>();
-
391
-
392 if (postSetupServices.InternalConfiguration.UsingSystemD)
-
393 services.AddHostedService<SystemDManager>();
-
394
-
395 // configure file transfer services
-
396 services.AddSingleton<FileTransferService>();
-
397 services.AddSingleton<IFileTransferStreamHandler>(x => x.GetRequiredService<FileTransferService>());
-
398 services.AddSingleton<IFileTransferTicketProvider>(x => x.GetRequiredService<FileTransferService>());
-
399 services.AddTransient<IActionResultExecutor<LimitedStreamResult>, LimitedStreamResultExecutor>();
-
400
-
401 // configure swarm service
-
402 services.AddSingleton<SwarmService>();
-
403 services.AddSingleton<ISwarmService>(x => x.GetRequiredService<SwarmService>());
-
404 services.AddSingleton<ISwarmOperations>(x => x.GetRequiredService<SwarmService>());
-
405 services.AddSingleton<ISwarmServiceController>(x => x.GetRequiredService<SwarmService>());
-
406
-
407 // configure component services
-
408 services.AddSingleton<IPortAllocator, PortAllocator>();
-
409 services.AddSingleton<IInstanceFactory, InstanceFactory>();
-
410 services.AddSingleton<IGitRemoteFeaturesFactory, GitRemoteFeaturesFactory>();
-
411 services.AddSingleton<ILibGit2RepositoryFactory, LibGit2RepositoryFactory>();
-
412 services.AddSingleton<ILibGit2Commands, LibGit2Commands>();
-
413 services.AddSingleton<IRepositoryManagerFactory, RepostoryManagerFactory>();
-
414 services.AddSingleton<IRemoteDeploymentManagerFactory, RemoteDeploymentManagerFactory>();
-
415 services.AddChatProviderFactory();
-
416 services.AddSingleton<IChatManagerFactory, ChatManagerFactory>();
-
417 services.AddSingleton<IServerUpdater, ServerUpdater>();
-
418 services.AddSingleton<IServerUpdateInitiator, ServerUpdateInitiator>();
-
419
-
420 // configure misc services
-
421 services.AddSingleton<IProcessExecutor, ProcessExecutor>();
-
422 services.AddSingleton<ISynchronousIOManager, SynchronousIOManager>();
-
423 services.AddSingleton<IServerPortProvider, ServerPortProivder>();
-
424 services.AddSingleton<ITopicClientFactory, TopicClientFactory>();
-
425 services.AddHostedService<CommandPipeManager>();
-
426
-
427 services.AddFileDownloader();
-
428 services.AddGitHub();
-
429
-
430 // configure root services
-
431 services.AddSingleton<JobService>();
-
432 services.AddSingleton<IJobService>(provider => provider.GetRequiredService<JobService>());
-
433 services.AddSingleton<IJobsHubUpdater>(provider => provider.GetRequiredService<JobService>());
-
434 services.AddSingleton<IJobManager>(x => x.GetRequiredService<IJobService>());
-
435 services.AddSingleton<JobsHubGroupMapper>();
-
436 services.AddSingleton<IPermissionsUpdateNotifyee>(provider => provider.GetRequiredService<JobsHubGroupMapper>());
-
437 services.AddSingleton<IHostedService>(x => x.GetRequiredService<JobsHubGroupMapper>()); // bit of a hack, but we need this to load immediated
-
438
-
439 services.AddSingleton<InstanceManager>();
-
440 services.AddSingleton<IBridgeDispatcher>(x => x.GetRequiredService<InstanceManager>());
-
441 services.AddSingleton<IInstanceManager>(x => x.GetRequiredService<InstanceManager>());
-
442 }
-
443
-
456 public void Configure(
-
457 IApplicationBuilder applicationBuilder,
-
458 IServerControl serverControl,
-
459 ITokenFactory tokenFactory,
-
460 IServerPortProvider serverPortProvider,
-
461 IAssemblyInformationProvider assemblyInformationProvider,
-
462 IOptions<ControlPanelConfiguration> controlPanelConfigurationOptions,
-
463 IOptions<GeneralConfiguration> generalConfigurationOptions,
-
464 IOptions<SwarmConfiguration> swarmConfigurationOptions,
-
465 ILogger<Application> logger)
-
466 {
-
467 ArgumentNullException.ThrowIfNull(applicationBuilder);
-
468 ArgumentNullException.ThrowIfNull(serverControl);
-
469
-
470 this.tokenFactory = tokenFactory ?? throw new ArgumentNullException(nameof(tokenFactory));
-
471
-
472 ArgumentNullException.ThrowIfNull(serverPortProvider);
-
473 ArgumentNullException.ThrowIfNull(assemblyInformationProvider);
-
474
-
475 var controlPanelConfiguration = controlPanelConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(controlPanelConfigurationOptions));
-
476 var generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
-
477 var swarmConfiguration = swarmConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(swarmConfigurationOptions));
-
478
-
479 ArgumentNullException.ThrowIfNull(logger);
-
480
-
481 logger.LogDebug("Content Root: {contentRoot}", hostingEnvironment.ContentRootPath);
-
482 logger.LogTrace("Web Root: {webRoot}", hostingEnvironment.WebRootPath);
-
483
-
484 // setup the HTTP request pipeline
-
485 // Add additional logging context to the request
-
486 applicationBuilder.UseAdditionalRequestLoggingContext(swarmConfiguration);
-
487
-
488 // Wrap exceptions in a 500 (ErrorMessage) response
-
489 applicationBuilder.UseServerErrorHandling();
-
490
-
491 // Add the X-Powered-By response header
-
492 applicationBuilder.UseServerBranding(assemblyInformationProvider);
-
493
-
494 // Add the X-Accel-Buffering response header
-
495 applicationBuilder.UseDisabledNginxProxyBuffering();
-
496
-
497 // suppress OperationCancelledExceptions, they are just aborted HTTP requests
-
498 applicationBuilder.UseCancelledRequestSuppression();
-
499
-
500 // 503 requests made while the application is starting
-
501 applicationBuilder.UseAsyncInitialization<IInstanceManager>(
-
502 (instanceManager, cancellationToken) => instanceManager.Ready.WaitAsync(cancellationToken));
-
503
-
504 if (generalConfiguration.HostApiDocumentation)
-
505 {
-
506 var siteDocPath = Routes.ApiRoot + $"doc/{SwaggerConfiguration.DocumentName}.json";
-
507 if (!String.IsNullOrWhiteSpace(controlPanelConfiguration.PublicPath))
-
508 siteDocPath = controlPanelConfiguration.PublicPath.TrimEnd('/') + siteDocPath;
-
509
-
510 applicationBuilder.UseSwagger(options =>
-
511 {
-
512 options.RouteTemplate = Routes.ApiRoot + "doc/{documentName}.{json|yaml}";
-
513 });
-
514 applicationBuilder.UseSwaggerUI(options =>
-
515 {
-
516 options.RoutePrefix = SwaggerConfiguration.DocumentationSiteRouteExtension;
-
517 options.SwaggerEndpoint(siteDocPath, "TGS API");
-
518 });
-
519 logger.LogTrace("Swagger API generation enabled");
-
520 }
-
521
-
522 // spa loading if necessary
-
523 if (controlPanelConfiguration.Enable)
-
524 {
-
525 logger.LogInformation("Web control panel enabled.");
-
526 applicationBuilder.UseFileServer(new FileServerOptions
-
527 {
-
528 RequestPath = ControlPanelController.ControlPanelRoute,
-
529 EnableDefaultFiles = true,
-
530 EnableDirectoryBrowsing = false,
-
531 RedirectToAppendTrailingSlash = false,
-
532 });
-
533 }
-
534 else
-
535#if NO_WEBPANEL
-
536 logger.LogDebug("Web control panel was not included in TGS build!");
-
537#else
-
538 logger.LogTrace("Web control panel disabled!");
-
539#endif
-
540
-
541 // Enable endpoint routing
-
542 applicationBuilder.UseRouting();
-
543
-
544 // Set up CORS based on configuration if necessary
-
545 Action<CorsPolicyBuilder>? corsBuilder = null;
-
546 if (controlPanelConfiguration.AllowAnyOrigin)
-
547 {
-
548 logger.LogTrace("Access-Control-Allow-Origin: *");
-
549 corsBuilder = builder => builder.SetIsOriginAllowed(_ => true);
-
550 }
-
551 else if (controlPanelConfiguration.AllowedOrigins?.Count > 0)
-
552 {
-
553 logger.LogTrace("Access-Control-Allow-Origin: {allowedOrigins}", String.Join(',', controlPanelConfiguration.AllowedOrigins));
-
554 corsBuilder = builder => builder.WithOrigins([.. controlPanelConfiguration.AllowedOrigins]);
-
555 }
-
556
-
557 var originalBuilder = corsBuilder;
-
558 corsBuilder = builder =>
-
559 {
-
560 builder
-
561 .AllowAnyHeader()
-
562 .AllowAnyMethod()
-
563 .AllowCredentials()
-
564 .SetPreflightMaxAge(TimeSpan.FromDays(1));
-
565 originalBuilder?.Invoke(builder);
-
566 };
-
567 applicationBuilder.UseCors(corsBuilder);
-
568
-
569 // validate the API version
-
570 applicationBuilder.UseApiCompatibility();
-
571
-
572 // authenticate JWT tokens using our security pipeline if present, returns 401 if bad
-
573 applicationBuilder.UseAuthentication();
-
574
-
575 // enable authorization on endpoints
-
576 applicationBuilder.UseAuthorization();
-
577
-
578 // suppress and log database exceptions
-
579 applicationBuilder.UseDbConflictHandling();
-
580
-
581 // setup endpoints
-
582 applicationBuilder.UseEndpoints(endpoints =>
-
583 {
-
584 // access to the signalR jobs hub
-
585 endpoints.MapHub<JobsHub>(
-
586 Routes.JobsHub,
-
587 options =>
-
588 {
-
589 options.Transports = HttpTransportType.ServerSentEvents;
-
590 options.CloseOnAuthenticationExpiration = true;
-
591 })
-
592 .RequireAuthorization()
-
593 .RequireCors(corsBuilder);
-
594
-
595 // majority of handling is done in the controllers
-
596 endpoints.MapControllers();
-
597 });
-
598
-
599 // 404 anything that gets this far
-
600 // End of request pipeline setup
-
601 logger.LogTrace("Configuration version: {configVersion}", GeneralConfiguration.CurrentConfigVersion);
-
602 logger.LogTrace("DMAPI Interop version: {interopVersion}", DMApiConstants.InteropVersion);
-
603 if (controlPanelConfiguration.Enable)
-
604 logger.LogTrace("Webpanel version: {webCPVersion}", MasterVersionsAttribute.Instance.RawWebpanelVersion);
-
605
-
606 logger.LogDebug("Starting hosting on port {httpApiPort}...", serverPortProvider.HttpApiPort);
-
607 }
-
608
-
610 protected override void ConfigureHostedService(IServiceCollection services)
-
611 => services.AddSingleton<IHostedService>(x => x.GetRequiredService<InstanceManager>());
-
612
-
617 void ConfigureAuthenticationPipeline(IServiceCollection services)
-
618 {
-
619 services.AddHttpContextAccessor();
-
620 services.AddScoped<IApiHeadersProvider, ApiHeadersProvider>();
-
621 services.AddScoped<AuthenticationContextFactory>();
-
622 services.AddScoped<IAuthenticationContextFactory>(provider => provider.GetRequiredService<AuthenticationContextFactory>());
-
623
-
624 // what if you
-
625 // wanted to just do this:
-
626 // return provider.GetRequiredService<AuthenticationContextFactory>().CurrentAuthenticationContext
-
627 // But M$ said
-
628 // https://stackoverflow.com/questions/56792917/scoped-services-in-asp-net-core-with-signalr-hubs
-
629 services.AddScoped(provider => (provider
-
630 .GetRequiredService<IHttpContextAccessor>()
-
631 .HttpContext ?? throw new InvalidOperationException($"Unable to resolve {nameof(IAuthenticationContext)} due to no HttpContext being available!"))
-
632 .RequestServices
-
633 .GetRequiredService<AuthenticationContextFactory>()
-
634 .CurrentAuthenticationContext);
-
635 services.AddScoped<IClaimsTransformation, AuthenticationContextClaimsTransformation>();
-
636
-
637 services
-
638 .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
-
639 .AddJwtBearer(jwtBearerOptions =>
-
640 {
-
641 // this line isn't actually run until the first request is made
-
642 // at that point tokenFactory will be populated
-
643 jwtBearerOptions.TokenValidationParameters = tokenFactory?.ValidationParameters ?? throw new InvalidOperationException("tokenFactory not initialized!");
-
644 jwtBearerOptions.MapInboundClaims = false;
-
645 jwtBearerOptions.Events = new JwtBearerEvents
-
646 {
-
647 OnMessageReceived = context =>
-
648 {
-
649 if (String.IsNullOrWhiteSpace(context.Token))
-
650 {
-
651 var accessToken = context.Request.Query["access_token"];
-
652 var path = context.HttpContext.Request.Path;
-
653
-
654 if (!String.IsNullOrWhiteSpace(accessToken) &&
-
655 path.StartsWithSegments(Routes.HubsRoot, StringComparison.OrdinalIgnoreCase))
-
656 {
-
657 context.Token = accessToken;
-
658 }
-
659 }
-
660
-
661 return Task.CompletedTask;
-
662 },
-
663 };
-
664 });
-
665 }
-
666 }
-
667}
+
368 // god help me if we need more
+
369 var openDreamRepositoryDirectory = ioManager.ConcatPath(
+
370 ioManager.GetPathInLocalDirectory(assemblyInformationProvider),
+
371 "OpenDreamRepository");
+
372 services.AddSingleton(
+
373 services => services
+
374 .GetRequiredService<IRepositoryManagerFactory>()
+
375 .CreateRepositoryManager(
+
376 new ResolvingIOManager(
+
377 services.GetRequiredService<IIOManager>(),
+
378 openDreamRepositoryDirectory),
+
379 new NoopEventConsumer()));
+
380
+
381 services.AddSingleton(
+
382 serviceProvider => new Dictionary<EngineType, IEngineInstaller>
+
383 {
+
384 { EngineType.Byond, serviceProvider.GetRequiredService<ByondInstallerBase>() },
+
385 { EngineType.OpenDream, serviceProvider.GetRequiredService<OpenDreamInstaller>() },
+
386 }
+
387 .ToFrozenDictionary());
+
388 services.AddSingleton<IEngineInstaller, DelegatingEngineInstaller>();
+
389
+
390 if (postSetupServices.InternalConfiguration.UsingSystemD)
+
391 services.AddHostedService<SystemDManager>();
+
392
+
393 // configure file transfer services
+
394 services.AddSingleton<FileTransferService>();
+
395 services.AddSingleton<IFileTransferStreamHandler>(x => x.GetRequiredService<FileTransferService>());
+
396 services.AddSingleton<IFileTransferTicketProvider>(x => x.GetRequiredService<FileTransferService>());
+
397 services.AddTransient<IActionResultExecutor<LimitedStreamResult>, LimitedStreamResultExecutor>();
+
398
+
399 // configure swarm service
+
400 services.AddSingleton<SwarmService>();
+
401 services.AddSingleton<ISwarmService>(x => x.GetRequiredService<SwarmService>());
+
402 services.AddSingleton<ISwarmOperations>(x => x.GetRequiredService<SwarmService>());
+
403 services.AddSingleton<ISwarmServiceController>(x => x.GetRequiredService<SwarmService>());
+
404
+
405 // configure component services
+
406 services.AddSingleton<IPortAllocator, PortAllocator>();
+
407 services.AddSingleton<IInstanceFactory, InstanceFactory>();
+
408 services.AddSingleton<IGitRemoteFeaturesFactory, GitRemoteFeaturesFactory>();
+
409 services.AddSingleton<ILibGit2RepositoryFactory, LibGit2RepositoryFactory>();
+
410 services.AddSingleton<ILibGit2Commands, LibGit2Commands>();
+
411 services.AddSingleton<IRepositoryManagerFactory, RepostoryManagerFactory>();
+
412 services.AddSingleton<IRemoteDeploymentManagerFactory, RemoteDeploymentManagerFactory>();
+
413 services.AddChatProviderFactory();
+
414 services.AddSingleton<IChatManagerFactory, ChatManagerFactory>();
+
415 services.AddSingleton<IServerUpdater, ServerUpdater>();
+
416 services.AddSingleton<IServerUpdateInitiator, ServerUpdateInitiator>();
+
417 services.AddSingleton<IDotnetDumpService, DotnetDumpService>();
+
418
+
419 // configure misc services
+
420 services.AddSingleton<IProcessExecutor, ProcessExecutor>();
+
421 services.AddSingleton<ISynchronousIOManager, SynchronousIOManager>();
+
422 services.AddSingleton<IServerPortProvider, ServerPortProivder>();
+
423 services.AddSingleton<ITopicClientFactory, TopicClientFactory>();
+
424 services.AddHostedService<CommandPipeManager>();
+
425
+
426 services.AddFileDownloader();
+
427 services.AddGitHub();
+
428
+
429 // configure root services
+
430 services.AddSingleton<JobService>();
+
431 services.AddSingleton<IJobService>(provider => provider.GetRequiredService<JobService>());
+
432 services.AddSingleton<IJobsHubUpdater>(provider => provider.GetRequiredService<JobService>());
+
433 services.AddSingleton<IJobManager>(x => x.GetRequiredService<IJobService>());
+
434 services.AddSingleton<JobsHubGroupMapper>();
+
435 services.AddSingleton<IPermissionsUpdateNotifyee>(provider => provider.GetRequiredService<JobsHubGroupMapper>());
+
436 services.AddSingleton<IHostedService>(x => x.GetRequiredService<JobsHubGroupMapper>()); // bit of a hack, but we need this to load immediated
+
437
+
438 services.AddSingleton<InstanceManager>();
+
439 services.AddSingleton<IBridgeDispatcher>(x => x.GetRequiredService<InstanceManager>());
+
440 services.AddSingleton<IInstanceManager>(x => x.GetRequiredService<InstanceManager>());
+
441 }
+
442
+
455 public void Configure(
+
456 IApplicationBuilder applicationBuilder,
+
457 IServerControl serverControl,
+
458 ITokenFactory tokenFactory,
+
459 IServerPortProvider serverPortProvider,
+
460 IAssemblyInformationProvider assemblyInformationProvider,
+
461 IOptions<ControlPanelConfiguration> controlPanelConfigurationOptions,
+
462 IOptions<GeneralConfiguration> generalConfigurationOptions,
+
463 IOptions<SwarmConfiguration> swarmConfigurationOptions,
+
464 ILogger<Application> logger)
+
465 {
+
466 ArgumentNullException.ThrowIfNull(applicationBuilder);
+
467 ArgumentNullException.ThrowIfNull(serverControl);
+
468
+
469 this.tokenFactory = tokenFactory ?? throw new ArgumentNullException(nameof(tokenFactory));
+
470
+
471 ArgumentNullException.ThrowIfNull(serverPortProvider);
+
472 ArgumentNullException.ThrowIfNull(assemblyInformationProvider);
+
473
+
474 var controlPanelConfiguration = controlPanelConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(controlPanelConfigurationOptions));
+
475 var generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
+
476 var swarmConfiguration = swarmConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(swarmConfigurationOptions));
+
477
+
478 ArgumentNullException.ThrowIfNull(logger);
+
479
+
480 logger.LogDebug("Content Root: {contentRoot}", hostingEnvironment.ContentRootPath);
+
481 logger.LogTrace("Web Root: {webRoot}", hostingEnvironment.WebRootPath);
+
482
+
483 // setup the HTTP request pipeline
+
484 // Add additional logging context to the request
+
485 applicationBuilder.UseAdditionalRequestLoggingContext(swarmConfiguration);
+
486
+
487 // Wrap exceptions in a 500 (ErrorMessage) response
+
488 applicationBuilder.UseServerErrorHandling();
+
489
+
490 // Add the X-Powered-By response header
+
491 applicationBuilder.UseServerBranding(assemblyInformationProvider);
+
492
+
493 // Add the X-Accel-Buffering response header
+
494 applicationBuilder.UseDisabledNginxProxyBuffering();
+
495
+
496 // suppress OperationCancelledExceptions, they are just aborted HTTP requests
+
497 applicationBuilder.UseCancelledRequestSuppression();
+
498
+
499 // 503 requests made while the application is starting
+
500 applicationBuilder.UseAsyncInitialization<IInstanceManager>(
+
501 (instanceManager, cancellationToken) => instanceManager.Ready.WaitAsync(cancellationToken));
+
502
+
503 if (generalConfiguration.HostApiDocumentation)
+
504 {
+
505 var siteDocPath = Routes.ApiRoot + $"doc/{SwaggerConfiguration.DocumentName}.json";
+
506 if (!String.IsNullOrWhiteSpace(controlPanelConfiguration.PublicPath))
+
507 siteDocPath = controlPanelConfiguration.PublicPath.TrimEnd('/') + siteDocPath;
+
508
+
509 applicationBuilder.UseSwagger(options =>
+
510 {
+
511 options.RouteTemplate = Routes.ApiRoot + "doc/{documentName}.{json|yaml}";
+
512 });
+
513 applicationBuilder.UseSwaggerUI(options =>
+
514 {
+
515 options.RoutePrefix = SwaggerConfiguration.DocumentationSiteRouteExtension;
+
516 options.SwaggerEndpoint(siteDocPath, "TGS API");
+
517 });
+
518 logger.LogTrace("Swagger API generation enabled");
+
519 }
+
520
+
521 // spa loading if necessary
+
522 if (controlPanelConfiguration.Enable)
+
523 {
+
524 logger.LogInformation("Web control panel enabled.");
+
525 applicationBuilder.UseFileServer(new FileServerOptions
+
526 {
+
527 RequestPath = ControlPanelController.ControlPanelRoute,
+
528 EnableDefaultFiles = true,
+
529 EnableDirectoryBrowsing = false,
+
530 RedirectToAppendTrailingSlash = false,
+
531 });
+
532 }
+
533 else
+
534#if NO_WEBPANEL
+
535 logger.LogDebug("Web control panel was not included in TGS build!");
+
536#else
+
537 logger.LogTrace("Web control panel disabled!");
+
538#endif
+
539
+
540 // Enable endpoint routing
+
541 applicationBuilder.UseRouting();
+
542
+
543 // Set up CORS based on configuration if necessary
+
544 Action<CorsPolicyBuilder>? corsBuilder = null;
+
545 if (controlPanelConfiguration.AllowAnyOrigin)
+
546 {
+
547 logger.LogTrace("Access-Control-Allow-Origin: *");
+
548 corsBuilder = builder => builder.SetIsOriginAllowed(_ => true);
+
549 }
+
550 else if (controlPanelConfiguration.AllowedOrigins?.Count > 0)
+
551 {
+
552 logger.LogTrace("Access-Control-Allow-Origin: {allowedOrigins}", String.Join(',', controlPanelConfiguration.AllowedOrigins));
+
553 corsBuilder = builder => builder.WithOrigins([.. controlPanelConfiguration.AllowedOrigins]);
+
554 }
+
555
+
556 var originalBuilder = corsBuilder;
+
557 corsBuilder = builder =>
+
558 {
+
559 builder
+
560 .AllowAnyHeader()
+
561 .AllowAnyMethod()
+
562 .AllowCredentials()
+
563 .SetPreflightMaxAge(TimeSpan.FromDays(1));
+
564 originalBuilder?.Invoke(builder);
+
565 };
+
566 applicationBuilder.UseCors(corsBuilder);
+
567
+
568 // validate the API version
+
569 applicationBuilder.UseApiCompatibility();
+
570
+
571 // authenticate JWT tokens using our security pipeline if present, returns 401 if bad
+
572 applicationBuilder.UseAuthentication();
+
573
+
574 // enable authorization on endpoints
+
575 applicationBuilder.UseAuthorization();
+
576
+
577 // suppress and log database exceptions
+
578 applicationBuilder.UseDbConflictHandling();
+
579
+
580 // setup endpoints
+
581 applicationBuilder.UseEndpoints(endpoints =>
+
582 {
+
583 // access to the signalR jobs hub
+
584 endpoints.MapHub<JobsHub>(
+
585 Routes.JobsHub,
+
586 options =>
+
587 {
+
588 options.Transports = HttpTransportType.ServerSentEvents;
+
589 options.CloseOnAuthenticationExpiration = true;
+
590 })
+
591 .RequireAuthorization()
+
592 .RequireCors(corsBuilder);
+
593
+
594 // majority of handling is done in the controllers
+
595 endpoints.MapControllers();
+
596 });
+
597
+
598 // 404 anything that gets this far
+
599 // End of request pipeline setup
+
600 logger.LogTrace("Configuration version: {configVersion}", GeneralConfiguration.CurrentConfigVersion);
+
601 logger.LogTrace("DMAPI Interop version: {interopVersion}", DMApiConstants.InteropVersion);
+
602 if (controlPanelConfiguration.Enable)
+
603 logger.LogTrace("Webpanel version: {webCPVersion}", MasterVersionsAttribute.Instance.RawWebpanelVersion);
+
604
+
605 logger.LogDebug("Starting hosting on port {httpApiPort}...", serverPortProvider.HttpApiPort);
+
606 }
+
607
+
609 protected override void ConfigureHostedService(IServiceCollection services)
+
610 => services.AddSingleton<IHostedService>(x => x.GetRequiredService<InstanceManager>());
+
611
+
616 void ConfigureAuthenticationPipeline(IServiceCollection services)
+
617 {
+
618 services.AddHttpContextAccessor();
+
619 services.AddScoped<IApiHeadersProvider, ApiHeadersProvider>();
+
620 services.AddScoped<AuthenticationContextFactory>();
+
621 services.AddScoped<IAuthenticationContextFactory>(provider => provider.GetRequiredService<AuthenticationContextFactory>());
+
622
+
623 // what if you
+
624 // wanted to just do this:
+
625 // return provider.GetRequiredService<AuthenticationContextFactory>().CurrentAuthenticationContext
+
626 // But M$ said
+
627 // https://stackoverflow.com/questions/56792917/scoped-services-in-asp-net-core-with-signalr-hubs
+
628 services.AddScoped(provider => (provider
+
629 .GetRequiredService<IHttpContextAccessor>()
+
630 .HttpContext ?? throw new InvalidOperationException($"Unable to resolve {nameof(IAuthenticationContext)} due to no HttpContext being available!"))
+
631 .RequestServices
+
632 .GetRequiredService<AuthenticationContextFactory>()
+
633 .CurrentAuthenticationContext);
+
634 services.AddScoped<IClaimsTransformation, AuthenticationContextClaimsTransformation>();
+
635
+
636 services
+
637 .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
+
638 .AddJwtBearer(jwtBearerOptions =>
+
639 {
+
640 // this line isn't actually run until the first request is made
+
641 // at that point tokenFactory will be populated
+
642 jwtBearerOptions.TokenValidationParameters = tokenFactory?.ValidationParameters ?? throw new InvalidOperationException("tokenFactory not initialized!");
+
643 jwtBearerOptions.MapInboundClaims = false;
+
644 jwtBearerOptions.Events = new JwtBearerEvents
+
645 {
+
646 OnMessageReceived = context =>
+
647 {
+
648 if (String.IsNullOrWhiteSpace(context.Token))
+
649 {
+
650 var accessToken = context.Request.Query["access_token"];
+
651 var path = context.HttpContext.Request.Path;
+
652
+
653 if (!String.IsNullOrWhiteSpace(accessToken) &&
+
654 path.StartsWithSegments(Routes.HubsRoot, StringComparison.OrdinalIgnoreCase))
+
655 {
+
656 context.Token = accessToken;
+
657 }
+
658 }
+
659
+
660 return Task.CompletedTask;
+
661 },
+
662 };
+
663 });
+
664 }
+
665 }
+
666}
IActionResultExecutor
IClaimsTransformation
IHostedService
@@ -707,7 +706,7 @@ $(function() {
Tgstation.Server.Host.Components.Deployment.Remote.RemoteDeploymentManagerFactory
Definition: RemoteDeploymentManagerFactory.cs:16
Tgstation.Server.Host.Components.Engine.ByondInstallerBase
Base implementation of IEngineInstaller for EngineType.Byond.
Definition: ByondInstallerBase.cs:20
Tgstation.Server.Host.Components.Engine.DelegatingEngineInstaller
Implementation of IEngineInstaller that forwards calls to different IEngineInstaller based on their a...
Definition: DelegatingEngineInstaller.cs:16
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller
Implementation of IEngineInstaller for EngineType.OpenDream.
Definition: OpenDreamInstaller.cs:26
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller
Implementation of IEngineInstaller for EngineType.OpenDream.
Definition: OpenDreamInstaller.cs:25
Tgstation.Server.Host.Components.Engine.PosixByondInstaller
IEngineInstaller for Posix systems.
Definition: PosixByondInstaller.cs:19
Tgstation.Server.Host.Components.Engine.WindowsByondInstaller
IEngineInstaller for windows systems.
Definition: WindowsByondInstaller.cs:24
Tgstation.Server.Host.Components.Engine.WindowsOpenDreamInstaller
Implementation of OpenDreamInstaller for Windows systems.
Definition: WindowsOpenDreamInstaller.cs:24
@@ -744,9 +743,9 @@ $(function() {
Tgstation.Server.Host.Core.Application.AddWatchdog< TSystemWatchdogFactory >
static void AddWatchdog< TSystemWatchdogFactory >(IServiceCollection services, IPostSetupServices postSetupServices)
Adds the IWatchdogFactory implementation.
Definition: Application.cs:102
Tgstation.Server.Host.Core.Application.ConfigureServices
void ConfigureServices(IServiceCollection services, IAssemblyInformationProvider assemblyInformationProvider, IIOManager ioManager, IPostSetupServices postSetupServices)
Configure the Application's services .
Definition: Application.cs:131
Tgstation.Server.Host.Core.Application.CreateDefaultServerFactory
static IServerFactory CreateDefaultServerFactory()
Create the default IServerFactory.
Definition: Application.cs:87
-
Tgstation.Server.Host.Core.Application.ConfigureAuthenticationPipeline
void ConfigureAuthenticationPipeline(IServiceCollection services)
Configure the services for the authentication pipeline.
Definition: Application.cs:617
+
Tgstation.Server.Host.Core.Application.ConfigureAuthenticationPipeline
void ConfigureAuthenticationPipeline(IServiceCollection services)
Configure the services for the authentication pipeline.
Definition: Application.cs:616
Tgstation.Server.Host.Core.Application.tokenFactory
ITokenFactory? tokenFactory
The ITokenFactory for the Application.
Definition: Application.cs:81
-
Tgstation.Server.Host.Core.Application.Configure
void Configure(IApplicationBuilder applicationBuilder, IServerControl serverControl, ITokenFactory tokenFactory, IServerPortProvider serverPortProvider, IAssemblyInformationProvider assemblyInformationProvider, IOptions< ControlPanelConfiguration > controlPanelConfigurationOptions, IOptions< GeneralConfiguration > generalConfigurationOptions, IOptions< SwarmConfiguration > swarmConfigurationOptions, ILogger< Application > logger)
Configure the Application.
Definition: Application.cs:456
+
Tgstation.Server.Host.Core.Application.Configure
void Configure(IApplicationBuilder applicationBuilder, IServerControl serverControl, ITokenFactory tokenFactory, IServerPortProvider serverPortProvider, IAssemblyInformationProvider assemblyInformationProvider, IOptions< ControlPanelConfiguration > controlPanelConfigurationOptions, IOptions< GeneralConfiguration > generalConfigurationOptions, IOptions< SwarmConfiguration > swarmConfigurationOptions, ILogger< Application > logger)
Configure the Application.
Definition: Application.cs:455
Tgstation.Server.Host.Core.Application.Application
Application(IConfiguration configuration, IWebHostEnvironment hostingEnvironment)
Initializes a new instance of the Application class.
Definition: Application.cs:116
Tgstation.Server.Host.Core.Application.hostingEnvironment
readonly IWebHostEnvironment hostingEnvironment
The IWebHostEnvironment for the Application.
Definition: Application.cs:76
Tgstation.Server.Host.Core.CommandPipeManager
Reads from the command pipe opened by the host watchdog.
Definition: CommandPipeManager.cs:22
@@ -784,6 +783,7 @@ $(function() {
Tgstation.Server.Host.Setup.SetupApplication.Configuration
IConfiguration Configuration
The IConfiguration for the SetupApplication.
Definition: SetupApplication.cs:25
Tgstation.Server.Host.Swarm.SwarmService
Helps keep servers connected to the same database in sync by coordinating updates.
Definition: SwarmService.cs:36
Tgstation.Server.Host.System.AssemblyInformationProvider
Definition: AssemblyInformationProvider.cs:12
+
Tgstation.Server.Host.System.DotnetDumpService
Definition: DotnetDumpService.cs:12
Tgstation.Server.Host.System.PosixNetworkPromptReaper
Definition: PosixNetworkPromptReaper.cs:5
Tgstation.Server.Host.System.PosixProcessFeatures
Definition: PosixProcessFeatures.cs:17
Tgstation.Server.Host.System.PosixSignalHandler
Handles POSIX signals.
Definition: PosixSignalHandler.cs:19
@@ -853,7 +853,7 @@ $(function() {
Tgstation.Server.Host.Swarm.ISwarmServiceController
Start and stop controllers for a swarm service.
Definition: ISwarmServiceController.cs:10
Tgstation.Server.Host.Swarm.ISwarmService
Used for swarm operations. Functions may be no-op based on configuration.
Definition: ISwarmService.cs:15
Tgstation.Server.Host.System.IAssemblyInformationProvider
For retrieving the Assembly's location.
Definition: IAssemblyInformationProvider.cs:11
-
Tgstation.Server.Host.System.IAssemblyInformationProvider.VersionPrefix
string VersionPrefix
Prefix to VersionString.
Definition: IAssemblyInformationProvider.cs:25
+
Tgstation.Server.Host.System.IDotnetDumpService
Service for managing the dotnet-dump installation.
Definition: IDotnetDumpService.cs:10
Tgstation.Server.Host.System.INetworkPromptReaper
On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort()....
Definition: INetworkPromptReaper.cs:7
Tgstation.Server.Host.System.IPlatformIdentifier.IsWindows
bool IsWindows
If the current platform is a Windows platform.
Definition: IPlatformIdentifier.cs:14
Tgstation.Server.Host.System.IProcessExecutor
For launching IProcess'.
Definition: IProcessExecutor.cs:9
diff --git a/_basic_watchdog_8cs_source.html b/_basic_watchdog_8cs_source.html index 19842487a9..1617067294 100644 --- a/_basic_watchdog_8cs_source.html +++ b/_basic_watchdog_8cs_source.html @@ -357,8 +357,8 @@ $(function() {
Tgstation.Server.Host.Components.Deployment.DmbFactory.LockNextDmb
IDmbProvider LockNextDmb(int lockCount)
Gets the next IDmbProvider. DmbAvailable is a precondition. A new IDmbProvider.
Definition: DmbFactory.cs:171
Tgstation.Server.Host.Components.Session.ReattachInformation
Parameters necessary for duplicating a ISessionController session.
Definition: ReattachInformation.cs:14
Tgstation.Server.Host.Components.Session.SessionControllerFactory
Definition: SessionControllerFactory.cs:33
-
Tgstation.Server.Host.Components.Session.SessionControllerFactory.LaunchNew
async ValueTask< ISessionController > LaunchNew(IDmbProvider dmbProvider, IEngineExecutableLock? currentByondLock, DreamDaemonLaunchParameters launchParameters, bool apiValidate, CancellationToken cancellationToken)
Create a ISessionController from a freshly launch DreamDaemon instance. A ValueTask<TResult> resultin...
Definition: SessionControllerFactory.cs:226
-
Tgstation.Server.Host.Components.Session.SessionControllerFactory.Reattach
async ValueTask< ISessionController?> Reattach(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Create a ISessionController from an existing DreamDaemon instance. A ValueTask<TResult> resulting in ...
Definition: SessionControllerFactory.cs:388
+
Tgstation.Server.Host.Components.Session.SessionControllerFactory.LaunchNew
async ValueTask< ISessionController > LaunchNew(IDmbProvider dmbProvider, IEngineExecutableLock? currentByondLock, DreamDaemonLaunchParameters launchParameters, bool apiValidate, CancellationToken cancellationToken)
Create a ISessionController from a freshly launch DreamDaemon instance. A ValueTask<TResult> resultin...
Definition: SessionControllerFactory.cs:234
+
Tgstation.Server.Host.Components.Session.SessionControllerFactory.Reattach
async ValueTask< ISessionController?> Reattach(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Create a ISessionController from an existing DreamDaemon instance. A ValueTask<TResult> resulting in ...
Definition: SessionControllerFactory.cs:397
Tgstation.Server.Host.Components.Session.SessionPersistor
Definition: SessionPersistor.cs:20
Tgstation.Server.Host.Components.Session.SessionPersistor.Update
ValueTask Update(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Update some reattachInformation . A ValueTask representing the running operation.
Tgstation.Server.Host.Components.Session.SessionPersistor.Save
ValueTask Save(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Save some reattachInformation . A ValueTask representing the running operation.
diff --git a/_byond_installation_8cs_source.html b/_byond_installation_8cs_source.html index 54c7039f01..4a5046bf89 100644 --- a/_byond_installation_8cs_source.html +++ b/_byond_installation_8cs_source.html @@ -103,95 +103,97 @@ $(function() {
32
34 public override bool PreferFileLogging => false;
35
-
37 public override Task InstallationTask { get; }
+
37 public override bool UseDotnetDump => false;
38
-
42 readonly bool supportsMapThreads;
-
43
-
49 static string SecurityWord(DreamDaemonSecurity securityLevel)
-
50 {
-
51 return securityLevel switch
-
52 {
-
53 DreamDaemonSecurity.Safe => "safe",
-
54 DreamDaemonSecurity.Trusted => "trusted",
-
55 DreamDaemonSecurity.Ultrasafe => "ultrasafe",
-
56 _ => throw new ArgumentOutOfRangeException(nameof(securityLevel), securityLevel, String.Format(CultureInfo.InvariantCulture, "Bad DreamDaemon security level: {0}", securityLevel)),
-
57 };
-
58 }
-
59
-
65 static string VisibilityWord(DreamDaemonVisibility visibility)
-
66 {
-
67 return visibility switch
-
68 {
-
69 DreamDaemonVisibility.Public => "public",
-
70 DreamDaemonVisibility.Private => "private",
-
71 DreamDaemonVisibility.Invisible => "invisible",
-
72 _ => throw new ArgumentOutOfRangeException(nameof(visibility), visibility, String.Format(CultureInfo.InvariantCulture, "Bad DreamDaemon visibility level: {0}", visibility)),
-
73 };
-
74 }
-
75
-
86 public ByondInstallation(
-
87 IIOManager installationIOManager,
-
88 Task installationTask,
-
89 EngineVersion version,
-
90 string dreamDaemonPath,
-
91 string dreamMakerPath,
-
92 bool supportsCli,
-
93 bool supportsMapThreads)
-
94 : base(installationIOManager)
-
95 {
-
96 InstallationTask = installationTask ?? throw new ArgumentNullException(nameof(installationTask));
-
97 ArgumentNullException.ThrowIfNull(version);
-
98
-
99 if (version.Engine != EngineType.Byond)
-
100 throw new ArgumentException($"Invalid EngineType: {version.Engine}", nameof(version));
+
40 public override Task InstallationTask { get; }
+
41
+
45 readonly bool supportsMapThreads;
+
46
+
52 static string SecurityWord(DreamDaemonSecurity securityLevel)
+
53 {
+
54 return securityLevel switch
+
55 {
+
56 DreamDaemonSecurity.Safe => "safe",
+
57 DreamDaemonSecurity.Trusted => "trusted",
+
58 DreamDaemonSecurity.Ultrasafe => "ultrasafe",
+
59 _ => throw new ArgumentOutOfRangeException(nameof(securityLevel), securityLevel, String.Format(CultureInfo.InvariantCulture, "Bad DreamDaemon security level: {0}", securityLevel)),
+
60 };
+
61 }
+
62
+
68 static string VisibilityWord(DreamDaemonVisibility visibility)
+
69 {
+
70 return visibility switch
+
71 {
+
72 DreamDaemonVisibility.Public => "public",
+
73 DreamDaemonVisibility.Private => "private",
+
74 DreamDaemonVisibility.Invisible => "invisible",
+
75 _ => throw new ArgumentOutOfRangeException(nameof(visibility), visibility, String.Format(CultureInfo.InvariantCulture, "Bad DreamDaemon visibility level: {0}", visibility)),
+
76 };
+
77 }
+
78
+
89 public ByondInstallation(
+
90 IIOManager installationIOManager,
+
91 Task installationTask,
+
92 EngineVersion version,
+
93 string dreamDaemonPath,
+
94 string dreamMakerPath,
+
95 bool supportsCli,
+
96 bool supportsMapThreads)
+
97 : base(installationIOManager)
+
98 {
+
99 InstallationTask = installationTask ?? throw new ArgumentNullException(nameof(installationTask));
+
100 ArgumentNullException.ThrowIfNull(version);
101
-
102 Version = version ?? throw new ArgumentNullException(nameof(version));
-
103 ServerExePath = dreamDaemonPath ?? throw new ArgumentNullException(nameof(dreamDaemonPath));
-
104 CompilerExePath = dreamMakerPath ?? throw new ArgumentNullException(nameof(dreamMakerPath));
-
105 HasStandardOutput = supportsCli;
-
106 PromptsForNetworkAccess = !supportsCli;
-
107 this.supportsMapThreads = supportsMapThreads;
-
108 }
-
109
-
111 public override string FormatServerArguments(
-
112 IDmbProvider dmbProvider,
-
113 IReadOnlyDictionary<string, string> parameters,
-
114 DreamDaemonLaunchParameters launchParameters,
-
115 string? logFilePath)
-
116 {
-
117 ArgumentNullException.ThrowIfNull(dmbProvider);
-
118 ArgumentNullException.ThrowIfNull(parameters);
-
119 ArgumentNullException.ThrowIfNull(launchParameters);
-
120
-
121 var parametersString = EncodeParameters(parameters, launchParameters);
-
122
-
123 var arguments = String.Format(
-
124 CultureInfo.InvariantCulture,
-
125 "\"{0}\" -port {1} -ports 1-65535 {2}-close -verbose -{3} -{4}{5}{6}{7} -params \"{8}\"",
-
126 dmbProvider.DmbName,
-
127 launchParameters.Port!.Value,
-
128 launchParameters.AllowWebClient!.Value
-
129 ? "-webclient "
-
130 : String.Empty,
-
131 SecurityWord(launchParameters.SecurityLevel!.Value),
-
132 VisibilityWord(launchParameters.Visibility!.Value),
-
133 logFilePath != null
-
134 ? $" -logself -log {logFilePath}"
-
135 : String.Empty, // DD doesn't output anything if -logself is set???
-
136 launchParameters.StartProfiler!.Value
-
137 ? " -profile"
-
138 : String.Empty,
-
139 supportsMapThreads && launchParameters.MapThreads!.Value != 0
-
140 ? $" -map-threads {launchParameters.MapThreads.Value}"
+
102 if (version.Engine != EngineType.Byond)
+
103 throw new ArgumentException($"Invalid EngineType: {version.Engine}", nameof(version));
+
104
+
105 Version = version ?? throw new ArgumentNullException(nameof(version));
+
106 ServerExePath = dreamDaemonPath ?? throw new ArgumentNullException(nameof(dreamDaemonPath));
+
107 CompilerExePath = dreamMakerPath ?? throw new ArgumentNullException(nameof(dreamMakerPath));
+
108 HasStandardOutput = supportsCli;
+
109 PromptsForNetworkAccess = !supportsCli;
+
110 this.supportsMapThreads = supportsMapThreads;
+
111 }
+
112
+
114 public override string FormatServerArguments(
+
115 IDmbProvider dmbProvider,
+
116 IReadOnlyDictionary<string, string> parameters,
+
117 DreamDaemonLaunchParameters launchParameters,
+
118 string? logFilePath)
+
119 {
+
120 ArgumentNullException.ThrowIfNull(dmbProvider);
+
121 ArgumentNullException.ThrowIfNull(parameters);
+
122 ArgumentNullException.ThrowIfNull(launchParameters);
+
123
+
124 var parametersString = EncodeParameters(parameters, launchParameters);
+
125
+
126 var arguments = String.Format(
+
127 CultureInfo.InvariantCulture,
+
128 "\"{0}\" -port {1} -ports 1-65535 {2}-close -verbose -{3} -{4}{5}{6}{7} -params \"{8}\"",
+
129 dmbProvider.DmbName,
+
130 launchParameters.Port!.Value,
+
131 launchParameters.AllowWebClient!.Value
+
132 ? "-webclient "
+
133 : String.Empty,
+
134 SecurityWord(launchParameters.SecurityLevel!.Value),
+
135 VisibilityWord(launchParameters.Visibility!.Value),
+
136 logFilePath != null
+
137 ? $" -logself -log {logFilePath}"
+
138 : String.Empty, // DD doesn't output anything if -logself is set???
+
139 launchParameters.StartProfiler!.Value
+
140 ? " -profile"
141 : String.Empty,
-
142 parametersString);
-
143 return arguments;
-
144 }
-
145
-
147 public override string FormatCompilerArguments(string dmePath)
-
148 => $"-clean \"{dmePath ?? throw new ArgumentNullException(nameof(dmePath))}\"";
-
149 }
-
150}
+
142 supportsMapThreads && launchParameters.MapThreads!.Value != 0
+
143 ? $" -map-threads {launchParameters.MapThreads.Value}"
+
144 : String.Empty,
+
145 parametersString);
+
146 return arguments;
+
147 }
+
148
+
150 public override string FormatCompilerArguments(string dmePath)
+
151 => $"-clean \"{dmePath ?? throw new ArgumentNullException(nameof(dmePath))}\"";
+
152 }
+
153}
Tgstation.Server.Api.Models.EngineVersion
Information about an engine installation.
Definition: EngineVersion.cs:14
Tgstation.Server.Api.Models.EngineVersion.Engine
EngineType? Engine
The EngineType.
Definition: EngineVersion.cs:19
Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters
Launch settings for DreamDaemon.
Definition: DreamDaemonLaunchParameters.cs:10
@@ -202,21 +204,22 @@ $(function() {
Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.SecurityLevel
DreamDaemonSecurity? SecurityLevel
The DreamDaemonSecurity level of DreamDaemon. No-op for EngineType.OpenDream.
Definition: DreamDaemonLaunchParameters.cs:39
Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.MapThreads
uint? MapThreads
If DreamDaemon supports it, the value added as the -map-threads parameter. 0 uses the default BYOND v...
Definition: DreamDaemonLaunchParameters.cs:99
Tgstation.Server.Host.Components.Engine.ByondInstallation
Implementation of IEngineInstallation for EngineType.Byond.
Definition: ByondInstallation.cs:17
-
Tgstation.Server.Host.Components.Engine.ByondInstallation.supportsMapThreads
readonly bool supportsMapThreads
If map threads are supported by the Version.
Definition: ByondInstallation.cs:42
+
Tgstation.Server.Host.Components.Engine.ByondInstallation.supportsMapThreads
readonly bool supportsMapThreads
If map threads are supported by the Version.
Definition: ByondInstallation.cs:45
Tgstation.Server.Host.Components.Engine.ByondInstallation.PromptsForNetworkAccess
override bool PromptsForNetworkAccess
If ServerExePath may create network prompts.
Definition: ByondInstallation.cs:28
-
Tgstation.Server.Host.Components.Engine.ByondInstallation.VisibilityWord
static string VisibilityWord(DreamDaemonVisibility visibility)
Change a given visibility into the appropriate DreamDaemon command line word.
Definition: ByondInstallation.cs:65
-
Tgstation.Server.Host.Components.Engine.ByondInstallation.SecurityWord
static string SecurityWord(DreamDaemonSecurity securityLevel)
Change a given securityLevel into the appropriate DreamDaemon command line word.
Definition: ByondInstallation.cs:49
+
Tgstation.Server.Host.Components.Engine.ByondInstallation.VisibilityWord
static string VisibilityWord(DreamDaemonVisibility visibility)
Change a given visibility into the appropriate DreamDaemon command line word.
Definition: ByondInstallation.cs:68
+
Tgstation.Server.Host.Components.Engine.ByondInstallation.SecurityWord
static string SecurityWord(DreamDaemonSecurity securityLevel)
Change a given securityLevel into the appropriate DreamDaemon command line word.
Definition: ByondInstallation.cs:52
Tgstation.Server.Host.Components.Engine.ByondInstallation.ServerExePath
override string ServerExePath
The full path to the game server executable.
Definition: ByondInstallation.cs:22
-
Tgstation.Server.Host.Components.Engine.ByondInstallation.InstallationTask
override Task InstallationTask
The Task that completes when the BYOND version finished installing.
Definition: ByondInstallation.cs:37
-
Tgstation.Server.Host.Components.Engine.ByondInstallation.ByondInstallation
ByondInstallation(IIOManager installationIOManager, Task installationTask, EngineVersion version, string dreamDaemonPath, string dreamMakerPath, bool supportsCli, bool supportsMapThreads)
Initializes a new instance of the ByondInstallation class.
Definition: ByondInstallation.cs:86
-
Tgstation.Server.Host.Components.Engine.ByondInstallation.FormatServerArguments
override string FormatServerArguments(IDmbProvider dmbProvider, IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters, string? logFilePath)
Return the command line arguments for launching with given launchParameters . The formatted arguments...
Definition: ByondInstallation.cs:111
+
Tgstation.Server.Host.Components.Engine.ByondInstallation.InstallationTask
override Task InstallationTask
The Task that completes when the BYOND version finished installing.
Definition: ByondInstallation.cs:40
+
Tgstation.Server.Host.Components.Engine.ByondInstallation.UseDotnetDump
override bool UseDotnetDump
If dotnet-dump should be used to create process dumps for this installation.
Definition: ByondInstallation.cs:37
+
Tgstation.Server.Host.Components.Engine.ByondInstallation.ByondInstallation
ByondInstallation(IIOManager installationIOManager, Task installationTask, EngineVersion version, string dreamDaemonPath, string dreamMakerPath, bool supportsCli, bool supportsMapThreads)
Initializes a new instance of the ByondInstallation class.
Definition: ByondInstallation.cs:89
+
Tgstation.Server.Host.Components.Engine.ByondInstallation.FormatServerArguments
override string FormatServerArguments(IDmbProvider dmbProvider, IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters, string? logFilePath)
Return the command line arguments for launching with given launchParameters . The formatted arguments...
Definition: ByondInstallation.cs:114
Tgstation.Server.Host.Components.Engine.ByondInstallation.HasStandardOutput
override bool HasStandardOutput
If ServerExePath supports being run as a command-line application and outputs log information to be c...
Definition: ByondInstallation.cs:31
Tgstation.Server.Host.Components.Engine.ByondInstallation.Version
override EngineVersion Version
The EngineVersion of the IEngineInstallation.
Definition: ByondInstallation.cs:19
Tgstation.Server.Host.Components.Engine.ByondInstallation.FormatCompilerArguments
override string FormatCompilerArguments(string dmePath)
Return the command line arguments for compiling a given dmePath if compilation is necessary....
Tgstation.Server.Host.Components.Engine.ByondInstallation.PreferFileLogging
override bool PreferFileLogging
If HasStandardOutput is set, this indicates that the engine server has good file logging that should ...
Definition: ByondInstallation.cs:34
Tgstation.Server.Host.Components.Engine.ByondInstallation.CompilerExePath
override string CompilerExePath
The full path to the dm/DreamMaker executable.
Definition: ByondInstallation.cs:25
Tgstation.Server.Host.Components.Engine.EngineInstallationBase
Definition: EngineInstallationBase.cs:23
-
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.EncodeParameters
static string EncodeParameters(IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters)
Encode given parameters for passing as world.params on the command line.
Definition: EngineInstallationBase.cs:56
+
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.EncodeParameters
static string EncodeParameters(IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters)
Encode given parameters for passing as world.params on the command line.
Definition: EngineInstallationBase.cs:59
Tgstation.Server.Host.Components.Deployment.IDmbProvider
Provides absolute paths to the latest compiled .dmbs.
Definition: IDmbProvider.cs:11
Tgstation.Server.Host.Components.Deployment.IDmbProvider.DmbName
string DmbName
The file name of the .dmb.
Definition: IDmbProvider.cs:15
Tgstation.Server.Host.IO.IIOManager
Interface for using filesystems.
Definition: IIOManager.cs:13
diff --git a/_command_pipe_manager_8cs_source.html b/_command_pipe_manager_8cs_source.html index 04a9dde9e9..6a79172aea 100644 --- a/_command_pipe_manager_8cs_source.html +++ b/_command_pipe_manager_8cs_source.html @@ -218,7 +218,7 @@ $(function() {
Tgstation.Server.Host.Core.IServerControl
Represents a service that may take an updated Host assembly and run it, stopping the current assembly...
Definition: IServerControl.cs:10
Tgstation.Server.Host.Core.IServerControl.GracefulShutdown
ValueTask GracefulShutdown(bool detach)
Gracefully shutsdown the Host.
Tgstation.Server.Host.Core.IServerControl.Die
ValueTask Die(Exception? exception)
Kill the server with a fatal exception.
-
Tgstation.Server.Host.Common
Definition: DotnetHelper.cs:9
+
Tgstation.Server.Host.Common
Definition: DotnetHelper.cs:9
Tgstation.Server.Host.Components
Definition: ChannelMapping.cs:4
Tgstation.Server.Host.Configuration
Definition: ControlPanelConfiguration.cs:4
Tgstation.Server.Host.Core
Definition: Application.cs:66
diff --git a/_delegating_engine_installer_8cs_source.html b/_delegating_engine_installer_8cs_source.html index 47b57e0d0e..9ab46f0d80 100644 --- a/_delegating_engine_installer_8cs_source.html +++ b/_delegating_engine_installer_8cs_source.html @@ -106,8 +106,8 @@ $(function() {
40 public ValueTask<IEngineInstallationData> DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
41 => DelegateCall(version, installer => installer.DownloadVersion(version, jobProgressReporter, cancellationToken));
42
-
44 public ValueTask Install(EngineVersion version, string path, CancellationToken cancellationToken)
-
45 => DelegateCall(version, installer => installer.Install(version, path, cancellationToken));
+
44 public ValueTask Install(EngineVersion version, string path, bool deploymentPipelineProcesses, CancellationToken cancellationToken)
+
45 => DelegateCall(version, installer => installer.Install(version, path, deploymentPipelineProcesses, cancellationToken));
46
48 public ValueTask TrustDmbPath(EngineVersion version, string fullDmbPath, CancellationToken cancellationToken)
49 => DelegateCall(version, installer => installer.TrustDmbPath(version, fullDmbPath, cancellationToken));
@@ -129,7 +129,7 @@ $(function() {
Tgstation.Server.Host.Components.Engine.DelegatingEngineInstaller.DelegatingEngineInstaller
DelegatingEngineInstaller(FrozenDictionary< EngineType, IEngineInstaller > delegatedInstallers)
Initializes a new instance of the DelegatingEngineInstaller class.
Definition: DelegatingEngineInstaller.cs:26
Tgstation.Server.Host.Components.Engine.DelegatingEngineInstaller.DownloadVersion
ValueTask< IEngineInstallationData > DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
Download a given engine version . A ValueTask<TResult> resulting in the IEngineInstallationData for t...
Tgstation.Server.Host.Components.Engine.DelegatingEngineInstaller.DelegateCall< TReturn >
TReturn DelegateCall< TReturn >(EngineVersion version, Func< IEngineInstaller, TReturn > call)
Delegate a given call to its appropriate IEngineInstaller.
Definition: DelegatingEngineInstaller.cs:62
-
Tgstation.Server.Host.Components.Engine.DelegatingEngineInstaller.Install
ValueTask Install(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working. A ValueTask representing the running...
+
Tgstation.Server.Host.Components.Engine.DelegatingEngineInstaller.Install
ValueTask Install(EngineVersion version, string path, bool deploymentPipelineProcesses, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working. A ValueTask representing the running...
Tgstation.Server.Host.Components.Engine.DelegatingEngineInstaller.UpgradeInstallation
ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get upgrade a version installed by a previous version of TGS....
Tgstation.Server.Host.Components.Engine.DelegatingEngineInstaller.CleanCache
Task CleanCache(CancellationToken cancellationToken)
Attempts to cleans the engine's cache folder for the system. A Task representing the running operatio...
Tgstation.Server.Host.Components.Engine.DelegatingEngineInstaller.delegatedInstallers
readonly FrozenDictionary< EngineType, IEngineInstaller > delegatedInstallers
The FrozenDictionary<TKey, TValue> mapping EngineTypes to their appropriate IEngineInstaller.
Definition: DelegatingEngineInstaller.cs:20
diff --git a/_dotnet_dump_service_8cs.html b/_dotnet_dump_service_8cs.html new file mode 100644 index 0000000000..b87fce3cd3 --- /dev/null +++ b/_dotnet_dump_service_8cs.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/System/DotnetDumpService.cs File Reference + + + + + + + + + +
+
+ + + + + + +
+
tgstation-server 6.1.5 +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes | +Namespaces
+
DotnetDumpService.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.System.DotnetDumpService
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.System
 
+
+ + + + diff --git a/_dotnet_dump_service_8cs_source.html b/_dotnet_dump_service_8cs_source.html new file mode 100644 index 0000000000..b18486dd65 --- /dev/null +++ b/_dotnet_dump_service_8cs_source.html @@ -0,0 +1,133 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/System/DotnetDumpService.cs Source File + + + + + + + + + +
+
+ + + + + + +
+
tgstation-server 6.1.5 +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
DotnetDumpService.cs
+
+
+Go to the documentation of this file.
1using System;
+
2using System.Threading;
+
3using System.Threading.Tasks;
+
4
+
5using Microsoft.Diagnostics.NETCore.Client;
+
6using Microsoft.Extensions.Logging;
+
7
+ +
9{
+ +
12 {
+
16 readonly ILogger<DotnetDumpService> logger;
+
17
+ +
23 ILogger<DotnetDumpService> logger)
+
24 {
+
25 this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
+
26 }
+
27
+
29 public async ValueTask Dump(IProcess process, string outputFile, CancellationToken cancellationToken)
+
30 {
+
31 // need to use an extra timeout here because if the process is truly deadlocked. A cooperative dump will hang forever
+
32 using var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
+
33
+
34 const int TimeoutMinutes = 5;
+
35 cts.CancelAfter(TimeSpan.FromMinutes(TimeoutMinutes));
+
36 cts.Token.Register(() =>
+
37 {
+
38 if (!cancellationToken.IsCancellationRequested)
+
39 logger.LogError("dotnet-dump timed out after {minutes} minutes!", TimeoutMinutes);
+
40 });
+
41
+
42 var pid = process.Id;
+
43 logger.LogDebug("dotnet-dump requested for PID {pid}...", pid);
+
44 var client = new DiagnosticsClient(pid);
+
45 await client.WriteDumpAsync(DumpType.Full, outputFile, false, cts.Token);
+
46 }
+
47 }
+
48}
+ +
DotnetDumpService(ILogger< DotnetDumpService > logger)
Initializes a new instance of the DotnetDumpService class.
+
readonly ILogger< DotnetDumpService > logger
The ILogger for the DotnetDumpService.
+
async ValueTask Dump(IProcess process, string outputFile, CancellationToken cancellationToken)
Attempt to dump a given process . A ValueTask representing the running operation.
+
Service for managing the dotnet-dump installation.
+
Abstraction over a global::System.Diagnostics.Process.
Definition: IProcess.cs:11
+ + +
+ + + + diff --git a/_engine_executable_lock_8cs_source.html b/_engine_executable_lock_8cs_source.html index 9684ebe26a..624c1cccbb 100644 --- a/_engine_executable_lock_8cs_source.html +++ b/_engine_executable_lock_8cs_source.html @@ -107,33 +107,35 @@ $(function() {
35
37 public Task InstallationTask => Instance.InstallationTask;
38
-
40 public void DoNotDeleteThisSession() => DangerousDropReference();
+
40 public bool UseDotnetDump => Instance.UseDotnetDump;
41
-
43 public string FormatServerArguments(
-
44 IDmbProvider dmbProvider,
-
45 IReadOnlyDictionary<string, string> parameters,
-
46 DreamDaemonLaunchParameters launchParameters,
-
47 string? logFilePath)
-
48 => Instance.FormatServerArguments(
-
49 dmbProvider,
-
50 parameters,
-
51 launchParameters,
-
52 logFilePath);
-
53
-
55 public string FormatCompilerArguments(string dmePath) => Instance.FormatCompilerArguments(dmePath);
+
43 public void DoNotDeleteThisSession() => DangerousDropReference();
+
44
+
46 public string FormatServerArguments(
+
47 IDmbProvider dmbProvider,
+
48 IReadOnlyDictionary<string, string> parameters,
+
49 DreamDaemonLaunchParameters launchParameters,
+
50 string? logFilePath)
+
51 => Instance.FormatServerArguments(
+
52 dmbProvider,
+
53 parameters,
+
54 launchParameters,
+
55 logFilePath);
56
-
58 public ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
-
59 => Instance.StopServerProcess(
-
60 logger,
-
61 process,
-
62 accessIdentifier,
-
63 port,
-
64 cancellationToken);
-
65
-
67 public ValueTask<Dictionary<string, string>?> LoadEnv(ILogger logger, bool forCompiler, CancellationToken cancellationToken)
-
68 => Instance.LoadEnv(logger, forCompiler, cancellationToken);
-
69 }
-
70}
+
58 public string FormatCompilerArguments(string dmePath) => Instance.FormatCompilerArguments(dmePath);
+
59
+
61 public ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
+
62 => Instance.StopServerProcess(
+
63 logger,
+
64 process,
+
65 accessIdentifier,
+
66 port,
+
67 cancellationToken);
+
68
+
70 public ValueTask<Dictionary<string, string>?> LoadEnv(ILogger logger, bool forCompiler, CancellationToken cancellationToken)
+
71 => Instance.LoadEnv(logger, forCompiler, cancellationToken);
+
72 }
+
73}
Tgstation.Server.Api.Models.EngineVersion
Information about an engine installation.
Definition: EngineVersion.cs:14
Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters
Launch settings for DreamDaemon.
Definition: DreamDaemonLaunchParameters.cs:10
Tgstation.Server.Host.Components.Engine.EngineExecutableLock
Definition: EngineExecutableLock.cs:17
@@ -149,6 +151,7 @@ $(function() {
Tgstation.Server.Host.Components.Engine.EngineExecutableLock.InstallationTask
Task InstallationTask
The Task that completes when the BYOND version finished installing.
Definition: EngineExecutableLock.cs:37
Tgstation.Server.Host.Components.Engine.EngineExecutableLock.StopServerProcess
ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
Kills a given engine server process . A ValueTask representing the running operation.
Tgstation.Server.Host.Components.Engine.EngineExecutableLock.Version
EngineVersion Version
The EngineVersion of the IEngineInstallation.
Definition: EngineExecutableLock.cs:19
+
Tgstation.Server.Host.Components.Engine.EngineExecutableLock.UseDotnetDump
bool UseDotnetDump
If dotnet-dump should be used to create process dumps for this installation.
Definition: EngineExecutableLock.cs:40
Tgstation.Server.Host.Components.Instance
Definition: Instance.cs:29
Tgstation.Server.Host.Utils.ReferenceCounter
Class used for counting references with ReferenceCountingContainer<TWrapped, TReference>.
Definition: ReferenceCounter.cs:11
Tgstation.Server.Host.Utils.ReferenceCounter< IEngineInstallation >::DangerousDropReference
void DangerousDropReference()
Prevents the aquired reference from being dropped when Dispose is called.
Definition: ReferenceCounter.cs:82
diff --git a/_engine_installation_base_8cs_source.html b/_engine_installation_base_8cs_source.html index 653d9a53d9..56ea4d90aa 100644 --- a/_engine_installation_base_8cs_source.html +++ b/_engine_installation_base_8cs_source.html @@ -111,95 +111,98 @@ $(function() {
38
40 public abstract bool PromptsForNetworkAccess { get; }
41
-
43 public abstract Task InstallationTask { get; }
+
43 public abstract bool UseDotnetDump { get; }
44
-
48 protected IIOManager InstallationIOManager { get; }
-
49
-
56 protected static string EncodeParameters(
-
57 IReadOnlyDictionary<string, string> parameters,
-
58 DreamDaemonLaunchParameters launchParameters)
-
59 {
-
60 var parametersString = String.Join('&', parameters.Select(kvp => $"{HttpUtility.UrlEncode(kvp.Key)}={HttpUtility.UrlEncode(kvp.Value)}"));
-
61
-
62 if (!String.IsNullOrEmpty(launchParameters.AdditionalParameters))
-
63 parametersString = $"{parametersString}&{launchParameters.AdditionalParameters}";
+
46 public abstract Task InstallationTask { get; }
+
47
+
51 protected IIOManager InstallationIOManager { get; }
+
52
+
59 protected static string EncodeParameters(
+
60 IReadOnlyDictionary<string, string> parameters,
+
61 DreamDaemonLaunchParameters launchParameters)
+
62 {
+
63 var parametersString = String.Join('&', parameters.Select(kvp => $"{HttpUtility.UrlEncode(kvp.Key)}={HttpUtility.UrlEncode(kvp.Value)}"));
64
-
65 return parametersString;
-
66 }
+
65 if (!String.IsNullOrEmpty(launchParameters.AdditionalParameters))
+
66 parametersString = $"{parametersString}&{launchParameters.AdditionalParameters}";
67
-
72 public EngineInstallationBase(IIOManager installationIOManager)
-
73 {
-
74 InstallationIOManager = installationIOManager ?? throw new ArgumentNullException(nameof(installationIOManager));
-
75 }
-
76
-
78 public abstract string FormatCompilerArguments(string dmePath);
+
68 return parametersString;
+
69 }
+
70
+
75 public EngineInstallationBase(IIOManager installationIOManager)
+
76 {
+
77 InstallationIOManager = installationIOManager ?? throw new ArgumentNullException(nameof(installationIOManager));
+
78 }
79
-
81 public abstract string FormatServerArguments(
-
82 IDmbProvider dmbProvider,
-
83 IReadOnlyDictionary<string, string> parameters,
-
84 DreamDaemonLaunchParameters launchParameters,
-
85 string? logFilePath);
-
86
-
88 public virtual async ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
-
89 {
-
90 ArgumentNullException.ThrowIfNull(logger);
-
91 cancellationToken.ThrowIfCancellationRequested();
-
92 logger.LogTrace("Terminating engine server process...");
-
93 process.Terminate();
-
94 await process.Lifetime;
-
95 }
-
96
-
98 public async ValueTask<Dictionary<string, string>?> LoadEnv(ILogger logger, bool forCompiler, CancellationToken cancellationToken)
-
99 {
-
100 ArgumentNullException.ThrowIfNull(logger);
-
101
-
102 var envFile = forCompiler
-
103 ? "compiler.env"
-
104 : "server.env";
-
105
-
106 if (!await InstallationIOManager.FileExists(envFile, cancellationToken))
-
107 {
-
108 logger.LogTrace("No {envFile} present in engine installation {version}", envFile, Version);
-
109 return null;
-
110 }
-
111
-
112 logger.LogDebug("Loading {envFile} for engine installation {version}...", envFile, Version);
-
113
-
114 var fileBytes = await InstallationIOManager.ReadAllBytes(envFile, cancellationToken);
-
115 var fileContents = Encoding.UTF8.GetString(fileBytes);
-
116 var parser = new EnvParser();
-
117
-
118 try
-
119 {
-
120 var variables = parser.Parse(fileContents);
-
121
-
122 return variables.ToDictionary();
-
123 }
-
124 catch (Exception ex)
-
125 {
-
126 logger.LogWarning(ex, "Unable to parse {envFile}!", envFile);
-
127 return null;
-
128 }
-
129 }
-
130 }
-
131}
+
81 public abstract string FormatCompilerArguments(string dmePath);
+
82
+
84 public abstract string FormatServerArguments(
+
85 IDmbProvider dmbProvider,
+
86 IReadOnlyDictionary<string, string> parameters,
+
87 DreamDaemonLaunchParameters launchParameters,
+
88 string? logFilePath);
+
89
+
91 public virtual async ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
+
92 {
+
93 ArgumentNullException.ThrowIfNull(logger);
+
94 cancellationToken.ThrowIfCancellationRequested();
+
95 logger.LogTrace("Terminating engine server process...");
+
96 process.Terminate();
+
97 await process.Lifetime;
+
98 }
+
99
+
101 public async ValueTask<Dictionary<string, string>?> LoadEnv(ILogger logger, bool forCompiler, CancellationToken cancellationToken)
+
102 {
+
103 ArgumentNullException.ThrowIfNull(logger);
+
104
+
105 var envFile = forCompiler
+
106 ? "compiler.env"
+
107 : "server.env";
+
108
+
109 if (!await InstallationIOManager.FileExists(envFile, cancellationToken))
+
110 {
+
111 logger.LogTrace("No {envFile} present in engine installation {version}", envFile, Version);
+
112 return null;
+
113 }
+
114
+
115 logger.LogDebug("Loading {envFile} for engine installation {version}...", envFile, Version);
+
116
+
117 var fileBytes = await InstallationIOManager.ReadAllBytes(envFile, cancellationToken);
+
118 var fileContents = Encoding.UTF8.GetString(fileBytes);
+
119 var parser = new EnvParser();
+
120
+
121 try
+
122 {
+
123 var variables = parser.Parse(fileContents);
+
124
+
125 return variables.ToDictionary();
+
126 }
+
127 catch (Exception ex)
+
128 {
+
129 logger.LogWarning(ex, "Unable to parse {envFile}!", envFile);
+
130 return null;
+
131 }
+
132 }
+
133 }
+
134}
Exception
Tgstation.Server.Api.Models.EngineVersion
Information about an engine installation.
Definition: EngineVersion.cs:14
Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters
Launch settings for DreamDaemon.
Definition: DreamDaemonLaunchParameters.cs:10
Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.AdditionalParameters
string? AdditionalParameters
Parameters string for DreamDaemon.
Definition: DreamDaemonLaunchParameters.cs:85
Tgstation.Server.Host.Components.Engine.EngineInstallationBase
Definition: EngineInstallationBase.cs:23
-
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.EncodeParameters
static string EncodeParameters(IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters)
Encode given parameters for passing as world.params on the command line.
Definition: EngineInstallationBase.cs:56
+
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.EncodeParameters
static string EncodeParameters(IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters)
Encode given parameters for passing as world.params on the command line.
Definition: EngineInstallationBase.cs:59
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.FormatCompilerArguments
abstract string FormatCompilerArguments(string dmePath)
Return the command line arguments for compiling a given dmePath if compilation is necessary....
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.ServerExePath
abstract string ServerExePath
The full path to the game server executable.
Definition: EngineInstallationBase.cs:28
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.Version
abstract EngineVersion Version
The EngineVersion of the IEngineInstallation.
Definition: EngineInstallationBase.cs:25
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.HasStandardOutput
abstract bool HasStandardOutput
If ServerExePath supports being run as a command-line application and outputs log information to be c...
Definition: EngineInstallationBase.cs:34
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.CompilerExePath
abstract string CompilerExePath
The full path to the dm/DreamMaker executable.
Definition: EngineInstallationBase.cs:31
-
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.EngineInstallationBase
EngineInstallationBase(IIOManager installationIOManager)
Initializes a new instance of the EngineInstallationBase class.
Definition: EngineInstallationBase.cs:72
-
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.StopServerProcess
virtual async ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
Kills a given engine server process . A ValueTask representing the running operation.
Definition: EngineInstallationBase.cs:88
-
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.InstallationTask
abstract Task InstallationTask
The Task that completes when the BYOND version finished installing.
Definition: EngineInstallationBase.cs:43
-
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.LoadEnv
async ValueTask< Dictionary< string, string >?> LoadEnv(ILogger logger, bool forCompiler, CancellationToken cancellationToken)
Loads the environment settings for either the server or compiler. A ValueTask<TResult> resulting in t...
Definition: EngineInstallationBase.cs:98
+
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.UseDotnetDump
abstract bool UseDotnetDump
If dotnet-dump should be used to create process dumps for this installation.
Definition: EngineInstallationBase.cs:43
+
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.EngineInstallationBase
EngineInstallationBase(IIOManager installationIOManager)
Initializes a new instance of the EngineInstallationBase class.
Definition: EngineInstallationBase.cs:75
+
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.StopServerProcess
virtual async ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
Kills a given engine server process . A ValueTask representing the running operation.
Definition: EngineInstallationBase.cs:91
+
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.InstallationTask
abstract Task InstallationTask
The Task that completes when the BYOND version finished installing.
Definition: EngineInstallationBase.cs:46
+
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.LoadEnv
async ValueTask< Dictionary< string, string >?> LoadEnv(ILogger logger, bool forCompiler, CancellationToken cancellationToken)
Loads the environment settings for either the server or compiler. A ValueTask<TResult> resulting in t...
Definition: EngineInstallationBase.cs:101
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.PreferFileLogging
abstract bool PreferFileLogging
If HasStandardOutput is set, this indicates that the engine server has good file logging that should ...
Definition: EngineInstallationBase.cs:37
-
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.InstallationIOManager
IIOManager InstallationIOManager
The IIOManager pointing to the installation directory.
Definition: EngineInstallationBase.cs:48
+
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.InstallationIOManager
IIOManager InstallationIOManager
The IIOManager pointing to the installation directory.
Definition: EngineInstallationBase.cs:51
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.PromptsForNetworkAccess
abstract bool PromptsForNetworkAccess
If ServerExePath may create network prompts.
Definition: EngineInstallationBase.cs:40
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.FormatServerArguments
abstract string FormatServerArguments(IDmbProvider dmbProvider, IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters, string? logFilePath)
Return the command line arguments for launching with given launchParameters . The formatted arguments...
Tgstation.Server.Host.Components.Deployment.IDmbProvider
Provides absolute paths to the latest compiled .dmbs.
Definition: IDmbProvider.cs:11
diff --git a/_engine_installer_base_8cs_source.html b/_engine_installer_base_8cs_source.html index bac22f0940..4572d3a0b2 100644 --- a/_engine_installer_base_8cs_source.html +++ b/_engine_installer_base_8cs_source.html @@ -107,7 +107,7 @@ $(function() {
44
46 public abstract Task CleanCache(CancellationToken cancellationToken);
47
-
49 public abstract ValueTask Install(EngineVersion version, string path, CancellationToken cancellationToken);
+
49 public abstract ValueTask Install(EngineVersion version, string path, bool deploymentPipelineProcesses, CancellationToken cancellationToken);
50
52 public abstract ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken);
53
@@ -129,11 +129,11 @@ $(function() {
Tgstation.Server.Host.Components.Engine.EngineInstallerBase.TrustDmbPath
abstract ValueTask TrustDmbPath(EngineVersion version, string fullDmbPath, CancellationToken cancellationToken)
Add a given fullDmbPath to the trusted DMBs list in BYOND's config. A ValueTask representing the run...
Tgstation.Server.Host.Components.Engine.EngineInstallerBase.DownloadVersion
abstract ValueTask< IEngineInstallationData > DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
Download a given engine version . A ValueTask<TResult> resulting in the IEngineInstallationData for t...
Tgstation.Server.Host.Components.Engine.EngineInstallerBase.CleanCache
abstract Task CleanCache(CancellationToken cancellationToken)
Attempts to cleans the engine's cache folder for the system. A Task representing the running operatio...
-
Tgstation.Server.Host.Components.Engine.EngineInstallerBase.Install
abstract ValueTask Install(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working. A ValueTask representing the running...
Tgstation.Server.Host.Components.Engine.EngineInstallerBase.CheckVersionValidity
void CheckVersionValidity(EngineVersion version)
Check that a given version is of type EngineType.Byond.
Definition: EngineInstallerBase.cs:64
Tgstation.Server.Host.Components.Engine.EngineInstallerBase.CreateInstallation
abstract IEngineInstallation CreateInstallation(EngineVersion version, string path, Task installationTask)
Creates an IEngineInstallation for a given version . The IEngineInstallation.
Tgstation.Server.Host.Components.Engine.EngineInstallerBase.IOManager
IIOManager IOManager
Gets the IIOManager for the EngineInstallerBase.
Definition: EngineInstallerBase.cs:24
Tgstation.Server.Host.Components.Engine.EngineInstallerBase.EngineInstallerBase
EngineInstallerBase(IIOManager ioManager, ILogger< EngineInstallerBase > logger)
Initializes a new instance of the EngineInstallerBase class.
Definition: EngineInstallerBase.cs:36
+
Tgstation.Server.Host.Components.Engine.EngineInstallerBase.Install
abstract ValueTask Install(EngineVersion version, string path, bool deploymentPipelineProcesses, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working. A ValueTask representing the running...
Tgstation.Server.Host.Components.Engine.EngineInstallerBase.Logger
ILogger< EngineInstallerBase > Logger
Gets the ILogger for the EngineInstallerBase.
Definition: EngineInstallerBase.cs:29
Tgstation.Server.Host.Components.Engine.EngineInstallerBase.TargetEngineType
abstract EngineType TargetEngineType
The EngineType the installer supports.
Definition: EngineInstallerBase.cs:19
Tgstation.Server.Host.Components.Engine.EngineInstallerBase.UpgradeInstallation
abstract ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get upgrade a version installed by a previous version of TGS....
diff --git a/_engine_manager_8cs_source.html b/_engine_manager_8cs_source.html index e9d3616c33..ab60371bbe 100644 --- a/_engine_manager_8cs_source.html +++ b/_engine_manager_8cs_source.html @@ -460,154 +460,160 @@ $(function() {
438 installLock = installationContainer.AddReference();
439 }
440
-
441 try
-
442 {
-
443 if (installedOrInstalling)
-
444 {
-
445 if (progressReporter != null)
-
446 progressReporter.StageName = "Waiting for existing installation job...";
-
447
-
448 if (neededForLock && !installation.InstallationTask.IsCompleted)
-
449 logger.LogWarning("The required engine version ({version}) is not readily available! We will have to wait for it to install.", version);
-
450
-
451 await installation.InstallationTask.WaitAsync(cancellationToken);
-
452 return installLock;
-
453 }
-
454
-
455 // okay up to us to install it then
-
456 try
-
457 {
-
458 if (customVersionStream != null)
-
459 logger.LogInformation("Installing custom engine version as {version}...", version);
-
460 else if (neededForLock)
-
461 {
-
462 if (version.CustomIteration.HasValue)
-
463 throw new JobException(ErrorCode.EngineNonExistentCustomVersion);
-
464
-
465 logger.LogWarning("The required engine version ({version}) is not readily available! We will have to install it.", version);
-
466 }
-
467 else
-
468 logger.LogDebug("Requested engine version {version} not currently installed. Doing so now...", version);
-
469
-
470 if (progressReporter != null)
-
471 progressReporter.StageName = "Running event";
-
472
-
473 var versionString = version.ToString();
-
474 await eventConsumer.HandleEvent(EventType.EngineInstallStart, new List<string> { versionString }, false, cancellationToken);
-
475
-
476 await InstallVersionFiles(progressReporter, version, customVersionStream, cancellationToken);
-
477
-
478 ourTcs.SetResult();
-
479
-
480 await eventConsumer.HandleEvent(EventType.EngineInstallComplete, new List<string> { versionString }, false, cancellationToken);
-
481 }
-
482 catch (Exception ex)
-
483 {
-
484 if (ex is not OperationCanceledException)
-
485 await eventConsumer.HandleEvent(EventType.EngineInstallFail, new List<string> { ex.Message }, false, cancellationToken);
-
486
-
487 lock (installedVersions)
-
488 installedVersions.Remove(version);
-
489
-
490 ourTcs.SetException(ex);
-
491 throw;
-
492 }
-
493
-
494 return installLock;
-
495 }
-
496 catch
-
497 {
-
498 installLock.Dispose();
-
499 throw;
-
500 }
-
501 }
-
502
-
511 async ValueTask InstallVersionFiles(JobProgressReporter? progressReporter, EngineVersion version, Stream? customVersionStream, CancellationToken cancellationToken)
-
512 {
-
513 var installFullPath = ioManager.ResolvePath(version.ToString());
-
514 async ValueTask DirectoryCleanup()
-
515 {
-
516 await ioManager.DeleteDirectory(installFullPath, cancellationToken);
-
517 await ioManager.CreateDirectory(installFullPath, cancellationToken);
-
518 }
-
519
-
520 var directoryCleanupTask = DirectoryCleanup();
-
521 try
+
441 var deploymentPipelineProcesses = !neededForLock;
+
442 try
+
443 {
+
444 if (installedOrInstalling)
+
445 {
+
446 if (progressReporter != null)
+
447 progressReporter.StageName = "Waiting for existing installation job...";
+
448
+
449 if (neededForLock && !installation.InstallationTask.IsCompleted)
+
450 logger.LogWarning("The required engine version ({version}) is not readily available! We will have to wait for it to install.", version);
+
451
+
452 await installation.InstallationTask.WaitAsync(cancellationToken);
+
453 return installLock;
+
454 }
+
455
+
456 // okay up to us to install it then
+
457 try
+
458 {
+
459 if (customVersionStream != null)
+
460 logger.LogInformation("Installing custom engine version as {version}...", version);
+
461 else if (neededForLock)
+
462 {
+
463 if (version.CustomIteration.HasValue)
+
464 throw new JobException(ErrorCode.EngineNonExistentCustomVersion);
+
465
+
466 logger.LogWarning("The required engine version ({version}) is not readily available! We will have to install it.", version);
+
467 }
+
468 else
+
469 logger.LogDebug("Requested engine version {version} not currently installed. Doing so now...", version);
+
470
+
471 if (progressReporter != null)
+
472 progressReporter.StageName = "Running event";
+
473
+
474 var versionString = version.ToString();
+
475 await eventConsumer.HandleEvent(EventType.EngineInstallStart, new List<string> { versionString }, deploymentPipelineProcesses, cancellationToken);
+
476
+
477 await InstallVersionFiles(progressReporter, version, customVersionStream, deploymentPipelineProcesses, cancellationToken);
+
478
+
479 ourTcs.SetResult();
+
480
+
481 await eventConsumer.HandleEvent(EventType.EngineInstallComplete, new List<string> { versionString }, deploymentPipelineProcesses, cancellationToken);
+
482 }
+
483 catch (Exception ex)
+
484 {
+
485 if (ex is not OperationCanceledException)
+
486 await eventConsumer.HandleEvent(EventType.EngineInstallFail, new List<string> { ex.Message }, deploymentPipelineProcesses, cancellationToken);
+
487
+
488 lock (installedVersions)
+
489 installedVersions.Remove(version);
+
490
+
491 ourTcs.SetException(ex);
+
492 throw;
+
493 }
+
494
+
495 return installLock;
+
496 }
+
497 catch
+
498 {
+
499 installLock.Dispose();
+
500 throw;
+
501 }
+
502 }
+
503
+
513 async ValueTask InstallVersionFiles(
+
514 JobProgressReporter? progressReporter,
+
515 EngineVersion version,
+
516 Stream? customVersionStream,
+
517 bool deploymentPipelineProcesses,
+
518 CancellationToken cancellationToken)
+
519 {
+
520 var installFullPath = ioManager.ResolvePath(version.ToString());
+
521 async ValueTask DirectoryCleanup()
522 {
-
523 IEngineInstallationData engineInstallationData;
-
524 if (customVersionStream == null)
-
525 {
-
526 if (progressReporter != null)
-
527 progressReporter.StageName = "Downloading version";
-
528
-
529 engineInstallationData = await engineInstaller.DownloadVersion(version, progressReporter, cancellationToken);
-
530
-
531 progressReporter?.ReportProgress(null);
-
532 }
-
533 else
-
534#pragma warning disable CA2000 // Dispose objects before losing scope, false positive
-
535 engineInstallationData = new ZipStreamEngineInstallationData(
-
536 ioManager,
-
537 customVersionStream);
-
538#pragma warning restore CA2000 // Dispose objects before losing scope
-
539
-
540 await using (engineInstallationData)
-
541 {
-
542 if (progressReporter != null)
-
543 progressReporter.StageName = "Cleaning target directory";
-
544
-
545 await directoryCleanupTask;
+
523 await ioManager.DeleteDirectory(installFullPath, cancellationToken);
+
524 await ioManager.CreateDirectory(installFullPath, cancellationToken);
+
525 }
+
526
+
527 var directoryCleanupTask = DirectoryCleanup();
+
528 try
+
529 {
+
530 IEngineInstallationData engineInstallationData;
+
531 if (customVersionStream == null)
+
532 {
+
533 if (progressReporter != null)
+
534 progressReporter.StageName = "Downloading version";
+
535
+
536 engineInstallationData = await engineInstaller.DownloadVersion(version, progressReporter, cancellationToken);
+
537
+
538 progressReporter?.ReportProgress(null);
+
539 }
+
540 else
+
541#pragma warning disable CA2000 // Dispose objects before losing scope, false positive
+
542 engineInstallationData = new ZipStreamEngineInstallationData(
+
543 ioManager,
+
544 customVersionStream);
+
545#pragma warning restore CA2000 // Dispose objects before losing scope
546
-
547 if (progressReporter != null)
-
548 progressReporter.StageName = "Extracting data";
-
549
-
550 logger.LogTrace("Extracting engine to {extractPath}...", installFullPath);
-
551 await engineInstallationData.ExtractToPath(installFullPath, cancellationToken);
-
552 }
+
547 await using (engineInstallationData)
+
548 {
+
549 if (progressReporter != null)
+
550 progressReporter.StageName = "Cleaning target directory";
+
551
+
552 await directoryCleanupTask;
553
-
554 if (progressReporter != null)
-
555 progressReporter.StageName = "Running installation actions";
+
554 if (progressReporter != null)
+
555 progressReporter.StageName = "Extracting data";
556
-
557 await engineInstaller.Install(version, installFullPath, cancellationToken);
-
558
-
559 if (progressReporter != null)
-
560 progressReporter.StageName = "Writing version file";
-
561
-
562 // make sure to do this last because this is what tells us we have a valid version in the future
-
563 await ioManager.WriteAllBytes(
-
564 ioManager.ConcatPath(installFullPath, VersionFileName),
-
565 Encoding.UTF8.GetBytes(version.ToString()),
-
566 cancellationToken);
-
567 }
-
568 catch (HttpRequestException ex)
-
569 {
-
570 // since the user can easily provide non-exitent version numbers, we'll turn this into a JobException
-
571 throw new JobException(ErrorCode.EngineDownloadFail, ex);
-
572 }
-
573 catch (OperationCanceledException)
-
574 {
-
575 throw;
-
576 }
-
577 catch
-
578 {
-
579 await ioManager.DeleteDirectory(installFullPath, cancellationToken);
-
580 throw;
-
581 }
-
582 }
-
583
-
591 ReferenceCountingContainer<IEngineInstallation, EngineExecutableLock> AddInstallationContainer(EngineVersion version, string installPath, Task installationTask)
-
592 {
-
593 var installation = engineInstaller.CreateInstallation(version, installPath, installationTask);
-
594
-
595 var installationContainer = new ReferenceCountingContainer<IEngineInstallation, EngineExecutableLock>(installation);
-
596
-
597 lock (installedVersions)
-
598 installedVersions.Add(version, installationContainer);
-
599
-
600 return installationContainer;
-
601 }
-
602 }
-
603}
+
557 logger.LogTrace("Extracting engine to {extractPath}...", installFullPath);
+
558 await engineInstallationData.ExtractToPath(installFullPath, cancellationToken);
+
559 }
+
560
+
561 if (progressReporter != null)
+
562 progressReporter.StageName = "Running installation actions";
+
563
+
564 await engineInstaller.Install(version, installFullPath, deploymentPipelineProcesses, cancellationToken);
+
565
+
566 if (progressReporter != null)
+
567 progressReporter.StageName = "Writing version file";
+
568
+
569 // make sure to do this last because this is what tells us we have a valid version in the future
+
570 await ioManager.WriteAllBytes(
+
571 ioManager.ConcatPath(installFullPath, VersionFileName),
+
572 Encoding.UTF8.GetBytes(version.ToString()),
+
573 cancellationToken);
+
574 }
+
575 catch (HttpRequestException ex)
+
576 {
+
577 // since the user can easily provide non-exitent version numbers, we'll turn this into a JobException
+
578 throw new JobException(ErrorCode.EngineDownloadFail, ex);
+
579 }
+
580 catch (OperationCanceledException)
+
581 {
+
582 throw;
+
583 }
+
584 catch
+
585 {
+
586 await ioManager.DeleteDirectory(installFullPath, cancellationToken);
+
587 throw;
+
588 }
+
589 }
+
590
+
598 ReferenceCountingContainer<IEngineInstallation, EngineExecutableLock> AddInstallationContainer(EngineVersion version, string installPath, Task installationTask)
+
599 {
+
600 var installation = engineInstaller.CreateInstallation(version, installPath, installationTask);
+
601
+
602 var installationContainer = new ReferenceCountingContainer<IEngineInstallation, EngineExecutableLock>(installation);
+
603
+
604 lock (installedVersions)
+
605 installedVersions.Add(version, installationContainer);
+
606
+
607 return installationContainer;
+
608 }
+
609 }
+
610}
Exception
Stream
Tgstation.Server.Api.Models.EngineVersion
Information about an engine installation.
Definition: EngineVersion.cs:14
@@ -620,6 +626,7 @@ $(function() {
Tgstation.Server.Common.Extensions.ValueTaskExtensions.WhenAll
static async ValueTask WhenAll(IEnumerable< ValueTask > tasks)
Fully await a given list of tasks .
Definition: ValueTaskExtensions.cs:99
Tgstation.Server.Host.Components.Engine.EngineExecutableLock
Definition: EngineExecutableLock.cs:17
Tgstation.Server.Host.Components.Engine.EngineManager
Definition: EngineManager.cs:23
+
Tgstation.Server.Host.Components.Engine.EngineManager.InstallVersionFiles
async ValueTask InstallVersionFiles(JobProgressReporter? progressReporter, EngineVersion version, Stream? customVersionStream, bool deploymentPipelineProcesses, CancellationToken cancellationToken)
Installs the files for a given BYOND version .
Definition: EngineManager.cs:513
Tgstation.Server.Host.Components.Engine.EngineManager.CheckVersionParameter
static void CheckVersionParameter(EngineVersion version)
Validates a given version parameter.
Definition: EngineManager.cs:86
Tgstation.Server.Host.Components.Engine.EngineManager.installedVersions
readonly Dictionary< EngineVersion, ReferenceCountingContainer< IEngineInstallation, EngineExecutableLock > > installedVersions
Map of byond EngineVersions to Tasks that complete when they are installed.
Definition: EngineManager.cs:70
Tgstation.Server.Host.Components.Engine.EngineManager.StopAsync
Task StopAsync(CancellationToken cancellationToken)
@@ -638,9 +645,8 @@ $(function() {
Tgstation.Server.Host.Components.Engine.EngineManager.ioManager
readonly IIOManager ioManager
The IIOManager for the EngineManager.
Definition: EngineManager.cs:50
Tgstation.Server.Host.Components.Engine.EngineManager.engineInstaller
readonly IEngineInstaller engineInstaller
The IEngineInstaller for the EngineManager.
Definition: EngineManager.cs:55
Tgstation.Server.Host.Components.Engine.EngineManager.logger
readonly ILogger< EngineManager > logger
The ILogger for the EngineManager.
Definition: EngineManager.cs:65
-
Tgstation.Server.Host.Components.Engine.EngineManager.AddInstallationContainer
ReferenceCountingContainer< IEngineInstallation, EngineExecutableLock > AddInstallationContainer(EngineVersion version, string installPath, Task installationTask)
Create and add a new IEngineInstallation to installedVersions.
Definition: EngineManager.cs:591
+
Tgstation.Server.Host.Components.Engine.EngineManager.AddInstallationContainer
ReferenceCountingContainer< IEngineInstallation, EngineExecutableLock > AddInstallationContainer(EngineVersion version, string installPath, Task installationTask)
Create and add a new IEngineInstallation to installedVersions.
Definition: EngineManager.cs:598
Tgstation.Server.Host.Components.Engine.EngineManager.ChangeVersion
async ValueTask ChangeVersion(JobProgressReporter? progressReporter, EngineVersion version, Stream? customVersionStream, bool allowInstallation, CancellationToken cancellationToken)
Change the active EngineVersion. A ValueTask representing the running operation.
Definition: EngineManager.cs:120
-
Tgstation.Server.Host.Components.Engine.EngineManager.InstallVersionFiles
async ValueTask InstallVersionFiles(JobProgressReporter? progressReporter, EngineVersion version, Stream? customVersionStream, CancellationToken cancellationToken)
Installs the files for a given BYOND version .
Definition: EngineManager.cs:511
Tgstation.Server.Host.Components.Engine.EngineManager.Dispose
void Dispose()
Tgstation.Server.Host.Components.Engine.ZipStreamEngineInstallationData
Implementation of IEngineInstallationData for a zip file in a Stream.
Definition: ZipStreamEngineInstallationData.cs:14
Tgstation.Server.Host.IO.DefaultIOManager
IIOManager that resolves paths to Environment.CurrentDirectory.
Definition: DefaultIOManager.cs:17
@@ -658,12 +664,12 @@ $(function() {
Tgstation.Server.Host.Components.Engine.IEngineInstallationData
Wraps data containing an engine installation.
Definition: IEngineInstallationData.cs:11
Tgstation.Server.Host.Components.Engine.IEngineInstallationData.ExtractToPath
Task ExtractToPath(string path, CancellationToken cancellationToken)
Extracts the installation to a given path.
Tgstation.Server.Host.Components.Engine.IEngineInstallation
Represents a BYOND installation.
Definition: IEngineInstallation.cs:18
-
Tgstation.Server.Host.Components.Engine.IEngineInstallation.InstallationTask
Task InstallationTask
The Task that completes when the BYOND version finished installing.
Definition: IEngineInstallation.cs:52
+
Tgstation.Server.Host.Components.Engine.IEngineInstallation.InstallationTask
Task InstallationTask
The Task that completes when the BYOND version finished installing.
Definition: IEngineInstallation.cs:57
Tgstation.Server.Host.Components.Engine.IEngineInstaller
For downloading and installing game engines for a given system.
Definition: IEngineInstaller.cs:13
Tgstation.Server.Host.Components.Engine.IEngineInstaller.CreateInstallation
IEngineInstallation CreateInstallation(EngineVersion version, string path, Task installationTask)
Creates an IEngineInstallation for a given version .
Tgstation.Server.Host.Components.Engine.IEngineInstaller.UpgradeInstallation
ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get upgrade a version installed by a previous version of TGS.
Tgstation.Server.Host.Components.Engine.IEngineInstaller.DownloadVersion
ValueTask< IEngineInstallationData > DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
Download a given engine version .
-
Tgstation.Server.Host.Components.Engine.IEngineInstaller.Install
ValueTask Install(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working.
+
Tgstation.Server.Host.Components.Engine.IEngineInstaller.Install
ValueTask Install(EngineVersion version, string path, bool deploymentPipelineProcesses, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working.
Tgstation.Server.Host.Components.Engine.IEngineInstaller.TrustDmbPath
ValueTask TrustDmbPath(EngineVersion version, string fullDmbPath, CancellationToken cancellationToken)
Add a given fullDmbPath to the trusted DMBs list in BYOND's config.
Tgstation.Server.Host.Components.Engine.IEngineManager
For managing the engine installations.
Definition: IEngineManager.cs:17
Tgstation.Server.Host.Components.Events.IEventConsumer
Consumes EventTypes and takes the appropriate actions.
Definition: IEventConsumer.cs:11
diff --git a/_host_exit_code_8cs_source.html b/_host_exit_code_8cs_source.html index 538a05fb55..c405c83ddb 100644 --- a/_host_exit_code_8cs_source.html +++ b/_host_exit_code_8cs_source.html @@ -88,7 +88,7 @@ $(function() {
21 Error,
22 }
23}
-
Tgstation.Server.Host.Common
Definition: DotnetHelper.cs:9
+
Tgstation.Server.Host.Common
Definition: DotnetHelper.cs:9
Tgstation.Server.Host.Common.HostExitCode
HostExitCode
Represents the exit code of the Host program.
Definition: HostExitCode.cs:7
diff --git a/_i_dotnet_dump_service_8cs.html b/_i_dotnet_dump_service_8cs.html new file mode 100644 index 0000000000..eb8c56a963 --- /dev/null +++ b/_i_dotnet_dump_service_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/System/IDotnetDumpService.cs File Reference + + + + + + + + + +
+
+ + + + + + +
+
tgstation-server 6.1.5 +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes | +Namespaces
+
IDotnetDumpService.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.System.IDotnetDumpService
 Service for managing the dotnet-dump installation. More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.System
 
+
+ + + + diff --git a/_i_dotnet_dump_service_8cs_source.html b/_i_dotnet_dump_service_8cs_source.html new file mode 100644 index 0000000000..6706ab7181 --- /dev/null +++ b/_i_dotnet_dump_service_8cs_source.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/System/IDotnetDumpService.cs Source File + + + + + + + + + +
+
+ + + + + + +
+
tgstation-server 6.1.5 +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
IDotnetDumpService.cs
+
+
+Go to the documentation of this file.
1using System.Threading;
+
2using System.Threading.Tasks;
+
3
+ +
5{
+
9 public interface IDotnetDumpService
+
10 {
+
18 ValueTask Dump(IProcess process, string outputFile, CancellationToken cancellationToken);
+
19 }
+
20}
+
Service for managing the dotnet-dump installation.
+
ValueTask Dump(IProcess process, string outputFile, CancellationToken cancellationToken)
Attempt to dump a given process .
+
Abstraction over a global::System.Diagnostics.Process.
Definition: IProcess.cs:11
+ +
+ + + + diff --git a/_i_engine_installation_8cs_source.html b/_i_engine_installation_8cs_source.html index 1f0d40708f..c049662d5e 100644 --- a/_i_engine_installation_8cs_source.html +++ b/_i_engine_installation_8cs_source.html @@ -104,21 +104,23 @@ $(function() {
43
47 bool PreferFileLogging { get; }
48
-
52 Task InstallationTask { get; }
+
52 bool UseDotnetDump { get; }
53
-
62 string FormatServerArguments(
-
63 IDmbProvider dmbProvider,
-
64 IReadOnlyDictionary<string, string> parameters,
-
65 DreamDaemonLaunchParameters launchParameters,
-
66 string? logFilePath);
-
67
-
73 string FormatCompilerArguments(string dmePath);
-
74
-
84 ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken);
-
85
-
93 ValueTask<Dictionary<string, string>?> LoadEnv(ILogger logger, bool forCompiler, CancellationToken cancellationToken);
-
94 }
-
95}
+
57 Task InstallationTask { get; }
+
58
+
67 string FormatServerArguments(
+
68 IDmbProvider dmbProvider,
+
69 IReadOnlyDictionary<string, string> parameters,
+
70 DreamDaemonLaunchParameters launchParameters,
+
71 string? logFilePath);
+
72
+
78 string FormatCompilerArguments(string dmePath);
+
79
+
89 ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken);
+
90
+
98 ValueTask<Dictionary<string, string>?> LoadEnv(ILogger logger, bool forCompiler, CancellationToken cancellationToken);
+
99 }
+
100}
Tgstation.Server.Api.Models.EngineVersion
Information about an engine installation.
Definition: EngineVersion.cs:14
Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters
Launch settings for DreamDaemon.
Definition: DreamDaemonLaunchParameters.cs:10
Tgstation.Server.Host.Components.Deployment.IDmbProvider
Provides absolute paths to the latest compiled .dmbs.
Definition: IDmbProvider.cs:11
@@ -126,11 +128,12 @@ $(function() {
Tgstation.Server.Host.Components.Engine.IEngineInstallation.ServerExePath
string ServerExePath
The full path to the game server executable.
Definition: IEngineInstallation.cs:27
Tgstation.Server.Host.Components.Engine.IEngineInstallation.LoadEnv
ValueTask< Dictionary< string, string >?> LoadEnv(ILogger logger, bool forCompiler, CancellationToken cancellationToken)
Loads the environment settings for either the server or compiler.
Tgstation.Server.Host.Components.Engine.IEngineInstallation.PromptsForNetworkAccess
bool PromptsForNetworkAccess
If ServerExePath may create network prompts.
Definition: IEngineInstallation.cs:42
-
Tgstation.Server.Host.Components.Engine.IEngineInstallation.InstallationTask
Task InstallationTask
The Task that completes when the BYOND version finished installing.
Definition: IEngineInstallation.cs:52
+
Tgstation.Server.Host.Components.Engine.IEngineInstallation.InstallationTask
Task InstallationTask
The Task that completes when the BYOND version finished installing.
Definition: IEngineInstallation.cs:57
Tgstation.Server.Host.Components.Engine.IEngineInstallation.PreferFileLogging
bool PreferFileLogging
If HasStandardOutput is set, this indicates that the engine server has good file logging that should ...
Definition: IEngineInstallation.cs:47
Tgstation.Server.Host.Components.Engine.IEngineInstallation.FormatServerArguments
string FormatServerArguments(IDmbProvider dmbProvider, IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters, string? logFilePath)
Return the command line arguments for launching with given launchParameters .
Tgstation.Server.Host.Components.Engine.IEngineInstallation.FormatCompilerArguments
string FormatCompilerArguments(string dmePath)
Return the command line arguments for compiling a given dmePath if compilation is necessary.
Tgstation.Server.Host.Components.Engine.IEngineInstallation.Version
EngineVersion Version
The EngineVersion of the IEngineInstallation.
Definition: IEngineInstallation.cs:22
+
Tgstation.Server.Host.Components.Engine.IEngineInstallation.UseDotnetDump
bool UseDotnetDump
If dotnet-dump should be used to create process dumps for this installation.
Definition: IEngineInstallation.cs:52
Tgstation.Server.Host.Components.Engine.IEngineInstallation.StopServerProcess
ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
Kills a given engine server process .
Tgstation.Server.Host.Components.Engine.IEngineInstallation.CompilerExePath
string CompilerExePath
The full path to the dm/DreamMaker executable.
Definition: IEngineInstallation.cs:32
Tgstation.Server.Host.Components.Engine.IEngineInstallation.HasStandardOutput
bool HasStandardOutput
If ServerExePath supports being run as a command-line application and outputs log information to be c...
Definition: IEngineInstallation.cs:37
diff --git a/_i_engine_installer_8cs_source.html b/_i_engine_installer_8cs_source.html index c9eb919245..b03647c345 100644 --- a/_i_engine_installer_8cs_source.html +++ b/_i_engine_installer_8cs_source.html @@ -91,15 +91,15 @@ $(function() {
22
30 ValueTask<IEngineInstallationData> DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken);
31
-
39 ValueTask Install(EngineVersion version, string path, CancellationToken cancellationToken);
-
40
-
48 ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken);
-
49
-
57 ValueTask TrustDmbPath(EngineVersion version, string fullDmbPath, CancellationToken cancellationToken);
-
58
-
64 Task CleanCache(CancellationToken cancellationToken);
-
65 }
-
66}
+
40 ValueTask Install(EngineVersion version, string path, bool deploymentPipelineProcesses, CancellationToken cancellationToken);
+
41
+
49 ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken);
+
50
+
58 ValueTask TrustDmbPath(EngineVersion version, string fullDmbPath, CancellationToken cancellationToken);
+
59
+
65 Task CleanCache(CancellationToken cancellationToken);
+
66 }
+
67}
Tgstation.Server.Api.Models.EngineVersion
Information about an engine installation.
Definition: EngineVersion.cs:14
Tgstation.Server.Host.Jobs.JobProgressReporter
Progress reporter for a Job.
Definition: JobProgressReporter.cs:13
Tgstation.Server.Host.Components.Engine.IEngineInstallation
Represents a BYOND installation.
Definition: IEngineInstallation.cs:18
@@ -107,7 +107,7 @@ $(function() {
Tgstation.Server.Host.Components.Engine.IEngineInstaller.CreateInstallation
IEngineInstallation CreateInstallation(EngineVersion version, string path, Task installationTask)
Creates an IEngineInstallation for a given version .
Tgstation.Server.Host.Components.Engine.IEngineInstaller.UpgradeInstallation
ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get upgrade a version installed by a previous version of TGS.
Tgstation.Server.Host.Components.Engine.IEngineInstaller.DownloadVersion
ValueTask< IEngineInstallationData > DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
Download a given engine version .
-
Tgstation.Server.Host.Components.Engine.IEngineInstaller.Install
ValueTask Install(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working.
+
Tgstation.Server.Host.Components.Engine.IEngineInstaller.Install
ValueTask Install(EngineVersion version, string path, bool deploymentPipelineProcesses, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working.
Tgstation.Server.Host.Components.Engine.IEngineInstaller.TrustDmbPath
ValueTask TrustDmbPath(EngineVersion version, string fullDmbPath, CancellationToken cancellationToken)
Add a given fullDmbPath to the trusted DMBs list in BYOND's config.
Tgstation.Server.Host.Components.Engine.IEngineInstaller.CleanCache
Task CleanCache(CancellationToken cancellationToken)
Attempts to cleans the engine's cache folder for the system.
Tgstation.Server.Api.Models
Definition: ChatChannel.cs:6
diff --git a/_i_o_manager_extensions_8cs.html b/_i_o_manager_extensions_8cs.html new file mode 100644 index 0000000000..a23f9928a9 --- /dev/null +++ b/_i_o_manager_extensions_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Extensions/IOManagerExtensions.cs File Reference + + + + + + + + + +
+
+ + + + + + +
+
tgstation-server 6.1.5 +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes | +Namespaces
+
IOManagerExtensions.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Extensions.IOManagerExtensions
 Extension methods for IIOManager. More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Extensions
 
+
+ + + + diff --git a/_i_o_manager_extensions_8cs_source.html b/_i_o_manager_extensions_8cs_source.html new file mode 100644 index 0000000000..67dfbf485c --- /dev/null +++ b/_i_o_manager_extensions_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Extensions/IOManagerExtensions.cs Source File + + + + + + + + + +
+
+ + + + + + +
+
tgstation-server 6.1.5 +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
IOManagerExtensions.cs
+
+
+Go to the documentation of this file.
1using System;
+
2
+ + +
5
+ +
7{
+ +
12 {
+
19 public static string GetPathInLocalDirectory(this IIOManager ioManager, IAssemblyInformationProvider assemblyInformationProvider)
+
20 {
+
21 ArgumentNullException.ThrowIfNull(ioManager);
+
22 ArgumentNullException.ThrowIfNull(assemblyInformationProvider);
+
23
+
24 return ioManager.ConcatPath(
+
25 Environment.GetFolderPath(
+
26 Environment.SpecialFolder.LocalApplicationData, // we use local application data here instead of comman application data because we store stuff here we don't want other users interfering with
+
27 Environment.SpecialFolderOption.DoNotVerify),
+
28 assemblyInformationProvider.VersionPrefix);
+
29 }
+
30 }
+
31}
+ +
static string GetPathInLocalDirectory(this IIOManager ioManager, IAssemblyInformationProvider assemblyInformationProvider)
Gets the local application data folder used by TGS.
+
Interface for using filesystems.
Definition: IIOManager.cs:13
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path.
+ + + + + +
+ + + + diff --git a/_i_session_controller_8cs_source.html b/_i_session_controller_8cs_source.html index 086872907d..1572bd9d31 100644 --- a/_i_session_controller_8cs_source.html +++ b/_i_session_controller_8cs_source.html @@ -118,17 +118,19 @@ $(function() {
81
85 bool DMApiAvailable { get; }
86
-
91 ValueTask Release();
-
92
-
99 ValueTask<TopicResponse?> SendCommand(TopicParameters parameters, CancellationToken cancellationToken);
-
100
-
107 ValueTask<bool> SetRebootState(RebootState newRebootState, CancellationToken cancellationToken);
-
108
-
112 void ResetRebootState();
+
90 string DumpFileExtension { get; }
+
91
+
96 ValueTask Release();
+
97
+
104 ValueTask<TopicResponse?> SendCommand(TopicParameters parameters, CancellationToken cancellationToken);
+
105
+
112 ValueTask<bool> SetRebootState(RebootState newRebootState, CancellationToken cancellationToken);
113
-
119 IAsyncDisposable ReplaceDmbProvider(IDmbProvider newProvider);
-
120 }
-
121}
+
117 void ResetRebootState();
+
118
+
124 IAsyncDisposable ReplaceDmbProvider(IDmbProvider newProvider);
+
125 }
+
126}
IAsyncDisposable
Tgstation.Server.Api.Models.EngineVersion
Information about an engine installation.
Definition: EngineVersion.cs:14
Tgstation.Server.Host.Components.Interop.Topic.TopicParameters
Parameters for a topic request.
Definition: TopicParameters.cs:13
@@ -152,6 +154,7 @@ $(function() {
Tgstation.Server.Host.Components.Session.ISessionController.OnStartup
Task OnStartup
A Task that completes when the server calls /world/TgsNew().
Definition: ISessionController.cs:65
Tgstation.Server.Host.Components.Session.ISessionController.Release
ValueTask Release()
Releases the IProcess without terminating it. Also calls IDisposable.Dispose.
Tgstation.Server.Host.Components.Session.ISessionController.DMApiVersion
Version? DMApiVersion
The DMAPI Version.
Definition: ISessionController.cs:35
+
Tgstation.Server.Host.Components.Session.ISessionController.DumpFileExtension
string DumpFileExtension
The file extension to use for process dumps created from this session.
Definition: ISessionController.cs:90
Tgstation.Server.Host.System.IProcessBase
Represents process lifetime.
Definition: IProcessBase.cs:10
Tgstation.Server.Api.Models
Definition: ChatChannel.cs:6
Tgstation.Server.Host.Components.Deployment
Definition: DmbFactory.cs:22
diff --git a/_installation_extensions_8cs_source.html b/_installation_extensions_8cs_source.html index 8a7a8d23a5..5f82701bad 100644 --- a/_installation_extensions_8cs_source.html +++ b/_installation_extensions_8cs_source.html @@ -202,7 +202,7 @@ $(function() {
Tgstation.Server.Host.Service.Wix.Extensions.InstallationExtensions.ApplyProductionAppsettingsIfNonExistant
static ActionResult ApplyProductionAppsettingsIfNonExistant(Session session)
Attempts to copy the initial config to the production config if necessary.
Definition: InstallationExtensions.cs:90
Tgstation.Server.Host.Service.Wix.Extensions.InstallationExtensions.DetachStopTgsServiceIfRunning
static ActionResult DetachStopTgsServiceIfRunning(Session session)
Attempts to detach stop the existing tgstation-server service if it exists.
Definition: InstallationExtensions.cs:28
Tgstation.Server.Host.Service.Wix.Extensions.InstallationExtensions.CanonicalPackageName
const string CanonicalPackageName
Package name
Definition: InstallationExtensions.cs:20
-
Tgstation.Server.Host.Common
Definition: DotnetHelper.cs:9
+
Tgstation.Server.Host.Common
Definition: DotnetHelper.cs:9
Tgstation.Server.Host.Service.Wix.Extensions
Definition: InstallationExtensions.cs:2
diff --git a/_instance_factory_8cs_source.html b/_instance_factory_8cs_source.html index aae31dac22..af2051d111 100644 --- a/_instance_factory_8cs_source.html +++ b/_instance_factory_8cs_source.html @@ -150,232 +150,241 @@ $(function() {
132
136 readonly IAsyncDelayer asyncDelayer;
137
-
141 readonly GeneralConfiguration generalConfiguration;
+
141 readonly IDotnetDumpService dotnetDumpService;
142
-
146 readonly SessionConfiguration sessionConfiguration;
+
146 readonly GeneralConfiguration generalConfiguration;
147
-
153 static ResolvingIOManager CreateGameIOManager(IIOManager instanceIOManager) => new(instanceIOManager, "Game");
-
154
-
155#pragma warning disable CA1502 // TODO: Decomplexify
-
182 public InstanceFactory(
-
183 IIOManager ioManager,
-
184 IDatabaseContextFactory databaseContextFactory,
-
185 IAssemblyInformationProvider assemblyInformationProvider,
-
186 ILoggerFactory loggerFactory,
-
187 ITopicClientFactory topicClientFactory,
-
188 ICryptographySuite cryptographySuite,
-
189 ISynchronousIOManager synchronousIOManager,
-
190 IFilesystemLinkFactory linkFactory,
-
191 IEngineInstaller engineInstaller,
-
192 IChatManagerFactory chatFactory,
-
193 IProcessExecutor processExecutor,
-
194 IPostWriteHandler postWriteHandler,
-
195 IWatchdogFactory watchdogFactory,
-
196 IJobManager jobManager,
-
197 INetworkPromptReaper networkPromptReaper,
-
198 IPlatformIdentifier platformIdentifier,
-
199 IRepositoryManagerFactory repositoryManagerFactory,
-
200 IServerPortProvider serverPortProvider,
-
201 IFileTransferTicketProvider fileTransferService,
-
202 IRemoteDeploymentManagerFactory remoteDeploymentManagerFactory,
-
203 IAsyncDelayer asyncDelayer,
-
204 IOptions<GeneralConfiguration> generalConfigurationOptions,
-
205 IOptions<SessionConfiguration> sessionConfigurationOptions)
-
206 {
-
207 this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
-
208 this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
-
209 this.assemblyInformationProvider = assemblyInformationProvider ?? throw new ArgumentNullException(nameof(assemblyInformationProvider));
-
210 this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
-
211 this.topicClientFactory = topicClientFactory ?? throw new ArgumentNullException(nameof(topicClientFactory));
-
212 this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
-
213 this.synchronousIOManager = synchronousIOManager ?? throw new ArgumentNullException(nameof(synchronousIOManager));
-
214 this.linkFactory = linkFactory ?? throw new ArgumentNullException(nameof(linkFactory));
-
215 this.engineInstaller = engineInstaller ?? throw new ArgumentNullException(nameof(engineInstaller));
-
216 this.chatFactory = chatFactory ?? throw new ArgumentNullException(nameof(chatFactory));
-
217 this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
-
218 this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
-
219 this.watchdogFactory = watchdogFactory ?? throw new ArgumentNullException(nameof(watchdogFactory));
-
220 this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
-
221 this.networkPromptReaper = networkPromptReaper ?? throw new ArgumentNullException(nameof(networkPromptReaper));
-
222 this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
-
223 this.repositoryManagerFactory = repositoryManagerFactory ?? throw new ArgumentNullException(nameof(repositoryManagerFactory));
-
224 this.serverPortProvider = serverPortProvider ?? throw new ArgumentNullException(nameof(serverPortProvider));
-
225 this.fileTransferService = fileTransferService ?? throw new ArgumentNullException(nameof(fileTransferService));
-
226 this.remoteDeploymentManagerFactory = remoteDeploymentManagerFactory ?? throw new ArgumentNullException(nameof(remoteDeploymentManagerFactory));
-
227 this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
-
228 generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
-
229 sessionConfiguration = sessionConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(sessionConfigurationOptions));
-
230 }
-
231#pragma warning restore CA1502
-
232
-
234 public IIOManager CreateGameIOManager(Models.Instance metadata)
-
235 {
-
236 ArgumentNullException.ThrowIfNull(metadata);
-
237
-
238 var instanceIoManager = CreateInstanceIOManager(metadata);
-
239 return CreateGameIOManager(instanceIoManager);
-
240 }
-
241
-
243#pragma warning disable CA1506 // TODO: Decomplexify
-
244 public async ValueTask<IInstance> CreateInstance(IBridgeRegistrar bridgeRegistrar, Models.Instance metadata)
-
245 {
-
246 ArgumentNullException.ThrowIfNull(bridgeRegistrar);
-
247 ArgumentNullException.ThrowIfNull(metadata);
-
248
-
249 // Create the ioManager for the instance
-
250 var instanceIoManager = CreateInstanceIOManager(metadata);
-
251
-
252 // various other ioManagers
-
253 var repoIoManager = new ResolvingIOManager(instanceIoManager, "Repository");
-
254 var byondIOManager = new ResolvingIOManager(instanceIoManager, "Byond");
-
255 var gameIoManager = CreateGameIOManager(instanceIoManager);
-
256 var diagnosticsIOManager = new ResolvingIOManager(instanceIoManager, "Diagnostics");
-
257 var configurationIoManager = new ResolvingIOManager(instanceIoManager, "Configuration");
-
258
-
259 var configuration = new StaticFiles.Configuration(
-
260 configurationIoManager,
-
261 synchronousIOManager,
-
262 linkFactory,
-
263 processExecutor,
-
264 postWriteHandler,
-
265 platformIdentifier,
-
266 fileTransferService,
-
267 loggerFactory.CreateLogger<StaticFiles.Configuration>(),
-
268 generalConfiguration,
-
269 sessionConfiguration);
-
270 var eventConsumer = new EventConsumer(configuration);
-
271 var repoManager = repositoryManagerFactory.CreateRepositoryManager(repoIoManager, eventConsumer);
-
272 try
-
273 {
-
274 var engineManager = new EngineManager(byondIOManager, engineInstaller, eventConsumer, loggerFactory.CreateLogger<EngineManager>());
-
275
-
276 var dmbFactory = new DmbFactory(
-
277 databaseContextFactory,
-
278 gameIoManager,
-
279 remoteDeploymentManagerFactory,
-
280 eventConsumer,
-
281 loggerFactory.CreateLogger<DmbFactory>(),
-
282 metadata);
-
283 try
-
284 {
-
285 var commandFactory = new CommandFactory(assemblyInformationProvider, engineManager, repoManager, databaseContextFactory, dmbFactory, metadata);
-
286
-
287 var chatManager = chatFactory.CreateChatManager(commandFactory, metadata.ChatSettings);
-
288 try
-
289 {
-
290 var reattachInfoHandler = new SessionPersistor(
-
291 databaseContextFactory,
-
292 dmbFactory,
-
293 processExecutor,
-
294 loggerFactory.CreateLogger<SessionPersistor>(),
-
295 metadata);
-
296
-
297 var sessionControllerFactory = new SessionControllerFactory(
-
298 processExecutor,
-
299 engineManager,
-
300 topicClientFactory,
-
301 cryptographySuite,
-
302 assemblyInformationProvider,
-
303 gameIoManager,
-
304 diagnosticsIOManager,
-
305 chatManager,
-
306 networkPromptReaper,
-
307 platformIdentifier,
-
308 bridgeRegistrar,
-
309 serverPortProvider,
-
310 eventConsumer,
-
311 asyncDelayer,
-
312 loggerFactory,
-
313 loggerFactory.CreateLogger<SessionControllerFactory>(),
-
314 sessionConfiguration,
-
315 metadata);
-
316
-
317 var watchdog = watchdogFactory.CreateWatchdog(
-
318 chatManager,
-
319 dmbFactory,
-
320 reattachInfoHandler,
-
321 sessionControllerFactory,
-
322 gameIoManager,
-
323 diagnosticsIOManager,
-
324 configuration, // watchdog doesn't need itself as an event consumer
-
325 remoteDeploymentManagerFactory,
-
326 metadata,
-
327 metadata.DreamDaemonSettings!);
-
328 try
-
329 {
-
330 eventConsumer.SetWatchdog(watchdog);
-
331 commandFactory.SetWatchdog(watchdog);
-
332
-
333 Instance? instance = null;
-
334 var dreamMaker = new DreamMaker(
-
335 engineManager,
-
336 gameIoManager,
-
337 configuration,
-
338 sessionControllerFactory,
-
339 eventConsumer,
-
340 chatManager,
-
341 processExecutor,
-
342 dmbFactory,
-
343 repoManager,
-
344 remoteDeploymentManagerFactory,
-
345 asyncDelayer,
-
346 loggerFactory.CreateLogger<DreamMaker>(),
-
347 sessionConfiguration,
-
348 metadata);
-
349
-
350 instance = new Instance(
-
351 metadata,
-
352 repoManager,
-
353 engineManager,
-
354 dreamMaker,
-
355 watchdog,
-
356 chatManager,
-
357 configuration,
-
358 dmbFactory,
-
359 jobManager,
-
360 eventConsumer,
-
361 remoteDeploymentManagerFactory,
-
362 asyncDelayer,
-
363 loggerFactory.CreateLogger<Instance>());
-
364
-
365 return instance;
-
366 }
-
367 catch
-
368 {
-
369 await watchdog.DisposeAsync();
-
370 throw;
-
371 }
-
372 }
-
373 catch
-
374 {
-
375 await chatManager.DisposeAsync();
-
376 throw;
-
377 }
-
378 }
-
379 catch
-
380 {
-
381 dmbFactory.Dispose();
-
382 throw;
-
383 }
-
384 }
-
385 catch
-
386 {
-
387 repoManager.Dispose();
-
388 throw;
-
389 }
-
390 }
-
391#pragma warning restore CA1506
-
392
-
394 public Task StartAsync(CancellationToken cancellationToken)
-
395 => Task.WhenAll(
-
396 repositoryManagerFactory.StartAsync(cancellationToken),
-
397 engineInstaller.CleanCache(cancellationToken));
-
398
-
400 public Task StopAsync(CancellationToken cancellationToken) => repositoryManagerFactory.StopAsync(cancellationToken);
-
401
-
407 ResolvingIOManager CreateInstanceIOManager(Models.Instance metadata) => new(ioManager, metadata.Path!);
-
408 }
-
409}
+
151 readonly SessionConfiguration sessionConfiguration;
+
152
+
158 static ResolvingIOManager CreateGameIOManager(IIOManager instanceIOManager) => new(instanceIOManager, "Game");
+
159
+
160#pragma warning disable CA1502 // TODO: Decomplexify
+
188 public InstanceFactory(
+
189 IIOManager ioManager,
+
190 IDatabaseContextFactory databaseContextFactory,
+
191 IAssemblyInformationProvider assemblyInformationProvider,
+
192 ILoggerFactory loggerFactory,
+
193 ITopicClientFactory topicClientFactory,
+
194 ICryptographySuite cryptographySuite,
+
195 ISynchronousIOManager synchronousIOManager,
+
196 IFilesystemLinkFactory linkFactory,
+
197 IEngineInstaller engineInstaller,
+
198 IChatManagerFactory chatFactory,
+
199 IProcessExecutor processExecutor,
+
200 IPostWriteHandler postWriteHandler,
+
201 IWatchdogFactory watchdogFactory,
+
202 IJobManager jobManager,
+
203 INetworkPromptReaper networkPromptReaper,
+
204 IPlatformIdentifier platformIdentifier,
+
205 IRepositoryManagerFactory repositoryManagerFactory,
+
206 IServerPortProvider serverPortProvider,
+
207 IFileTransferTicketProvider fileTransferService,
+
208 IRemoteDeploymentManagerFactory remoteDeploymentManagerFactory,
+
209 IAsyncDelayer asyncDelayer,
+
210 IDotnetDumpService dotnetDumpService,
+
211 IOptions<GeneralConfiguration> generalConfigurationOptions,
+
212 IOptions<SessionConfiguration> sessionConfigurationOptions)
+
213 {
+
214 this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
+
215 this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
+
216 this.assemblyInformationProvider = assemblyInformationProvider ?? throw new ArgumentNullException(nameof(assemblyInformationProvider));
+
217 this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
+
218 this.topicClientFactory = topicClientFactory ?? throw new ArgumentNullException(nameof(topicClientFactory));
+
219 this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
+
220 this.synchronousIOManager = synchronousIOManager ?? throw new ArgumentNullException(nameof(synchronousIOManager));
+
221 this.linkFactory = linkFactory ?? throw new ArgumentNullException(nameof(linkFactory));
+
222 this.engineInstaller = engineInstaller ?? throw new ArgumentNullException(nameof(engineInstaller));
+
223 this.chatFactory = chatFactory ?? throw new ArgumentNullException(nameof(chatFactory));
+
224 this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
+
225 this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
+
226 this.watchdogFactory = watchdogFactory ?? throw new ArgumentNullException(nameof(watchdogFactory));
+
227 this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
+
228 this.networkPromptReaper = networkPromptReaper ?? throw new ArgumentNullException(nameof(networkPromptReaper));
+
229 this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
+
230 this.repositoryManagerFactory = repositoryManagerFactory ?? throw new ArgumentNullException(nameof(repositoryManagerFactory));
+
231 this.serverPortProvider = serverPortProvider ?? throw new ArgumentNullException(nameof(serverPortProvider));
+
232 this.fileTransferService = fileTransferService ?? throw new ArgumentNullException(nameof(fileTransferService));
+
233 this.remoteDeploymentManagerFactory = remoteDeploymentManagerFactory ?? throw new ArgumentNullException(nameof(remoteDeploymentManagerFactory));
+
234 this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
+
235 this.dotnetDumpService = dotnetDumpService ?? throw new ArgumentNullException(nameof(dotnetDumpService));
+
236 generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
+
237 sessionConfiguration = sessionConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(sessionConfigurationOptions));
+
238 }
+
239#pragma warning restore CA1502
+
240
+
242 public IIOManager CreateGameIOManager(Models.Instance metadata)
+
243 {
+
244 ArgumentNullException.ThrowIfNull(metadata);
+
245
+
246 var instanceIoManager = CreateInstanceIOManager(metadata);
+
247 return CreateGameIOManager(instanceIoManager);
+
248 }
+
249
+
251#pragma warning disable CA1506 // TODO: Decomplexify
+
252 public async ValueTask<IInstance> CreateInstance(IBridgeRegistrar bridgeRegistrar, Models.Instance metadata)
+
253 {
+
254 ArgumentNullException.ThrowIfNull(bridgeRegistrar);
+
255 ArgumentNullException.ThrowIfNull(metadata);
+
256
+
257 // Create the ioManager for the instance
+
258 var instanceIoManager = CreateInstanceIOManager(metadata);
+
259
+
260 // various other ioManagers
+
261 var repoIoManager = new ResolvingIOManager(instanceIoManager, "Repository");
+
262 var byondIOManager = new ResolvingIOManager(instanceIoManager, "Byond");
+
263 var gameIoManager = CreateGameIOManager(instanceIoManager);
+
264 var diagnosticsIOManager = new ResolvingIOManager(instanceIoManager, "Diagnostics");
+
265 var configurationIoManager = new ResolvingIOManager(instanceIoManager, "Configuration");
+
266
+
267 var configuration = new StaticFiles.Configuration(
+
268 configurationIoManager,
+
269 synchronousIOManager,
+
270 linkFactory,
+
271 processExecutor,
+
272 postWriteHandler,
+
273 platformIdentifier,
+
274 fileTransferService,
+
275 loggerFactory.CreateLogger<StaticFiles.Configuration>(),
+
276 generalConfiguration,
+
277 sessionConfiguration);
+
278 var eventConsumer = new EventConsumer(configuration);
+
279 var repoManager = repositoryManagerFactory.CreateRepositoryManager(repoIoManager, eventConsumer);
+
280 try
+
281 {
+
282 var engineManager = new EngineManager(
+
283 byondIOManager,
+
284 engineInstaller,
+
285 eventConsumer,
+
286 loggerFactory.CreateLogger<EngineManager>());
+
287
+
288 var dmbFactory = new DmbFactory(
+
289 databaseContextFactory,
+
290 gameIoManager,
+
291 remoteDeploymentManagerFactory,
+
292 eventConsumer,
+
293 loggerFactory.CreateLogger<DmbFactory>(),
+
294 metadata);
+
295 try
+
296 {
+
297 var commandFactory = new CommandFactory(assemblyInformationProvider, engineManager, repoManager, databaseContextFactory, dmbFactory, metadata);
+
298
+
299 var chatManager = chatFactory.CreateChatManager(commandFactory, metadata.ChatSettings);
+
300 try
+
301 {
+
302 var reattachInfoHandler = new SessionPersistor(
+
303 databaseContextFactory,
+
304 dmbFactory,
+
305 processExecutor,
+
306 loggerFactory.CreateLogger<SessionPersistor>(),
+
307 metadata);
+
308
+
309 var sessionControllerFactory = new SessionControllerFactory(
+
310 processExecutor,
+
311 engineManager,
+
312 topicClientFactory,
+
313 cryptographySuite,
+
314 assemblyInformationProvider,
+
315 gameIoManager,
+
316 diagnosticsIOManager,
+
317 chatManager,
+
318 networkPromptReaper,
+
319 platformIdentifier,
+
320 bridgeRegistrar,
+
321 serverPortProvider,
+
322 eventConsumer,
+
323 asyncDelayer,
+
324 dotnetDumpService,
+
325 loggerFactory,
+
326 loggerFactory.CreateLogger<SessionControllerFactory>(),
+
327 sessionConfiguration,
+
328 metadata);
+
329
+
330 var watchdog = watchdogFactory.CreateWatchdog(
+
331 chatManager,
+
332 dmbFactory,
+
333 reattachInfoHandler,
+
334 sessionControllerFactory,
+
335 gameIoManager,
+
336 diagnosticsIOManager,
+
337 configuration, // watchdog doesn't need itself as an event consumer
+
338 remoteDeploymentManagerFactory,
+
339 metadata,
+
340 metadata.DreamDaemonSettings!);
+
341 try
+
342 {
+
343 eventConsumer.SetWatchdog(watchdog);
+
344 commandFactory.SetWatchdog(watchdog);
+
345
+
346 Instance? instance = null;
+
347 var dreamMaker = new DreamMaker(
+
348 engineManager,
+
349 gameIoManager,
+
350 configuration,
+
351 sessionControllerFactory,
+
352 eventConsumer,
+
353 chatManager,
+
354 processExecutor,
+
355 dmbFactory,
+
356 repoManager,
+
357 remoteDeploymentManagerFactory,
+
358 asyncDelayer,
+
359 loggerFactory.CreateLogger<DreamMaker>(),
+
360 sessionConfiguration,
+
361 metadata);
+
362
+
363 instance = new Instance(
+
364 metadata,
+
365 repoManager,
+
366 engineManager,
+
367 dreamMaker,
+
368 watchdog,
+
369 chatManager,
+
370 configuration,
+
371 dmbFactory,
+
372 jobManager,
+
373 eventConsumer,
+
374 remoteDeploymentManagerFactory,
+
375 asyncDelayer,
+
376 loggerFactory.CreateLogger<Instance>());
+
377
+
378 return instance;
+
379 }
+
380 catch
+
381 {
+
382 await watchdog.DisposeAsync();
+
383 throw;
+
384 }
+
385 }
+
386 catch
+
387 {
+
388 await chatManager.DisposeAsync();
+
389 throw;
+
390 }
+
391 }
+
392 catch
+
393 {
+
394 dmbFactory.Dispose();
+
395 throw;
+
396 }
+
397 }
+
398 catch
+
399 {
+
400 repoManager.Dispose();
+
401 throw;
+
402 }
+
403 }
+
404#pragma warning restore CA1506
+
405
+
407 public Task StartAsync(CancellationToken cancellationToken)
+
408 => Task.WhenAll(
+
409 repositoryManagerFactory.StartAsync(cancellationToken),
+
410 engineInstaller.CleanCache(cancellationToken));
+
411
+
413 public Task StopAsync(CancellationToken cancellationToken) => repositoryManagerFactory.StopAsync(cancellationToken);
+
414
+
420 ResolvingIOManager CreateInstanceIOManager(Models.Instance metadata) => new(ioManager, metadata.Path!);
+
421 }
+
422}
Tgstation.Server.Host.Components.Chat.Commands.CommandFactory
Definition: CommandFactory.cs:15
Tgstation.Server.Host.Components.Deployment.DmbFactory
Standard IDmbFactory.
Definition: DmbFactory.cs:27
Tgstation.Server.Host.Components.Deployment.DreamMaker
Definition: DreamMaker.cs:32
@@ -386,7 +395,7 @@ $(function() {
Tgstation.Server.Host.Components.InstanceFactory.topicClientFactory
readonly ITopicClientFactory topicClientFactory
The ITopicClientFactory for the InstanceFactory.
Definition: InstanceFactory.cs:56
Tgstation.Server.Host.Components.InstanceFactory.synchronousIOManager
readonly ISynchronousIOManager synchronousIOManager
The ISynchronousIOManager for the InstanceFactory.
Definition: InstanceFactory.cs:66
Tgstation.Server.Host.Components.InstanceFactory.platformIdentifier
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the InstanceFactory.
Definition: InstanceFactory.cs:111
-
Tgstation.Server.Host.Components.InstanceFactory.sessionConfiguration
readonly SessionConfiguration sessionConfiguration
The SessionConfiguration for the InstanceFactory.
Definition: InstanceFactory.cs:146
+
Tgstation.Server.Host.Components.InstanceFactory.sessionConfiguration
readonly SessionConfiguration sessionConfiguration
The SessionConfiguration for the InstanceFactory.
Definition: InstanceFactory.cs:151
Tgstation.Server.Host.Components.InstanceFactory.engineInstaller
readonly IEngineInstaller engineInstaller
The IEngineInstaller for the InstanceFactory.
Definition: InstanceFactory.cs:76
Tgstation.Server.Host.Components.InstanceFactory.ioManager
readonly IIOManager ioManager
The IIOManager for the InstanceFactory.
Definition: InstanceFactory.cs:36
Tgstation.Server.Host.Components.InstanceFactory.asyncDelayer
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the InstanceFactory.
Definition: InstanceFactory.cs:136
@@ -395,7 +404,7 @@ $(function() {
Tgstation.Server.Host.Components.InstanceFactory.chatFactory
readonly IChatManagerFactory chatFactory
The IChatManagerFactory for the InstanceFactory.
Definition: InstanceFactory.cs:81
Tgstation.Server.Host.Components.InstanceFactory.repositoryManagerFactory
readonly IRepositoryManagerFactory repositoryManagerFactory
The IRepositoryManagerFactory for the InstanceFactory.
Definition: InstanceFactory.cs:116
Tgstation.Server.Host.Components.InstanceFactory.serverPortProvider
readonly IServerPortProvider serverPortProvider
The IServerPortProvider for the InstanceFactory.
Definition: InstanceFactory.cs:121
-
Tgstation.Server.Host.Components.InstanceFactory.generalConfiguration
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the InstanceFactory.
Definition: InstanceFactory.cs:141
+
Tgstation.Server.Host.Components.InstanceFactory.generalConfiguration
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the InstanceFactory.
Definition: InstanceFactory.cs:146
Tgstation.Server.Host.Components.InstanceFactory.StartAsync
Task StartAsync(CancellationToken cancellationToken)
Tgstation.Server.Host.Components.InstanceFactory.StopAsync
Task StopAsync(CancellationToken cancellationToken)
Tgstation.Server.Host.Components.InstanceFactory.watchdogFactory
readonly IWatchdogFactory watchdogFactory
The IWatchdogFactory for the InstanceFactory.
Definition: InstanceFactory.cs:96
@@ -403,9 +412,10 @@ $(function() {
Tgstation.Server.Host.Components.InstanceFactory.assemblyInformationProvider
readonly IAssemblyInformationProvider assemblyInformationProvider
The IAssemblyInformationProvider for the InstanceFactory.
Definition: InstanceFactory.cs:46
Tgstation.Server.Host.Components.InstanceFactory.CreateInstanceIOManager
ResolvingIOManager CreateInstanceIOManager(Models.Instance metadata)
Create the IIOManager for a given set of instance metadata .
Tgstation.Server.Host.Components.InstanceFactory.postWriteHandler
readonly IPostWriteHandler postWriteHandler
The IPostWriteHandler for the InstanceFactory.
Definition: InstanceFactory.cs:91
-
Tgstation.Server.Host.Components.InstanceFactory.CreateGameIOManager
IIOManager CreateGameIOManager(Models.Instance metadata)
Create an IIOManager that resolves to the "Game" directory of the Models.Instance defined by metadata...
Definition: InstanceFactory.cs:234
+
Tgstation.Server.Host.Components.InstanceFactory.CreateGameIOManager
IIOManager CreateGameIOManager(Models.Instance metadata)
Create an IIOManager that resolves to the "Game" directory of the Models.Instance defined by metadata...
Definition: InstanceFactory.cs:242
+
Tgstation.Server.Host.Components.InstanceFactory.dotnetDumpService
readonly IDotnetDumpService dotnetDumpService
The IDotnetDumpService for the InstanceFactory.
Definition: InstanceFactory.cs:141
Tgstation.Server.Host.Components.InstanceFactory.cryptographySuite
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the InstanceFactory.
Definition: InstanceFactory.cs:61
-
Tgstation.Server.Host.Components.InstanceFactory.CreateInstance
async ValueTask< IInstance > CreateInstance(IBridgeRegistrar bridgeRegistrar, Models.Instance metadata)
Create an IInstance. A ValueTask<TResult> resulting in a new IInstance.
Definition: InstanceFactory.cs:244
+
Tgstation.Server.Host.Components.InstanceFactory.CreateInstance
async ValueTask< IInstance > CreateInstance(IBridgeRegistrar bridgeRegistrar, Models.Instance metadata)
Create an IInstance. A ValueTask<TResult> resulting in a new IInstance.
Definition: InstanceFactory.cs:252
Tgstation.Server.Host.Components.InstanceFactory.fileTransferService
readonly IFileTransferTicketProvider fileTransferService
The IFileTransferTicketProvider for the InstanceFactory.
Definition: InstanceFactory.cs:126
Tgstation.Server.Host.Components.InstanceFactory.networkPromptReaper
readonly INetworkPromptReaper networkPromptReaper
The INetworkPromptReaper for the InstanceFactory.
Definition: InstanceFactory.cs:106
Tgstation.Server.Host.Components.InstanceFactory.linkFactory
readonly IFilesystemLinkFactory linkFactory
The IFilesystemLinkFactory for the InstanceFactory.
Definition: InstanceFactory.cs:71
@@ -439,6 +449,7 @@ $(function() {
Tgstation.Server.Host.Jobs.IJobManager
Manages the runtime of Jobs.
Definition: IJobManager.cs:13
Tgstation.Server.Host.Security.ICryptographySuite
Contains various cryptographic functions.
Definition: ICryptographySuite.cs:9
Tgstation.Server.Host.System.IAssemblyInformationProvider
For retrieving the Assembly's location.
Definition: IAssemblyInformationProvider.cs:11
+
Tgstation.Server.Host.System.IDotnetDumpService
Service for managing the dotnet-dump installation.
Definition: IDotnetDumpService.cs:10
Tgstation.Server.Host.System.INetworkPromptReaper
On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort()....
Definition: INetworkPromptReaper.cs:7
Tgstation.Server.Host.System.IPlatformIdentifier
For identifying the current platform.
Definition: IPlatformIdentifier.cs:9
Tgstation.Server.Host.System.IProcessExecutor
For launching IProcess'.
Definition: IProcessExecutor.cs:9
diff --git a/_open_dream_installation_8cs_source.html b/_open_dream_installation_8cs_source.html index 42c1854f84..8cbd7b41db 100644 --- a/_open_dream_installation_8cs_source.html +++ b/_open_dream_installation_8cs_source.html @@ -114,139 +114,142 @@ $(function() {
43
45 public override bool PreferFileLogging => true;
46
-
48 public override Task InstallationTask { get; }
+
48 public override bool UseDotnetDump => true;
49
-
53 readonly IAsyncDelayer asyncDelayer;
-
54
-
58 readonly IAbstractHttpClientFactory httpClientFactory;
-
59
-
70 public OpenDreamInstallation(
-
71 IIOManager installationIOManager,
-
72 IAsyncDelayer asyncDelayer,
-
73 IAbstractHttpClientFactory httpClientFactory,
-
74 string serverExePath,
-
75 string compilerExePath,
-
76 Task installationTask,
-
77 EngineVersion version)
-
78 : base(installationIOManager)
-
79 {
-
80 this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
-
81 this.httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));
-
82 ServerExePath = serverExePath ?? throw new ArgumentNullException(nameof(serverExePath));
-
83 CompilerExePath = compilerExePath ?? throw new ArgumentNullException(nameof(compilerExePath));
-
84 InstallationTask = installationTask ?? throw new ArgumentNullException(nameof(installationTask));
-
85 Version = version ?? throw new ArgumentNullException(nameof(version));
-
86
-
87 if (version.Engine!.Value != EngineType.OpenDream)
-
88 throw new ArgumentException($"Invalid EngineType: {version.Engine.Value}", nameof(version));
-
89 }
-
90
-
92 public override string FormatServerArguments(
-
93 IDmbProvider dmbProvider,
-
94 IReadOnlyDictionary<string, string> parameters,
-
95 DreamDaemonLaunchParameters launchParameters,
-
96 string? logFilePath)
-
97 {
-
98 ArgumentNullException.ThrowIfNull(dmbProvider);
-
99 ArgumentNullException.ThrowIfNull(parameters);
-
100 ArgumentNullException.ThrowIfNull(launchParameters);
-
101
-
102 if (!parameters.TryGetValue(DMApiConstants.ParamAccessIdentifier, out var accessIdentifier))
-
103 throw new ArgumentException($"parameters must have \"{DMApiConstants.ParamAccessIdentifier}\" set!", nameof(parameters));
+
51 public override Task InstallationTask { get; }
+
52
+
56 readonly IAsyncDelayer asyncDelayer;
+
57
+
61 readonly IAbstractHttpClientFactory httpClientFactory;
+
62
+
73 public OpenDreamInstallation(
+
74 IIOManager installationIOManager,
+
75 IAsyncDelayer asyncDelayer,
+
76 IAbstractHttpClientFactory httpClientFactory,
+
77 string serverExePath,
+
78 string compilerExePath,
+
79 Task installationTask,
+
80 EngineVersion version)
+
81 : base(installationIOManager)
+
82 {
+
83 this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
+
84 this.httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));
+
85 ServerExePath = serverExePath ?? throw new ArgumentNullException(nameof(serverExePath));
+
86 CompilerExePath = compilerExePath ?? throw new ArgumentNullException(nameof(compilerExePath));
+
87 InstallationTask = installationTask ?? throw new ArgumentNullException(nameof(installationTask));
+
88 Version = version ?? throw new ArgumentNullException(nameof(version));
+
89
+
90 if (version.Engine!.Value != EngineType.OpenDream)
+
91 throw new ArgumentException($"Invalid EngineType: {version.Engine.Value}", nameof(version));
+
92 }
+
93
+
95 public override string FormatServerArguments(
+
96 IDmbProvider dmbProvider,
+
97 IReadOnlyDictionary<string, string> parameters,
+
98 DreamDaemonLaunchParameters launchParameters,
+
99 string? logFilePath)
+
100 {
+
101 ArgumentNullException.ThrowIfNull(dmbProvider);
+
102 ArgumentNullException.ThrowIfNull(parameters);
+
103 ArgumentNullException.ThrowIfNull(launchParameters);
104
-
105 var parametersString = EncodeParameters(parameters, launchParameters);
-
106
-
107 var arguments = $"--cvar {(logFilePath != null ? $"log.path=\"{InstallationIOManager.GetDirectoryName(logFilePath)}\" --cvar log.format=\"{InstallationIOManager.GetFileName(logFilePath)}\"" : "log.enabled=false")} --cvar watchdog.token={accessIdentifier} --cvar log.runtimelog=false --cvar net.port={launchParameters.Port!.Value} --cvar opendream.topic_port=0 --cvar opendream.world_params=\"{parametersString}\" --cvar opendream.json_path=\"./{dmbProvider.DmbName}\"";
-
108 return arguments;
-
109 }
-
110
-
112 public override string FormatCompilerArguments(string dmePath)
-
113 => $"--suppress-unimplemented --notices-enabled \"{dmePath ?? throw new ArgumentNullException(nameof(dmePath))}\"";
-
114
-
116 public override async ValueTask StopServerProcess(
-
117 ILogger logger,
-
118 IProcess process,
-
119 string accessIdentifier,
-
120 ushort port,
-
121 CancellationToken cancellationToken)
-
122 {
-
123 ArgumentNullException.ThrowIfNull(logger);
-
124
-
125 const int MaximumTerminationSeconds = 5;
-
126
-
127 logger.LogTrace("Attempting Robust.Server graceful exit (Timeout: {seconds}s)...", MaximumTerminationSeconds);
-
128 var timeout = asyncDelayer.Delay(TimeSpan.FromSeconds(MaximumTerminationSeconds), cancellationToken);
-
129 var lifetime = process.Lifetime;
-
130
-
131 var stopwatch = Stopwatch.StartNew();
-
132 try
-
133 {
-
134 using var httpClient = httpClientFactory.CreateClient();
-
135 using var request = new HttpRequestMessage();
-
136 request.Headers.Add("WatchdogToken", accessIdentifier);
-
137 request.RequestUri = new Uri($"http://localhost:{port}/shutdown");
-
138 request.Content = new StringContent(
-
139 "{\"Reason\":\"TGS session termination\"}",
-
140 Encoding.UTF8,
-
141 new MediaTypeHeaderValue(MediaTypeNames.Application.Json));
-
142 request.Method = HttpMethod.Post;
-
143
-
144 var responseTask = httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);
-
145 try
-
146 {
-
147 await Task.WhenAny(timeout, lifetime, responseTask);
-
148 if (responseTask.IsCompleted)
-
149 {
-
150 using var response = await responseTask;
-
151 if (response.IsSuccessStatusCode)
-
152 {
-
153 logger.LogDebug("Robust.Server responded to the shutdown command successfully ({requestMs}ms). Waiting for exit...", stopwatch.ElapsedMilliseconds);
-
154 await Task.WhenAny(timeout, lifetime);
-
155 }
-
156 }
-
157
-
158 if (!lifetime.IsCompleted)
-
159 logger.LogWarning("Robust.Server graceful exit timed out!");
-
160 }
-
161 catch (Exception ex) when (ex is not OperationCanceledException)
-
162 {
-
163 logger.LogDebug(ex, "Unable to send graceful exit request to Robust.Server watchdog API!");
-
164 }
-
165
-
166 if (lifetime.IsCompleted)
-
167 {
-
168 logger.LogTrace("Robust.Server exited without termination");
-
169 return;
-
170 }
-
171 }
-
172 finally
-
173 {
-
174 logger.LogTrace("Robust.Server graceful shutdown attempt took {totalMs}ms", stopwatch.ElapsedMilliseconds);
-
175 }
-
176
-
177 await base.StopServerProcess(logger, process, accessIdentifier, port, cancellationToken);
-
178 }
-
179 }
-
180}
+
105 if (!parameters.TryGetValue(DMApiConstants.ParamAccessIdentifier, out var accessIdentifier))
+
106 throw new ArgumentException($"parameters must have \"{DMApiConstants.ParamAccessIdentifier}\" set!", nameof(parameters));
+
107
+
108 var parametersString = EncodeParameters(parameters, launchParameters);
+
109
+
110 var arguments = $"--cvar {(logFilePath != null ? $"log.path=\"{InstallationIOManager.GetDirectoryName(logFilePath)}\" --cvar log.format=\"{InstallationIOManager.GetFileName(logFilePath)}\"" : "log.enabled=false")} --cvar watchdog.token={accessIdentifier} --cvar log.runtimelog=false --cvar net.port={launchParameters.Port!.Value} --cvar opendream.topic_port=0 --cvar opendream.world_params=\"{parametersString}\" --cvar opendream.json_path=\"./{dmbProvider.DmbName}\"";
+
111 return arguments;
+
112 }
+
113
+
115 public override string FormatCompilerArguments(string dmePath)
+
116 => $"--suppress-unimplemented --notices-enabled \"{dmePath ?? throw new ArgumentNullException(nameof(dmePath))}\"";
+
117
+
119 public override async ValueTask StopServerProcess(
+
120 ILogger logger,
+
121 IProcess process,
+
122 string accessIdentifier,
+
123 ushort port,
+
124 CancellationToken cancellationToken)
+
125 {
+
126 ArgumentNullException.ThrowIfNull(logger);
+
127
+
128 const int MaximumTerminationSeconds = 5;
+
129
+
130 logger.LogTrace("Attempting Robust.Server graceful exit (Timeout: {seconds}s)...", MaximumTerminationSeconds);
+
131 var timeout = asyncDelayer.Delay(TimeSpan.FromSeconds(MaximumTerminationSeconds), cancellationToken);
+
132 var lifetime = process.Lifetime;
+
133
+
134 var stopwatch = Stopwatch.StartNew();
+
135 try
+
136 {
+
137 using var httpClient = httpClientFactory.CreateClient();
+
138 using var request = new HttpRequestMessage();
+
139 request.Headers.Add("WatchdogToken", accessIdentifier);
+
140 request.RequestUri = new Uri($"http://localhost:{port}/shutdown");
+
141 request.Content = new StringContent(
+
142 "{\"Reason\":\"TGS session termination\"}",
+
143 Encoding.UTF8,
+
144 new MediaTypeHeaderValue(MediaTypeNames.Application.Json));
+
145 request.Method = HttpMethod.Post;
+
146
+
147 var responseTask = httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);
+
148 try
+
149 {
+
150 await Task.WhenAny(timeout, lifetime, responseTask);
+
151 if (responseTask.IsCompleted)
+
152 {
+
153 using var response = await responseTask;
+
154 if (response.IsSuccessStatusCode)
+
155 {
+
156 logger.LogDebug("Robust.Server responded to the shutdown command successfully ({requestMs}ms). Waiting for exit...", stopwatch.ElapsedMilliseconds);
+
157 await Task.WhenAny(timeout, lifetime);
+
158 }
+
159 }
+
160
+
161 if (!lifetime.IsCompleted)
+
162 logger.LogWarning("Robust.Server graceful exit timed out!");
+
163 }
+
164 catch (Exception ex) when (ex is not OperationCanceledException)
+
165 {
+
166 logger.LogDebug(ex, "Unable to send graceful exit request to Robust.Server watchdog API!");
+
167 }
+
168
+
169 if (lifetime.IsCompleted)
+
170 {
+
171 logger.LogTrace("Robust.Server exited without termination");
+
172 return;
+
173 }
+
174 }
+
175 finally
+
176 {
+
177 logger.LogTrace("Robust.Server graceful shutdown attempt took {totalMs}ms", stopwatch.ElapsedMilliseconds);
+
178 }
+
179
+
180 await base.StopServerProcess(logger, process, accessIdentifier, port, cancellationToken);
+
181 }
+
182 }
+
183}
Exception
Tgstation.Server.Api.Models.EngineVersion
Information about an engine installation.
Definition: EngineVersion.cs:14
Tgstation.Server.Api.Models.EngineVersion.Engine
EngineType? Engine
The EngineType.
Definition: EngineVersion.cs:19
Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters
Launch settings for DreamDaemon.
Definition: DreamDaemonLaunchParameters.cs:10
Tgstation.Server.Host.Components.Engine.EngineInstallationBase
Definition: EngineInstallationBase.cs:23
-
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.EncodeParameters
static string EncodeParameters(IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters)
Encode given parameters for passing as world.params on the command line.
Definition: EngineInstallationBase.cs:56
+
Tgstation.Server.Host.Components.Engine.EngineInstallationBase.EncodeParameters
static string EncodeParameters(IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters)
Encode given parameters for passing as world.params on the command line.
Definition: EngineInstallationBase.cs:59
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation
Implementation of IEngineInstallation for EngineType.OpenDream.
Definition: OpenDreamInstallation.cs:28
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.CompilerExePath
override string CompilerExePath
The full path to the dm/DreamMaker executable.
Definition: OpenDreamInstallation.cs:36
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.httpClientFactory
readonly IAbstractHttpClientFactory httpClientFactory
The IAbstractHttpClientFactory for the OpenDreamInstallation.
Definition: OpenDreamInstallation.cs:58
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.OpenDreamInstallation
OpenDreamInstallation(IIOManager installationIOManager, IAsyncDelayer asyncDelayer, IAbstractHttpClientFactory httpClientFactory, string serverExePath, string compilerExePath, Task installationTask, EngineVersion version)
Initializes a new instance of the OpenDreamInstallation class.
Definition: OpenDreamInstallation.cs:70
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.asyncDelayer
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the OpenDreamInstallation.
Definition: OpenDreamInstallation.cs:53
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.httpClientFactory
readonly IAbstractHttpClientFactory httpClientFactory
The IAbstractHttpClientFactory for the OpenDreamInstallation.
Definition: OpenDreamInstallation.cs:61
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.OpenDreamInstallation
OpenDreamInstallation(IIOManager installationIOManager, IAsyncDelayer asyncDelayer, IAbstractHttpClientFactory httpClientFactory, string serverExePath, string compilerExePath, Task installationTask, EngineVersion version)
Initializes a new instance of the OpenDreamInstallation class.
Definition: OpenDreamInstallation.cs:73
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.asyncDelayer
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the OpenDreamInstallation.
Definition: OpenDreamInstallation.cs:56
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.PromptsForNetworkAccess
override bool PromptsForNetworkAccess
If ServerExePath may create network prompts.
Definition: OpenDreamInstallation.cs:39
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.FormatServerArguments
override string FormatServerArguments(IDmbProvider dmbProvider, IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters, string? logFilePath)
Return the command line arguments for launching with given launchParameters . The formatted arguments...
Definition: OpenDreamInstallation.cs:92
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.FormatServerArguments
override string FormatServerArguments(IDmbProvider dmbProvider, IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters, string? logFilePath)
Return the command line arguments for launching with given launchParameters . The formatted arguments...
Definition: OpenDreamInstallation.cs:95
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.HasStandardOutput
override bool HasStandardOutput
If ServerExePath supports being run as a command-line application and outputs log information to be c...
Definition: OpenDreamInstallation.cs:42
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.Version
override EngineVersion Version
The EngineVersion of the IEngineInstallation.
Definition: OpenDreamInstallation.cs:30
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.ServerExePath
override string ServerExePath
The full path to the game server executable.
Definition: OpenDreamInstallation.cs:33
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.PreferFileLogging
override bool PreferFileLogging
If HasStandardOutput is set, this indicates that the engine server has good file logging that should ...
Definition: OpenDreamInstallation.cs:45
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.InstallationTask
override Task InstallationTask
The Task that completes when the BYOND version finished installing.
Definition: OpenDreamInstallation.cs:48
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.arguments
return arguments
Definition: OpenDreamInstallation.cs:108
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.UseDotnetDump
override bool UseDotnetDump
If dotnet-dump should be used to create process dumps for this installation.
Definition: OpenDreamInstallation.cs:48
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.InstallationTask
override Task InstallationTask
The Task that completes when the BYOND version finished installing.
Definition: OpenDreamInstallation.cs:51
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation.arguments
return arguments
Definition: OpenDreamInstallation.cs:111
Tgstation.Server.Host.Components.Interop.DMApiConstants
Constants used for communication with the DMAPI.
Definition: DMApiConstants.cs:15
Tgstation.Server.Host.Components.Interop.DMApiConstants.ParamAccessIdentifier
const string ParamAccessIdentifier
Identifies the DMApiParameters.AccessIdentifier for the session.
Definition: DMApiConstants.cs:29
Tgstation.Server.Common.Http.IAbstractHttpClientFactory
Creates IHttpClients.
Definition: IAbstractHttpClientFactory.cs:7
@@ -262,7 +265,7 @@ $(function() {
Tgstation.Server.Host.Components.Deployment
Definition: DmbFactory.cs:22
Tgstation.Server.Host.Components.Engine
Definition: ByondInstallation.cs:12
Tgstation.Server.Host.Components.Engine.FormatCompilerArguments
override string FormatCompilerArguments(string dmePath)
-
Tgstation.Server.Host.Components.Engine.StopServerProcess
override async ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
Definition: OpenDreamInstallation.cs:116
+
Tgstation.Server.Host.Components.Engine.StopServerProcess
override async ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
Definition: OpenDreamInstallation.cs:119
Tgstation.Server.Host.Components.Interop
Definition: BridgeCommandType.cs:2
Tgstation.Server.Host.IO
Definition: BufferedFileStreamProvider.cs:9
Tgstation.Server.Host.System
Definition: AssemblyInformationProvider.cs:9
diff --git a/_open_dream_installer_8cs_source.html b/_open_dream_installer_8cs_source.html index c588ad68b8..dbc640d369 100644 --- a/_open_dream_installer_8cs_source.html +++ b/_open_dream_installer_8cs_source.html @@ -88,310 +88,298 @@ $(function() {
9using Tgstation.Server.Api.Models;
10using Tgstation.Server.Common.Extensions;
11using Tgstation.Server.Common.Http;
-
12using Tgstation.Server.Host.Common;
-
13using Tgstation.Server.Host.Components.Repository;
-
14using Tgstation.Server.Host.Configuration;
-
15using Tgstation.Server.Host.IO;
-
16using Tgstation.Server.Host.Jobs;
-
17using Tgstation.Server.Host.System;
-
18using Tgstation.Server.Host.Utils;
-
19
-
20namespace Tgstation.Server.Host.Components.Engine
-
21{
-
25 class OpenDreamInstaller : EngineInstallerBase
-
26 {
-
30 const string BinDir = "bin";
-
31
-
35 const string ServerDir = "server";
-
36
-
40 const string InstallationCompilerDirectory = "compiler";
-
41
-
45 const string InstallationSourceSubDirectory = "TgsSourceSubdir";
-
46
-
48 protected override EngineType TargetEngineType => EngineType.OpenDream;
-
49
-
53 protected IProcessExecutor ProcessExecutor { get; }
-
54
-
58 protected GeneralConfiguration GeneralConfiguration { get; }
-
59
-
63 protected SessionConfiguration SessionConfiguration { get; }
-
64
-
68 readonly IPlatformIdentifier platformIdentifier;
-
69
-
73 readonly IRepositoryManager repositoryManager;
-
74
-
78 readonly IAsyncDelayer asyncDelayer;
-
79
-
83 readonly IAbstractHttpClientFactory httpClientFactory;
-
84
-
97 public OpenDreamInstaller(
-
98 IIOManager ioManager,
-
99 ILogger<OpenDreamInstaller> logger,
-
100 IPlatformIdentifier platformIdentifier,
-
101 IProcessExecutor processExecutor,
-
102 IRepositoryManager repositoryManager,
-
103 IAsyncDelayer asyncDelayer,
-
104 IAbstractHttpClientFactory httpClientFactory,
-
105 IOptions<GeneralConfiguration> generalConfigurationOptions,
-
106 IOptions<SessionConfiguration> sessionConfigurationOptions)
-
107 : base(ioManager, logger)
-
108 {
-
109 this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
-
110 ProcessExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
-
111 this.repositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
-
112 this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
-
113 this.httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));
-
114 GeneralConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
-
115 SessionConfiguration = sessionConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(sessionConfigurationOptions));
-
116 }
-
117
-
119 public override Task CleanCache(CancellationToken cancellationToken) => Task.CompletedTask;
-
120
-
122 public override IEngineInstallation CreateInstallation(EngineVersion version, string path, Task installationTask)
-
123 {
-
124 CheckVersionValidity(version);
-
125 GetExecutablePaths(path, out var serverExePath, out var compilerExePath);
-
126 return new OpenDreamInstallation(
-
127 new ResolvingIOManager(IOManager, path),
-
128 asyncDelayer,
-
129 httpClientFactory,
-
130 serverExePath,
-
131 compilerExePath,
-
132 installationTask,
-
133 version);
-
134 }
-
135
-
137 public override async ValueTask<IEngineInstallationData> DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
-
138 {
-
139 CheckVersionValidity(version);
-
140
-
141 // get a lock on a system wide OD repo
-
142 Logger.LogTrace("Cloning OD repo...");
-
143
-
144 var progressSection1 = jobProgressReporter?.CreateSection("Updating OpenDream git repository", 0.5f);
-
145
-
146 var repo = await repositoryManager.CloneRepository(
-
147 GeneralConfiguration.OpenDreamGitUrl,
+
12using Tgstation.Server.Host.Components.Repository;
+
13using Tgstation.Server.Host.Configuration;
+
14using Tgstation.Server.Host.IO;
+
15using Tgstation.Server.Host.Jobs;
+
16using Tgstation.Server.Host.System;
+
17using Tgstation.Server.Host.Utils;
+
18
+
19namespace Tgstation.Server.Host.Components.Engine
+
20{
+
24 class OpenDreamInstaller : EngineInstallerBase
+
25 {
+
29 const string BinDir = "bin";
+
30
+
34 const string ServerDir = "server";
+
35
+
39 const string InstallationCompilerDirectory = "compiler";
+
40
+
44 const string InstallationSourceSubDirectory = "TgsSourceSubdir";
+
45
+
47 protected override EngineType TargetEngineType => EngineType.OpenDream;
+
48
+
52 protected IProcessExecutor ProcessExecutor { get; }
+
53
+
57 protected GeneralConfiguration GeneralConfiguration { get; }
+
58
+
62 protected SessionConfiguration SessionConfiguration { get; }
+
63
+
67 readonly IPlatformIdentifier platformIdentifier;
+
68
+
72 readonly IRepositoryManager repositoryManager;
+
73
+
77 readonly IAsyncDelayer asyncDelayer;
+
78
+
82 readonly IAbstractHttpClientFactory httpClientFactory;
+
83
+
96 public OpenDreamInstaller(
+
97 IIOManager ioManager,
+
98 ILogger<OpenDreamInstaller> logger,
+
99 IPlatformIdentifier platformIdentifier,
+
100 IProcessExecutor processExecutor,
+
101 IRepositoryManager repositoryManager,
+
102 IAsyncDelayer asyncDelayer,
+
103 IAbstractHttpClientFactory httpClientFactory,
+
104 IOptions<GeneralConfiguration> generalConfigurationOptions,
+
105 IOptions<SessionConfiguration> sessionConfigurationOptions)
+
106 : base(ioManager, logger)
+
107 {
+
108 this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
+
109 ProcessExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
+
110 this.repositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
+
111 this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
+
112 this.httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));
+
113 GeneralConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
+
114 SessionConfiguration = sessionConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(sessionConfigurationOptions));
+
115 }
+
116
+
118 public override Task CleanCache(CancellationToken cancellationToken) => Task.CompletedTask;
+
119
+
121 public override IEngineInstallation CreateInstallation(EngineVersion version, string path, Task installationTask)
+
122 {
+
123 CheckVersionValidity(version);
+
124 GetExecutablePaths(path, out var serverExePath, out var compilerExePath);
+
125 return new OpenDreamInstallation(
+
126 new ResolvingIOManager(IOManager, path),
+
127 asyncDelayer,
+
128 httpClientFactory,
+
129 serverExePath,
+
130 compilerExePath,
+
131 installationTask,
+
132 version);
+
133 }
+
134
+
136 public override async ValueTask<IEngineInstallationData> DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
+
137 {
+
138 CheckVersionValidity(version);
+
139
+
140 // get a lock on a system wide OD repo
+
141 Logger.LogTrace("Cloning OD repo...");
+
142
+
143 var progressSection1 = jobProgressReporter?.CreateSection("Updating OpenDream git repository", 0.5f);
+
144
+
145 var repo = await repositoryManager.CloneRepository(
+
146 GeneralConfiguration.OpenDreamGitUrl,
+
147 null,
148 null,
149 null,
-
150 null,
-
151 progressSection1,
-
152 true,
-
153 cancellationToken);
-
154
-
155 try
-
156 {
-
157 if (repo == null)
-
158 {
-
159 Logger.LogTrace("OD repo seems to already exist, attempting load and fetch...");
-
160 repo = await repositoryManager.LoadRepository(cancellationToken);
-
161
-
162 await repo!.FetchOrigin(
-
163 progressSection1,
+
150 progressSection1,
+
151 true,
+
152 cancellationToken);
+
153
+
154 try
+
155 {
+
156 if (repo == null)
+
157 {
+
158 Logger.LogTrace("OD repo seems to already exist, attempting load and fetch...");
+
159 repo = await repositoryManager.LoadRepository(cancellationToken);
+
160
+
161 await repo!.FetchOrigin(
+
162 progressSection1,
+
163 null,
164 null,
-
165 null,
-
166 false,
-
167 cancellationToken);
-
168 }
-
169
-
170 var progressSection2 = jobProgressReporter?.CreateSection("Checking out OpenDream version", 0.5f);
-
171
-
172 var committish = version.SourceSHA
-
173 ?? $"{GeneralConfiguration.OpenDreamGitTagPrefix}{version.Version!.Semver()}";
-
174
-
175 await repo.CheckoutObject(
-
176 committish,
+
165 false,
+
166 cancellationToken);
+
167 }
+
168
+
169 var progressSection2 = jobProgressReporter?.CreateSection("Checking out OpenDream version", 0.5f);
+
170
+
171 var committish = version.SourceSHA
+
172 ?? $"{GeneralConfiguration.OpenDreamGitTagPrefix}{version.Version!.Semver()}";
+
173
+
174 await repo.CheckoutObject(
+
175 committish,
+
176 null,
177 null,
-
178 null,
-
179 true,
-
180 progressSection2,
-
181 cancellationToken);
-
182
-
183 if (!await repo.CommittishIsParent("tgs-min-compat", cancellationToken))
-
184 throw new JobException(ErrorCode.OpenDreamTooOld);
-
185
-
186 return new RepositoryEngineInstallationData(IOManager, repo, InstallationSourceSubDirectory);
-
187 }
-
188 catch
-
189 {
-
190 repo?.Dispose();
-
191 throw;
-
192 }
-
193 }
-
194
-
196 public override async ValueTask Install(EngineVersion version, string installPath, CancellationToken cancellationToken)
-
197 {
-
198 CheckVersionValidity(version);
-
199 ArgumentNullException.ThrowIfNull(installPath);
-
200 var sourcePath = IOManager.ConcatPath(installPath, InstallationSourceSubDirectory);
-
201
-
202 if (!await IOManager.DirectoryExists(sourcePath, cancellationToken))
-
203 {
-
204 // a zip install that didn't come from us?
-
205 // we want to use the bin dir, so put everything where we expect
-
206 Logger.LogDebug("Correcting extraction location...");
-
207 var dirsTask = IOManager.GetDirectories(installPath, cancellationToken);
-
208 var filesTask = IOManager.GetFiles(installPath, cancellationToken);
-
209 var dirCreateTask = IOManager.CreateDirectory(sourcePath, cancellationToken);
-
210
-
211 await Task.WhenAll(dirsTask, filesTask, dirCreateTask);
-
212
-
213 var dirsMoveTasks = dirsTask
-
214 .Result
-
215 .Select(
-
216 dirPath => IOManager.MoveDirectory(
-
217 dirPath,
-
218 IOManager.ConcatPath(
-
219 sourcePath,
-
220 IOManager.GetFileName(dirPath)),
-
221 cancellationToken));
-
222 var filesMoveTask = filesTask
-
223 .Result
-
224 .Select(
-
225 filePath => IOManager.MoveFile(
-
226 filePath,
-
227 IOManager.ConcatPath(
-
228 sourcePath,
-
229 IOManager.GetFileName(filePath)),
-
230 cancellationToken));
-
231
-
232 await Task.WhenAll(dirsMoveTasks.Concat(filesMoveTask));
-
233 }
-
234
-
235 var dotnetPaths = DotnetHelper.GetPotentialDotnetPaths(platformIdentifier.IsWindows)
-
236 .ToList();
-
237 var tasks = dotnetPaths
-
238 .Select(path => IOManager.FileExists(path, cancellationToken))
-
239 .ToList();
-
240
-
241 await Task.WhenAll(tasks);
-
242
-
243 var selectedPathIndex = tasks.FindIndex(pathValidTask => pathValidTask.Result);
-
244
-
245 if (selectedPathIndex == -1)
-
246 throw new JobException(ErrorCode.OpenDreamCantFindDotnet);
-
247
-
248 var dotnetPath = dotnetPaths[selectedPathIndex];
-
249
-
250 const string DeployDir = "tgs_deploy";
-
251 int? buildExitCode = null;
-
252 await HandleExtremelyLongPathOperation(
-
253 async shortenedPath =>
-
254 {
-
255 var shortenedDeployPath = IOManager.ConcatPath(shortenedPath, DeployDir);
-
256 await using var buildProcess = ProcessExecutor.LaunchProcess(
-
257 dotnetPath,
-
258 shortenedPath,
-
259 $"run -c Release --project OpenDreamPackageTool -- --tgs -o {shortenedDeployPath}",
-
260 null,
-
261 null,
-
262 !GeneralConfiguration.OpenDreamSuppressInstallOutput,
-
263 !GeneralConfiguration.OpenDreamSuppressInstallOutput);
-
264
-
265 if (SessionConfiguration.LowPriorityDeploymentProcesses)
-
266 buildProcess.AdjustPriority(false);
-
267
-
268 using (cancellationToken.Register(() => buildProcess.Terminate()))
-
269 buildExitCode = await buildProcess.Lifetime;
-
270
-
271 string? output;
-
272 if (!GeneralConfiguration.OpenDreamSuppressInstallOutput)
-
273 {
-
274 var buildOutputTask = buildProcess.GetCombinedOutput(cancellationToken);
-
275 if (!buildOutputTask.IsCompleted)
-
276 Logger.LogTrace("OD build complete, waiting for output...");
-
277 output = await buildOutputTask;
-
278 }
-
279 else
-
280 output = "<Build output suppressed by configuration due to not being immediately available>";
+
178 true,
+
179 progressSection2,
+
180 cancellationToken);
+
181
+
182 if (!await repo.CommittishIsParent("tgs-min-compat", cancellationToken))
+
183 throw new JobException(ErrorCode.OpenDreamTooOld);
+
184
+
185 return new RepositoryEngineInstallationData(IOManager, repo, InstallationSourceSubDirectory);
+
186 }
+
187 catch
+
188 {
+
189 repo?.Dispose();
+
190 throw;
+
191 }
+
192 }
+
193
+
195 public override async ValueTask Install(EngineVersion version, string installPath, bool deploymentPipelineProcesses, CancellationToken cancellationToken)
+
196 {
+
197 CheckVersionValidity(version);
+
198 ArgumentNullException.ThrowIfNull(installPath);
+
199 var sourcePath = IOManager.ConcatPath(installPath, InstallationSourceSubDirectory);
+
200
+
201 if (!await IOManager.DirectoryExists(sourcePath, cancellationToken))
+
202 {
+
203 // a zip install that didn't come from us?
+
204 // we want to use the bin dir, so put everything where we expect
+
205 Logger.LogDebug("Correcting extraction location...");
+
206 var dirsTask = IOManager.GetDirectories(installPath, cancellationToken);
+
207 var filesTask = IOManager.GetFiles(installPath, cancellationToken);
+
208 var dirCreateTask = IOManager.CreateDirectory(sourcePath, cancellationToken);
+
209
+
210 await Task.WhenAll(dirsTask, filesTask, dirCreateTask);
+
211
+
212 var dirsMoveTasks = dirsTask
+
213 .Result
+
214 .Select(
+
215 dirPath => IOManager.MoveDirectory(
+
216 dirPath,
+
217 IOManager.ConcatPath(
+
218 sourcePath,
+
219 IOManager.GetFileName(dirPath)),
+
220 cancellationToken));
+
221 var filesMoveTask = filesTask
+
222 .Result
+
223 .Select(
+
224 filePath => IOManager.MoveFile(
+
225 filePath,
+
226 IOManager.ConcatPath(
+
227 sourcePath,
+
228 IOManager.GetFileName(filePath)),
+
229 cancellationToken));
+
230
+
231 await Task.WhenAll(dirsMoveTasks.Concat(filesMoveTask));
+
232 }
+
233
+
234 var dotnetPath = await DotnetHelper.GetDotnetPath(platformIdentifier, IOManager, cancellationToken);
+
235 if (dotnetPath == null)
+
236 throw new JobException(ErrorCode.OpenDreamCantFindDotnet);
+
237
+
238 const string DeployDir = "tgs_deploy";
+
239 int? buildExitCode = null;
+
240 await HandleExtremelyLongPathOperation(
+
241 async shortenedPath =>
+
242 {
+
243 var shortenedDeployPath = IOManager.ConcatPath(shortenedPath, DeployDir);
+
244 await using var buildProcess = ProcessExecutor.LaunchProcess(
+
245 dotnetPath,
+
246 shortenedPath,
+
247 $"run -c Release --project OpenDreamPackageTool -- --tgs -o {shortenedDeployPath}",
+
248 null,
+
249 null,
+
250 !GeneralConfiguration.OpenDreamSuppressInstallOutput,
+
251 !GeneralConfiguration.OpenDreamSuppressInstallOutput);
+
252
+
253 if (deploymentPipelineProcesses && SessionConfiguration.LowPriorityDeploymentProcesses)
+
254 buildProcess.AdjustPriority(false);
+
255
+
256 using (cancellationToken.Register(() => buildProcess.Terminate()))
+
257 buildExitCode = await buildProcess.Lifetime;
+
258
+
259 string? output;
+
260 if (!GeneralConfiguration.OpenDreamSuppressInstallOutput)
+
261 {
+
262 var buildOutputTask = buildProcess.GetCombinedOutput(cancellationToken);
+
263 if (!buildOutputTask.IsCompleted)
+
264 Logger.LogTrace("OD build complete, waiting for output...");
+
265 output = await buildOutputTask;
+
266 }
+
267 else
+
268 output = "<Build output suppressed by configuration due to not being immediately available>";
+
269
+
270 Logger.LogDebug(
+
271 "OpenDream build exited with code {exitCode}:{newLine}{output}",
+
272 buildExitCode,
+
273 Environment.NewLine,
+
274 output);
+
275 },
+
276 sourcePath,
+
277 cancellationToken);
+
278
+
279 if (buildExitCode != 0)
+
280 throw new JobException("OpenDream build failed!");
281
-
282 Logger.LogDebug(
-
283 "OpenDream build exited with code {exitCode}:{newLine}{output}",
-
284 buildExitCode,
-
285 Environment.NewLine,
-
286 output);
-
287 },
-
288 sourcePath,
-
289 cancellationToken);
-
290
-
291 if (buildExitCode != 0)
-
292 throw new JobException("OpenDream build failed!");
-
293
-
294 var deployPath = IOManager.ConcatPath(sourcePath, DeployDir);
-
295 async ValueTask MoveDirs()
-
296 {
-
297 var dirs = await IOManager.GetDirectories(deployPath, cancellationToken);
-
298 await Task.WhenAll(
-
299 dirs.Select(
-
300 dir => IOManager.MoveDirectory(
-
301 dir,
-
302 IOManager.ConcatPath(
-
303 installPath,
-
304 IOManager.GetFileName(dir)),
-
305 cancellationToken)));
-
306 }
-
307
-
308 async ValueTask MoveFiles()
-
309 {
-
310 var files = await IOManager.GetFiles(deployPath, cancellationToken);
-
311 await Task.WhenAll(
-
312 files.Select(
-
313 file => IOManager.MoveFile(
-
314 file,
-
315 IOManager.ConcatPath(
-
316 installPath,
-
317 IOManager.GetFileName(file)),
-
318 cancellationToken)));
-
319 }
-
320
-
321 var dirsMoveTask = MoveDirs();
-
322 var outputFilesMoveTask = MoveFiles();
-
323 await ValueTaskExtensions.WhenAll(dirsMoveTask, outputFilesMoveTask);
-
324 await IOManager.DeleteDirectory(sourcePath, cancellationToken);
-
325 }
-
326
-
328 public override ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken)
-
329 {
-
330 CheckVersionValidity(version);
-
331 ArgumentNullException.ThrowIfNull(path);
-
332 return ValueTask.CompletedTask;
-
333 }
-
334
-
336 public override ValueTask TrustDmbPath(EngineVersion engineVersion, string fullDmbPath, CancellationToken cancellationToken)
-
337 {
-
338 ArgumentNullException.ThrowIfNull(engineVersion);
-
339 ArgumentNullException.ThrowIfNull(fullDmbPath);
-
340
-
341 Logger.LogTrace("TrustDmbPath is a no-op: {path}", fullDmbPath);
-
342 return ValueTask.CompletedTask;
-
343 }
-
344
-
352 protected virtual ValueTask HandleExtremelyLongPathOperation(
-
353 Func<string, ValueTask> shortenedPathOperation,
-
354 string originalPath,
-
355 CancellationToken cancellationToken)
-
356 => shortenedPathOperation(originalPath); // based god linux has no such weakness
+
282 var deployPath = IOManager.ConcatPath(sourcePath, DeployDir);
+
283 async ValueTask MoveDirs()
+
284 {
+
285 var dirs = await IOManager.GetDirectories(deployPath, cancellationToken);
+
286 await Task.WhenAll(
+
287 dirs.Select(
+
288 dir => IOManager.MoveDirectory(
+
289 dir,
+
290 IOManager.ConcatPath(
+
291 installPath,
+
292 IOManager.GetFileName(dir)),
+
293 cancellationToken)));
+
294 }
+
295
+
296 async ValueTask MoveFiles()
+
297 {
+
298 var files = await IOManager.GetFiles(deployPath, cancellationToken);
+
299 await Task.WhenAll(
+
300 files.Select(
+
301 file => IOManager.MoveFile(
+
302 file,
+
303 IOManager.ConcatPath(
+
304 installPath,
+
305 IOManager.GetFileName(file)),
+
306 cancellationToken)));
+
307 }
+
308
+
309 var dirsMoveTask = MoveDirs();
+
310 var outputFilesMoveTask = MoveFiles();
+
311 await ValueTaskExtensions.WhenAll(dirsMoveTask, outputFilesMoveTask);
+
312 await IOManager.DeleteDirectory(sourcePath, cancellationToken);
+
313 }
+
314
+
316 public override ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken)
+
317 {
+
318 CheckVersionValidity(version);
+
319 ArgumentNullException.ThrowIfNull(path);
+
320 return ValueTask.CompletedTask;
+
321 }
+
322
+
324 public override ValueTask TrustDmbPath(EngineVersion engineVersion, string fullDmbPath, CancellationToken cancellationToken)
+
325 {
+
326 ArgumentNullException.ThrowIfNull(engineVersion);
+
327 ArgumentNullException.ThrowIfNull(fullDmbPath);
+
328
+
329 Logger.LogTrace("TrustDmbPath is a no-op: {path}", fullDmbPath);
+
330 return ValueTask.CompletedTask;
+
331 }
+
332
+
340 protected virtual ValueTask HandleExtremelyLongPathOperation(
+
341 Func<string, ValueTask> shortenedPathOperation,
+
342 string originalPath,
+
343 CancellationToken cancellationToken)
+
344 => shortenedPathOperation(originalPath); // based god linux has no such weakness
+
345
+
352 protected void GetExecutablePaths(string installationPath, out string serverExePath, out string compilerExePath)
+
353 {
+
354 var exeExtension = platformIdentifier.IsWindows
+
355 ? ".exe"
+
356 : String.Empty;
357
-
364 protected void GetExecutablePaths(string installationPath, out string serverExePath, out string compilerExePath)
-
365 {
-
366 var exeExtension = platformIdentifier.IsWindows
-
367 ? ".exe"
-
368 : String.Empty;
-
369
-
370 serverExePath = IOManager.ConcatPath(
-
371 installationPath,
-
372 BinDir,
-
373 ServerDir,
-
374 $"Robust.Server{exeExtension}");
-
375
-
376 compilerExePath = IOManager.ConcatPath(
-
377 installationPath,
-
378 BinDir,
-
379 InstallationCompilerDirectory,
-
380 $"DMCompiler{exeExtension}");
-
381 }
-
382 }
-
383}
+
358 serverExePath = IOManager.ConcatPath(
+
359 installationPath,
+
360 BinDir,
+
361 ServerDir,
+
362 $"Robust.Server{exeExtension}");
+
363
+
364 compilerExePath = IOManager.ConcatPath(
+
365 installationPath,
+
366 BinDir,
+
367 InstallationCompilerDirectory,
+
368 $"DMCompiler{exeExtension}");
+
369 }
+
370 }
+
371}
Tgstation.Server.Api.Models.EngineVersion
Information about an engine installation.
Definition: EngineVersion.cs:14
Tgstation.Server.Common.Extensions.ValueTaskExtensions
Extension methods for the ValueTask and ValueTask<TResult> classes.
Definition: ValueTaskExtensions.cs:12
Tgstation.Server.Common.Extensions.ValueTaskExtensions.WhenAll
static async ValueTask WhenAll(IEnumerable< ValueTask > tasks)
Fully await a given list of tasks .
Definition: ValueTaskExtensions.cs:99
@@ -400,25 +388,25 @@ $(function() {
Tgstation.Server.Host.Components.Engine.EngineInstallerBase.IOManager
IIOManager IOManager
Gets the IIOManager for the EngineInstallerBase.
Definition: EngineInstallerBase.cs:24
Tgstation.Server.Host.Components.Engine.EngineInstallerBase.Logger
ILogger< EngineInstallerBase > Logger
Gets the ILogger for the EngineInstallerBase.
Definition: EngineInstallerBase.cs:29
Tgstation.Server.Host.Components.Engine.OpenDreamInstallation
Implementation of IEngineInstallation for EngineType.OpenDream.
Definition: OpenDreamInstallation.cs:28
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller
Implementation of IEngineInstaller for EngineType.OpenDream.
Definition: OpenDreamInstaller.cs:26
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.GetExecutablePaths
void GetExecutablePaths(string installationPath, out string serverExePath, out string compilerExePath)
Gets the paths to the server and client executables.
Definition: OpenDreamInstaller.cs:364
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.httpClientFactory
readonly IAbstractHttpClientFactory httpClientFactory
The IAbstractHttpClientFactory for the OpenDreamInstaller.
Definition: OpenDreamInstaller.cs:83
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.TargetEngineType
override EngineType TargetEngineType
Definition: OpenDreamInstaller.cs:48
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.platformIdentifier
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the OpenDreamInstaller.
Definition: OpenDreamInstaller.cs:68
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.repositoryManager
readonly IRepositoryManager repositoryManager
The IRepositoryManager for the OpenDream repository.
Definition: OpenDreamInstaller.cs:73
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.Install
override async ValueTask Install(EngineVersion version, string installPath, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working. A ValueTask representing the running...
Definition: OpenDreamInstaller.cs:196
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.DownloadVersion
override async ValueTask< IEngineInstallationData > DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
Download a given engine version . A ValueTask<TResult> resulting in the IEngineInstallationData for t...
Definition: OpenDreamInstaller.cs:137
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.TrustDmbPath
override ValueTask TrustDmbPath(EngineVersion engineVersion, string fullDmbPath, CancellationToken cancellationToken)
Add a given fullDmbPath to the trusted DMBs list in BYOND's config. A ValueTask representing the run...
Definition: OpenDreamInstaller.cs:336
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.ServerDir
const string ServerDir
The OD server directory name.
Definition: OpenDreamInstaller.cs:35
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.CreateInstallation
override IEngineInstallation CreateInstallation(EngineVersion version, string path, Task installationTask)
Creates an IEngineInstallation for a given version . The IEngineInstallation.
Definition: OpenDreamInstaller.cs:122
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller
Implementation of IEngineInstaller for EngineType.OpenDream.
Definition: OpenDreamInstaller.cs:25
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.GetExecutablePaths
void GetExecutablePaths(string installationPath, out string serverExePath, out string compilerExePath)
Gets the paths to the server and client executables.
Definition: OpenDreamInstaller.cs:352
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.httpClientFactory
readonly IAbstractHttpClientFactory httpClientFactory
The IAbstractHttpClientFactory for the OpenDreamInstaller.
Definition: OpenDreamInstaller.cs:82
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.TargetEngineType
override EngineType TargetEngineType
Definition: OpenDreamInstaller.cs:47
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.platformIdentifier
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the OpenDreamInstaller.
Definition: OpenDreamInstaller.cs:67
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.repositoryManager
readonly IRepositoryManager repositoryManager
The IRepositoryManager for the OpenDream repository.
Definition: OpenDreamInstaller.cs:72
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.Install
override async ValueTask Install(EngineVersion version, string installPath, bool deploymentPipelineProcesses, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working. A ValueTask representing the running...
Definition: OpenDreamInstaller.cs:195
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.DownloadVersion
override async ValueTask< IEngineInstallationData > DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
Download a given engine version . A ValueTask<TResult> resulting in the IEngineInstallationData for t...
Definition: OpenDreamInstaller.cs:136
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.TrustDmbPath
override ValueTask TrustDmbPath(EngineVersion engineVersion, string fullDmbPath, CancellationToken cancellationToken)
Add a given fullDmbPath to the trusted DMBs list in BYOND's config. A ValueTask representing the run...
Definition: OpenDreamInstaller.cs:324
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.ServerDir
const string ServerDir
The OD server directory name.
Definition: OpenDreamInstaller.cs:34
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.CreateInstallation
override IEngineInstallation CreateInstallation(EngineVersion version, string path, Task installationTask)
Creates an IEngineInstallation for a given version . The IEngineInstallation.
Definition: OpenDreamInstaller.cs:121
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.CleanCache
override Task CleanCache(CancellationToken cancellationToken)
Attempts to cleans the engine's cache folder for the system. A Task representing the running operatio...
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.OpenDreamInstaller
OpenDreamInstaller(IIOManager ioManager, ILogger< OpenDreamInstaller > logger, IPlatformIdentifier platformIdentifier, IProcessExecutor processExecutor, IRepositoryManager repositoryManager, IAsyncDelayer asyncDelayer, IAbstractHttpClientFactory httpClientFactory, IOptions< GeneralConfiguration > generalConfigurationOptions, IOptions< SessionConfiguration > sessionConfigurationOptions)
Initializes a new instance of the OpenDreamInstaller class.
Definition: OpenDreamInstaller.cs:97
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.InstallationCompilerDirectory
const string InstallationCompilerDirectory
The name of the subdirectory in an installation's BinDir used to store the compiler binaries.
Definition: OpenDreamInstaller.cs:40
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.InstallationSourceSubDirectory
const string InstallationSourceSubDirectory
The name of the subdirectory used for the RepositoryEngineInstallationData's copy.
Definition: OpenDreamInstaller.cs:45
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.UpgradeInstallation
override ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get upgrade a version installed by a previous version of TGS....
Definition: OpenDreamInstaller.cs:328
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.asyncDelayer
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the OpenDreamInstaller.
Definition: OpenDreamInstaller.cs:78
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.OpenDreamInstaller
OpenDreamInstaller(IIOManager ioManager, ILogger< OpenDreamInstaller > logger, IPlatformIdentifier platformIdentifier, IProcessExecutor processExecutor, IRepositoryManager repositoryManager, IAsyncDelayer asyncDelayer, IAbstractHttpClientFactory httpClientFactory, IOptions< GeneralConfiguration > generalConfigurationOptions, IOptions< SessionConfiguration > sessionConfigurationOptions)
Initializes a new instance of the OpenDreamInstaller class.
Definition: OpenDreamInstaller.cs:96
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.InstallationCompilerDirectory
const string InstallationCompilerDirectory
The name of the subdirectory in an installation's BinDir used to store the compiler binaries.
Definition: OpenDreamInstaller.cs:39
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.InstallationSourceSubDirectory
const string InstallationSourceSubDirectory
The name of the subdirectory used for the RepositoryEngineInstallationData's copy.
Definition: OpenDreamInstaller.cs:44
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.UpgradeInstallation
override ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get upgrade a version installed by a previous version of TGS....
Definition: OpenDreamInstaller.cs:316
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.asyncDelayer
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the OpenDreamInstaller.
Definition: OpenDreamInstaller.cs:77
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.HandleExtremelyLongPathOperation
virtual ValueTask HandleExtremelyLongPathOperation(Func< string, ValueTask > shortenedPathOperation, string originalPath, CancellationToken cancellationToken)
Perform an operation on a very long path.
-
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.BinDir
const string BinDir
The bin directory name.
Definition: OpenDreamInstaller.cs:30
+
Tgstation.Server.Host.Components.Engine.OpenDreamInstaller.BinDir
const string BinDir
The bin directory name.
Definition: OpenDreamInstaller.cs:29
Tgstation.Server.Host.Components.Engine.RepositoryEngineInstallationData
Implementation of IEngineInstallationData using a IRepository.
Definition: RepositoryEngineInstallationData.cs:14
Tgstation.Server.Host.Configuration.GeneralConfiguration
General configuration options.
Definition: GeneralConfiguration.cs:20
Tgstation.Server.Host.Configuration.GeneralConfiguration.OpenDreamSuppressInstallOutput
bool OpenDreamSuppressInstallOutput
If the dotnet output of creating an OpenDream installation should be suppressed. Known to cause issue...
Definition: GeneralConfiguration.cs:151
@@ -429,6 +417,8 @@ $(function() {
Tgstation.Server.Host.Jobs.JobException
Operation exceptions thrown from the context of a Models.Job.
Definition: JobException.cs:11
Tgstation.Server.Host.Jobs.JobProgressReporter
Progress reporter for a Job.
Definition: JobProgressReporter.cs:13
Tgstation.Server.Host.Jobs.JobProgressReporter.CreateSection
JobProgressReporter CreateSection(string? newStageName, double percentage)
Create a subsection of the JobProgressReporter with its optional own stage name.
Definition: JobProgressReporter.cs:100
+
Tgstation.Server.Host.System.DotnetHelper
Helper methods for working with the dotnet executable.
Definition: DotnetHelper.cs:14
+
Tgstation.Server.Host.System.DotnetHelper.GetDotnetPath
static async ValueTask< string?> GetDotnetPath(IPlatformIdentifier platformIdentifier, IIOManager ioManager, CancellationToken cancellationToken)
Locate a dotnet executable to use.
Definition: DotnetHelper.cs:22
Tgstation.Server.Host.System.ProcessExecutor
Definition: ProcessExecutor.cs:19
Tgstation.Server.Host.System.ProcessExecutor.LaunchProcess
IProcess LaunchProcess(string fileName, string workingDirectory, string arguments, IReadOnlyDictionary< string, string >? environment, string? fileRedirect, bool readStandardHandles, bool noShellExecute)
Launch a IProcess. The new IProcess.
Definition: ProcessExecutor.cs:108
Tgstation.Server.Common.Http.IAbstractHttpClientFactory
Creates IHttpClients.
Definition: IAbstractHttpClientFactory.cs:7
@@ -444,11 +434,9 @@ $(function() {
Tgstation.Server.Host.IO.IIOManager.GetDirectories
Task< IReadOnlyList< string > > GetDirectories(string path, CancellationToken cancellationToken)
Returns full directory names in a given path .
Tgstation.Server.Host.IO.IIOManager.CreateDirectory
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path .
Tgstation.Server.Host.IO.IIOManager.DeleteDirectory
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory, removes and does not enter any symlinks encounterd.
-
Tgstation.Server.Host.IO.IIOManager.FileExists
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists.
Tgstation.Server.Host.IO.IIOManager.MoveDirectory
Task MoveDirectory(string source, string destination, CancellationToken cancellationToken)
Moves a directory at source to destination .
Tgstation.Server.Host.IO.IIOManager.DirectoryExists
Task< bool > DirectoryExists(string path, CancellationToken cancellationToken)
Check that the directory at path exists.
Tgstation.Server.Host.System.IPlatformIdentifier
For identifying the current platform.
Definition: IPlatformIdentifier.cs:9
-
Tgstation.Server.Host.System.IPlatformIdentifier.IsWindows
bool IsWindows
If the current platform is a Windows platform.
Definition: IPlatformIdentifier.cs:14
Tgstation.Server.Host.System.IProcessBase.AdjustPriority
void AdjustPriority(bool higher)
Set's the owned global::System.Diagnostics.Process.PriorityClass to a non-normal value.
Tgstation.Server.Host.System.IProcessExecutor
For launching IProcess'.
Definition: IProcessExecutor.cs:9
Tgstation.Server.Host.Utils.IAsyncDelayer
For waiting asynchronously.
Definition: IAsyncDelayer.cs:11
@@ -457,7 +445,6 @@ $(function() {
Tgstation.Server.Api.Models.EngineType
EngineType
The type of engine the codebase is using.
Definition: EngineType.cs:7
Tgstation.Server.Common.Extensions
Definition: ValueTaskExtensions.cs:7
Tgstation.Server.Common.Http
Definition: CachedResponseStream.cs:7
-
Tgstation.Server.Host.Common
Definition: DotnetHelper.cs:9
Tgstation.Server.Host.Components.Engine
Definition: ByondInstallation.cs:12
Tgstation.Server.Host.Components.Repository
Definition: DefaultGitRemoteFeatures.cs:8
Tgstation.Server.Host.Configuration
Definition: ControlPanelConfiguration.cs:4
diff --git a/_pipe_commands_8cs_source.html b/_pipe_commands_8cs_source.html index bc95f9fbb9..79d44615c5 100644 --- a/_pipe_commands_8cs_source.html +++ b/_pipe_commands_8cs_source.html @@ -115,7 +115,7 @@ $(function() {
Tgstation.Server.Host.Common.PipeCommands.CommandStop
const string CommandStop
Stops the server ASAP, shutting down any running instances.
Definition: PipeCommands.cs:11
Tgstation.Server.Host.Common.PipeCommands.CommandGracefulShutdown
const string CommandGracefulShutdown
Stops the server eventually, waiting for the games in any running instances to reboot.
Definition: PipeCommands.cs:16
Tgstation.Server.Host.Common.PipeCommands.CommandStartupComplete
const string CommandStartupComplete
Indicates that the host has finished initializing.
Definition: PipeCommands.cs:26
-
Tgstation.Server.Host.Common
Definition: DotnetHelper.cs:9
+
Tgstation.Server.Host.Common
Definition: DotnetHelper.cs:9