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 +++++++++++++++++++++++++
OpenSim/Tools/Configger/Main.cs | 108 +++++++++++
OpenSim/Tools/Configger/Util.cs | 79 ++++++++
3 files changed, 438 insertions(+)
create mode 100644 OpenSim/Tools/Configger/ConfigurationLoader.cs
create mode 100644 OpenSim/Tools/Configger/Main.cs
create mode 100644 OpenSim/Tools/Configger/Util.cs
(limited to 'OpenSim/Tools/Configger')
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;
+ }
+
+ }
+}
diff --git a/OpenSim/Tools/Configger/Main.cs b/OpenSim/Tools/Configger/Main.cs
new file mode 100644
index 0000000..c85f0d2
--- /dev/null
+++ b/OpenSim/Tools/Configger/Main.cs
@@ -0,0 +1,108 @@
+using Nini.Config;
+using System;
+
+namespace Careminster
+{
+ public class Configger
+ {
+ public static int Main(string[] args)
+ {
+ ArgvConfigSource argvConfig = new ArgvConfigSource(args);
+ argvConfig.AddSwitch("Startup", "format", "f");
+
+ IConfig startupConfig = argvConfig.Configs["Startup"];
+
+ string format = startupConfig.GetString("format", "ini");
+
+ ConfigurationLoader loader = new ConfigurationLoader();
+
+ IConfigSource s = loader.LoadConfigSettings();
+
+ if (format == "mysql")
+ {
+ foreach (IConfig c in s.Configs)
+ {
+ foreach (string k in c.GetKeys())
+ {
+ string v = c.GetString(k);
+
+ if (k.StartsWith("Include-"))
+ continue;
+ Console.WriteLine("insert ignore into config (section, name, value) values ('{0}', '{1}', '{2}');", c.Name, k, v);
+ }
+ }
+ }
+ else if (format == "xml")
+ {
+ Console.WriteLine("");
+
+ foreach (IConfig c in s.Configs)
+ {
+ int count = 0;
+
+ foreach (string k in c.GetKeys())
+ {
+ if (k.StartsWith("Include-"))
+ continue;
+
+ count++;
+ }
+
+ if (count > 0)
+ {
+ Console.WriteLine("", c.Name);
+
+ foreach (string k in c.GetKeys())
+ {
+ string v = c.GetString(k);
+
+ if (k.StartsWith("Include-"))
+ continue;
+ Console.WriteLine(" ", k, v);
+
+ Console.WriteLine("");
+ }
+ }
+ }
+ Console.WriteLine("");
+ }
+ else if (format == "ini")
+ {
+ foreach (IConfig c in s.Configs)
+ {
+ int count = 0;
+
+ foreach (string k in c.GetKeys())
+ {
+ if (k.StartsWith("Include-"))
+ continue;
+
+ count++;
+ }
+
+ if (count > 0)
+ {
+ Console.WriteLine("[{0}]", c.Name);
+
+ foreach (string k in c.GetKeys())
+ {
+ string v = c.GetString(k);
+
+ if (k.StartsWith("Include-"))
+ continue;
+ Console.WriteLine("{0} = \"{1}\"", k, v);
+ }
+
+ Console.WriteLine();
+ }
+ }
+ }
+ else
+ {
+ Console.WriteLine("Error: unknown format: {0}", format);
+ }
+
+ return 0;
+ }
+ }
+}
diff --git a/OpenSim/Tools/Configger/Util.cs b/OpenSim/Tools/Configger/Util.cs
new file mode 100644
index 0000000..6f8aa76
--- /dev/null
+++ b/OpenSim/Tools/Configger/Util.cs
@@ -0,0 +1,79 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.IO.Compression;
+using System.Net;
+using System.Net.Sockets;
+using System.Reflection;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading;
+using log4net;
+using Nini.Config;
+
+namespace Careminster
+{
+ public static class Util
+ {
+ public static string[] Glob(string path)
+ {
+ string vol=String.Empty;
+
+ if (Path.VolumeSeparatorChar != Path.DirectorySeparatorChar)
+ {
+ string[] vcomps = path.Split(new char[] {Path.VolumeSeparatorChar}, 2, StringSplitOptions.RemoveEmptyEntries);
+
+ if (vcomps.Length > 1)
+ {
+ path = vcomps[1];
+ vol = vcomps[0];
+ }
+ }
+
+ string[] comps = path.Split(new char[] {Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar}, StringSplitOptions.RemoveEmptyEntries);
+
+ // Glob
+
+ path = vol;
+ if (vol != String.Empty)
+ path += new String(new char[] {Path.VolumeSeparatorChar, Path.DirectorySeparatorChar});
+ else
+ path = new String(new char[] {Path.DirectorySeparatorChar});
+
+ List paths = new List();
+ List found = new List();
+ paths.Add(path);
+
+ int compIndex = -1;
+ foreach (string c in comps)
+ {
+ compIndex++;
+
+ List addpaths = new List();
+ foreach (string p in paths)
+ {
+ string[] dirs = Directory.GetDirectories(p, c);
+
+ if (dirs.Length != 0)
+ {
+ foreach (string dir in dirs)
+ addpaths.Add(Path.Combine(path, dir));
+ }
+
+ // Only add files if that is the last path component
+ if (compIndex == comps.Length - 1)
+ {
+ string[] files = Directory.GetFiles(p, c);
+ foreach (string f in files)
+ found.Add(f);
+ }
+ }
+ paths = addpaths;
+ }
+
+ return found.ToArray();
+ }
+ }
+}
--
cgit v1.1