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