tgstation-server  4.3.2
The /tg/station 13 server suite
InstanceFactory.cs
Go to the documentation of this file.
1 using Byond.TopicSender;
2 using Microsoft.Extensions.Logging;
3 using System;
4 using System.Threading;
5 using System.Threading.Tasks;
17 using Tgstation.Server.Host.IO;
21 
22 namespace Tgstation.Server.Host.Components
23 {
26  {
31 
36 
41 
45  readonly ILoggerFactory loggerFactory;
46 
50  readonly ITopicClient byondTopicSender;
51 
56 
61 
66 
71 
76 
81 
86 
91 
96 
101 
106 
111 
116 
121 
126 
151  IIOManager ioManager,
152  IDatabaseContextFactory databaseContextFactory,
153  IAssemblyInformationProvider assemblyInformationProvider,
154  ILoggerFactory loggerFactory,
155  ITopicClient byondTopicSender,
156  ICryptographySuite cryptographySuite,
157  ISynchronousIOManager synchronousIOManager,
158  ISymlinkFactory symlinkFactory,
159  IByondInstaller byondInstaller,
160  IChatManagerFactory chatFactory,
161  IProcessExecutor processExecutor,
162  IPostWriteHandler postWriteHandler,
163  IWatchdogFactory watchdogFactory,
164  IJobManager jobManager,
165  INetworkPromptReaper networkPromptReaper,
166  IGitHubClientFactory gitHubClientFactory,
167  IPlatformIdentifier platformIdentifier,
168  ILibGit2RepositoryFactory repositoryFactory,
169  ILibGit2Commands repositoryCommands,
170  IServerPortProvider serverPortProvider)
171  {
172  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
173  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
174  this.assemblyInformationProvider = assemblyInformationProvider ?? throw new ArgumentNullException(nameof(assemblyInformationProvider));
175  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
176  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
177  this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
178  this.synchronousIOManager = synchronousIOManager ?? throw new ArgumentNullException(nameof(synchronousIOManager));
179  this.symlinkFactory = symlinkFactory ?? throw new ArgumentNullException(nameof(symlinkFactory));
180  this.byondInstaller = byondInstaller ?? throw new ArgumentNullException(nameof(byondInstaller));
181  this.chatFactory = chatFactory ?? throw new ArgumentNullException(nameof(chatFactory));
182  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
183  this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
184  this.watchdogFactory = watchdogFactory ?? throw new ArgumentNullException(nameof(watchdogFactory));
185  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
186  this.networkPromptReaper = networkPromptReaper ?? throw new ArgumentNullException(nameof(networkPromptReaper));
187  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
188  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
189  this.repositoryFactory = repositoryFactory ?? throw new ArgumentNullException(nameof(repositoryFactory));
190  this.repositoryCommands = repositoryCommands ?? throw new ArgumentNullException(nameof(repositoryCommands));
191  this.serverPortProvider = serverPortProvider ?? throw new ArgumentNullException(nameof(serverPortProvider));
192  }
193 
195 #pragma warning disable CA1506 // TODO: Decomplexify
196  public IInstance CreateInstance(IBridgeRegistrar bridgeRegistrar, Models.Instance metadata)
197  {
198  // Create the ioManager for the instance
199  var instanceIoManager = new ResolvingIOManager(ioManager, metadata.Path);
200 
201  // various other ioManagers
202  var repoIoManager = new ResolvingIOManager(instanceIoManager, "Repository");
203  var byondIOManager = new ResolvingIOManager(instanceIoManager, "Byond");
204  var gameIoManager = new ResolvingIOManager(instanceIoManager, "Game");
205  var configurationIoManager = new ResolvingIOManager(instanceIoManager, "Configuration");
206 
207  var configuration = new StaticFiles.Configuration(configurationIoManager, synchronousIOManager, symlinkFactory, processExecutor, postWriteHandler, platformIdentifier, loggerFactory.CreateLogger<StaticFiles.Configuration>());
208  var eventConsumer = new EventConsumer(configuration);
209  var repoManager = new RepositoryManager(
210  repositoryFactory,
211  repositoryCommands,
212  repoIoManager,
213  eventConsumer,
214  loggerFactory.CreateLogger<Repository.Repository>(),
215  loggerFactory.CreateLogger<RepositoryManager>());
216  try
217  {
218  var byond = new ByondManager(byondIOManager, byondInstaller, eventConsumer, loggerFactory.CreateLogger<ByondManager>());
219 
220  var commandFactory = new CommandFactory(assemblyInformationProvider, byond, repoManager, databaseContextFactory, metadata);
221 
222  var chatManager = chatFactory.CreateChatManager(instanceIoManager, commandFactory, metadata.ChatSettings);
223  try
224  {
225  var sessionControllerFactory = new SessionControllerFactory(
226  processExecutor,
227  byond,
228  byondTopicSender,
229  cryptographySuite,
230  assemblyInformationProvider,
231  gameIoManager,
232  chatManager,
233  networkPromptReaper,
234  platformIdentifier,
235  bridgeRegistrar,
236  serverPortProvider,
237  loggerFactory,
238  loggerFactory.CreateLogger<SessionControllerFactory>(),
239  metadata.CloneMetadata());
240 
241  var dmbFactory = new DmbFactory(databaseContextFactory, gameIoManager, loggerFactory.CreateLogger<DmbFactory>(), metadata.CloneMetadata());
242  try
243  {
244  var reattachInfoHandler = new ReattachInfoHandler(databaseContextFactory, dmbFactory, loggerFactory.CreateLogger<ReattachInfoHandler>(), metadata.CloneMetadata());
245  var watchdog = watchdogFactory.CreateWatchdog(
246  chatManager,
247  dmbFactory,
248  reattachInfoHandler,
249  sessionControllerFactory,
250  gameIoManager,
251  metadata.CloneMetadata(),
252  metadata.DreamDaemonSettings);
253  eventConsumer.SetWatchdog(watchdog);
254  commandFactory.SetWatchdog(watchdog);
255  try
256  {
257  Instance instance = null;
258  var dreamMaker = new DreamMaker(
259  byond,
260  gameIoManager,
261  configuration,
262  sessionControllerFactory,
263  eventConsumer,
264  chatManager,
265  processExecutor,
266  gitHubClientFactory,
267  dmbFactory,
268  repoManager,
269  loggerFactory.CreateLogger<DreamMaker>(),
270  metadata.CloneMetadata());
271 
272  instance = new Instance(
273  metadata.CloneMetadata(),
274  repoManager,
275  byond,
276  dreamMaker,
277  watchdog,
278  chatManager,
279  configuration,
280  databaseContextFactory,
281  dmbFactory,
282  jobManager,
283  eventConsumer,
284  loggerFactory.CreateLogger<Instance>());
285 
286  return instance;
287  }
288  catch
289  {
290  watchdog.Dispose();
291  throw;
292  }
293  }
294  catch
295  {
296  dmbFactory.Dispose();
297  throw;
298  }
299  }
300  catch
301  {
302  chatManager.Dispose();
303  throw;
304  }
305  }
306  catch
307  {
308  repoManager.Dispose();
309  throw;
310  }
311  }
312 #pragma warning restore CA1506
313 
315  public Task StartAsync(CancellationToken cancellationToken)
316  {
317  CheckSystemCompatibility();
318  return byondInstaller.CleanCache(cancellationToken);
319  }
320 
322  public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
323 
327  private void CheckSystemCompatibility() => repositoryFactory.CreateInMemory().Dispose();
328  }
329 }
readonly ITopicClient byondTopicSender
The ITopicClient for the InstanceFactory
readonly ISynchronousIOManager synchronousIOManager
The ISynchronousIOManager for the InstanceFactory
readonly IByondInstaller byondInstaller
The IByondInstaller for the InstanceFactory
Task StartAsync(CancellationToken cancellationToken)
Handles changing file modes/permissions after writing
An IIOManager that resolve relative paths from another IIOManager to a subdirectory of that ...
readonly IServerPortProvider serverPortProvider
The IServerPortProvider for the InstanceFactory.
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
For low level interactions with a LibGit2Sharp.IRepository.
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the InstanceFactory
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the InstanceFactory
Contains various cryptographic functions
readonly IProcessExecutor processExecutor
The IProcessExecutor for the InstanceFactory
readonly INetworkPromptReaper networkPromptReaper
The INetworkPromptReaper for the InstanceFactory
readonly IPostWriteHandler postWriteHandler
The IPostWriteHandler for the InstanceFactory
For downloading and installing BYOND extractions for a given system
For accessing the disk in a synchronous manner
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the InstanceFactory
readonly IWatchdogFactory watchdogFactory
The IWatchdogFactory for the InstanceFactory
InstanceFactory(IIOManager ioManager, IDatabaseContextFactory databaseContextFactory, IAssemblyInformationProvider assemblyInformationProvider, ILoggerFactory loggerFactory, ITopicClient byondTopicSender, ICryptographySuite cryptographySuite, ISynchronousIOManager synchronousIOManager, ISymlinkFactory symlinkFactory, IByondInstaller byondInstaller, IChatManagerFactory chatFactory, IProcessExecutor processExecutor, IPostWriteHandler postWriteHandler, IWatchdogFactory watchdogFactory, IJobManager jobManager, INetworkPromptReaper networkPromptReaper, IGitHubClientFactory gitHubClientFactory, IPlatformIdentifier platformIdentifier, ILibGit2RepositoryFactory repositoryFactory, ILibGit2Commands repositoryCommands, IServerPortProvider serverPortProvider)
Construct an InstanceFactory
readonly ILibGit2RepositoryFactory repositoryFactory
The ILibGit2RepositoryFactory for the InstanceFactory.
For interacting with the instance services
Definition: IInstance.cs:16
readonly IIOManager ioManager
The IIOManager for the InstanceFactory
readonly IGitHubClientFactory gitHubClientFactory
The IGitHubClientFactory for the InstanceFactory
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the InstanceFactory
readonly ISymlinkFactory symlinkFactory
The ISymlinkFactory for the InstanceFactory
readonly IJobManager jobManager
The IJobManager for the InstanceFactory
readonly IChatManagerFactory chatFactory
The IChatManagerFactory for the InstanceFactory
Manages the runtime of Jobs
Definition: IJobManager.cs:13
IInstance CreateInstance(IBridgeRegistrar bridgeRegistrar, Models.Instance metadata)
Create an IInstance
On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort(). This looks out for those prompts and immediately clicks "Yes" if the owning process has registered for it
readonly ILibGit2Commands repositoryCommands
The ILibGit2Commands for the InstanceFactory.
Interface for using filesystems
Definition: IIOManager.cs:11
Provides access to the server&#39;s HttpApiPort.
Repository(LibGit2Sharp.IRepository libGitRepo, ILibGit2Commands commands, IIOManager ioMananger, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger< Repository > logger, Action onDispose)
Construct a Repository
Definition: Repository.cs:115
readonly IAssemblyInformationProvider assemblyInformationProvider
The IAssemblyInformationProvider for the InstanceFactory
For identifying the current platform