Ejemplo n.º 1
0
        internal static ModuleConfiguration LoadModuleConfiguration(CommandContext commandContext, string moduleName, string[] moduleSettingOverrides, string[] pluginListOverride)
        {
            var sharedFolder         = Path.Combine(commandContext.HostConfiguration.ModulesFolder, "Shared");
            var sharedConfigFileName = Path.Combine(sharedFolder, "shared-configuration.json");

            var moduleFolder = Path.Combine(commandContext.HostConfiguration.ModulesFolder, moduleName);

            if (!Directory.Exists(moduleFolder))
            {
                commandContext.Logger.Write(LogEventLevel.Fatal, "can't find the module folder: {Folder}", moduleFolder);
                commandContext.OpsLogger.Write(LogEventLevel.Fatal, "can't find the module folder: {Folder}", moduleFolder);
                return(null);
            }

            moduleFolder = Directory.GetDirectories(commandContext.HostConfiguration.ModulesFolder, moduleName, SearchOption.TopDirectoryOnly).FirstOrDefault();
            moduleName   = Path.GetFileName(moduleFolder);

            var configurationBuilder = new ConfigurationBuilder();

            if (File.Exists(sharedConfigFileName))
            {
                configurationBuilder.AddJsonFile(sharedConfigFileName);
                commandContext.Logger.Debug("using shared configuration file from {FileName}", PathHelpers.GetFriendlyPathName(sharedConfigFileName));

                try
                {
                    configurationBuilder.Build();
                }
                catch (Exception ex)
                {
                    throw new ConfigurationFileException(PathHelpers.GetFriendlyPathName(sharedConfigFileName), "can't read the configuration file", ex);
                }
            }

            var moduleConfigFileName = Path.Combine(moduleFolder, "module-configuration.json");

            if (!File.Exists(moduleConfigFileName))
            {
                commandContext.Logger.Write(LogEventLevel.Fatal, "can't find the module configuration file: {FileName}", moduleConfigFileName);
                commandContext.OpsLogger.Write(LogEventLevel.Fatal, "can't find the module configuration file: {FileName}", moduleConfigFileName);
                return(null);
            }

            configurationBuilder.AddJsonFile(moduleConfigFileName);
            commandContext.Logger.Debug("using module configuration file from {FileName}", PathHelpers.GetFriendlyPathName(moduleConfigFileName));

            IConfigurationRoot configuration;

            try
            {
                configuration = configurationBuilder.Build();
                AddCommandLineArgumentsToModuleConfiguration(configuration, moduleSettingOverrides);
            }
            catch (Exception ex)
            {
                throw new ConfigurationFileException(PathHelpers.GetFriendlyPathName(moduleConfigFileName), "can't read the configuration file", ex);
            }

            var pluginNamesToExecute = pluginListOverride;

            if (pluginNamesToExecute == null || pluginNamesToExecute.Length == 0)
            {
                pluginNamesToExecute = configuration.GetSection("Module:PluginsToExecute-" + Environment.MachineName).Get <string[]>();
            }

            if (pluginNamesToExecute == null || pluginNamesToExecute.Length == 0)
            {
                pluginNamesToExecute = configuration.GetSection("Module:PluginsToExecute").Get <string[]>();
            }

            var broken = false;

            foreach (var pluginName in pluginNamesToExecute.Where(x => x.Contains(',', StringComparison.InvariantCultureIgnoreCase) || x.Contains(' ', StringComparison.InvariantCultureIgnoreCase)))
            {
                commandContext.Logger.Write(LogEventLevel.Fatal, "plugin name can't contain comma or space character: [{Plugin}]", pluginName);
                broken = true;
            }

            if (broken)
            {
                return(null);
            }

            var allConnectionStrings = new List <NamedConnectionString>();
            var sharedCs             = new ConnectionStringCollection();

            sharedCs.LoadFromConfiguration(configuration, "ConnectionStrings:Shared", commandContext.HostConfiguration.SecretProtector);
            foreach (var cs in sharedCs.All)
            {
                allConnectionStrings.Add(cs);
            }

            var moduleCs = new ConnectionStringCollection();

            moduleCs.LoadFromConfiguration(configuration, "ConnectionStrings:Module", commandContext.HostConfiguration.SecretProtector);
            foreach (var cs in moduleCs.All)
            {
                allConnectionStrings.RemoveAll(x => x.Name == cs.Name);
                allConnectionStrings.Add(cs);
            }

            var relevantConnectionStrings = new ConnectionStringCollection();

            if (allConnectionStrings?.Count > 0)
            {
                var originalNames = allConnectionStrings
                                    .Select(x => x.Name.Split('-')[0])
                                    .Distinct()
                                    .ToList();

                foreach (var originalName in originalNames)
                {
                    var connectionString = allConnectionStrings.Find(x => string.Equals(x.Name, originalName + "-" + Environment.MachineName, StringComparison.InvariantCultureIgnoreCase))
                                           ?? allConnectionStrings.Find(x => string.Equals(x.Name, originalName, StringComparison.InvariantCultureIgnoreCase));

                    relevantConnectionStrings.Add(connectionString);
                }
            }

            return(new ModuleConfiguration()
            {
                ModuleName = moduleName,
                ConfigurationFileName = moduleConfigFileName,
                ModuleFolder = moduleFolder,
                Configuration = configuration,
                ConnectionStrings = relevantConnectionStrings,
                EnabledPluginList = pluginNamesToExecute
                                    .Select(name => name.Trim())
                                    .Where(name => !name.StartsWith("!", StringComparison.InvariantCultureIgnoreCase))
                                    .Where(plugin => plugin != null)
                                    .ToList(),
                SecretProtector = commandContext.HostConfiguration.SecretProtector,
            });
        }