diff --git a/src/Tgstation.Server.Host/Components/Chat/Chat.cs b/src/Tgstation.Server.Host/Components/Chat/Chat.cs
index de28124c76..b4d68b1139 100644
--- a/src/Tgstation.Server.Host/Components/Chat/Chat.cs
+++ b/src/Tgstation.Server.Host/Components/Chat/Chat.cs
@@ -39,6 +39,11 @@ namespace Tgstation.Server.Host.Components.Chat
///
readonly IRestartRegistration restartRegistration;
+ ///
+ /// The for the
+ ///
+ readonly IAsyncDelayer asyncDelayer;
+
///
/// The for the
///
@@ -109,18 +114,20 @@ namespace Tgstation.Server.Host.Components.Chat
///
/// The value of
/// The value of
- /// The value of
- /// The value of
/// The value of
/// The to populate with
+ /// The value of
+ /// The value of
+ /// The value of
/// The used to populate
- public Chat(IProviderFactory providerFactory, IIOManager ioManager, ICommandFactory commandFactory, IServerControl serverControl, ILoggerFactory loggerFactory, ILogger logger, IEnumerable initialChatBots)
+ public Chat(IProviderFactory providerFactory, IIOManager ioManager, ICommandFactory commandFactory, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILoggerFactory loggerFactory, ILogger logger, IEnumerable initialChatBots)
{
this.providerFactory = providerFactory ?? throw new ArgumentNullException(nameof(providerFactory));
this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
this.commandFactory = commandFactory ?? throw new ArgumentNullException(nameof(commandFactory));
if (serverControl == null)
throw new ArgumentNullException(nameof(serverControl));
+ this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
this.initialChatBots = initialChatBots?.ToList() ?? throw new ArgumentNullException(nameof(initialChatBots));
@@ -344,7 +351,7 @@ namespace Tgstation.Server.Host.Components.Chat
if (messageTasks.Count == 0)
{
- await Task.Delay(1000, cancellationToken).ConfigureAwait(false);
+ await asyncDelayer.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
continue;
}
diff --git a/src/Tgstation.Server.Host/Components/Chat/ChatFactory.cs b/src/Tgstation.Server.Host/Components/Chat/ChatFactory.cs
index 28e1323dde..15d353e644 100644
--- a/src/Tgstation.Server.Host/Components/Chat/ChatFactory.cs
+++ b/src/Tgstation.Server.Host/Components/Chat/ChatFactory.cs
@@ -25,20 +25,27 @@ namespace Tgstation.Server.Host.Components.Chat
///
readonly IServerControl serverControl;
+ ///
+ /// The for the
+ ///
+ readonly IAsyncDelayer asyncDelayer;
+
///
/// Construct a
///
- /// The value of
/// The value of
/// The value of
- public ChatFactory(ILoggerFactory loggerFactory, IProviderFactory providerFactory, IServerControl serverControl)
+ /// The value of
+ /// The value of
+ public ChatFactory(IProviderFactory providerFactory, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILoggerFactory loggerFactory)
{
- this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
this.providerFactory = providerFactory ?? throw new ArgumentNullException(nameof(providerFactory));
this.serverControl = serverControl ?? throw new ArgumentNullException(nameof(serverControl));
+ this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
+ this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
}
///
- public IChat CreateChat(IIOManager ioManager, ICommandFactory commandFactory, IEnumerable initialChatBots) => new Chat(providerFactory, ioManager, commandFactory, serverControl, loggerFactory, loggerFactory.CreateLogger(), initialChatBots);
+ public IChat CreateChat(IIOManager ioManager, ICommandFactory commandFactory, IEnumerable initialChatBots) => new Chat(providerFactory, ioManager, commandFactory, serverControl, asyncDelayer, loggerFactory, loggerFactory.CreateLogger(), initialChatBots);
}
}
diff --git a/src/Tgstation.Server.Host/Components/Chat/ProviderFactory.cs b/src/Tgstation.Server.Host/Components/Chat/ProviderFactory.cs
index aee9d43965..14df6b306c 100644
--- a/src/Tgstation.Server.Host/Components/Chat/ProviderFactory.cs
+++ b/src/Tgstation.Server.Host/Components/Chat/ProviderFactory.cs
@@ -11,24 +11,31 @@ namespace Tgstation.Server.Host.Components.Chat
///
sealed class ProviderFactory : IProviderFactory
{
- ///
- /// The for the
- ///
- readonly ILoggerFactory loggerFactory;
-
///
/// The for the
///
readonly IApplication application;
+ ///
+ /// The for the
+ ///
+ readonly IAsyncDelayer asyncDelayer;
+
+ ///
+ /// The for the
+ ///
+ readonly ILoggerFactory loggerFactory;
+
///
/// Construct a
///
- /// The value of
/// The value of
- public ProviderFactory(ILoggerFactory loggerFactory, IApplication application)
+ /// The value of
+ /// The value of
+ public ProviderFactory(IApplication application, IAsyncDelayer asyncDelayer, ILoggerFactory loggerFactory)
{
this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
+ this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
this.application = application ?? throw new ArgumentNullException(nameof(application));
}
@@ -44,7 +51,7 @@ namespace Tgstation.Server.Host.Components.Chat
{
case ChatProvider.Irc:
var ircBuilder = (IrcConnectionStringBuilder)builder;
- return new IrcProvider(loggerFactory.CreateLogger(), application, ircBuilder.Address, ircBuilder.Port.Value, ircBuilder.Nickname, ircBuilder.Password, ircBuilder.PasswordType, ircBuilder.UseSsl.Value);
+ return new IrcProvider(application, asyncDelayer, loggerFactory.CreateLogger(), ircBuilder.Address, ircBuilder.Port.Value, ircBuilder.Nickname, ircBuilder.Password, ircBuilder.PasswordType, ircBuilder.UseSsl.Value);
case ChatProvider.Discord:
var discordBuilder = (DiscordConnectionStringBuilder)builder;
return new DiscordProvider(loggerFactory.CreateLogger(), discordBuilder.BotToken);
diff --git a/src/Tgstation.Server.Host/Components/Chat/Providers/IrcProvider.cs b/src/Tgstation.Server.Host/Components/Chat/Providers/IrcProvider.cs
index ea2ff03a1c..cd08c1760e 100644
--- a/src/Tgstation.Server.Host/Components/Chat/Providers/IrcProvider.cs
+++ b/src/Tgstation.Server.Host/Components/Chat/Providers/IrcProvider.cs
@@ -25,6 +25,11 @@ namespace Tgstation.Server.Host.Components.Chat.Providers
///
public override string BotMention => client.Nickname;
+ ///
+ /// The for the
+ ///
+ readonly IAsyncDelayer asyncDelayer;
+
///
/// The for the
///
@@ -84,19 +89,21 @@ namespace Tgstation.Server.Host.Components.Chat.Providers
///
/// Construct an
///
- /// The value of logger
/// The to get the from
+ /// The value of
+ /// The value of logger
/// The value of
/// The value of
/// The value of
/// The value of
/// The value of
/// If should be used
- public IrcProvider(ILogger logger, IApplication application, string address, ushort port, string nickname, string password, IrcPasswordType? passwordType, bool useSsl)
+ public IrcProvider(IApplication application, IAsyncDelayer asyncDelayer, ILogger logger, string address, ushort port, string nickname, string password, IrcPasswordType? passwordType, bool useSsl)
{
- this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
if (application == null)
throw new ArgumentNullException(nameof(application));
+ this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
+ this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
this.address = address ?? throw new ArgumentNullException(nameof(address));
this.port = port;
@@ -267,13 +274,15 @@ namespace Tgstation.Server.Host.Components.Chat.Providers
var startTime = DateTimeOffset.Now;
var endTime = DateTimeOffset.Now.AddSeconds(TimeoutSeconds);
cancellationToken.ThrowIfCancellationRequested();
- for (; !recievedAck && DateTimeOffset.Now <= endTime; Task.Delay(10, cancellationToken).GetAwaiter().GetResult())
+
+ var listenTimeSpan = TimeSpan.FromMilliseconds(10);
+ for (; !recievedAck && DateTimeOffset.Now <= endTime; asyncDelayer.Delay(listenTimeSpan, cancellationToken).GetAwaiter().GetResult())
client.Listen(false);
client.WriteLine("AUTHENTICATE PLAIN", Priority.Critical);
cancellationToken.ThrowIfCancellationRequested();
- for (; !recievedPlus && DateTimeOffset.Now <= endTime; Task.Delay(10, cancellationToken).GetAwaiter().GetResult())
+ for (; !recievedPlus && DateTimeOffset.Now <= endTime; asyncDelayer.Delay(listenTimeSpan, cancellationToken).GetAwaiter().GetResult())
client.Listen(false);
//Stolen! https://github.com/znc/znc/blob/1e697580155d5a38f8b5a377f3b1d94aaa979539/modules/sasl.cpp#L196
diff --git a/src/Tgstation.Server.Host/Components/InstanceFactory.cs b/src/Tgstation.Server.Host/Components/InstanceFactory.cs
index 7d087d1c08..b54cbc4d68 100644
--- a/src/Tgstation.Server.Host/Components/InstanceFactory.cs
+++ b/src/Tgstation.Server.Host/Components/InstanceFactory.cs
@@ -103,6 +103,11 @@ namespace Tgstation.Server.Host.Components
///
readonly IGitHubClientFactory gitHubClientFactory;
+ ///
+ /// The for the
+ ///
+ readonly IPlatformIdentifier platformIdentifier;
+
///
/// Construct an
///
@@ -123,7 +128,8 @@ namespace Tgstation.Server.Host.Components
/// The value of
/// The value of
/// The value of
- public InstanceFactory(IIOManager ioManager, IDatabaseContextFactory databaseContextFactory, IApplication application, ILoggerFactory loggerFactory, IByondTopicSender byondTopicSender, ICryptographySuite cryptographySuite, ISynchronousIOManager synchronousIOManager, ISymlinkFactory symlinkFactory, IByondInstaller byondInstaller, IChatFactory chatFactory, IProcessExecutor processExecutor, IPostWriteHandler postWriteHandler, IWatchdogFactory watchdogFactory, IJobManager jobManager, ICredentialsProvider credentialsProvider, INetworkPromptReaper networkPromptReaper, IGitHubClientFactory gitHubClientFactory)
+ /// The value of
+ public InstanceFactory(IIOManager ioManager, IDatabaseContextFactory databaseContextFactory, IApplication application, ILoggerFactory loggerFactory, IByondTopicSender byondTopicSender, ICryptographySuite cryptographySuite, ISynchronousIOManager synchronousIOManager, ISymlinkFactory symlinkFactory, IByondInstaller byondInstaller, IChatFactory chatFactory, IProcessExecutor processExecutor, IPostWriteHandler postWriteHandler, IWatchdogFactory watchdogFactory, IJobManager jobManager, ICredentialsProvider credentialsProvider, INetworkPromptReaper networkPromptReaper, IGitHubClientFactory gitHubClientFactory, IPlatformIdentifier platformIdentifier)
{
this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
@@ -142,6 +148,7 @@ namespace Tgstation.Server.Host.Components
this.credentialsProvider = credentialsProvider ?? throw new ArgumentNullException(nameof(credentialsProvider));
this.networkPromptReaper = networkPromptReaper ?? throw new ArgumentNullException(nameof(networkPromptReaper));
this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
+ this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
}
///
@@ -156,7 +163,7 @@ namespace Tgstation.Server.Host.Components
var gameIoManager = new ResolvingIOManager(instanceIoManager, "Game");
var configurationIoManager = new ResolvingIOManager(instanceIoManager, "Configuration");
- var configuration = new StaticFiles.Configuration(configurationIoManager, synchronousIOManager, symlinkFactory, processExecutor, postWriteHandler, loggerFactory.CreateLogger());
+ var configuration = new StaticFiles.Configuration(configurationIoManager, synchronousIOManager, symlinkFactory, processExecutor, postWriteHandler, platformIdentifier, loggerFactory.CreateLogger());
var eventConsumer = new EventConsumer(configuration);
var dmbFactory = new DmbFactory(databaseContextFactory, gameIoManager, loggerFactory.CreateLogger(), metadata.CloneMetadata());
@@ -172,7 +179,7 @@ namespace Tgstation.Server.Host.Components
var chat = chatFactory.CreateChat(instanceIoManager, commandFactory, metadata.ChatSettings);
try
{
- var sessionControllerFactory = new SessionControllerFactory(processExecutor, byond, byondTopicSender, cryptographySuite, application, gameIoManager, chat, networkPromptReaper, loggerFactory, metadata.CloneMetadata());
+ var sessionControllerFactory = new SessionControllerFactory(processExecutor, byond, byondTopicSender, cryptographySuite, application, gameIoManager, chat, networkPromptReaper, platformIdentifier, loggerFactory, metadata.CloneMetadata());
var reattachInfoHandler = new ReattachInfoHandler(databaseContextFactory, dmbFactory, loggerFactory.CreateLogger(), metadata.CloneMetadata());
var watchdog = watchdogFactory.CreateWatchdog(chat, dmbFactory, reattachInfoHandler, configuration, sessionControllerFactory, metadata.CloneMetadata(), metadata.DreamDaemonSettings);
eventConsumer.SetWatchdog(watchdog);
diff --git a/src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs b/src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs
index dcf009a8f6..bb19579a21 100644
--- a/src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs
+++ b/src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs
@@ -38,8 +38,6 @@ namespace Tgstation.Server.Host.Components.StaticFiles
{ EventType.RepoPreSynchronize, "PreSynchronize" }
};
- static readonly string SystemScriptFileExtension = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "bat" : "sh";
-
///
/// The for
///
@@ -65,6 +63,11 @@ namespace Tgstation.Server.Host.Components.StaticFiles
///
readonly IPostWriteHandler postWriteHandler;
+ ///
+ /// The for
+ ///
+ readonly IPlatformIdentifier platformIdentifier;
+
///
/// The for
///
@@ -83,14 +86,16 @@ namespace Tgstation.Server.Host.Components.StaticFiles
/// The value of
/// The value of
/// The value of
+ /// The value of
/// The value of
- public Configuration(IIOManager ioManager, ISynchronousIOManager synchronousIOManager, ISymlinkFactory symlinkFactory, IProcessExecutor processExecutor, IPostWriteHandler postWriteHandler, ILogger logger)
+ public Configuration(IIOManager ioManager, ISynchronousIOManager synchronousIOManager, ISymlinkFactory symlinkFactory, IProcessExecutor processExecutor, IPostWriteHandler postWriteHandler, IPlatformIdentifier platformIdentifier, ILogger logger)
{
this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
this.synchronousIOManager = synchronousIOManager ?? throw new ArgumentNullException(nameof(synchronousIOManager));
this.symlinkFactory = symlinkFactory ?? throw new ArgumentNullException(nameof(symlinkFactory));
this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
+ this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
semaphore = new SemaphoreSlim(1);
@@ -312,7 +317,7 @@ namespace Tgstation.Server.Host.Components.StaticFiles
var fileName = ioManager.GetFileName(x);
bool ignored;
- if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+ if (platformIdentifier.IsWindows)
//need to normalize
ignored = ignoreFiles.Any(y => fileName.ToUpperInvariant() == y.ToUpperInvariant());
else
@@ -438,7 +443,7 @@ namespace Tgstation.Server.Host.Components.StaticFiles
//always execute in serial
using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
{
- var files = await ioManager.GetFilesWithExtension(EventScriptsSubdirectory, SystemScriptFileExtension, cancellationToken).ConfigureAwait(false);
+ var files = await ioManager.GetFilesWithExtension(EventScriptsSubdirectory, platformIdentifier.ScriptFileExtension, cancellationToken).ConfigureAwait(false);
var resolvedScriptsDir = ioManager.ResolvePath(EventScriptsSubdirectory);
foreach (var I in files.Select(x => ioManager.GetFileName(x)).Where(x => x.StartsWith(scriptName, StringComparison.Ordinal)))
diff --git a/src/Tgstation.Server.Host/Components/Watchdog/SessionControllerFactory.cs b/src/Tgstation.Server.Host/Components/Watchdog/SessionControllerFactory.cs
index 63ee94c543..4715f6443e 100644
--- a/src/Tgstation.Server.Host/Components/Watchdog/SessionControllerFactory.cs
+++ b/src/Tgstation.Server.Host/Components/Watchdog/SessionControllerFactory.cs
@@ -63,6 +63,11 @@ namespace Tgstation.Server.Host.Components.Watchdog
///
readonly INetworkPromptReaper networkPromptReaper;
+ ///
+ /// The for the
+ ///
+ readonly IPlatformIdentifier platformIdentifier;
+
///
/// The for the
///
@@ -105,8 +110,9 @@ namespace Tgstation.Server.Host.Components.Watchdog
/// The value of
/// The value of
/// The value of
+ /// The value of
/// The value of
- public SessionControllerFactory(IProcessExecutor processExecutor, IByondManager byond, IByondTopicSender byondTopicSender, ICryptographySuite cryptographySuite, IApplication application, IIOManager ioManager, IChat chat, INetworkPromptReaper networkPromptReaper, ILoggerFactory loggerFactory, Api.Models.Instance instance)
+ public SessionControllerFactory(IProcessExecutor processExecutor, IByondManager byond, IByondTopicSender byondTopicSender, ICryptographySuite cryptographySuite, IApplication application, IIOManager ioManager, IChat chat, INetworkPromptReaper networkPromptReaper, IPlatformIdentifier platformIdentifier, ILoggerFactory loggerFactory, Api.Models.Instance instance)
{
this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
this.byond = byond ?? throw new ArgumentNullException(nameof(byond));
@@ -117,6 +123,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
this.chat = chat ?? throw new ArgumentNullException(nameof(chat));
this.networkPromptReaper = networkPromptReaper ?? throw new ArgumentNullException(nameof(networkPromptReaper));
+ this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
}
@@ -211,7 +218,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
parameters);
//See #719
- var noShellExecute = !RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
+ var noShellExecute = !platformIdentifier.IsWindows;
//launch dd
var process = processExecutor.LaunchProcess(byondLock.DreamDaemonPath, basePath, arguments, noShellExecute: noShellExecute);
try
diff --git a/src/Tgstation.Server.Host/Components/Watchdog/Watchdog.cs b/src/Tgstation.Server.Host/Components/Watchdog/Watchdog.cs
index b79b9f5363..0302b24fce 100644
--- a/src/Tgstation.Server.Host/Components/Watchdog/Watchdog.cs
+++ b/src/Tgstation.Server.Host/Components/Watchdog/Watchdog.cs
@@ -60,11 +60,6 @@ namespace Tgstation.Server.Host.Components.Watchdog
///
readonly IDmbFactory dmbFactory;
- ///
- /// The for the
- ///
- readonly ILogger logger;
-
///
/// The for the
///
@@ -95,6 +90,16 @@ namespace Tgstation.Server.Host.Components.Watchdog
///
readonly IRestartRegistration restartRegistration;
+ ///
+ /// The for the
+ ///
+ readonly IAsyncDelayer asyncDelayer;
+
+ ///
+ /// The for the
+ ///
+ readonly ILogger logger;
+
///
/// The for the
///
@@ -145,27 +150,29 @@ namespace Tgstation.Server.Host.Components.Watchdog
/// The value of
/// The value of
/// The value of
- /// The value of
/// The value of
/// The value of
/// The value of
/// The value of
/// The value of
/// The to populate with
+ /// The value of
+ /// The value of
/// The initial value of . May be modified
/// The value of
/// The value of
- public Watchdog(IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, ILogger logger, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)
+ public Watchdog(IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)
{
this.chat = chat ?? throw new ArgumentNullException(nameof(chat));
this.sessionControllerFactory = sessionControllerFactory ?? throw new ArgumentNullException(nameof(sessionControllerFactory));
this.dmbFactory = dmbFactory ?? throw new ArgumentNullException(nameof(dmbFactory));
- this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
this.reattachInfoHandler = reattachInfoHandler ?? throw new ArgumentNullException(nameof(reattachInfoHandler));
this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
+ this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
+ this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
ActiveLaunchParameters = initialLaunchParameters ?? throw new ArgumentNullException(nameof(initialLaunchParameters));
this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
this.autoStart = autoStart;
@@ -635,7 +642,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
logger.LogWarning("Failed to automatically restart the watchdog! Attempt: {0}, Exception: {1}", retryAttempts, launchException);
var retryDelay = Math.Min(Math.Pow(2, retryAttempts), 3600); //max of one hour, increasing by a power of 2 each time
chatTask = chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Failed to restart watchdog (Attempt: {0}), retrying in {1} seconds...", retryAttempts, retryDelay), cancellationToken);
- await Task.WhenAll(Task.Delay((int)retryDelay, cancellationToken), chatTask).ConfigureAwait(false);
+ await Task.WhenAll(asyncDelayer.Delay(TimeSpan.FromSeconds(retryDelay), cancellationToken), chatTask).ConfigureAwait(false);
}
}
}
@@ -751,7 +758,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
//definitely not if reattaching though
if (reattachInfo == null && delay.TotalSeconds < AlphaBravoStartupSeperationInterval)
- await Task.Delay(startTime.AddSeconds(AlphaBravoStartupSeperationInterval) - now, cancellationToken).ConfigureAwait(false);
+ await asyncDelayer.Delay(startTime.AddSeconds(AlphaBravoStartupSeperationInterval) - now, cancellationToken).ConfigureAwait(false);
//now bring bravo up
if (!doesntNeedNewDmb)
diff --git a/src/Tgstation.Server.Host/Components/Watchdog/WatchdogFactory.cs b/src/Tgstation.Server.Host/Components/Watchdog/WatchdogFactory.cs
index b2d33d838d..1c03523ee7 100644
--- a/src/Tgstation.Server.Host/Components/Watchdog/WatchdogFactory.cs
+++ b/src/Tgstation.Server.Host/Components/Watchdog/WatchdogFactory.cs
@@ -36,6 +36,11 @@ namespace Tgstation.Server.Host.Components.Watchdog
///
readonly IJobManager jobManager;
+ ///
+ /// The for the
+ ///
+ readonly IAsyncDelayer asyncDelayer;
+
///
/// Construct a
///
@@ -44,16 +49,18 @@ namespace Tgstation.Server.Host.Components.Watchdog
/// The value of
/// The value of
/// The value of
- public WatchdogFactory(IServerControl serverControl, ILoggerFactory loggerFactory, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IJobManager jobManager)
+ /// The value of
+ public WatchdogFactory(IServerControl serverControl, ILoggerFactory loggerFactory, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IJobManager jobManager, IAsyncDelayer asyncDelayer)
{
this.serverControl = serverControl ?? throw new ArgumentNullException(nameof(serverControl));
this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
+ this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
}
///
- public IWatchdog CreateWatchdog(IChat chat, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IEventConsumer eventConsumer, ISessionControllerFactory sessionControllerFactory, Api.Models.Instance instance, DreamDaemonSettings settings) => new Watchdog(chat, sessionControllerFactory, dmbFactory, loggerFactory.CreateLogger(), reattachInfoHandler, databaseContextFactory, byondTopicSender, eventConsumer, jobManager, serverControl, settings, instance, settings.AutoStart.Value);
+ public IWatchdog CreateWatchdog(IChat chat, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IEventConsumer eventConsumer, ISessionControllerFactory sessionControllerFactory, Api.Models.Instance instance, DreamDaemonSettings settings) => new Watchdog(chat, sessionControllerFactory, dmbFactory, reattachInfoHandler, databaseContextFactory, byondTopicSender, eventConsumer, jobManager, serverControl, asyncDelayer, loggerFactory.CreateLogger(), settings, instance, settings.AutoStart.Value);
}
}
diff --git a/src/Tgstation.Server.Host/Components/Watchdog/WindowsNetworkPromptReaper.cs b/src/Tgstation.Server.Host/Components/Watchdog/WindowsNetworkPromptReaper.cs
index ef11168489..719eb9f4f8 100644
--- a/src/Tgstation.Server.Host/Components/Watchdog/WindowsNetworkPromptReaper.cs
+++ b/src/Tgstation.Server.Host/Components/Watchdog/WindowsNetworkPromptReaper.cs
@@ -25,6 +25,11 @@ namespace Tgstation.Server.Host.Components.Watchdog
///
const int RecheckDelayMs = 250;
+ ///
+ /// The for the
+ ///
+ readonly IAsyncDelayer asyncDelayer;
+
///
/// The for the
///
@@ -78,9 +83,11 @@ namespace Tgstation.Server.Host.Components.Watchdog
///
/// Construct a
///
+ /// The value of
/// The value of
- public WindowsNetworkPromptReaper(ILogger logger)
+ public WindowsNetworkPromptReaper(IAsyncDelayer asyncDelayer, ILogger logger)
{
+ this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
registeredProcesses = new List();
@@ -97,7 +104,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
{
while (!cancellationToken.IsCancellationRequested)
{
- await Task.Delay(TimeSpan.FromMilliseconds(RecheckDelayMs), cancellationToken).ConfigureAwait(false);
+ await asyncDelayer.Delay(TimeSpan.FromMilliseconds(RecheckDelayMs), cancellationToken).ConfigureAwait(false);
IntPtr window;
int processId;
diff --git a/src/Tgstation.Server.Host/Controllers/AdministrationController.cs b/src/Tgstation.Server.Host/Controllers/AdministrationController.cs
index a7ed6593d4..0899ab7db5 100644
--- a/src/Tgstation.Server.Host/Controllers/AdministrationController.cs
+++ b/src/Tgstation.Server.Host/Controllers/AdministrationController.cs
@@ -52,6 +52,11 @@ namespace Tgstation.Server.Host.Controllers
///
readonly IIOManager ioManager;
+ ///
+ /// The for the
+ ///
+ readonly IPlatformIdentifier platformIdentifier;
+
///
/// The for the
///
@@ -71,15 +76,17 @@ namespace Tgstation.Server.Host.Controllers
/// The value of
/// The value of
/// The value of
+ /// The value of
/// The for the
/// The containing value of
/// The containing value of
- public AdministrationController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IGitHubClientFactory gitHubClientFactory, IServerControl serverUpdater, IApplication application, IIOManager ioManager, ILogger logger, IOptions updatesConfigurationOptions, IOptions generalConfigurationOptions) : base(databaseContext, authenticationContextFactory, logger, false)
+ public AdministrationController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IGitHubClientFactory gitHubClientFactory, IServerControl serverUpdater, IApplication application, IIOManager ioManager, IPlatformIdentifier platformIdentifier, ILogger logger, IOptions updatesConfigurationOptions, IOptions generalConfigurationOptions) : base(databaseContext, authenticationContextFactory, logger, false)
{
this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
this.serverUpdater = serverUpdater ?? throw new ArgumentNullException(nameof(serverUpdater));
this.application = application ?? throw new ArgumentNullException(nameof(application));
this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
+ this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
updatesConfiguration = updatesConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(updatesConfigurationOptions));
generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
}
@@ -123,7 +130,7 @@ namespace Tgstation.Server.Host.Controllers
{
LatestVersion = greatestVersion,
TrackedRepositoryUrl = repoUrl,
- WindowsHost = RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
+ WindowsHost = platformIdentifier.IsWindows
});
}
catch (RateLimitExceededException e)
diff --git a/src/Tgstation.Server.Host/Controllers/InstanceController.cs b/src/Tgstation.Server.Host/Controllers/InstanceController.cs
index 5d6515dc7b..5db9cd5897 100644
--- a/src/Tgstation.Server.Host/Controllers/InstanceController.cs
+++ b/src/Tgstation.Server.Host/Controllers/InstanceController.cs
@@ -40,10 +40,12 @@ namespace Tgstation.Server.Host.Controllers
/// The for the
///
readonly IJobManager jobManager;
+
///
/// The for the
///
readonly IInstanceManager instanceManager;
+
///
/// The for the
///
@@ -54,6 +56,11 @@ namespace Tgstation.Server.Host.Controllers
///
readonly IApplication application;
+ ///
+ /// The for the
+ ///
+ readonly IPlatformIdentifier platformIdentifier;
+
///
/// Construct a
///
@@ -63,13 +70,15 @@ namespace Tgstation.Server.Host.Controllers
/// The value of
/// The value of
/// The value of
+ /// The value of
/// The for the
- public InstanceController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, IIOManager ioManager, IApplication application, ILogger logger) : base(databaseContext, authenticationContextFactory, logger, false)
+ public InstanceController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, IIOManager ioManager, IApplication application, IPlatformIdentifier platformIdentifier, ILogger logger) : base(databaseContext, authenticationContextFactory, logger, false)
{
this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
this.application = application ?? throw new ArgumentNullException(nameof(application));
+ this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
}
void NormalizeModelPath(Api.Models.Instance model, out string absolutePath)
@@ -80,7 +89,7 @@ namespace Tgstation.Server.Host.Controllers
return;
}
absolutePath = ioManager.ResolvePath(model.Path);
- if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+ if (platformIdentifier.IsWindows)
model.Path = absolutePath.ToUpperInvariant();
else
model.Path = absolutePath;
diff --git a/src/Tgstation.Server.Host/Core/Application.cs b/src/Tgstation.Server.Host/Core/Application.cs
index 1288324842..05b5234e0c 100644
--- a/src/Tgstation.Server.Host/Core/Application.cs
+++ b/src/Tgstation.Server.Host/Core/Application.cs
@@ -60,6 +60,11 @@ namespace Tgstation.Server.Host.Core
///
readonly TaskCompletionSource