/// <inheritdoc />
 protected override IWatchdog CreateNonExperimentalWatchdog(
     IChat chat,
     IDmbFactory dmbFactory,
     IReattachInfoHandler reattachInfoHandler,
     IEventConsumer eventConsumer,
     ISessionControllerFactory sessionControllerFactory,
     IIOManager ioManager,
     Api.Models.Instance instance,
     DreamDaemonSettings settings)
 => new WindowsWatchdog(
     chat,
     sessionControllerFactory,
     dmbFactory,
     reattachInfoHandler,
     DatabaseContextFactory,
     ByondTopicSender,
     eventConsumer,
     JobManager,
     ServerControl,
     AsyncDelayer,
     ioManager,
     symlinkFactory,
     LoggerFactory.CreateLogger <WindowsWatchdog>(),
     settings,
     instance,
     settings.AutoStart.Value);
        /// <inheritdoc />
        public IWatchdog CreateWatchdog(
            IChat chat,
            IDmbFactory dmbFactory,
            IReattachInfoHandler reattachInfoHandler,
            IEventConsumer eventConsumer,
            ISessionControllerFactory sessionControllerFactory,
            IIOManager ioManager,
            Api.Models.Instance instance,
            DreamDaemonSettings settings)
        {
            if (GeneralConfiguration.UseExperimentalWatchdog)
            {
                return(new ExperimentalWatchdog(
                           chat,
                           sessionControllerFactory,
                           dmbFactory,
                           reattachInfoHandler,
                           DatabaseContextFactory,
                           ByondTopicSender,
                           eventConsumer,
                           JobManager,
                           ServerControl,
                           AsyncDelayer,
                           LoggerFactory.CreateLogger <ExperimentalWatchdog>(),
                           settings,
                           instance,
                           settings.AutoStart.Value));
            }

            return(CreateNonExperimentalWatchdog(chat, dmbFactory, reattachInfoHandler, eventConsumer, sessionControllerFactory, ioManager, instance, settings));
        }
Exemplo n.º 3
0
        /// <summary>
        /// Implementation of <see cref="Read(CancellationToken)"/>
        /// </summary>
        /// <param name="settings">The <see cref="DreamDaemonSettings"/> to operate on if any</param>
        /// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation</param>
        /// <returns>A <see cref="Task{TResult}"/> resulting in the <see cref="IActionResult"/> of the operation</returns>
        async Task <IActionResult> ReadImpl(DreamDaemonSettings settings, CancellationToken cancellationToken)
        {
            var instance = instanceManager.GetInstance(Instance);
            var dd       = instance.Watchdog;

            var metadata = (AuthenticationContext.GetRight(RightsType.DreamDaemon) & (ulong)DreamDaemonRights.ReadMetadata) != 0;
            var revision = (AuthenticationContext.GetRight(RightsType.DreamDaemon) & (ulong)DreamDaemonRights.ReadRevision) != 0;

            if (settings == null)
            {
                settings = await DatabaseContext
                           .Instances
                           .AsQueryable()
                           .Where(x => x.Id == Instance.Id)
                           .Select(x => x.DreamDaemonSettings)
                           .FirstOrDefaultAsync(cancellationToken)
                           .ConfigureAwait(false);

                if (settings == default)
                {
                    return(StatusCode((int)HttpStatusCode.Gone));
                }
            }

            var result = new DreamDaemon();

            if (metadata)
            {
                var alphaActive = dd.AlphaIsActive;
                var llp         = dd.LastLaunchParameters;
                var rstate      = dd.RebootState;
                result.AutoStart             = settings.AutoStart.Value;
                result.CurrentPort           = alphaActive ? llp?.PrimaryPort.Value : llp?.SecondaryPort.Value;
                result.CurrentSecurity       = llp?.SecurityLevel.Value;
                result.CurrentAllowWebclient = llp?.AllowWebClient.Value;
                result.PrimaryPort           = settings.PrimaryPort.Value;
                result.AllowWebClient        = settings.AllowWebClient.Value;
                result.Running          = dd.Running;
                result.SecondaryPort    = settings.SecondaryPort.Value;
                result.SecurityLevel    = settings.SecurityLevel.Value;
                result.SoftRestart      = rstate == RebootState.Restart;
                result.SoftShutdown     = rstate == RebootState.Shutdown;
                result.StartupTimeout   = settings.StartupTimeout.Value;
                result.HeartbeatSeconds = settings.HeartbeatSeconds.Value;
            }

            if (revision)
            {
                var latestCompileJob = instance.LatestCompileJob();
                result.ActiveCompileJob = ((dd.Running ? dd.ActiveCompileJob : latestCompileJob) ?? latestCompileJob)?.ToApi();
                if (latestCompileJob?.Id != result.ActiveCompileJob?.Id)
                {
                    result.StagedCompileJob = latestCompileJob?.ToApi();
                }
            }

            return(Json(result));
        }
