diff --git a/MoonlightServers.Daemon/ServerSys/Abstractions/Server.cs b/MoonlightServers.Daemon/ServerSys/Abstractions/Server.cs index 8393a8d..67c3ca4 100644 --- a/MoonlightServers.Daemon/ServerSys/Abstractions/Server.cs +++ b/MoonlightServers.Daemon/ServerSys/Abstractions/Server.cs @@ -23,7 +23,7 @@ public class Server : IAsyncDisposable public IAsyncObservable OnState => OnStateSubject; private readonly EventSubject OnStateSubject = new(); - private readonly ILogger Logger; + private readonly ILogger Logger; private readonly RemoteService RemoteService; private readonly ServerConfigurationMapper Mapper; private readonly IHubContext HubContext; @@ -33,7 +33,7 @@ public class Server : IAsyncDisposable private IAsyncDisposable? ConsoleSubscription; public Server( - ILogger logger, + ILoggerFactory loggerFactory, IConsole console, IFileSystem fileSystem, IInstaller installer, @@ -46,7 +46,7 @@ public class Server : IAsyncDisposable ServerConfigurationMapper mapper, IHubContext hubContext) { - Logger = logger; + Logger = loggerFactory.CreateLogger($"Servers.Instance.{context.Configuration.Id}.{nameof(Server)}"); Console = console; FileSystem = fileSystem; Installer = installer; @@ -192,6 +192,20 @@ public class Server : IAsyncDisposable public async Task Delete() { + if (Installer.IsRunning) + { + Logger.LogDebug("Installer still running. Aborting and cleaning up"); + + await Installer.Abort(); + await Installer.Cleanup(); + } + + if (Provisioner.IsProvisioned) + await Provisioner.Deprovision(); + + if (FileSystem.IsMounted) + await FileSystem.Unmount(); + await FileSystem.Delete(); } diff --git a/MoonlightServers.Daemon/ServerSys/Implementations/DefaultRestorer.cs b/MoonlightServers.Daemon/ServerSys/Implementations/DefaultRestorer.cs index b0e0bb4..d007bea 100644 --- a/MoonlightServers.Daemon/ServerSys/Implementations/DefaultRestorer.cs +++ b/MoonlightServers.Daemon/ServerSys/Implementations/DefaultRestorer.cs @@ -5,19 +5,22 @@ namespace MoonlightServers.Daemon.ServerSys.Implementations; public class DefaultRestorer : IRestorer { - private readonly ILogger Logger; + private readonly ILogger Logger; private readonly IConsole Console; private readonly IProvisioner Provisioner; private readonly IInstaller Installer; private readonly IStatistics Statistics; public DefaultRestorer( - ILogger logger, + ILoggerFactory loggerFactory, + ServerContext context, IConsole console, IProvisioner provisioner, - IStatistics statistics, IInstaller installer) + IStatistics statistics, + IInstaller installer + ) { - Logger = logger; + Logger = loggerFactory.CreateLogger($"Servers.Instance.{context.Configuration.Id}.{nameof(DefaultRestorer)}"); Console = console; Provisioner = provisioner; Statistics = statistics; @@ -41,7 +44,7 @@ public class DefaultRestorer : IRestorer await Console.CollectFromRuntime(); await Console.AttachToRuntime(); await Statistics.SubscribeToRuntime(); - + return ServerState.Online; } @@ -52,7 +55,7 @@ public class DefaultRestorer : IRestorer await Console.CollectFromInstallation(); await Console.AttachToInstallation(); await Statistics.SubscribeToInstallation(); - + return ServerState.Installing; } diff --git a/MoonlightServers.Daemon/ServerSys/Implementations/DockerConsole.cs b/MoonlightServers.Daemon/ServerSys/Implementations/DockerConsole.cs index f324c8d..650b93a 100644 --- a/MoonlightServers.Daemon/ServerSys/Implementations/DockerConsole.cs +++ b/MoonlightServers.Daemon/ServerSys/Implementations/DockerConsole.cs @@ -17,22 +17,24 @@ public class DockerConsole : IConsole private readonly ConcurrentList OutputCache = new(); private readonly DockerClient DockerClient; - private readonly ILogger Logger; + private readonly ILogger Logger; private readonly ServerContext Context; private MultiplexedStream? CurrentStream; private CancellationTokenSource Cts = new(); - private const string MlPrefix = "\x1b[1;38;2;200;90;200mM\x1b[1;38;2;204;110;230mo\x1b[1;38;2;170;130;245mo\x1b[1;38;2;140;150;255mn\x1b[1;38;2;110;180;255ml\x1b[1;38;2;100;200;255mi\x1b[1;38;2;100;220;255mg\x1b[1;38;2;120;235;255mh\x1b[1;38;2;140;250;255mt\x1b[0m \x1b[3;38;2;200;200;200m{0}\x1b[0m\n\r"; + private const string MlPrefix = + "\x1b[1;38;2;200;90;200mM\x1b[1;38;2;204;110;230mo\x1b[1;38;2;170;130;245mo\x1b[1;38;2;140;150;255mn\x1b[1;38;2;110;180;255ml\x1b[1;38;2;100;200;255mi\x1b[1;38;2;100;220;255mg\x1b[1;38;2;120;235;255mh\x1b[1;38;2;140;250;255mt\x1b[0m \x1b[3;38;2;200;200;200m{0}\x1b[0m\n\r"; public DockerConsole( ServerContext context, DockerClient dockerClient, - ILogger logger) + ILoggerFactory loggerFactory + ) { Context = context; DockerClient = dockerClient; - Logger = logger; + Logger = loggerFactory.CreateLogger($"Servers.Instance.{context.Configuration.Id}.{nameof(DockerConsole)}"); } public Task Initialize() diff --git a/MoonlightServers.Daemon/ServerSys/Implementations/DockerInstaller.cs b/MoonlightServers.Daemon/ServerSys/Implementations/DockerInstaller.cs index 2539d59..eb35bb6 100644 --- a/MoonlightServers.Daemon/ServerSys/Implementations/DockerInstaller.cs +++ b/MoonlightServers.Daemon/ServerSys/Implementations/DockerInstaller.cs @@ -19,7 +19,7 @@ public class DockerInstaller : IInstaller private readonly EventSubject OnExitedSubject = new(); - private readonly ILogger Logger; + private readonly ILogger Logger; private readonly DockerEventService EventService; private readonly IConsole Console; private readonly DockerClient DockerClient; @@ -37,7 +37,7 @@ public class DockerInstaller : IInstaller private IAsyncDisposable? ContainerEventSubscription; public DockerInstaller( - ILogger logger, + ILoggerFactory loggerFactory, DockerEventService eventService, IConsole console, DockerClient dockerClient, @@ -48,7 +48,7 @@ public class DockerInstaller : IInstaller ServerConfigurationMapper mapper ) { - Logger = logger; + Logger = loggerFactory.CreateLogger($"Servers.Instance.{context.Configuration.Id}.{nameof(DockerInstaller)}"); EventService = eventService; Console = console; DockerClient = dockerClient; diff --git a/MoonlightServers.Daemon/ServerSys/Implementations/DockerProvisioner.cs b/MoonlightServers.Daemon/ServerSys/Implementations/DockerProvisioner.cs index 6bb2f13..e088ccc 100644 --- a/MoonlightServers.Daemon/ServerSys/Implementations/DockerProvisioner.cs +++ b/MoonlightServers.Daemon/ServerSys/Implementations/DockerProvisioner.cs @@ -18,7 +18,7 @@ public class DockerProvisioner : IProvisioner public bool IsProvisioned { get; private set; } private readonly DockerClient DockerClient; - private readonly ILogger Logger; + private readonly ILogger Logger; private readonly DockerEventService EventService; private readonly ServerContext Context; private readonly IConsole Console; @@ -34,7 +34,7 @@ public class DockerProvisioner : IProvisioner public DockerProvisioner( DockerClient dockerClient, - ILogger logger, + ILoggerFactory loggerFactory, DockerEventService eventService, ServerContext context, IConsole console, @@ -44,7 +44,7 @@ public class DockerProvisioner : IProvisioner ) { DockerClient = dockerClient; - Logger = logger; + Logger = loggerFactory.CreateLogger($"Servers.Instance.{context.Configuration.Id}.{nameof(DockerProvisioner)}"); EventService = eventService; Context = context; Console = console; diff --git a/MoonlightServers.Daemon/ServerSys/Implementations/RegexOnlineDetection.cs b/MoonlightServers.Daemon/ServerSys/Implementations/RegexOnlineDetection.cs index b220341..7fc841a 100644 --- a/MoonlightServers.Daemon/ServerSys/Implementations/RegexOnlineDetection.cs +++ b/MoonlightServers.Daemon/ServerSys/Implementations/RegexOnlineDetection.cs @@ -9,28 +9,31 @@ public class RegexOnlineDetection : IOnlineDetection { private readonly ServerContext Context; private readonly IConsole Console; - private readonly ILogger Logger; + private readonly ILogger Logger; private Regex? Regex; private IAsyncDisposable? ConsoleSubscription; private IAsyncDisposable? StateSubscription; - public RegexOnlineDetection(ServerContext context, IConsole console, ILogger logger) + public RegexOnlineDetection( + ServerContext context, + IConsole console, + ILoggerFactory loggerFactory) { Context = context; Console = console; - Logger = logger; + Logger = loggerFactory.CreateLogger($"Servers.Instance.{context.Configuration.Id}.{nameof(RegexOnlineDetection)}"); } public async Task Initialize() { - Logger.LogInformation("Subscribing to state changes"); + Logger.LogDebug("Subscribing to state changes"); StateSubscription = await Context.Self.OnState.SubscribeAsync(async state => { if (state == ServerState.Starting) // Subscribe to console when starting { - Logger.LogInformation("Detected state change to online. Subscribing to console in order to check for the regex matches"); + Logger.LogDebug("Detected state change to online. Subscribing to console in order to check for the regex matches"); if(ConsoleSubscription != null) await ConsoleSubscription.DisposeAsync(); @@ -48,7 +51,7 @@ public class RegexOnlineDetection : IOnlineDetection } else if (ConsoleSubscription != null) // Unsubscribe from console when any other state and not already unsubscribed { - Logger.LogInformation("Detected state change to {state}. Unsubscribing from console", state); + Logger.LogDebug("Detected state change to {state}. Unsubscribing from console", state); await ConsoleSubscription.DisposeAsync(); ConsoleSubscription = null; diff --git a/MoonlightServers.Daemon/ServerSys/ServerFactory.cs b/MoonlightServers.Daemon/ServerSys/ServerFactory.cs index 6313ab2..f9beb7d 100644 --- a/MoonlightServers.Daemon/ServerSys/ServerFactory.cs +++ b/MoonlightServers.Daemon/ServerSys/ServerFactory.cs @@ -17,10 +17,12 @@ public class ServerFactory var scope = ServiceProvider.CreateAsyncScope(); var context = scope.ServiceProvider.GetRequiredService(); - var server = scope.ServiceProvider.GetRequiredService(); context.Configuration = configuration; context.ServiceScope = scope; + + var server = scope.ServiceProvider.GetRequiredService(); + context.Self = server; return server;