Allow the use of modular configs with Robust as we already can with OpenSim

melanie
Melanie Thielker 2016-12-22 18:23:04 +00:00
parent c3e8406f41
commit 0ae2b5ac81
3 changed files with 125 additions and 27 deletions

View File

@ -55,11 +55,7 @@ namespace OpenSim.Server.Base
//
protected string[] m_Arguments;
public string ConfigDirectory
{
get;
private set;
}
protected string m_configDirectory = ".";
// Run flag
//
@ -101,31 +97,24 @@ namespace OpenSim.Server.Base
logConfig =startupConfig.GetString("logconfig", logConfig);
}
// Find out of the file name is a URI and remote load it if possible.
// Load it as a local file otherwise.
Uri configUri;
Config = ReadConfigSource(iniFile);
try
List<string> sources = new List<string>();
sources.Add(iniFile);
int sourceIndex = 1;
while (AddIncludes(Config, sources))
{
if (Uri.TryCreate(iniFile, UriKind.Absolute, out configUri) &&
configUri.Scheme == Uri.UriSchemeHttp)
for ( ; sourceIndex < sources.Count ; ++sourceIndex)
{
XmlReader r = XmlReader.Create(iniFile);
Config = new XmlConfigSource(r);
IConfigSource s = ReadConfigSource(sources[sourceIndex]);
Config.Merge(s);
}
else
{
Config = new IniConfigSource(iniFile);
}
}
catch (Exception e)
{
System.Console.WriteLine("Error reading from config source. {0}", e.Message);
Environment.Exit(1);
}
// Merge OpSys env vars
m_log.Info("[CONFIG]: Loading environment variables for Config");
Console.WriteLine("[CONFIG]: Loading environment variables for Config");
Util.MergeEnvironmentToConfig(Config);
// Merge the configuration from the command line into the loaded file
@ -141,7 +130,7 @@ namespace OpenSim.Server.Base
if (startupConfig != null)
{
ConfigDirectory = startupConfig.GetString("ConfigDirectory", ".");
m_configDirectory = startupConfig.GetString("ConfigDirectory", m_configDirectory);
prompt = startupConfig.GetString("Prompt", prompt);
}
@ -241,5 +230,114 @@ namespace OpenSim.Server.Base
protected virtual void Initialise()
{
}
/// <summary>
/// Adds the included files as ini configuration files
/// </summary>
/// <param name="sources">List of URL strings or filename strings</param>
private bool AddIncludes(IConfigSource configSource, List<string> sources)
{
bool sourcesAdded = false;
//loop over config sources
foreach (IConfig config in configSource.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))
{
sourcesAdded = true;
sources.Add(file);
}
}
else
{
string basepath = Path.GetFullPath(m_configDirectory);
// Resolve relative paths with wildcards
string chunkWithoutWildcards = file;
string chunkWithWildcards = string.Empty;
int wildcardIndex = file.IndexOfAny(new char[] { '*', '?' });
if (wildcardIndex != -1)
{
chunkWithoutWildcards = file.Substring(0, wildcardIndex);
chunkWithWildcards = file.Substring(wildcardIndex);
}
string path = Path.Combine(basepath, chunkWithoutWildcards);
path = Path.GetFullPath(path) + chunkWithWildcards;
string[] paths = Util.Glob(path);
// If the include path contains no wildcards, then warn the user that it wasn't found.
if (wildcardIndex == -1 && paths.Length == 0)
{
Console.WriteLine("[CONFIG]: Could not find include file {0}", path);
}
else
{
foreach (string p in paths)
{
if (!sources.Contains(p))
{
sourcesAdded = true;
sources.Add(p);
}
}
}
}
}
}
}
return sourcesAdded;
}
/// <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;
}
IConfigSource ReadConfigSource(string iniFile)
{
// Find out of the file name is a URI and remote load it if possible.
// Load it as a local file otherwise.
Uri configUri;
IConfigSource s = null;
try
{
if (Uri.TryCreate(iniFile, UriKind.Absolute, out configUri) &&
configUri.Scheme == Uri.UriSchemeHttp)
{
XmlReader r = XmlReader.Create(iniFile);
s = new XmlConfigSource(r);
}
else
{
s = new IniConfigSource(iniFile);
}
}
catch (Exception e)
{
System.Console.WriteLine("Error reading from config source. {0}", e.Message);
Environment.Exit(1);
}
return s;
}
}
}

View File

@ -58,7 +58,7 @@
; Modular configurations
; Set path to directory for modular ini files...
; The Robust.exe process must have R/W access to the location
ConfigDirectory = "."
ConfigDirectory = "robust-include"
; Console commands can be saved to a file, so the command history persists after a restart. (default is true)
ConsoleHistoryFileEnabled = true

View File

@ -50,7 +50,7 @@
; Modular configurations
; Set path to directory for modular ini files...
; The Robust.exe process must have R/W access to the location
ConfigDirectory = "."
ConfigDirectory = "robust-include"
; Console commands can be saved to a file, so the command history persists after a restart. (default is true)
ConsoleHistoryFileEnabled = true