Exemplo n.º 4
0
 /// <inheritdoc />
 public virtual IWatchdog CreateWatchdog(
     IChatManager chat,
     IDmbFactory dmbFactory,
     ISessionPersistor sessionPersistor,
     ISessionControllerFactory sessionControllerFactory,
     IIOManager gameIOManager,
     IIOManager diagnosticsIOManager,
     IEventConsumer eventConsumer,
     Api.Models.Instance instance,
     DreamDaemonSettings settings)
 => new BasicWatchdog(
Exemplo n.º 5
0
 /// <inheritdoc />
 public override IWatchdog CreateWatchdog(
     IChatManager chat,
     IDmbFactory dmbFactory,
     ISessionPersistor sessionPersistor,
     ISessionControllerFactory sessionControllerFactory,
     IIOManager gameIOManager,
     IIOManager diagnosticsIOManager,
     IEventConsumer eventConsumer,
     IRemoteDeploymentManagerFactory remoteDeploymentManagerFactory,
     Api.Models.Instance instance,
     DreamDaemonSettings settings)
 => new WindowsWatchdog(
        /// <summary>
        /// Implementation of <see cref="Read(CancellationToken)"/>
        /// </summary>
        /// <param name="settings">The <see cref="DreamDaemonSettings"/> to operate on if any</param>
        /// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation</param>
        /// <returns>A <see cref="Task{TResult}"/> resulting in the <see cref="IActionResult"/> of the operation</returns>
        async Task <IActionResult> ReadImpl(DreamDaemonSettings settings, CancellationToken cancellationToken)
        {
            var instance = instanceManager.GetInstance(Instance);
            var dd       = instance.Watchdog;

            var metadata = (AuthenticationContext.GetRight(RightsType.DreamDaemon) & (ulong)DreamDaemonRights.ReadMetadata) != 0;
            var revision = (AuthenticationContext.GetRight(RightsType.DreamDaemon) & (ulong)DreamDaemonRights.ReadRevision) != 0;

            if (settings == null)
            {
                settings = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).Select(x => x.DreamDaemonSettings).FirstAsync(cancellationToken).ConfigureAwait(false);
            }
            var result = new DreamDaemon();

            if (metadata)
            {
                var alphaActive = dd.AlphaIsActive;
                var llp         = dd.LastLaunchParameters;
                var rstate      = dd.RebootState;
                result.AutoStart             = settings.AutoStart;
                result.CurrentPort           = alphaActive ? llp?.PrimaryPort : llp?.SecondaryPort;
                result.CurrentSecurity       = llp?.SecurityLevel;
                result.CurrentAllowWebclient = llp?.AllowWebClient;
                result.PrimaryPort           = settings.PrimaryPort;
                result.AllowWebClient        = settings.AllowWebClient;
                result.Running       = dd.Running;
                result.SecondaryPort = settings.SecondaryPort;
                result.SecurityLevel = settings.SecurityLevel;
                result.SoftRestart   = rstate == RebootState.Restart;
                result.SoftShutdown  = rstate == RebootState.Shutdown;
            }
            ;

            if (revision)
            {
                result.ActiveCompileJob = dd.ActiveCompileJob?.ToApi();
                var compileJob = instance.LatestCompileJob();
                result.StagedCompileJob = compileJob?.ToApi();
            }

            return(Json(result));
        }
Exemplo n.º 7
0
 /// <summary>
 /// Create a <see cref="IWatchdog"/> that isn't the <see cref="ExperimentalWatchdog"/>.
 /// </summary>
 /// <param name="chat">The <see cref="IChatManager"/> for the <see cref="IWatchdog"/></param>
 /// <param name="dmbFactory">The <see cref="IDmbFactory"/> for the <see cref="IWatchdog"/> with</param>
 /// <param name="reattachInfoHandler">The <see cref="IReattachInfoHandler"/> for the <see cref="IWatchdog"/></param>
 /// <param name="sessionControllerFactory">The <see cref="ISessionControllerFactory"/> for the <see cref="IWatchdog"/></param>
 /// <param name="ioManager">The <see cref="IIOManager"/> for the <see cref="IWatchdog"/>.</param>
 /// <param name="instance">The <see cref="Instance"/> for the <see cref="IWatchdog"/></param>
 /// <param name="settings">The initial <see cref="DreamDaemonSettings"/> for the <see cref="IWatchdog"/></param>
 /// <returns>A new <see cref="IWatchdog"/></returns>
 protected virtual IWatchdog CreateNonExperimentalWatchdog(
     IChatManager chat,
     IDmbFactory dmbFactory,
     IReattachInfoHandler reattachInfoHandler,
     ISessionControllerFactory sessionControllerFactory,
     IIOManager ioManager,
     Api.Models.Instance instance,
     DreamDaemonSettings settings)
 => new BasicWatchdog(
     chat,
     sessionControllerFactory,
     dmbFactory,
     reattachInfoHandler,
     DatabaseContextFactory,
     JobManager,
     ServerControl,
     AsyncDelayer,
     LoggerFactory.CreateLogger <BasicWatchdog>(),
     settings,
     instance,
     settings.AutoStart.Value);
Exemplo n.º 8
0
        /// <summary>
        /// Correct invalid database data caused by previous versions (NOT user fuckery).
        /// </summary>
        /// <param name="databaseContext">The <see cref="IDatabaseContext"/> to sanitize.</param>
        /// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation.</param>
        /// <returns>A <see cref="Task"/> representing the running operation.</returns>
        async Task SanitizeDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken)
        {
            var admin = await GetAdminUser(databaseContext, cancellationToken).ConfigureAwait(false);

            if (admin != null)
            {
                if (admin.PermissionSet != null)
                {
                    // Fix the issue with ulong enums
                    // https://github.com/tgstation/tgstation-server/commit/db341d43b3dab74fe3681f5172ca9bfeaafa6b6d#diff-09f06ec4584665cf89bb77b97f5ccfb9R36-R39
                    // https://github.com/JamesNK/Newtonsoft.Json/issues/2301
                    admin.PermissionSet.AdministrationRights  &= RightsHelper.AllRights <AdministrationRights>();
                    admin.PermissionSet.InstanceManagerRights &= RightsHelper.AllRights <InstanceManagerRights>();
                }

                if (admin.CreatedBy == null)
                {
                    var tgsUser = await databaseContext
                                  .Users
                                  .AsQueryable()
                                  .Where(x => x.CanonicalName == User.CanonicalizeName(User.TgsSystemUserName))
                                  .FirstOrDefaultAsync(cancellationToken)
                                  .ConfigureAwait(false);

                    if (tgsUser != null)
                    {
                        logger.LogError(
                            "A user named TGS (Canonically) exists but isn't marked as the admin's creator. This may be because it was created manually. This user is going to be adapted to use as the starter of system jobs.");
                    }

                    tgsUser         = SeedSystemUser(databaseContext, tgsUser);
                    admin.CreatedBy = tgsUser;
                }
            }

            if (platformIdentifier.IsWindows)
            {
                // normalize backslashes to forward slashes
                var allInstances = await databaseContext
                                   .Instances
                                   .AsQueryable()
                                   .ToListAsync(cancellationToken)
                                   .ConfigureAwait(false);

                foreach (var instance in allInstances)
                {
                    instance.Path = instance.Path.Replace('\\', '/');
                }
            }

            if (generalConfiguration.ByondTopicTimeout != 0)
            {
                var ids = await databaseContext
                          .DreamDaemonSettings
                          .AsQueryable()
                          .Where(x => x.TopicRequestTimeout == 0)
                          .Select(x => x.Id)
                          .ToListAsync(cancellationToken)
                          .ConfigureAwait(false);

                var rowsUpdated = ids.Count;
                foreach (var id in ids)
                {
                    var newDDSettings = new DreamDaemonSettings
                    {
                        Id = id
                    };

                    databaseContext.DreamDaemonSettings.Attach(newDDSettings);
                    newDDSettings.TopicRequestTimeout = generalConfiguration.ByondTopicTimeout;
                }

                if (rowsUpdated > 0)
                {
                    logger.LogInformation(
                        "Updated {0} instances to use database backed BYOND topic timeouts from configuration setting of {1}",
                        rowsUpdated,
                        generalConfiguration.ByondTopicTimeout);
                }
            }

            await databaseContext.Save(cancellationToken).ConfigureAwait(false);
        }
 /// <summary>
 /// Implementation of <see cref="Read(CancellationToken)"/>
 /// </summary>
 /// <param name="settings">The <see cref="DreamDaemonSettings"/> to operate on if any</param>
 /// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation</param>
 /// <returns>A <see cref="Task{TResult}"/> resulting in the <see cref="IActionResult"/> of the operation</returns>
 Task <IActionResult> ReadImpl(DreamDaemonSettings settings, CancellationToken cancellationToken)
 => WithComponentInstance(async instance =>
 /// <inheritdoc />
 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 <Watchdog>(), reattachInfoHandler, databaseContextFactory, byondTopicSender, eventConsumer, jobManager, serverControl, settings, instance, settings.AutoStart.Value);
Exemplo n.º 11
0
 /// <inheritdoc />
 public IWatchdog CreateWatchdog(IDmbFactory dmbFactory, DreamDaemonSettings settings) => new Watchdog(chat, sessionControllerFactory, dmbFactory, serverUpdater, loggerFactory.CreateLogger <Watchdog>(), reattachInfoHandler, databaseContextFactory, byondTopicSender, eventConsumer, settings, instance, settings.AutoStart.Value);