aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Tools/OpenSim.GridLaunch/Program.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Tools/OpenSim.GridLaunch/Program.cs')
-rw-r--r--OpenSim/Tools/OpenSim.GridLaunch/Program.cs245
1 files changed, 245 insertions, 0 deletions
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/Program.cs b/OpenSim/Tools/OpenSim.GridLaunch/Program.cs
new file mode 100644
index 0000000..5a0bb0c
--- /dev/null
+++ b/OpenSim/Tools/OpenSim.GridLaunch/Program.cs
@@ -0,0 +1,245 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSim Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Reflection;
32using System.Threading;
33using log4net;
34using log4net.Appender;
35using log4net.Repository.Hierarchy;
36using OpenSim.GridLaunch.GUI;
37using OpenSim.GridLaunch.GUI.Network;
38
39namespace OpenSim.GridLaunch
40{
41 class Program
42 {
43 public static readonly string ConfigFile = "OpenSim.GridLaunch.ini";
44 internal static Dictionary<string, AppExecutor> AppList = new Dictionary<string, AppExecutor>();
45 private static readonly int delayBetweenExecuteSeconds = 10;
46 //private static readonly int consoleReadIntervalMilliseconds = 50;
47 ////private static readonly Timer readTimer = new Timer(readConsole, null, Timeout.Infinite, Timeout.Infinite);
48 //private static Thread timerThread;
49 //private static object timerThreadLock = new object();
50 private static IGUI GUIModule;
51 private static string GUIModuleName = "";
52 public static readonly CommandProcessor Command = new CommandProcessor();
53 public static readonly Settings Settings = new Settings();
54
55 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
56
57 public delegate void AppConsoleOutputDelegate(string App, string Text);
58 public static event AppConsoleOutputDelegate AppConsoleOutput;
59 public delegate void AppConsoleErrorDelegate(string App, string Text);
60 public static event AppConsoleErrorDelegate AppConsoleError;
61 public delegate void AppCreatedDelegate(string App);
62 public static event AppCreatedDelegate AppCreated;
63 public delegate void AppRemovedDelegate(string App);
64 public static event AppRemovedDelegate AppRemoved;
65
66 internal static void FireAppConsoleOutput(string App, string Text)
67 {
68 if (AppConsoleOutput != null)
69 AppConsoleOutput(App, Text);
70 }
71 internal static void FireAppConsoleError(string App, string Text)
72 {
73 if (AppConsoleError != null)
74 AppConsoleError(App, Text);
75 }
76
77
78 private static readonly object startStopLock = new object();
79
80 public static string Name { get { return "OpenSim Grid executor"; } }
81
82 #region Start/Shutdown
83 static void Main(string[] args)
84 {
85 log4net.Config.XmlConfigurator.Configure();
86
87 // Startup
88 m_log.Info(Name);
89 m_log.Info(new string('-', Name.Length));
90
91 // Read settings
92 Settings.LoadConfig(ConfigFile);
93 // Command line arguments override settings
94 Settings.ParseCommandArguments(args);
95
96 // Start GUI module
97 StartGUIModule();
98
99 // Start the processes
100 ThreadPool.QueueUserWorkItem(startProcesses);
101
102 // Hand over thread control to whatever GUI module
103 GUIModule.StartGUI();
104
105 // GUI module returned, we are done
106 Shutdown();
107
108 }
109
110 private static void StartGUIModule()
111 {
112 // Create GUI module
113 GUIModuleName = Settings["GUI"];
114
115 switch (GUIModuleName.ToLower())
116 {
117 case "winform":
118 GUIModuleName = "WinForm";
119 GUIModule = new GUI.WinForm.ProcessPanel();
120 break;
121 case "service":
122 GUIModuleName = "Service";
123 GUIModule = new Service();
124 break;
125 case "tcpd":
126 GUIModuleName = "TCPD";
127 GUIModule = new TCPD();
128 break;
129 case "console":
130 default:
131 GUIModuleName = "Console";
132 GUIModule = new GUI.Console.Console();
133 break;
134 }
135 m_log.Info("GUI type: " + GUIModuleName);
136
137 }
138
139 internal static void Shutdown()
140 {
141 // Stop the processes
142 stopProcesses();
143
144 lock (startStopLock)
145 {
146 // Stop GUI module
147 if (GUIModule != null)
148 {
149 GUIModule.StopGUI();
150 GUIModule = null;
151 }
152 }
153 }
154
155 internal static void SafeDisposeOf(object obj)
156 {
157 IDisposable o = obj as IDisposable;
158 try
159 {
160 if (o != null)
161 o.Dispose();
162 }
163 catch { }
164 }
165 #endregion
166
167 #region Start / Stop applications
168 private static void startProcesses(Object stateInfo)
169 {
170 // Stop before starting
171 stopProcesses();
172
173 // Start console read timer
174 //timer_Start();
175
176 // Start the applications
177 foreach (string file in new ArrayList(Settings.Components.Keys))
178 {
179 // Is this file marked for startup?
180 if (Settings.Components[file])
181 {
182 AppExecutor app = new AppExecutor(file);
183 app.Start();
184 AppList.Add(file, app);
185 if (AppCreated != null)
186 AppCreated(app.File);
187 System.Threading.Thread.Sleep(1000*delayBetweenExecuteSeconds);
188 }
189 }
190 }
191
192 private static void stopProcesses()
193 {
194 // Stop timer
195 //timer_Stop();
196
197 // Lock so we don't collide with any timer still executing on AppList
198 lock (AppList)
199 {
200 // Start the applications
201 foreach (AppExecutor app in AppList.Values)
202 {
203 try
204 {
205 m_log.Info("Stopping: " + app.File);
206 app.Stop();
207 }
208 catch (Exception ex)
209 {
210 m_log.ErrorFormat("Exception while stopping \"{0}\": {1}", app.File, ex.ToString());
211 }
212 finally
213 {
214 if (AppRemoved != null)
215 AppRemoved(app.File);
216 app.Dispose();
217 }
218
219 }
220 AppList.Clear();
221 }
222 }
223 #endregion
224
225 public static void Write(string App, string Text)
226 {
227 // Check if it is a commands
228 bool isCommand = Command.Process(App, Text);
229
230 // Write to stdInput of app
231 if (!isCommand && AppList.ContainsKey(App))
232 AppList[App].Write(Text);
233 }
234
235 public static void WriteLine(string App, string Text)
236 {
237 // Check if it is a commands
238 bool isCommand = Command.Process(App, Text);
239
240 // Write to stdInput of app
241 if (!isCommand && AppList.ContainsKey(App))
242 AppList[App].WriteLine(Text);
243 }
244 }
245}