diff options
Diffstat (limited to 'OpenSim/Server/Base/ServicesServerBase.cs')
-rw-r--r-- | OpenSim/Server/Base/ServicesServerBase.cs | 202 |
1 files changed, 172 insertions, 30 deletions
diff --git a/OpenSim/Server/Base/ServicesServerBase.cs b/OpenSim/Server/Base/ServicesServerBase.cs index 076868d..176e876 100644 --- a/OpenSim/Server/Base/ServicesServerBase.cs +++ b/OpenSim/Server/Base/ServicesServerBase.cs | |||
@@ -55,16 +55,16 @@ namespace OpenSim.Server.Base | |||
55 | // | 55 | // |
56 | protected string[] m_Arguments; | 56 | protected string[] m_Arguments; |
57 | 57 | ||
58 | public string ConfigDirectory | 58 | protected string m_configDirectory = "."; |
59 | { | ||
60 | get; | ||
61 | private set; | ||
62 | } | ||
63 | 59 | ||
64 | // Run flag | 60 | // Run flag |
65 | // | 61 | // |
66 | private bool m_Running = true; | 62 | private bool m_Running = true; |
67 | 63 | ||
64 | #if (_MONO) | ||
65 | private static Mono.Unix.UnixSignal[] signals; | ||
66 | #endif | ||
67 | |||
68 | // Handle all the automagical stuff | 68 | // Handle all the automagical stuff |
69 | // | 69 | // |
70 | public ServicesServerBase(string prompt, string[] args) : base() | 70 | public ServicesServerBase(string prompt, string[] args) : base() |
@@ -85,7 +85,7 @@ namespace OpenSim.Server.Base | |||
85 | string fileName = ""; | 85 | string fileName = ""; |
86 | if (Assembly.GetEntryAssembly() != null) | 86 | if (Assembly.GetEntryAssembly() != null) |
87 | fileName = Path.GetFileNameWithoutExtension(Assembly.GetEntryAssembly().Location); | 87 | fileName = Path.GetFileNameWithoutExtension(Assembly.GetEntryAssembly().Location); |
88 | string iniFile = "../config/" + fileName + ".ini"; | 88 | string iniFile = fileName + ".ini"; |
89 | string logConfig = null; | 89 | string logConfig = null; |
90 | 90 | ||
91 | IConfig startupConfig = argvConfig.Configs["Startup"]; | 91 | IConfig startupConfig = argvConfig.Configs["Startup"]; |
@@ -96,39 +96,31 @@ namespace OpenSim.Server.Base | |||
96 | 96 | ||
97 | // Check if a prompt was given on the command line | 97 | // Check if a prompt was given on the command line |
98 | prompt = startupConfig.GetString("prompt", prompt); | 98 | prompt = startupConfig.GetString("prompt", prompt); |
99 | 99 | ||
100 | // Check for a Log4Net config file on the command line | 100 | // Check for a Log4Net config file on the command line |
101 | logConfig =startupConfig.GetString("logconfig", logConfig); | 101 | logConfig =startupConfig.GetString("logconfig", logConfig); |
102 | } | 102 | } |
103 | 103 | ||
104 | // Find out of the file name is a URI and remote load it if possible. | 104 | Config = ReadConfigSource(iniFile); |
105 | // Load it as a local file otherwise. | ||
106 | Uri configUri; | ||
107 | 105 | ||
108 | try | 106 | List<string> sources = new List<string>(); |
107 | sources.Add(iniFile); | ||
108 | |||
109 | int sourceIndex = 1; | ||
110 | |||
111 | while (AddIncludes(Config, sources)) | ||
109 | { | 112 | { |
110 | if (Uri.TryCreate(iniFile, UriKind.Absolute, out configUri) && | 113 | for ( ; sourceIndex < sources.Count ; ++sourceIndex) |
111 | configUri.Scheme == Uri.UriSchemeHttp) | ||
112 | { | 114 | { |
113 | XmlReader r = XmlReader.Create(iniFile); | 115 | IConfigSource s = ReadConfigSource(sources[sourceIndex]); |
114 | Config = new XmlConfigSource(r); | 116 | Config.Merge(s); |
115 | } | 117 | } |
116 | else | ||
117 | { | ||
118 | Config = new IniConfigSource(iniFile); | ||
119 | } | ||
120 | } | ||
121 | catch (Exception e) | ||
122 | { | ||
123 | System.Console.WriteLine("Error reading from config source. {0}", e.Message); | ||
124 | System.Diagnostics.Process.GetCurrentProcess().Kill(); | ||
125 | ///// Environment.Exit(1); | ||
126 | } | 118 | } |
127 | 119 | ||
128 | // Merge OpSys env vars | 120 | // Merge OpSys env vars |
129 | m_log.Info("[CONFIG]: Loading environment variables for Config"); | 121 | Console.WriteLine("[CONFIG]: Loading environment variables for Config"); |
130 | Util.MergeEnvironmentToConfig(Config); | 122 | Util.MergeEnvironmentToConfig(Config); |
131 | 123 | ||
132 | // Merge the configuration from the command line into the loaded file | 124 | // Merge the configuration from the command line into the loaded file |
133 | Config.Merge(argvConfig); | 125 | Config.Merge(argvConfig); |
134 | 126 | ||
@@ -140,10 +132,12 @@ namespace OpenSim.Server.Base | |||
140 | startupConfig = Config.Configs["Startup"]; | 132 | startupConfig = Config.Configs["Startup"]; |
141 | } | 133 | } |
142 | 134 | ||
143 | ConfigDirectory = startupConfig.GetString("ConfigDirectory", "."); | 135 | if (startupConfig != null) |
144 | 136 | { | |
145 | prompt = startupConfig.GetString("Prompt", prompt); | 137 | m_configDirectory = startupConfig.GetString("ConfigDirectory", m_configDirectory); |
146 | 138 | ||
139 | prompt = startupConfig.GetString("Prompt", prompt); | ||
140 | } | ||
147 | // Allow derived classes to load config before the console is opened. | 141 | // Allow derived classes to load config before the console is opened. |
148 | ReadConfig(); | 142 | ReadConfig(); |
149 | 143 | ||
@@ -193,6 +187,42 @@ namespace OpenSim.Server.Base | |||
193 | RegisterCommonCommands(); | 187 | RegisterCommonCommands(); |
194 | RegisterCommonComponents(Config); | 188 | RegisterCommonComponents(Config); |
195 | 189 | ||
190 | #if (_MONO) | ||
191 | Thread signal_thread = new Thread (delegate () | ||
192 | { | ||
193 | while (true) | ||
194 | { | ||
195 | // Wait for a signal to be delivered | ||
196 | int index = Mono.Unix.UnixSignal.WaitAny (signals, -1); | ||
197 | |||
198 | //Mono.Unix.Native.Signum signal = signals [index].Signum; | ||
199 | ShutdownSpecific(); | ||
200 | m_Running = false; | ||
201 | Environment.Exit(0); | ||
202 | } | ||
203 | }); | ||
204 | |||
205 | if(!Util.IsWindows()) | ||
206 | { | ||
207 | try | ||
208 | { | ||
209 | // linux mac os specifics | ||
210 | signals = new Mono.Unix.UnixSignal[] | ||
211 | { | ||
212 | new Mono.Unix.UnixSignal(Mono.Unix.Native.Signum.SIGTERM) | ||
213 | }; | ||
214 | ignal_thread.IsBackground = true; | ||
215 | signal_thread.Start(); | ||
216 | } | ||
217 | catch (Exception e) | ||
218 | { | ||
219 | m_log.Info("Could not set up UNIX signal handlers. SIGTERM will not"); | ||
220 | m_log.InfoFormat("shut down gracefully: {0}", e.Message); | ||
221 | m_log.Debug("Exception was: ", e); | ||
222 | } | ||
223 | } | ||
224 | #endif | ||
225 | |||
196 | // Allow derived classes to perform initialization that | 226 | // Allow derived classes to perform initialization that |
197 | // needs to be done after the console has opened | 227 | // needs to be done after the console has opened |
198 | Initialise(); | 228 | Initialise(); |
@@ -220,6 +250,9 @@ namespace OpenSim.Server.Base | |||
220 | } | 250 | } |
221 | } | 251 | } |
222 | 252 | ||
253 | MemoryWatchdog.Enabled = false; | ||
254 | Watchdog.Enabled = false; | ||
255 | WorkManager.Stop(); | ||
223 | RemovePIDFile(); | 256 | RemovePIDFile(); |
224 | 257 | ||
225 | return 0; | 258 | return 0; |
@@ -240,5 +273,114 @@ namespace OpenSim.Server.Base | |||
240 | protected virtual void Initialise() | 273 | protected virtual void Initialise() |
241 | { | 274 | { |
242 | } | 275 | } |
276 | |||
277 | /// <summary> | ||
278 | /// Adds the included files as ini configuration files | ||
279 | /// </summary> | ||
280 | /// <param name="sources">List of URL strings or filename strings</param> | ||
281 | private bool AddIncludes(IConfigSource configSource, List<string> sources) | ||
282 | { | ||
283 | bool sourcesAdded = false; | ||
284 | |||
285 | //loop over config sources | ||
286 | foreach (IConfig config in configSource.Configs) | ||
287 | { | ||
288 | // Look for Include-* in the key name | ||
289 | string[] keys = config.GetKeys(); | ||
290 | foreach (string k in keys) | ||
291 | { | ||
292 | if (k.StartsWith("Include-")) | ||
293 | { | ||
294 | // read the config file to be included. | ||
295 | string file = config.GetString(k); | ||
296 | if (IsUri(file)) | ||
297 | { | ||
298 | if (!sources.Contains(file)) | ||
299 | { | ||
300 | sourcesAdded = true; | ||
301 | sources.Add(file); | ||
302 | } | ||
303 | } | ||
304 | else | ||
305 | { | ||
306 | string basepath = Path.GetFullPath(m_configDirectory); | ||
307 | // Resolve relative paths with wildcards | ||
308 | string chunkWithoutWildcards = file; | ||
309 | string chunkWithWildcards = string.Empty; | ||
310 | int wildcardIndex = file.IndexOfAny(new char[] { '*', '?' }); | ||
311 | if (wildcardIndex != -1) | ||
312 | { | ||
313 | chunkWithoutWildcards = file.Substring(0, wildcardIndex); | ||
314 | chunkWithWildcards = file.Substring(wildcardIndex); | ||
315 | } | ||
316 | string path = Path.Combine(basepath, chunkWithoutWildcards); | ||
317 | path = Path.GetFullPath(path) + chunkWithWildcards; | ||
318 | string[] paths = Util.Glob(path); | ||
319 | |||
320 | // If the include path contains no wildcards, then warn the user that it wasn't found. | ||
321 | if (wildcardIndex == -1 && paths.Length == 0) | ||
322 | { | ||
323 | Console.WriteLine("[CONFIG]: Could not find include file {0}", path); | ||
324 | } | ||
325 | else | ||
326 | { | ||
327 | foreach (string p in paths) | ||
328 | { | ||
329 | if (!sources.Contains(p)) | ||
330 | { | ||
331 | sourcesAdded = true; | ||
332 | sources.Add(p); | ||
333 | } | ||
334 | } | ||
335 | } | ||
336 | } | ||
337 | } | ||
338 | } | ||
339 | } | ||
340 | |||
341 | return sourcesAdded; | ||
342 | } | ||
343 | |||
344 | /// <summary> | ||
345 | /// Check if we can convert the string to a URI | ||
346 | /// </summary> | ||
347 | /// <param name="file">String uri to the remote resource</param> | ||
348 | /// <returns>true if we can convert the string to a Uri object</returns> | ||
349 | bool IsUri(string file) | ||
350 | { | ||
351 | Uri configUri; | ||
352 | |||
353 | return Uri.TryCreate(file, UriKind.Absolute, | ||
354 | out configUri) && configUri.Scheme == Uri.UriSchemeHttp; | ||
355 | } | ||
356 | |||
357 | IConfigSource ReadConfigSource(string iniFile) | ||
358 | { | ||
359 | // Find out of the file name is a URI and remote load it if possible. | ||
360 | // Load it as a local file otherwise. | ||
361 | Uri configUri; | ||
362 | IConfigSource s = null; | ||
363 | |||
364 | try | ||
365 | { | ||
366 | if (Uri.TryCreate(iniFile, UriKind.Absolute, out configUri) && | ||
367 | configUri.Scheme == Uri.UriSchemeHttp) | ||
368 | { | ||
369 | XmlReader r = XmlReader.Create(iniFile); | ||
370 | s = new XmlConfigSource(r); | ||
371 | } | ||
372 | else | ||
373 | { | ||
374 | s = new IniConfigSource(iniFile); | ||
375 | } | ||
376 | } | ||
377 | catch (Exception e) | ||
378 | { | ||
379 | System.Console.WriteLine("Error reading from config source. {0}", e.Message); | ||
380 | Environment.Exit(1); | ||
381 | } | ||
382 | |||
383 | return s; | ||
384 | } | ||
243 | } | 385 | } |
244 | } | 386 | } |