From 70a0d7aa4677c240ad12527adde6725df946e572 Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 8 Feb 2010 15:21:35 +0000 Subject: Adding the Careminster "Configger" tool to OpenSim. The tool will, when launched in place of OpenSim, dump the config to stdout. Use -f xml, -f ini or -f mysql to get a condensed ini file, an xml file suitable for webloading, or a set of mysql insert statements. --- OpenSim/Tools/Configger/ConfigurationLoader.cs | 251 +++++++++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 OpenSim/Tools/Configger/ConfigurationLoader.cs (limited to 'OpenSim/Tools/Configger/ConfigurationLoader.cs') diff --git a/OpenSim/Tools/Configger/ConfigurationLoader.cs b/OpenSim/Tools/Configger/ConfigurationLoader.cs new file mode 100644 index 0000000..49af417 --- /dev/null +++ b/OpenSim/Tools/Configger/ConfigurationLoader.cs @@ -0,0 +1,251 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Threading; +using System.Xml; +using log4net; +using Nini.Config; + +namespace Careminster +{ + /// + /// Loads the Configuration files into nIni + /// + public class ConfigurationLoader + { + /// + /// A source of Configuration data + /// + protected IConfigSource m_config; + + /// + /// Console logger + /// + private static readonly ILog m_log = + LogManager.GetLogger( + MethodBase.GetCurrentMethod().DeclaringType); + + public ConfigurationLoader() + { + } + + /// + /// Loads the region configuration + /// + /// Parameters passed into the process when started + /// + /// + /// A configuration that gets passed to modules + public IConfigSource LoadConfigSettings() + { + bool iniFileExists = false; + + List sources = new List(); + + string iniFileName = "OpenSim.ini"; + string iniFilePath = Path.Combine(".", iniFileName); + + if (IsUri(iniFileName)) + { + if (!sources.Contains(iniFileName)) + sources.Add(iniFileName); + } + else + { + if (File.Exists(iniFilePath)) + { + if (!sources.Contains(iniFilePath)) + sources.Add(iniFilePath); + } + } + + m_config = new IniConfigSource(); + m_config.Merge(DefaultConfig()); + + m_log.Info("[CONFIG] Reading configuration settings"); + + if (sources.Count == 0) + { + m_log.FatalFormat("[CONFIG] Could not load any configuration"); + m_log.FatalFormat("[CONFIG] Did you copy the OpenSim.ini.example file to OpenSim.ini?"); + Environment.Exit(1); + } + + for (int i = 0 ; i < sources.Count ; i++) + { + if (ReadConfig(sources[i])) + iniFileExists = true; + AddIncludes(sources); + } + + if (!iniFileExists) + { + m_log.FatalFormat("[CONFIG] Could not load any configuration"); + m_log.FatalFormat("[CONFIG] Configuration exists, but there was an error loading it!"); + Environment.Exit(1); + } + + return m_config; + } + + /// + /// Adds the included files as ini configuration files + /// + /// List of URL strings or filename strings + private void AddIncludes(List sources) + { + //loop over config sources + foreach (IConfig config in m_config.Configs) + { + // Look for Include-* in the key name + string[] keys = config.GetKeys(); + foreach (string k in keys) + { + if (k.StartsWith("Include-")) + { + // read the config file to be included. + string file = config.GetString(k); + if (IsUri(file)) + { + if (!sources.Contains(file)) + sources.Add(file); + } + else + { + string basepath = Path.GetFullPath("."); + string path = Path.Combine(basepath, file); + string[] paths = Util.Glob(path); + foreach (string p in paths) + { + if (!sources.Contains(p)) + sources.Add(p); + } + } + } + } + } + } + /// + /// Check if we can convert the string to a URI + /// + /// String uri to the remote resource + /// true if we can convert the string to a Uri object + bool IsUri(string file) + { + Uri configUri; + + return Uri.TryCreate(file, UriKind.Absolute, + out configUri) && configUri.Scheme == Uri.UriSchemeHttp; + } + + /// + /// Provide same ini loader functionality for standard ini and master ini - file system or XML over http + /// + /// Full path to the ini + /// + private bool ReadConfig(string iniPath) + { + bool success = false; + + if (!IsUri(iniPath)) + { + m_log.InfoFormat("[CONFIG] Reading configuration file {0}", + Path.GetFullPath(iniPath)); + + m_config.Merge(new IniConfigSource(iniPath)); + success = true; + } + else + { + m_log.InfoFormat("[CONFIG] {0} is a http:// URI, fetching ...", + iniPath); + + // The ini file path is a http URI + // Try to read it + // + try + { + XmlReader r = XmlReader.Create(iniPath); + XmlConfigSource cs = new XmlConfigSource(r); + m_config.Merge(cs); + + success = true; + } + catch (Exception e) + { + m_log.FatalFormat("[CONFIG] Exception reading config from URI {0}\n" + e.ToString(), iniPath); + Environment.Exit(1); + } + } + return success; + } + + /// + /// Setup a default config values in case they aren't present in the ini file + /// + /// A Configuration source containing the default configuration + private static IConfigSource DefaultConfig() + { + IConfigSource defaultConfig = new IniConfigSource(); + + { + IConfig config = defaultConfig.Configs["Startup"]; + + if (null == config) + config = defaultConfig.AddConfig("Startup"); + + config.Set("region_info_source", "filesystem"); + + config.Set("gridmode", false); + config.Set("physics", "OpenDynamicsEngine"); + config.Set("meshing", "Meshmerizer"); + config.Set("physical_prim", true); + config.Set("see_into_this_sim_from_neighbor", true); + config.Set("serverside_object_permissions", false); + config.Set("storage_plugin", "OpenSim.Data.SQLite.dll"); + config.Set("storage_connection_string", "URI=file:OpenSim.db,version=3"); + config.Set("storage_prim_inventories", true); + config.Set("startup_console_commands_file", String.Empty); + config.Set("shutdown_console_commands_file", String.Empty); + config.Set("DefaultScriptEngine", "XEngine"); + config.Set("clientstack_plugin", "OpenSim.Region.ClientStack.LindenUDP.dll"); + // life doesn't really work without this + config.Set("EventQueue", true); + } + + { + IConfig config = defaultConfig.Configs["StandAlone"]; + + if (null == config) + config = defaultConfig.AddConfig("StandAlone"); + + config.Set("accounts_authenticate", true); + config.Set("welcome_message", "Welcome to OpenSimulator"); + config.Set("inventory_plugin", "OpenSim.Data.SQLite.dll"); + config.Set("inventory_source", ""); + config.Set("userDatabase_plugin", "OpenSim.Data.SQLite.dll"); + config.Set("user_source", ""); + config.Set("LibrariesXMLFile", string.Format(".{0}inventory{0}Libraries.xml", Path.DirectorySeparatorChar)); + } + + { + IConfig config = defaultConfig.Configs["Network"]; + + if (null == config) + config = defaultConfig.AddConfig("Network"); + + config.Set("default_location_x", 1000); + config.Set("default_location_y", 1000); + config.Set("grid_send_key", "null"); + config.Set("grid_recv_key", "null"); + config.Set("user_send_key", "null"); + config.Set("user_recv_key", "null"); + config.Set("secure_inventory_server", "true"); + } + + return defaultConfig; + } + + } +} -- cgit v1.1