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.0.6.9
parent
5dc278b0d7
commit
70a0d7aa46
|
@ -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
|
||||
{
|
||||
/// <summary>
|
||||
/// Loads the Configuration files into nIni
|
||||
/// </summary>
|
||||
public class ConfigurationLoader
|
||||
{
|
||||
/// <summary>
|
||||
/// A source of Configuration data
|
||||
/// </summary>
|
||||
protected IConfigSource m_config;
|
||||
|
||||
/// <summary>
|
||||
/// Console logger
|
||||
/// </summary>
|
||||
private static readonly ILog m_log =
|
||||
LogManager.GetLogger(
|
||||
MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
public ConfigurationLoader()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Loads the region configuration
|
||||
/// </summary>
|
||||
/// <param name="argvSource">Parameters passed into the process when started</param>
|
||||
/// <param name="configSettings"></param>
|
||||
/// <param name="networkInfo"></param>
|
||||
/// <returns>A configuration that gets passed to modules</returns>
|
||||
public IConfigSource LoadConfigSettings()
|
||||
{
|
||||
bool iniFileExists = false;
|
||||
|
||||
List<string> sources = new List<string>();
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds the included files as ini configuration files
|
||||
/// </summary>
|
||||
/// <param name="sources">List of URL strings or filename strings</param>
|
||||
private void AddIncludes(List<string> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Check if we can convert the string to a URI
|
||||
/// </summary>
|
||||
/// <param name="file">String uri to the remote resource</param>
|
||||
/// <returns>true if we can convert the string to a Uri object</returns>
|
||||
bool IsUri(string file)
|
||||
{
|
||||
Uri configUri;
|
||||
|
||||
return Uri.TryCreate(file, UriKind.Absolute,
|
||||
out configUri) && configUri.Scheme == Uri.UriSchemeHttp;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Provide same ini loader functionality for standard ini and master ini - file system or XML over http
|
||||
/// </summary>
|
||||
/// <param name="iniPath">Full path to the ini</param>
|
||||
/// <returns></returns>
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Setup a default config values in case they aren't present in the ini file
|
||||
/// </summary>
|
||||
/// <returns>A Configuration source containing the default configuration</returns>
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -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("<Nini>");
|
||||
|
||||
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("<Section Name=\"{0}\">", c.Name);
|
||||
|
||||
foreach (string k in c.GetKeys())
|
||||
{
|
||||
string v = c.GetString(k);
|
||||
|
||||
if (k.StartsWith("Include-"))
|
||||
continue;
|
||||
Console.WriteLine(" <Key Name=\"{0}\" Value=\"{1}\" />", k, v);
|
||||
|
||||
Console.WriteLine("</Section>");
|
||||
}
|
||||
}
|
||||
}
|
||||
Console.WriteLine("</Nini>");
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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<string> paths = new List<string>();
|
||||
List<string> found = new List<string>();
|
||||
paths.Add(path);
|
||||
|
||||
int compIndex = -1;
|
||||
foreach (string c in comps)
|
||||
{
|
||||
compIndex++;
|
||||
|
||||
List<string> addpaths = new List<string>();
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
22
prebuild.xml
22
prebuild.xml
|
@ -2886,6 +2886,28 @@
|
|||
</Files>
|
||||
</Project>
|
||||
|
||||
<Project frameworkVersion="v3_5" name="OpenSim.Tools.Configger" path="OpenSim/Tools/Configger" type="Exe">
|
||||
<Configuration name="Debug">
|
||||
<Options>
|
||||
<OutputPath>../../../bin/</OutputPath>
|
||||
</Options>
|
||||
</Configuration>
|
||||
<Configuration name="Release">
|
||||
<Options>
|
||||
<OutputPath>../../../bin/</OutputPath>
|
||||
</Options>
|
||||
</Configuration>
|
||||
|
||||
<ReferencePath>../../../bin/</ReferencePath>
|
||||
<Reference name="System"/>
|
||||
<Reference name="Nini.dll"/>
|
||||
<Reference name="log4net.dll"/>
|
||||
|
||||
<Files>
|
||||
<Match pattern="*.cs" recurse="true"/>
|
||||
</Files>
|
||||
</Project>
|
||||
|
||||
<!-- Test Suite -->
|
||||
<Project frameworkVersion="v3_5" name="OpenSim.TestSuite" path="OpenSim/TestSuite" type="Exe">
|
||||
<Configuration name="Debug">
|
||||
|
|
Loading…
Reference in New Issue