diff --git a/build/Version.props b/build/Version.props index dc72d597a5..5e8bc3e55f 100644 --- a/build/Version.props +++ b/build/Version.props @@ -8,7 +8,7 @@ 9.0.1 9.0.0 10.0.0 - 6.0.3 + 6.0.4 5.3.0 1.1.1 1.2.0 diff --git a/src/DMAPI/tgs.dm b/src/DMAPI/tgs.dm index af09ab6711..24efe11b90 100644 --- a/src/DMAPI/tgs.dm +++ b/src/DMAPI/tgs.dm @@ -102,6 +102,8 @@ // #define TGS_EVENT_WORLD_REBOOT 20 /// Watchdog event when TgsInitializationComplete() is called. No parameters. #define TGS_EVENT_WORLD_PRIME 21 +// DMAPI also doesnt implement this +// #define TGS_EVENT_WATCHEDOG_LAUNCH_SUCCESS 22 // OTHER ENUMS diff --git a/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs b/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs index a028bc497d..78c1f8843a 100644 --- a/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs +++ b/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs @@ -230,7 +230,7 @@ namespace Tgstation.Server.Host.Components.Deployment ApiValidationStatus validationStatus; using (var provider = new TemporaryDmbProvider(ioManager.ResolvePath(job.DirectoryName.ToString()), String.Concat(job.DmeName, DmbExtension), job)) - await using (var controller = await sessionControllerFactory.LaunchNew(provider, byondLock, launchParameters, true, cancellationToken).ConfigureAwait(false)) + await using (var controller = await sessionControllerFactory.LaunchNew(provider, byondLock, launchParameters, true, false, cancellationToken).ConfigureAwait(false)) { var launchResult = await controller.LaunchResult.ConfigureAwait(false); diff --git a/src/Tgstation.Server.Host/Components/Events/EventType.cs b/src/Tgstation.Server.Host/Components/Events/EventType.cs index 5de479b2a6..c6697b233f 100644 --- a/src/Tgstation.Server.Host/Components/Events/EventType.cs +++ b/src/Tgstation.Server.Host/Components/Events/EventType.cs @@ -137,5 +137,11 @@ namespace Tgstation.Server.Host.Components.Events /// [EventScript("WorldPrime")] WorldPrime, + + /// + /// After the watchdog has launched successfully. Parameters: PID of DreamDaemon + /// + [EventScript("WatchdogSuccessfulLaunch")] + WatchdogSuccessfulLaunch, } } diff --git a/src/Tgstation.Server.Host/Components/InstanceFactory.cs b/src/Tgstation.Server.Host/Components/InstanceFactory.cs index e2c0a5afda..1c93991629 100644 --- a/src/Tgstation.Server.Host/Components/InstanceFactory.cs +++ b/src/Tgstation.Server.Host/Components/InstanceFactory.cs @@ -273,7 +273,8 @@ namespace Tgstation.Server.Host.Components serverPortProvider, loggerFactory, loggerFactory.CreateLogger(), - metadata); + metadata, + eventConsumer); var dmbFactory = new DmbFactory( databaseContextFactory, diff --git a/src/Tgstation.Server.Host/Components/Session/ISessionControllerFactory.cs b/src/Tgstation.Server.Host/Components/Session/ISessionControllerFactory.cs index 89a7e3d4aa..27dd2b0a70 100644 --- a/src/Tgstation.Server.Host/Components/Session/ISessionControllerFactory.cs +++ b/src/Tgstation.Server.Host/Components/Session/ISessionControllerFactory.cs @@ -1,4 +1,4 @@ -using System.Threading; +using System.Threading; using System.Threading.Tasks; using Tgstation.Server.Api.Models.Internal; using Tgstation.Server.Host.Components.Byond; @@ -18,6 +18,7 @@ namespace Tgstation.Server.Host.Components.Session /// The current if any /// The to use. will be updated with the minumum required security level for the launch. /// If the should only validate the DMAPI then exit + /// If the is starting a production DD and not a staging DD /// The for the operation /// A resulting in a new Task LaunchNew( @@ -25,6 +26,7 @@ namespace Tgstation.Server.Host.Components.Session IByondExecutableLock currentByondLock, DreamDaemonLaunchParameters launchParameters, bool apiValidate, + bool isProduction, CancellationToken cancellationToken); /// diff --git a/src/Tgstation.Server.Host/Components/Session/SessionControllerFactory.cs b/src/Tgstation.Server.Host/Components/Session/SessionControllerFactory.cs index 1cc3960a7a..52d040227f 100644 --- a/src/Tgstation.Server.Host/Components/Session/SessionControllerFactory.cs +++ b/src/Tgstation.Server.Host/Components/Session/SessionControllerFactory.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.Logging; using System; +using System.Collections.Generic; using System.Globalization; using System.Net.Sockets; using System.Text; @@ -11,6 +12,7 @@ using Tgstation.Server.Api.Models.Internal; using Tgstation.Server.Host.Components.Byond; using Tgstation.Server.Host.Components.Chat; using Tgstation.Server.Host.Components.Deployment; +using Tgstation.Server.Host.Components.Events; using Tgstation.Server.Host.Components.Interop; using Tgstation.Server.Host.Components.Interop.Bridge; using Tgstation.Server.Host.Core; @@ -95,6 +97,11 @@ namespace Tgstation.Server.Host.Components.Session /// readonly Api.Models.Instance instance; + /// + /// The for the + /// + private IEventConsumer EventConsumer { get; } + /// /// Change a given into the appropriate DreamDaemon command line word /// @@ -145,6 +152,7 @@ namespace Tgstation.Server.Host.Components.Session /// The value of . /// The value of /// The value of . + /// The value of . public SessionControllerFactory( IProcessExecutor processExecutor, IByondManager byond, @@ -159,7 +167,8 @@ namespace Tgstation.Server.Host.Components.Session IServerPortProvider serverPortProvider, ILoggerFactory loggerFactory, ILogger logger, - Api.Models.Instance instance) + Api.Models.Instance instance, + EventConsumer eventConsumer) { this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor)); this.byond = byond ?? throw new ArgumentNullException(nameof(byond)); @@ -175,6 +184,7 @@ namespace Tgstation.Server.Host.Components.Session this.serverPortProvider = serverPortProvider ?? throw new ArgumentNullException(nameof(serverPortProvider)); this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory)); this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); + EventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer)); } /// @@ -184,6 +194,7 @@ namespace Tgstation.Server.Host.Components.Session IByondExecutableLock currentByondLock, DreamDaemonLaunchParameters launchParameters, bool apiValidate, + bool isProduction, CancellationToken cancellationToken) { logger.LogTrace("Begin session launch..."); @@ -266,6 +277,14 @@ namespace Tgstation.Server.Host.Components.Session noShellExecute, noShellExecute: noShellExecute); + // If this isnt a staging DD (Deployment DD), fire off an event + if(isProduction) { + await EventConsumer.HandleEvent(EventType.WatchdogSuccessfulLaunch, new List + { + process.Id.ToString(CultureInfo.InvariantCulture) + }, cancellationToken).ConfigureAwait(false); + } + async Task GetDDOutput() { // DCT x2: None available diff --git a/src/Tgstation.Server.Host/Components/Watchdog/BasicWatchdog.cs b/src/Tgstation.Server.Host/Components/Watchdog/BasicWatchdog.cs index 3cddd03a02..3bc88c2f5c 100644 --- a/src/Tgstation.Server.Host/Components/Watchdog/BasicWatchdog.cs +++ b/src/Tgstation.Server.Host/Components/Watchdog/BasicWatchdog.cs @@ -210,6 +210,7 @@ namespace Tgstation.Server.Host.Components.Watchdog null, ActiveLaunchParameters, false, + true, cancellationToken); } else