public void Works_fine_with_unset_values() { Dictionary <string, string> args = new Dictionary <string, string>(); ArgsConfigSource configSource = new ArgsConfigSource(args); Assert.IsFalse(configSource.GetValue(typeof(int), "a", "a").IsSet); }
public void Can_parse_various_values(Type valueType, string valueString, object parsedValue) { Dictionary <string, string> args = new Dictionary <string, string>(); args.Add("A.a", valueString); ArgsConfigSource configSource = new ArgsConfigSource(args); Assert.AreEqual(parsedValue, configSource.GetValue(valueType, "a", "A").Value); }
public void Is_case_insensitive() { Dictionary <string, string> args = new Dictionary <string, string>(); args.Add("A.a", "12"); ArgsConfigSource configSource = new ArgsConfigSource(args); Assert.IsTrue(configSource.GetValue(typeof(int), "a", "A").IsSet); }
protected override (CommandLineApplication, Func <IConfigProvider>, Func <string>) BuildCommandLineApp() { var pluginsDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins"); if (Directory.Exists(pluginsDirectory)) { var plugins = Directory.GetFiles(pluginsDirectory, "*.dll"); foreach (var plugin in plugins) { var pluginName = plugin.Contains("/") ? plugin.Split("/").Last() : plugin.Split("\\").Last(); if (Logger.IsInfo) { Logger.Info($"Loading an external assembly: {pluginName}"); } AssemblyLoadContext.Default.LoadFromAssemblyPath(plugin); } } var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToList(); loadedAssemblies .SelectMany(x => x.GetReferencedAssemblies()) .Distinct() .Where(y => loadedAssemblies.Any((a) => a.FullName == y.FullName) == false) .ToList() .ForEach(x => loadedAssemblies.Add(AppDomain.CurrentDomain.Load(x))); var configurationType = typeof(IConfig); var configs = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => a.GetTypes()) .Where(t => configurationType.IsAssignableFrom(t) && !t.IsInterface) .ToList(); var app = new CommandLineApplication { Name = "Nethermind.Runner" }; app.HelpOption("-?|-h|--help"); var configFile = app.Option("-c|--config <configFile>", "config file path", CommandOptionType.SingleValue); var dbBasePath = app.Option("-d|--baseDbPath <baseDbPath>", "base db path", CommandOptionType.SingleValue); var logLevelOverride = app.Option("-l|--log <logLevel>", "log level", CommandOptionType.SingleValue); foreach (Type configType in configs) { foreach (PropertyInfo propertyInfo in configType.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { app.Option($"--{configType.Name.Replace("Config", String.Empty)}.{propertyInfo.Name}", $"{configType.Name}.{propertyInfo.Name}", CommandOptionType.SingleValue); } } IConfigProvider BuildConfigProvider() { // TODO: dynamically switch log levels from CLI! if (logLevelOverride.HasValue()) { string logLevel = logLevelOverride.Value(); NLog.LogLevel nLogLevel = NLog.LogLevel.Info; switch (logLevel.ToUpperInvariant()) { case "OFF": nLogLevel = NLog.LogLevel.Off; break; case "ERROR": nLogLevel = NLog.LogLevel.Error; break; case "WARN": nLogLevel = NLog.LogLevel.Warn; break; case "INFO": nLogLevel = NLog.LogLevel.Info; break; case "DEBUG": nLogLevel = NLog.LogLevel.Debug; break; case "TRACE": nLogLevel = NLog.LogLevel.Trace; break; } Console.WriteLine($"Enabling log level override: {logLevel.ToUpperInvariant()}"); foreach (var rule in LogManager.Configuration.LoggingRules) { rule.DisableLoggingForLevels(NLog.LogLevel.Trace, nLogLevel); rule.EnableLoggingForLevels(nLogLevel, NLog.LogLevel.Off); } //Call to update existing Loggers created with GetLogger() or //GetCurrentClassLogger() LogManager.ReconfigExistingLoggers(); } ConfigProvider configProvider = new ConfigProvider(); Dictionary <string, string> args = new Dictionary <string, string>(); foreach (CommandOption commandOption in app.Options) { if (commandOption.HasValue()) { args.Add(commandOption.LongName, commandOption.Value()); } } IConfigSource argsSource = new ArgsConfigSource(args); configProvider.AddSource(argsSource); configProvider.AddSource(new EnvConfigSource()); string configFilePath = configFile.HasValue() ? configFile.Value() : _defaultConfigFile; var configPathVariable = Environment.GetEnvironmentVariable("NETHERMIND_CONFIG"); if (!string.IsNullOrWhiteSpace(configPathVariable)) { configFilePath = configPathVariable; } if (!Path.HasExtension(configFilePath) && !configFilePath.Contains(Path.DirectorySeparatorChar)) { string redirectedConfigPath = Path.Combine("configs", string.Concat(configFilePath, ".cfg")); Console.WriteLine($"Redirecting config {configFilePath} to {redirectedConfigPath}"); configFilePath = redirectedConfigPath; } Console.WriteLine($"Reading config file from {configFilePath}"); configProvider.AddSource(new JsonConfigSource(configFilePath)); return(configProvider); } string GetBaseDbPath() { return(dbBasePath.HasValue() ? dbBasePath.Value() : null); } return(app, BuildConfigProvider, GetBaseDbPath); }
protected override (CommandLineApplication, Func <IConfigProvider>, Func <string>) BuildCommandLineApp() { var app = new CommandLineApplication { Name = "ChainLoader" }; app.HelpOption("-?|-h|--help"); var configFile = app.Option("-c|--config <configFile>", "config file path", CommandOptionType.SingleValue); var dbBasePath = app.Option("-d|--baseDbPath <baseDbPath>", "base db path", CommandOptionType.SingleValue); foreach (Type configType in _configs) { foreach (PropertyInfo propertyInfo in configType.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { app.Option($"--{configType.Name}.{propertyInfo.Name}", $"{configType.Name}.{propertyInfo.Name}", CommandOptionType.SingleValue); } } IConfigProvider BuildConfigProvider() { ConfigProvider configProvider = new ConfigProvider(); Dictionary <string, string> args = new Dictionary <string, string>(); foreach (CommandOption commandOption in app.Options) { if (commandOption.HasValue()) { args.Add(commandOption.LongName, commandOption.Value()); } } IConfigSource argsSource = new ArgsConfigSource(args); configProvider.AddSource(argsSource); configProvider.AddSource(new EnvConfigSource()); string configFilePath = configFile.HasValue() ? configFile.Value() : _defaultConfigFile; var configPathVariable = Environment.GetEnvironmentVariable("NETHERMIND_CONFIG"); if (!string.IsNullOrWhiteSpace(configPathVariable)) { configFilePath = configPathVariable; } if (!Path.HasExtension(configFilePath) && !configFilePath.Contains(Path.DirectorySeparatorChar)) { string redirectedConfigPath = Path.Combine("configs", string.Concat(configFilePath, ".cfg")); Console.WriteLine($"Redirecting config {configFilePath} to {redirectedConfigPath}"); configFilePath = redirectedConfigPath; } Console.WriteLine($"Reading config file from {configFilePath}"); configProvider.AddSource(new JsonConfigSource(configFilePath)); return(configProvider); } string GetBaseDbPath() { return(dbBasePath.HasValue() ? dbBasePath.Value() : null); } return(app, BuildConfigProvider, GetBaseDbPath); }
private static IConfigProvider BuildConfigProvider( CommandLineApplication app, CommandOption loggerConfigSource, CommandOption logLevelOverride, CommandOption configsDirectory, CommandOption configFile) { ILogger logger = SimpleConsoleLogger.Instance; if (loggerConfigSource.HasValue()) { string nLogPath = loggerConfigSource.Value(); logger.Info($"Loading NLog configuration file from {nLogPath}."); try { LogManager.Configuration = new XmlLoggingConfiguration(nLogPath); } catch (Exception e) { logger.Info($"Failed to load NLog configuration from {nLogPath}. {e}"); } } else { logger.Info($"Loading standard NLog.config file from {"NLog.config".GetApplicationResourcePath()}."); Stopwatch stopwatch = Stopwatch.StartNew(); LogManager.Configuration = new XmlLoggingConfiguration("NLog.config".GetApplicationResourcePath()); stopwatch.Stop(); logger.Info($"NLog.config loaded in {stopwatch.ElapsedMilliseconds}ms."); } // TODO: dynamically switch log levels from CLI! if (logLevelOverride.HasValue()) { NLogConfigurator.ConfigureLogLevels(logLevelOverride); } ConfigProvider configProvider = new ConfigProvider(); Dictionary <string, string> configArgs = new Dictionary <string, string>(); foreach (CommandOption commandOption in app.Options) { if (commandOption.HasValue()) { configArgs.Add(commandOption.LongName, commandOption.Value()); } } IConfigSource argsSource = new ArgsConfigSource(configArgs); configProvider.AddSource(argsSource); configProvider.AddSource(new EnvConfigSource()); string configDir = configsDirectory.HasValue() ? configsDirectory.Value() : DefaultConfigsDirectory; string configFilePath = configFile.HasValue() ? configFile.Value() : DefaultConfigFile; string?configPathVariable = Environment.GetEnvironmentVariable("NETHERMIND_CONFIG"); if (!string.IsNullOrWhiteSpace(configPathVariable)) { configFilePath = configPathVariable; } if (!PathUtils.IsExplicitlyRelative(configFilePath)) { if (configDir == DefaultConfigsDirectory) { configFilePath = configFilePath.GetApplicationResourcePath(); } else { configFilePath = Path.Combine(configDir, string.Concat(configFilePath)); } } if (!Path.HasExtension(configFilePath) && !configFilePath.Contains(Path.DirectorySeparatorChar)) { string redirectedConfigPath = Path.Combine(configDir, string.Concat(configFilePath, ".cfg")); configFilePath = redirectedConfigPath; if (!File.Exists(configFilePath)) { throw new InvalidOperationException($"Configuration: {configFilePath} was not found."); } } if (!Path.HasExtension(configFilePath)) { configFilePath = string.Concat(configFilePath, ".cfg"); } // Fallback to "{executingDirectory}/configs/{configFile}" if "configs" catalog was not specified. if (!File.Exists(configFilePath)) { string configName = Path.GetFileName(configFilePath); string?configDirectory = Path.GetDirectoryName(configFilePath); string redirectedConfigPath = Path.Combine(configDirectory ?? string.Empty, configDir, configName); configFilePath = redirectedConfigPath; if (!File.Exists(configFilePath)) { throw new InvalidOperationException($"Configuration: {configFilePath} was not found."); } } logger.Info($"Reading config file from {configFilePath}"); configProvider.AddSource(new JsonConfigSource(configFilePath)); configProvider.Initialize(); logger.Info("Configuration initialized."); return(configProvider); }
protected override (CommandLineApplication, Func <IConfigProvider>, Func <string?>) BuildCommandLineApp() { string pluginsDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory ?? string.Empty, "plugins"); if (Directory.Exists(pluginsDirectory)) { var plugins = Directory.GetFiles(pluginsDirectory, "*.dll"); foreach (string plugin in plugins) { Console.WriteLine($"Loading plugin {plugin} from {pluginsDirectory}"); string pluginName = plugin.Contains("/") ? plugin.Split("/").Last() : plugin.Split("\\").Last(); AssemblyLoadContext.Default.LoadFromAssemblyPath(plugin); } } else { Console.WriteLine($"Could not find plugins directory at: {pluginsDirectory}"); } var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToList(); loadedAssemblies .SelectMany(x => x.GetReferencedAssemblies()) .Distinct() .Where(y => loadedAssemblies.Any((a) => a.FullName == y.FullName) == false) .ToList() .ForEach(x => loadedAssemblies.Add(AppDomain.CurrentDomain.Load(x))); Type configurationType = typeof(IConfig); List <Type> configTypes = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => a.GetTypes()) .Where(t => configurationType.IsAssignableFrom(t) && !t.IsInterface) .ToList(); CommandLineApplication app = new CommandLineApplication { Name = "Nethermind.Runner" }; app.HelpOption("-?|-h|--help"); app.VersionOption("-v|--version", () => ClientVersion.Version, () => ClientVersion.Description); NLog.GlobalDiagnosticsContext.Set("version", ClientVersion.Version); CommandOption configFile = app.Option("-c|--config <configFile>", "config file path", CommandOptionType.SingleValue); CommandOption dbBasePath = app.Option("-d|--baseDbPath <baseDbPath>", "base db path", CommandOptionType.SingleValue); CommandOption logLevelOverride = app.Option("-l|--log <logLevel>", "log level", CommandOptionType.SingleValue); CommandOption configsDirectory = app.Option("-cd|--configsDirectory <configsDirectory>", "configs directory", CommandOptionType.SingleValue); CommandOption loggerConfigSource = app.Option("-lcs|--loggerConfigSource <loggerConfigSource>", "path to the NLog config file", CommandOptionType.SingleValue); foreach (Type configType in configTypes) { if (configType == null) { continue; } foreach (PropertyInfo propertyInfo in configType.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { Type? interfaceType = configType.GetInterface("I" + configType.Name); PropertyInfo?interfaceProperty = interfaceType?.GetProperty(propertyInfo.Name); ConfigItemAttribute?configItemAttribute = interfaceProperty?.GetCustomAttribute <ConfigItemAttribute>(); app.Option($"--{configType.Name.Replace("Config", String.Empty)}.{propertyInfo.Name}", $"{(configItemAttribute == null ? "<missing documentation>" : configItemAttribute.Description ?? "<missing documentation>")}", CommandOptionType.SingleValue); } } IConfigProvider BuildConfigProvider() { if (loggerConfigSource.HasValue()) { string nLogPath = loggerConfigSource.Value(); Console.WriteLine($"Loading NLog configuration file from {nLogPath}."); try { LogManager.Configuration = new XmlLoggingConfiguration(nLogPath); } catch (Exception e) { Console.WriteLine($"Failed to load NLog configuration from {nLogPath}. {e}"); } } else { Console.WriteLine($"Loading standard NLog.config file from {"NLog.config".GetApplicationResourcePath()}."); LogManager.Configuration = new XmlLoggingConfiguration("NLog.config".GetApplicationResourcePath()); } // TODO: dynamically switch log levels from CLI! if (logLevelOverride.HasValue()) { (new NLogConfigurator()).ConfigureLogLevels(logLevelOverride); } ConfigProvider configProvider = new ConfigProvider(); Dictionary <string, string> args = new Dictionary <string, string>(); foreach (CommandOption commandOption in app.Options) { if (commandOption.HasValue()) { args.Add(commandOption.LongName, commandOption.Value()); } } IConfigSource argsSource = new ArgsConfigSource(args); configProvider.AddSource(argsSource); configProvider.AddSource(new EnvConfigSource()); string configDir = configsDirectory.HasValue() ? configsDirectory.Value() : DefaultConfigsDirectory; string configFilePath = configFile.HasValue() ? configFile.Value() : _defaultConfigFile; string?configPathVariable = Environment.GetEnvironmentVariable("NETHERMIND_CONFIG"); if (!string.IsNullOrWhiteSpace(configPathVariable)) { configFilePath = configPathVariable; } if (!PathUtils.IsExplicitlyRelative(configFilePath)) { if (configDir == DefaultConfigsDirectory) { configFilePath = configFilePath.GetApplicationResourcePath(); } else { configFilePath = Path.Combine(configDir, string.Concat(configFilePath)); } } if (!Path.HasExtension(configFilePath) && !configFilePath.Contains(Path.DirectorySeparatorChar)) { string redirectedConfigPath = Path.Combine(configDir, string.Concat(configFilePath, ".cfg")); configFilePath = redirectedConfigPath; if (!File.Exists(configFilePath)) { throw new InvalidOperationException($"Configuration: {configFilePath} was not found."); } } if (!Path.HasExtension(configFilePath)) { configFilePath = string.Concat(configFilePath, ".cfg"); } // Fallback to "{executingDirectory}/configs/{configFile}" if "configs" catalog was not specified. if (!File.Exists(configFilePath)) { string configName = Path.GetFileName(configFilePath); string?configDirectory = Path.GetDirectoryName(configFilePath); string redirectedConfigPath = Path.Combine(configDirectory ?? string.Empty, configDir, configName); configFilePath = redirectedConfigPath; if (!File.Exists(configFilePath)) { throw new InvalidOperationException($"Configuration: {configFilePath} was not found."); } } Console.WriteLine($"Reading config file from {configFilePath}"); configProvider.AddSource(new JsonConfigSource(configFilePath)); configTypes.ForEach(configType => configProvider.RegisterCategory(configType.Name, configType)); return(configProvider); } string?GetBaseDbPath() { return(dbBasePath.HasValue() ? dbBasePath.Value() : null); } return(app, BuildConfigProvider, GetBaseDbPath); }
protected override (CommandLineApplication, Func <IConfigProvider>, Func <string>) BuildCommandLineApp() { var app = new CommandLineApplication { Name = "Nethermind.Runner" }; app.HelpOption("-?|-h|--help"); var configFile = app.Option("-c|--config <configFile>", "config file path", CommandOptionType.SingleValue); var dbBasePath = app.Option("-d|--baseDbPath <baseDbPath>", "base db path", CommandOptionType.SingleValue); var logLevelOverride = app.Option("-l|--log <logLevel>", "log level", CommandOptionType.SingleValue); foreach (Type configType in _configs) { foreach (PropertyInfo propertyInfo in configType.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { app.Option($"--{configType.Name}.{propertyInfo.Name}", $"{configType.Name}.{propertyInfo.Name}", CommandOptionType.SingleValue); } } IConfigProvider BuildConfigProvider() { // TODO: dynamically switch log levels from CLI! if (logLevelOverride.HasValue()) { string logLevel = logLevelOverride.Value(); NLog.LogLevel nLogLevel = NLog.LogLevel.Info; switch (logLevel.ToUpperInvariant()) { case "OFF": nLogLevel = NLog.LogLevel.Off; break; case "ERROR": nLogLevel = NLog.LogLevel.Error; break; case "WARN": nLogLevel = NLog.LogLevel.Warn; break; case "INFO": nLogLevel = NLog.LogLevel.Info; break; case "DEBUG": nLogLevel = NLog.LogLevel.Debug; break; case "TRACE": nLogLevel = NLog.LogLevel.Trace; break; } Console.WriteLine($"Enabling log level override: {logLevel.ToUpperInvariant()}"); foreach (var rule in LogManager.Configuration.LoggingRules) { rule.DisableLoggingForLevels(NLog.LogLevel.Trace, nLogLevel); rule.EnableLoggingForLevels(nLogLevel, NLog.LogLevel.Off); } //Call to update existing Loggers created with GetLogger() or //GetCurrentClassLogger() LogManager.ReconfigExistingLoggers(); } ConfigProvider configProvider = new ConfigProvider(); Dictionary <string, string> args = new Dictionary <string, string>(); foreach (CommandOption commandOption in app.Options) { if (commandOption.HasValue()) { args.Add(commandOption.LongName, commandOption.Value()); } } IConfigSource argsSource = new ArgsConfigSource(args); configProvider.AddSource(argsSource); configProvider.AddSource(new EnvConfigSource()); string configFilePath = configFile.HasValue() ? configFile.Value() : _defaultConfigFile; var configPathVariable = Environment.GetEnvironmentVariable("NETHERMIND_CONFIG"); if (!string.IsNullOrWhiteSpace(configPathVariable)) { configFilePath = configPathVariable; } if (!Path.HasExtension(configFilePath) && !configFilePath.Contains(Path.DirectorySeparatorChar)) { string redirectedConfigPath = Path.Combine("configs", string.Concat(configFilePath, ".cfg")); Console.WriteLine($"Redirecting config {configFilePath} to {redirectedConfigPath}"); configFilePath = redirectedConfigPath; } Console.WriteLine($"Reading config file from {configFilePath}"); configProvider.AddSource(new JsonConfigSource(configFilePath)); return(configProvider); } string GetBaseDbPath() { return(dbBasePath.HasValue() ? dbBasePath.Value() : null); } return(app, BuildConfigProvider, GetBaseDbPath); }