Beispiel #1
0
        public Task HandleAsync(RuntimeUnattendedInstallNotification notification, CancellationToken cancellationToken)
        {
            // unattended install is not enabled
            if (_unattendedSettings.Value.InstallUnattended == false)
            {
                return(Task.CompletedTask);
            }

            // no connection string set
            if (_databaseFactory.Configured == false)
            {
                return(Task.CompletedTask);
            }

            _runtimeState.DetermineRuntimeLevel();
            if (_runtimeState.Reason == RuntimeLevelReason.InstallMissingDatabase)
            {
                _dbProviderFactoryCreator.CreateDatabase(_databaseFactory.ProviderName, _databaseFactory.ConnectionString);
            }

            bool connect;

            try
            {
                for (var i = 0; ;)
                {
                    connect = _databaseFactory.CanConnect;
                    if (connect || ++i == 5)
                    {
                        break;
                    }

                    _logger.LogDebug("Could not immediately connect to database, trying again.");

                    Thread.Sleep(1000);
                }
            }
            catch (Exception ex)
            {
                _logger.LogInformation(ex, "Error during unattended install.");

                var innerException = new UnattendedInstallException("Unattended installation failed.", ex);
                _runtimeState.Configure(Core.RuntimeLevel.BootFailed, Core.RuntimeLevelReason.BootFailedOnException, innerException);
                return(Task.CompletedTask);
            }

            // could not connect to the database
            if (connect == false)
            {
                return(Task.CompletedTask);
            }

            IUmbracoDatabase database = null;

            try
            {
                using (database = _databaseFactory.CreateDatabase())
                {
                    var hasUmbracoTables = database.IsUmbracoInstalled();

                    // database has umbraco tables, assume Umbraco is already installed
                    if (hasUmbracoTables)
                    {
                        return(Task.CompletedTask);
                    }

                    // all conditions fulfilled, do the install
                    _logger.LogInformation("Starting unattended install.");

                    database.BeginTransaction();
                    DatabaseSchemaCreator creator = _databaseSchemaCreatorFactory.Create(database);
                    creator.InitializeDatabaseSchema();
                    database.CompleteTransaction();
                    _logger.LogInformation("Unattended install completed.");

                    // Emit an event with EventAggregator that unattended install completed
                    // Then this event can be listened for and create an unattended user
                    _eventAggregator.Publish(new UnattendedInstallNotification());
                }
            }
            catch (Exception ex)
            {
                _logger.LogInformation(ex, "Error during unattended install.");
                database?.AbortTransaction();

                var innerException = new UnattendedInstallException(
                    "The database configuration failed."
                    + "\n Please check log file for additional information (can be found in '/Umbraco/Data/Logs/')",
                    ex);

                _runtimeState.Configure(Core.RuntimeLevel.BootFailed, Core.RuntimeLevelReason.BootFailedOnException, innerException);
            }

            return(Task.CompletedTask);
        }