diff --git a/src/Tgstation.Server.Host/Components/Watchdog/SessionController.cs b/src/Tgstation.Server.Host/Components/Watchdog/SessionController.cs index 0792b0736c..4d61522620 100644 --- a/src/Tgstation.Server.Host/Components/Watchdog/SessionController.cs +++ b/src/Tgstation.Server.Host/Components/Watchdog/SessionController.cs @@ -1,5 +1,6 @@ using Byond.TopicSender; using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Primitives; using System; using System.Collections.Generic; @@ -110,6 +111,11 @@ namespace Tgstation.Server.Host.Components.Watchdog /// readonly IChat chat; + /// + /// The for the + /// + readonly ILogger logger; + /// /// The waits on when DreamDaemon currently has it's ports closed /// @@ -147,15 +153,17 @@ namespace Tgstation.Server.Host.Components.Watchdog /// The used to construct /// The value of /// The value of - public SessionController(ReattachInformation reattachInformation, ISession session, IByondTopicSender byondTopicSender, IInteropRegistrar interopRegistrar, IChatJsonTrackingContext chatJsonTrackingContext, IChat chat) + /// The value of + public SessionController(ReattachInformation reattachInformation, ISession session, IByondTopicSender byondTopicSender, IInteropRegistrar interopRegistrar, IChatJsonTrackingContext chatJsonTrackingContext, IChat chat, ILogger logger) { this.chatJsonTrackingContext = chatJsonTrackingContext; //null valid this.reattachInformation = reattachInformation ?? throw new ArgumentNullException(nameof(reattachInformation)); this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender)); - this.session = session ?? throw new ArgumentNullException(nameof(session)); - this.chat = chat ?? throw new ArgumentNullException(nameof(chat)); if (interopRegistrar == null) throw new ArgumentNullException(nameof(interopRegistrar)); + this.session = session ?? throw new ArgumentNullException(nameof(session)); + this.chat = chat ?? throw new ArgumentNullException(nameof(chat)); + this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); interopContext = interopRegistrar.Register(reattachInformation.AccessIdentifier, this); @@ -254,16 +262,27 @@ namespace Tgstation.Server.Host.Components.Watchdog } /// - public Task SendCommand(string command, CancellationToken cancellationToken) => byondTopicSender.SendTopic( - new IPEndPoint(IPAddress.Loopback, reattachInformation.Port), - String.Format(CultureInfo.InvariantCulture, - "?{0}={1}&{2}={3}", - byondTopicSender.SanitizeString(InteropConstants.DMInteropAccessIdentifier), - byondTopicSender.SanitizeString(reattachInformation.AccessIdentifier), - byondTopicSender.SanitizeString(InteropConstants.DMParameterCommand), - //intentionally don't sanitize command, that's up to the caller - command), - cancellationToken); + public async Task SendCommand(string command, CancellationToken cancellationToken) + { + try + { + return await byondTopicSender.SendTopic( + new IPEndPoint(IPAddress.Loopback, reattachInformation.Port), + String.Format(CultureInfo.InvariantCulture, + "?{0}={1}&{2}={3}", + byondTopicSender.SanitizeString(InteropConstants.DMInteropAccessIdentifier), + byondTopicSender.SanitizeString(reattachInformation.AccessIdentifier), + byondTopicSender.SanitizeString(InteropConstants.DMParameterCommand), + //intentionally don't sanitize command, that's up to the caller + command), + cancellationToken).ConfigureAwait(false); + } + catch (Exception e) + { + logger.LogInformation("Send command exception:{0}{1}", Environment.NewLine, e.Message); + return null; + } + } async Task SetPortImpl(ushort port, CancellationToken cancellationToken) => await SendCommand(String.Format(CultureInfo.InvariantCulture, "{0}&{1}={2}", byondTopicSender.SanitizeString(InteropConstants.DMTopicChangePort), byondTopicSender.SanitizeString(InteropConstants.DMParameterNewPort), byondTopicSender.SanitizeString(port.ToString(CultureInfo.InvariantCulture))), cancellationToken).ConfigureAwait(false) == InteropConstants.DMResponseSuccess; diff --git a/src/Tgstation.Server.Host/Components/Watchdog/SessionControllerFactory.cs b/src/Tgstation.Server.Host/Components/Watchdog/SessionControllerFactory.cs index 19de65758f..18be1f76af 100644 --- a/src/Tgstation.Server.Host/Components/Watchdog/SessionControllerFactory.cs +++ b/src/Tgstation.Server.Host/Components/Watchdog/SessionControllerFactory.cs @@ -1,4 +1,5 @@ using Byond.TopicSender; +using Microsoft.Extensions.Logging; using Newtonsoft.Json; using System; using System.Globalization; @@ -61,6 +62,11 @@ namespace Tgstation.Server.Host.Components.Watchdog /// readonly IChat chat; + /// + /// The for the + /// + readonly ILoggerFactory loggerFactory; + /// /// Construct a /// @@ -73,7 +79,8 @@ namespace Tgstation.Server.Host.Components.Watchdog /// The value of /// The value of /// The value of - public SessionControllerFactory(IExecutor executor, IByond byond, IByondTopicSender byondTopicSender, IInteropRegistrar interopRegistrar, ICryptographySuite cryptographySuite, IApplication application, IInstance instance, IIOManager ioManager, IChat chat) + /// The value of + public SessionControllerFactory(IExecutor executor, IByond byond, IByondTopicSender byondTopicSender, IInteropRegistrar interopRegistrar, ICryptographySuite cryptographySuite, IApplication application, IInstance instance, IIOManager ioManager, IChat chat, ILoggerFactory loggerFactory) { this.executor = executor ?? throw new ArgumentNullException(nameof(executor)); this.byond = byond ?? throw new ArgumentNullException(nameof(byond)); @@ -84,6 +91,7 @@ namespace Tgstation.Server.Host.Components.Watchdog this.instance = instance ?? throw new ArgumentNullException(nameof(instance)); this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager)); this.chat = chat ?? throw new ArgumentNullException(nameof(chat)); + this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory)); } /// @@ -149,7 +157,7 @@ namespace Tgstation.Server.Host.Components.Watchdog IsPrimary = primaryDirectory, Port = portToUse.Value, ProcessId = session.ProcessId - }, session, byondTopicSender, interopRegistrar, chatJsonTrackingContext, chat); + }, session, byondTopicSender, interopRegistrar, chatJsonTrackingContext, chat, loggerFactory.CreateLogger()); } catch { @@ -186,7 +194,7 @@ namespace Tgstation.Server.Host.Components.Watchdog var session = executor.AttachToDreamDaemon(reattachInformation.ProcessId, byondLock); try { - return new SessionController(reattachInformation, session, byondTopicSender, interopRegistrar, chatJsonTrackingContext, chat); + return new SessionController(reattachInformation, session, byondTopicSender, interopRegistrar, chatJsonTrackingContext, chat, loggerFactory.CreateLogger()); } catch {