diff options
Diffstat (limited to 'OpenGridServices.GridServer')
-rw-r--r-- | OpenGridServices.GridServer/GridHttp.cs | 307 | ||||
-rw-r--r-- | OpenGridServices.GridServer/Main.cs | 132 | ||||
-rw-r--r-- | OpenGridServices.GridServer/OpenGridServices.GridServer.csproj | 3 | ||||
-rw-r--r-- | OpenGridServices.GridServer/OpenGridServices.GridServer.exe.build | 1 | ||||
-rw-r--r-- | OpenGridServices.GridServer/SimProfiles.cs | 196 |
5 files changed, 256 insertions, 383 deletions
diff --git a/OpenGridServices.GridServer/GridHttp.cs b/OpenGridServices.GridServer/GridHttp.cs deleted file mode 100644 index 9e9246d..0000000 --- a/OpenGridServices.GridServer/GridHttp.cs +++ /dev/null | |||
@@ -1,307 +0,0 @@ | |||
1 | /* | ||
2 | Copyright (c) OpenGrid project, http://osgrid.org/ | ||
3 | |||
4 | |||
5 | * All rights reserved. | ||
6 | * | ||
7 | * Redistribution and use in source and binary forms, with or without | ||
8 | * modification, are permitted provided that the following conditions are met: | ||
9 | * * Redistributions of source code must retain the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer. | ||
11 | * * Redistributions in binary form must reproduce the above copyright | ||
12 | * notice, this list of conditions and the following disclaimer in the | ||
13 | * documentation and/or other materials provided with the distribution. | ||
14 | * * Neither the name of the <organization> nor the | ||
15 | * names of its contributors may be used to endorse or promote products | ||
16 | * derived from this software without specific prior written permission. | ||
17 | * | ||
18 | * THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY | ||
19 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
20 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
21 | * DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY | ||
22 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
23 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
24 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
25 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
26 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
27 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
28 | */ | ||
29 | |||
30 | using System; | ||
31 | using System.Text; | ||
32 | using Nwc.XmlRpc; | ||
33 | using System.Threading; | ||
34 | using System.Text.RegularExpressions; | ||
35 | using System.Net; | ||
36 | using System.Xml; | ||
37 | using System.IO; | ||
38 | using System.Collections; | ||
39 | using System.Collections.Generic; | ||
40 | using libsecondlife; | ||
41 | using OpenSim.Framework.Sims; | ||
42 | using OpenSim.Framework.Console; | ||
43 | using OpenSim.Servers; | ||
44 | |||
45 | namespace OpenGridServices.GridServer | ||
46 | { | ||
47 | public class GridHTTPServer : BaseHttpServer { | ||
48 | public Thread HTTPD; | ||
49 | public HttpListener Listener; | ||
50 | |||
51 | public GridHTTPServer() : base( 8001 ) { | ||
52 | Start(); | ||
53 | } | ||
54 | |||
55 | public void Start() | ||
56 | { | ||
57 | MainConsole.Instance.WriteLine("Starting up HTTP Server"); | ||
58 | HTTPD = new Thread(new ThreadStart(StartHTTP)); | ||
59 | HTTPD.Start(); | ||
60 | } | ||
61 | |||
62 | public void StartHTTP() { | ||
63 | MainConsole.Instance.WriteLine("GridHttp.cs:StartHTTP() - Spawned main thread OK"); | ||
64 | Listener = new HttpListener(); | ||
65 | |||
66 | Listener.Prefixes.Add("http://+:8001/"); | ||
67 | Listener.Prefixes.Add("http://+:8001/sims/"); | ||
68 | Listener.Prefixes.Add("http://+:8001/gods/"); | ||
69 | Listener.Prefixes.Add("http://+:8001/highestuuid/"); | ||
70 | Listener.Prefixes.Add("http://+:8001/uuidblocks/"); | ||
71 | Listener.Start(); | ||
72 | |||
73 | MainConsole.Instance.WriteLine("GridHttp.cs:StartHTTP() - Successfully bound to port 8001"); | ||
74 | |||
75 | HttpListenerContext context; | ||
76 | while(true) { | ||
77 | context = Listener.GetContext(); | ||
78 | ThreadPool.QueueUserWorkItem(new WaitCallback(HandleRequest), context); | ||
79 | } | ||
80 | } | ||
81 | |||
82 | static string ParseXMLRPC(string requestBody, string referrer) { | ||
83 | try{ | ||
84 | XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(requestBody); | ||
85 | |||
86 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
87 | switch(request.MethodName) { | ||
88 | case "simulator_login": | ||
89 | |||
90 | /*if(!((string)requestData["authkey"]==OpenGrid_Main.thegrid.SimRecvKey)) { | ||
91 | XmlRpcResponse ErrorResp = new XmlRpcResponse(); | ||
92 | Hashtable ErrorRespData = new Hashtable(); | ||
93 | ErrorRespData["error"]="invalid key"; | ||
94 | ErrorResp.Value=ErrorRespData; | ||
95 | return(Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(ErrorResp),"utf-16","utf-8")); | ||
96 | }*/ | ||
97 | SimProfileBase TheSim = null; | ||
98 | |||
99 | if(requestData.ContainsKey("UUID")) { | ||
100 | TheSim = OpenGrid_Main.thegrid._regionmanager.GetProfileByLLUUID(new LLUUID((string)requestData["UUID"])); | ||
101 | } else if (requestData.ContainsKey("region_handle")){ | ||
102 | TheSim = OpenGrid_Main.thegrid._regionmanager.GetProfileByHandle((ulong)Convert.ToUInt64(requestData["region_handle"])); | ||
103 | } | ||
104 | |||
105 | if(TheSim==null) { | ||
106 | XmlRpcResponse ErrorResp = new XmlRpcResponse(); | ||
107 | Hashtable ErrorRespData = new Hashtable(); | ||
108 | ErrorRespData["error"]="sim not found"; | ||
109 | ErrorResp.Value=ErrorRespData; | ||
110 | return(Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(ErrorResp),"utf-16","utf-8")); | ||
111 | } | ||
112 | |||
113 | XmlRpcResponse SimLoginResp = new XmlRpcResponse(); | ||
114 | Hashtable SimLoginRespData = new Hashtable(); | ||
115 | |||
116 | ArrayList SimNeighboursData = new ArrayList(); | ||
117 | |||
118 | SimProfileBase neighbour; | ||
119 | Hashtable NeighbourBlock; | ||
120 | for(int x=-1; x<2; x++) for(int y=-1; y<2; y++) { | ||
121 | if(OpenGrid_Main.thegrid._regionmanager.GetProfileByHandle(Helpers.UIntsToLong((uint)((TheSim.RegionLocX+x)*256), (uint)(TheSim.RegionLocY+y)*256))!=null) { | ||
122 | neighbour=OpenGrid_Main.thegrid._regionmanager.GetProfileByHandle(Helpers.UIntsToLong((uint)((TheSim.RegionLocX+x)*256), (uint)(TheSim.RegionLocY+y)*256)); | ||
123 | NeighbourBlock = new Hashtable(); | ||
124 | NeighbourBlock["sim_ip"] = neighbour.sim_ip; | ||
125 | NeighbourBlock["sim_port"] = neighbour.sim_port.ToString(); | ||
126 | NeighbourBlock["region_locx"] = neighbour.RegionLocX.ToString(); | ||
127 | NeighbourBlock["region_locy"] = neighbour.RegionLocY.ToString(); | ||
128 | NeighbourBlock["UUID"] = neighbour.UUID.ToString(); | ||
129 | SimNeighboursData.Add(NeighbourBlock); | ||
130 | } | ||
131 | } | ||
132 | |||
133 | SimLoginRespData["UUID"]=TheSim.UUID; | ||
134 | SimLoginRespData["region_locx"]=TheSim.RegionLocX.ToString(); | ||
135 | SimLoginRespData["region_locy"]=TheSim.RegionLocY.ToString(); | ||
136 | SimLoginRespData["regionname"]=TheSim.regionname; | ||
137 | SimLoginRespData["estate_id"]="1"; | ||
138 | SimLoginRespData["neighbours"]=SimNeighboursData; | ||
139 | SimLoginRespData["asset_url"]=OpenGrid_Main.thegrid.DefaultAssetServer; | ||
140 | SimLoginRespData["asset_sendkey"]=OpenGrid_Main.thegrid.AssetSendKey; | ||
141 | SimLoginRespData["asset_recvkey"]=OpenGrid_Main.thegrid.AssetRecvKey; | ||
142 | SimLoginRespData["user_url"]=OpenGrid_Main.thegrid.DefaultUserServer; | ||
143 | SimLoginRespData["user_sendkey"]=OpenGrid_Main.thegrid.UserSendKey; | ||
144 | SimLoginRespData["user_recvkey"]=OpenGrid_Main.thegrid.UserRecvKey; | ||
145 | SimLoginRespData["authkey"]=OpenGrid_Main.thegrid.SimSendKey; | ||
146 | SimLoginResp.Value=SimLoginRespData; | ||
147 | return(Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(SimLoginResp),"utf-16","utf-8")); | ||
148 | break; | ||
149 | } | ||
150 | } catch(Exception e) { | ||
151 | Console.WriteLine(e.ToString()); | ||
152 | } | ||
153 | return ""; | ||
154 | } | ||
155 | |||
156 | static string ParseREST(string requestURL, string requestBody, string HTTPmethod) { | ||
157 | char[] splitter = {'/'}; | ||
158 | string[] rest_params = requestURL.Split(splitter); | ||
159 | string req_type = rest_params[0]; // First part of the URL is the type of request - | ||
160 | string respstring=""; | ||
161 | SimProfileBase TheSim; | ||
162 | Console.WriteLine(req_type); | ||
163 | switch(req_type) { | ||
164 | case "regions": | ||
165 | // DIRTY HACK ALERT | ||
166 | Console.WriteLine("/regions/ accessed"); | ||
167 | TheSim=OpenGrid_Main.thegrid._regionmanager.GetProfileByHandle((ulong)Convert.ToUInt64(rest_params[1])); | ||
168 | respstring=ParseREST("/regions/" + rest_params[1], requestBody, HTTPmethod); | ||
169 | break; | ||
170 | |||
171 | case "sims": | ||
172 | LLUUID UUID = new LLUUID((string)rest_params[1]); | ||
173 | TheSim = OpenGrid_Main.thegrid._regionmanager.GetProfileByLLUUID(UUID); | ||
174 | if(!(TheSim==null)) { | ||
175 | switch(HTTPmethod) { | ||
176 | case "GET": | ||
177 | respstring="<authkey>" + OpenGrid_Main.thegrid.SimSendKey + "</authkey>"; | ||
178 | respstring+="<sim>"; | ||
179 | respstring+="<uuid>" + TheSim.UUID.ToString() + "</uuid>"; | ||
180 | respstring+="<regionname>" + TheSim.regionname + "</regionname>"; | ||
181 | respstring+="<sim_ip>" + TheSim.sim_ip + "</sim_ip>"; | ||
182 | respstring+="<sim_port>" + TheSim.sim_port.ToString() + "</sim_port>"; | ||
183 | respstring+="<region_locx>" + TheSim.RegionLocX.ToString() + "</region_locx>"; | ||
184 | respstring+="<region_locy>" + TheSim.RegionLocY.ToString() + "</region_locy>"; | ||
185 | respstring+="<estate_id>1</estate_id>"; | ||
186 | respstring+="</sim>"; | ||
187 | break; | ||
188 | case "POST": | ||
189 | Console.WriteLine("Updating sim details....."); | ||
190 | XmlDocument doc = new XmlDocument(); | ||
191 | doc.LoadXml(requestBody); | ||
192 | XmlNode authkeynode = doc.FirstChild; | ||
193 | if (authkeynode.Name != "authkey") { | ||
194 | respstring = "ERROR! bad XML - expected authkey tag"; | ||
195 | return respstring; | ||
196 | } | ||
197 | XmlNode simnode = doc.ChildNodes[1]; | ||
198 | if (simnode.Name != "sim") { | ||
199 | respstring = "ERROR! bad XML - expected sim tag"; | ||
200 | return respstring; | ||
201 | } | ||
202 | if (authkeynode.Name != OpenGrid_Main.thegrid.SimRecvKey) { | ||
203 | respstring = "ERROR! invalid key"; | ||
204 | return respstring; | ||
205 | } | ||
206 | |||
207 | if (TheSim==null) { | ||
208 | respstring="ERROR! sim not found"; | ||
209 | return respstring; | ||
210 | } else { | ||
211 | for(int i=0; i<= simnode.ChildNodes.Count; i++) { | ||
212 | switch(simnode.ChildNodes[i].Name) { | ||
213 | case "uuid": | ||
214 | // should a sim be able to update it's own UUID? To be decided | ||
215 | // watch next week for the exciting conclusion in "the adventures of OpenGridServices.GridServer/GridHttp.cs:ParseREST() at line 190! | ||
216 | break; // and line 190's arch-enemy - THE BREAK STATEMENT! OH NOES!!!!! (this code written at 6:57AM, no sleep, lots of caffeine) | ||
217 | |||
218 | case "regionname": | ||
219 | TheSim.regionname=simnode.ChildNodes[i].InnerText; | ||
220 | break; | ||
221 | |||
222 | case "sim_ip": | ||
223 | TheSim.sim_ip=simnode.ChildNodes[i].InnerText; | ||
224 | break; | ||
225 | |||
226 | case "sim_port": | ||
227 | TheSim.sim_port=Convert.ToUInt32(simnode.ChildNodes[i].InnerText); | ||
228 | break; | ||
229 | |||
230 | case "region_locx": | ||
231 | TheSim.RegionLocX=Convert.ToUInt32((string)simnode.ChildNodes[i].InnerText); | ||
232 | TheSim.regionhandle=Helpers.UIntsToLong((TheSim.RegionLocX * 256), (TheSim.RegionLocY * 256)); | ||
233 | break; | ||
234 | |||
235 | case "region_locy": | ||
236 | TheSim.RegionLocY=Convert.ToUInt32((string)simnode.ChildNodes[i].InnerText); | ||
237 | TheSim.regionhandle=Helpers.UIntsToLong((TheSim.RegionLocX * 256), (TheSim.RegionLocY * 256)); | ||
238 | break; | ||
239 | } | ||
240 | } | ||
241 | respstring="OK"; | ||
242 | } | ||
243 | |||
244 | |||
245 | |||
246 | break; | ||
247 | } | ||
248 | } | ||
249 | return respstring; | ||
250 | break; | ||
251 | } | ||
252 | return ""; | ||
253 | |||
254 | } | ||
255 | |||
256 | |||
257 | static void HandleRequest(Object stateinfo) { | ||
258 | HttpListenerContext context=(HttpListenerContext)stateinfo; | ||
259 | |||
260 | HttpListenerRequest request = context.Request; | ||
261 | HttpListenerResponse response = context.Response; | ||
262 | |||
263 | response.KeepAlive=false; | ||
264 | response.SendChunked=false; | ||
265 | |||
266 | System.IO.Stream body = request.InputStream; | ||
267 | System.Text.Encoding encoding = System.Text.Encoding.UTF8; | ||
268 | System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding); | ||
269 | |||
270 | string requestBody = reader.ReadToEnd(); | ||
271 | body.Close(); | ||
272 | reader.Close(); | ||
273 | |||
274 | // TODO: AUTHENTICATION!!!!!!!!! MUST ADD!!!!!!!!!! SCRIPT KIDDIES LOVE LACK OF IT!!!!!!!!!! | ||
275 | |||
276 | string responseString=""; | ||
277 | switch(request.ContentType) { | ||
278 | case "text/xml": | ||
279 | // must be XML-RPC, so pass to the XML-RPC parser | ||
280 | |||
281 | responseString=ParseXMLRPC(requestBody,request.Headers["Referer"]); | ||
282 | response.AddHeader("Content-type","text/xml"); | ||
283 | break; | ||
284 | |||
285 | case "text/plaintext": | ||
286 | // must be REST | ||
287 | responseString=ParseREST(request.RawUrl,requestBody,request.HttpMethod); | ||
288 | break; | ||
289 | |||
290 | case null: | ||
291 | // must be REST or invalid crap, so pass to the REST parser | ||
292 | responseString=ParseREST(request.RawUrl,requestBody,request.HttpMethod); | ||
293 | break; | ||
294 | } | ||
295 | |||
296 | |||
297 | byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString); | ||
298 | System.IO.Stream output = response.OutputStream; | ||
299 | response.SendChunked=false; | ||
300 | response.ContentLength64=buffer.Length; | ||
301 | output.Write(buffer,0,buffer.Length); | ||
302 | output.Close(); | ||
303 | } | ||
304 | } | ||
305 | |||
306 | |||
307 | } | ||
diff --git a/OpenGridServices.GridServer/Main.cs b/OpenGridServices.GridServer/Main.cs index 8c83bbf..5827227 100644 --- a/OpenGridServices.GridServer/Main.cs +++ b/OpenGridServices.GridServer/Main.cs | |||
@@ -38,16 +38,19 @@ using OpenSim.Framework; | |||
38 | using OpenSim.Framework.Sims; | 38 | using OpenSim.Framework.Sims; |
39 | using OpenSim.Framework.Console; | 39 | using OpenSim.Framework.Console; |
40 | using OpenSim.Framework.Interfaces; | 40 | using OpenSim.Framework.Interfaces; |
41 | using OpenSim.Servers; | ||
41 | 42 | ||
42 | namespace OpenGridServices.GridServer | 43 | namespace OpenGridServices.GridServer |
43 | { | 44 | { |
44 | /// <summary> | 45 | /// <summary> |
45 | /// </summary> | 46 | /// </summary> |
46 | public class OpenGrid_Main : conscmd_callback | 47 | public class OpenGrid_Main : BaseServer, conscmd_callback |
47 | { | 48 | { |
48 | private string ConfigDll = "OpenGrid.Config.GridConfigDb4o.dll"; | 49 | private string ConfigDll = "OpenGrid.Config.GridConfigDb4o.dll"; |
49 | private GridConfig Cfg; | 50 | private GridConfig Cfg; |
51 | |||
50 | public static OpenGrid_Main thegrid; | 52 | public static OpenGrid_Main thegrid; |
53 | |||
51 | public string GridOwner; | 54 | public string GridOwner; |
52 | public string DefaultStartupMsg; | 55 | public string DefaultStartupMsg; |
53 | public string DefaultAssetServer; | 56 | public string DefaultAssetServer; |
@@ -56,16 +59,14 @@ namespace OpenGridServices.GridServer | |||
56 | public string DefaultUserServer; | 59 | public string DefaultUserServer; |
57 | public string UserSendKey; | 60 | public string UserSendKey; |
58 | public string UserRecvKey; | 61 | public string UserRecvKey; |
59 | public string SimSendKey; | 62 | public string SimSendKey; |
60 | public string SimRecvKey; | 63 | public string SimRecvKey; |
61 | public LLUUID highestUUID; | 64 | //public LLUUID highestUUID; |
62 | 65 | ||
63 | public GridHTTPServer _httpd; | 66 | private SimProfileManager m_simProfileManager; |
64 | public SimProfileManager _regionmanager; | ||
65 | 67 | ||
66 | private ConsoleBase m_console; | 68 | private ConsoleBase m_console; |
67 | private Timer SimCheckTimer; | 69 | |
68 | |||
69 | [STAThread] | 70 | [STAThread] |
70 | public static void Main(string[] args) | 71 | public static void Main(string[] args) |
71 | { | 72 | { |
@@ -92,29 +93,49 @@ namespace OpenGridServices.GridServer | |||
92 | m_console = new ConsoleBase("opengrid-gridserver-console.log", "OpenGrid", this); | 93 | m_console = new ConsoleBase("opengrid-gridserver-console.log", "OpenGrid", this); |
93 | MainConsole.Instance = m_console; | 94 | MainConsole.Instance = m_console; |
94 | } | 95 | } |
95 | 96 | ||
96 | public void Startup() | 97 | public void Startup() |
97 | { | 98 | { |
98 | m_console.WriteLine("Main.cs:Startup() - Loading configuration"); | 99 | m_console.WriteLine("Main.cs:Startup() - Loading configuration"); |
99 | Cfg = this.LoadConfigDll(this.ConfigDll); | 100 | Cfg = this.LoadConfigDll(this.ConfigDll); |
100 | Cfg.InitConfig(); | 101 | Cfg.InitConfig(); |
101 | 102 | ||
102 | m_console.WriteLine("Main.cs:Startup() - Loading sim profiles from database"); | 103 | m_console.WriteLine("Main.cs:Startup() - Loading sim profiles from database"); |
103 | this._regionmanager = new SimProfileManager(); | 104 | m_simProfileManager = new SimProfileManager( this ); |
104 | _regionmanager.LoadProfiles(); | 105 | m_simProfileManager.LoadProfiles(); |
106 | |||
107 | m_console.WriteLine("Main.cs:Startup() - Starting HTTP process"); | ||
108 | BaseHttpServer httpServer = new BaseHttpServer(8001); | ||
105 | 109 | ||
106 | m_console.WriteLine("Main.cs:Startup() - Starting HTTP process"); | 110 | httpServer.AddXmlRPCHandler("simulator_login", m_simProfileManager.XmlRpcLoginToSimulatorMethod); |
107 | _httpd = new GridHTTPServer(); | ||
108 | _httpd.Start(); | ||
109 | 111 | ||
110 | m_console.WriteLine("Main.cs:Startup() - Starting sim status checker"); | 112 | httpServer.AddRestHandler("GET", "/sims/", m_simProfileManager.RestGetSimMethod); |
111 | SimCheckTimer = new Timer(); | 113 | httpServer.AddRestHandler("POST", "/sims/", m_simProfileManager.RestSetSimMethod); |
112 | SimCheckTimer.Interval = 300000; // 5 minutes | 114 | |
113 | SimCheckTimer.Elapsed+=new ElapsedEventHandler(CheckSims); | 115 | // lbsa71 : This code snippet taken from old http server. |
114 | SimCheckTimer.Enabled=true; | 116 | // I have no idea what this was supposed to do - looks like an infinite recursion to me. |
117 | // case "regions": | ||
118 | //// DIRTY HACK ALERT | ||
119 | //Console.WriteLine("/regions/ accessed"); | ||
120 | //TheSim = OpenGrid_Main.thegrid._regionmanager.GetProfileByHandle((ulong)Convert.ToUInt64(rest_params[1])); | ||
121 | //respstring = ParseREST("/regions/" + rest_params[1], requestBody, HTTPmethod); | ||
122 | //break; | ||
123 | |||
124 | // lbsa71 : I guess these were never used? | ||
125 | //Listener.Prefixes.Add("http://+:8001/gods/"); | ||
126 | //Listener.Prefixes.Add("http://+:8001/highestuuid/"); | ||
127 | //Listener.Prefixes.Add("http://+:8001/uuidblocks/"); | ||
128 | |||
129 | httpServer.Start(); | ||
130 | |||
131 | m_console.WriteLine("Main.cs:Startup() - Starting sim status checker"); | ||
132 | |||
133 | Timer simCheckTimer = new Timer( 300000 ); // 5 minutes | ||
134 | simCheckTimer.Elapsed += new ElapsedEventHandler(CheckSims); | ||
135 | simCheckTimer.Enabled = true; | ||
115 | } | 136 | } |
116 | 137 | ||
117 | private GridConfig LoadConfigDll(string dllName) | 138 | private GridConfig LoadConfigDll(string dllName) |
118 | { | 139 | { |
119 | Assembly pluginAssembly = Assembly.LoadFrom(dllName); | 140 | Assembly pluginAssembly = Assembly.LoadFrom(dllName); |
120 | GridConfig config = null; | 141 | GridConfig config = null; |
@@ -142,33 +163,42 @@ namespace OpenGridServices.GridServer | |||
142 | return config; | 163 | return config; |
143 | } | 164 | } |
144 | 165 | ||
145 | public void CheckSims(object sender, ElapsedEventArgs e) { | 166 | public void CheckSims(object sender, ElapsedEventArgs e) |
146 | foreach(SimProfileBase sim in _regionmanager.SimProfiles.Values) { | 167 | { |
147 | string SimResponse=""; | 168 | foreach (SimProfileBase sim in m_simProfileManager.SimProfiles.Values) |
148 | try { | 169 | { |
149 | WebRequest CheckSim = WebRequest.Create("http://" + sim.sim_ip + ":" + sim.sim_port.ToString() + "/checkstatus/"); | 170 | string SimResponse = ""; |
150 | CheckSim.Method = "GET"; | 171 | try |
151 | CheckSim.ContentType = "text/plaintext"; | 172 | { |
152 | CheckSim.ContentLength = 0; | 173 | WebRequest CheckSim = WebRequest.Create("http://" + sim.sim_ip + ":" + sim.sim_port.ToString() + "/checkstatus/"); |
153 | 174 | CheckSim.Method = "GET"; | |
154 | StreamWriter stOut = new StreamWriter(CheckSim.GetRequestStream(), System.Text.Encoding.ASCII); | 175 | CheckSim.ContentType = "text/plaintext"; |
155 | stOut.Write(""); | 176 | CheckSim.ContentLength = 0; |
156 | stOut.Close(); | 177 | |
157 | 178 | StreamWriter stOut = new StreamWriter(CheckSim.GetRequestStream(), System.Text.Encoding.ASCII); | |
158 | StreamReader stIn = new StreamReader(CheckSim.GetResponse().GetResponseStream()); | 179 | stOut.Write(""); |
159 | SimResponse = stIn.ReadToEnd(); | 180 | stOut.Close(); |
160 | stIn.Close(); | 181 | |
161 | } catch(Exception exception) { | 182 | StreamReader stIn = new StreamReader(CheckSim.GetResponse().GetResponseStream()); |
162 | } | 183 | SimResponse = stIn.ReadToEnd(); |
163 | if(SimResponse=="OK") { | 184 | stIn.Close(); |
164 | _regionmanager.SimProfiles[sim.UUID].online=true; | 185 | } |
165 | } else { | 186 | catch |
166 | _regionmanager.SimProfiles[sim.UUID].online=false; | 187 | { |
167 | } | 188 | } |
168 | } | 189 | |
169 | } | 190 | if (SimResponse == "OK") |
170 | 191 | { | |
171 | public void RunCmd(string cmd, string[] cmdparams) | 192 | m_simProfileManager.SimProfiles[sim.UUID].online = true; |
193 | } | ||
194 | else | ||
195 | { | ||
196 | m_simProfileManager.SimProfiles[sim.UUID].online = false; | ||
197 | } | ||
198 | } | ||
199 | } | ||
200 | |||
201 | public void RunCmd(string cmd, string[] cmdparams) | ||
172 | { | 202 | { |
173 | switch (cmd) | 203 | switch (cmd) |
174 | { | 204 | { |
diff --git a/OpenGridServices.GridServer/OpenGridServices.GridServer.csproj b/OpenGridServices.GridServer/OpenGridServices.GridServer.csproj index 2ce4c00..808886e 100644 --- a/OpenGridServices.GridServer/OpenGridServices.GridServer.csproj +++ b/OpenGridServices.GridServer/OpenGridServices.GridServer.csproj | |||
@@ -100,9 +100,6 @@ | |||
100 | </ProjectReference> | 100 | </ProjectReference> |
101 | </ItemGroup> | 101 | </ItemGroup> |
102 | <ItemGroup> | 102 | <ItemGroup> |
103 | <Compile Include="GridHttp.cs"> | ||
104 | <SubType>Code</SubType> | ||
105 | </Compile> | ||
106 | <Compile Include="Main.cs"> | 103 | <Compile Include="Main.cs"> |
107 | <SubType>Code</SubType> | 104 | <SubType>Code</SubType> |
108 | </Compile> | 105 | </Compile> |
diff --git a/OpenGridServices.GridServer/OpenGridServices.GridServer.exe.build b/OpenGridServices.GridServer/OpenGridServices.GridServer.exe.build index ece9986..316ebb3 100644 --- a/OpenGridServices.GridServer/OpenGridServices.GridServer.exe.build +++ b/OpenGridServices.GridServer/OpenGridServices.GridServer.exe.build | |||
@@ -11,7 +11,6 @@ | |||
11 | <resources prefix="OpenGridServices.GridServer" dynamicprefix="true" > | 11 | <resources prefix="OpenGridServices.GridServer" dynamicprefix="true" > |
12 | </resources> | 12 | </resources> |
13 | <sources failonempty="true"> | 13 | <sources failonempty="true"> |
14 | <include name="GridHttp.cs" /> | ||
15 | <include name="Main.cs" /> | 14 | <include name="Main.cs" /> |
16 | <include name="SimProfiles.cs" /> | 15 | <include name="SimProfiles.cs" /> |
17 | <include name="Properties/AssemblyInfo.cs" /> | 16 | <include name="Properties/AssemblyInfo.cs" /> |
diff --git a/OpenGridServices.GridServer/SimProfiles.cs b/OpenGridServices.GridServer/SimProfiles.cs index 7aff434..fd4ba99 100644 --- a/OpenGridServices.GridServer/SimProfiles.cs +++ b/OpenGridServices.GridServer/SimProfiles.cs | |||
@@ -36,6 +36,8 @@ using OpenSim.Framework.Utilities; | |||
36 | using OpenSim.Framework.Console; | 36 | using OpenSim.Framework.Console; |
37 | using OpenSim.Framework.Sims; | 37 | using OpenSim.Framework.Sims; |
38 | using Db4objects.Db4o; | 38 | using Db4objects.Db4o; |
39 | using Nwc.XmlRpc; | ||
40 | using System.Xml; | ||
39 | 41 | ||
40 | namespace OpenGridServices.GridServer | 42 | namespace OpenGridServices.GridServer |
41 | { | 43 | { |
@@ -44,9 +46,11 @@ namespace OpenGridServices.GridServer | |||
44 | public class SimProfileManager { | 46 | public class SimProfileManager { |
45 | 47 | ||
46 | public Dictionary<LLUUID, SimProfileBase> SimProfiles = new Dictionary<LLUUID, SimProfileBase>(); | 48 | public Dictionary<LLUUID, SimProfileBase> SimProfiles = new Dictionary<LLUUID, SimProfileBase>(); |
49 | private OpenGrid_Main m_gridManager; | ||
47 | 50 | ||
48 | public SimProfileManager() { | 51 | public SimProfileManager(OpenGrid_Main gridManager) { |
49 | } | 52 | m_gridManager = gridManager; |
53 | } | ||
50 | 54 | ||
51 | public void LoadProfiles() { // should abstract this out | 55 | public void LoadProfiles() { // should abstract this out |
52 | IObjectContainer db; | 56 | IObjectContainer db; |
@@ -117,26 +121,176 @@ namespace OpenGridServices.GridServer | |||
117 | return newprofile; | 121 | return newprofile; |
118 | } | 122 | } |
119 | 123 | ||
124 | public XmlRpcResponse XmlRpcLoginToSimulatorMethod(XmlRpcRequest request) | ||
125 | { | ||
126 | XmlRpcResponse response = new XmlRpcResponse(); | ||
127 | Hashtable responseData = new Hashtable(); | ||
128 | response.Value = responseData; | ||
129 | |||
130 | SimProfileBase TheSim = null; | ||
131 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
132 | |||
133 | if (requestData.ContainsKey("UUID")) | ||
134 | { | ||
135 | TheSim = GetProfileByLLUUID(new LLUUID((string)requestData["UUID"])); | ||
136 | } | ||
137 | else if (requestData.ContainsKey("region_handle")) | ||
138 | { | ||
139 | TheSim = GetProfileByHandle((ulong)Convert.ToUInt64(requestData["region_handle"])); | ||
140 | } | ||
141 | |||
142 | if (TheSim == null) | ||
143 | { | ||
144 | responseData["error"] = "sim not found"; | ||
145 | } | ||
146 | else | ||
147 | { | ||
148 | |||
149 | ArrayList SimNeighboursData = new ArrayList(); | ||
150 | |||
151 | SimProfileBase neighbour; | ||
152 | Hashtable NeighbourBlock; | ||
153 | for (int x = -1; x < 2; x++) for (int y = -1; y < 2; y++) | ||
154 | { | ||
155 | if (GetProfileByHandle(Helpers.UIntsToLong((uint)((TheSim.RegionLocX + x) * 256), (uint)(TheSim.RegionLocY + y) * 256)) != null) | ||
156 | { | ||
157 | neighbour = GetProfileByHandle(Helpers.UIntsToLong((uint)((TheSim.RegionLocX + x) * 256), (uint)(TheSim.RegionLocY + y) * 256)); | ||
158 | NeighbourBlock = new Hashtable(); | ||
159 | NeighbourBlock["sim_ip"] = neighbour.sim_ip; | ||
160 | NeighbourBlock["sim_port"] = neighbour.sim_port.ToString(); | ||
161 | NeighbourBlock["region_locx"] = neighbour.RegionLocX.ToString(); | ||
162 | NeighbourBlock["region_locy"] = neighbour.RegionLocY.ToString(); | ||
163 | NeighbourBlock["UUID"] = neighbour.UUID.ToString(); | ||
164 | SimNeighboursData.Add(NeighbourBlock); | ||
165 | } | ||
166 | } | ||
167 | |||
168 | responseData["UUID"] = TheSim.UUID; | ||
169 | responseData["region_locx"] = TheSim.RegionLocX.ToString(); | ||
170 | responseData["region_locy"] = TheSim.RegionLocY.ToString(); | ||
171 | responseData["regionname"] = TheSim.regionname; | ||
172 | responseData["estate_id"] = "1"; | ||
173 | responseData["neighbours"] = SimNeighboursData; | ||
174 | |||
175 | responseData["asset_url"] = m_gridManager.DefaultAssetServer; | ||
176 | responseData["asset_sendkey"] = m_gridManager.AssetSendKey; | ||
177 | responseData["asset_recvkey"] = m_gridManager.AssetRecvKey; | ||
178 | responseData["user_url"] = m_gridManager.DefaultUserServer; | ||
179 | responseData["user_sendkey"] = m_gridManager.UserSendKey; | ||
180 | responseData["user_recvkey"] = m_gridManager.UserRecvKey; | ||
181 | responseData["authkey"] = m_gridManager.SimSendKey; | ||
182 | } | ||
183 | |||
184 | return response; | ||
185 | } | ||
186 | |||
187 | public string RestSetSimMethod(string request, string path, string param) | ||
188 | { | ||
189 | string respstring = String.Empty; | ||
190 | |||
191 | SimProfileBase TheSim; | ||
192 | LLUUID UUID = new LLUUID(param); | ||
193 | TheSim = GetProfileByLLUUID(UUID); | ||
194 | |||
195 | if (!(TheSim == null)) | ||
196 | { | ||
197 | Console.WriteLine("Updating sim details....."); | ||
198 | XmlDocument doc = new XmlDocument(); | ||
199 | doc.LoadXml(request); | ||
200 | XmlNode authkeynode = doc.FirstChild; | ||
201 | if (authkeynode.Name != "authkey") | ||
202 | { | ||
203 | respstring = "ERROR! bad XML - expected authkey tag"; | ||
204 | } | ||
205 | else | ||
206 | { | ||
207 | XmlNode simnode = doc.ChildNodes[1]; | ||
208 | if (simnode.Name != "sim") | ||
209 | { | ||
210 | respstring = "ERROR! bad XML - expected sim tag"; | ||
211 | } | ||
212 | else | ||
213 | { | ||
214 | if (authkeynode.Name != m_gridManager.SimRecvKey) | ||
215 | { | ||
216 | respstring = "ERROR! invalid key"; | ||
217 | } | ||
218 | else | ||
219 | { | ||
220 | if (TheSim == null) | ||
221 | { | ||
222 | respstring = "ERROR! sim not found"; | ||
223 | } | ||
224 | else | ||
225 | { | ||
226 | for (int i = 0; i <= simnode.ChildNodes.Count; i++) | ||
227 | { | ||
228 | switch (simnode.ChildNodes[i].Name) | ||
229 | { | ||
230 | case "uuid": | ||
231 | // should a sim be able to update it's own UUID? To be decided | ||
232 | // watch next week for the exciting conclusion in "the adventures of OpenGridServices.GridServer/GridHttp.cs:ParseREST() at line 190! | ||
233 | break; // and line 190's arch-enemy - THE BREAK STATEMENT! OH NOES!!!!! (this code written at 6:57AM, no sleep, lots of caffeine) | ||
234 | |||
235 | case "regionname": | ||
236 | TheSim.regionname = simnode.ChildNodes[i].InnerText; | ||
237 | break; | ||
238 | |||
239 | case "sim_ip": | ||
240 | TheSim.sim_ip = simnode.ChildNodes[i].InnerText; | ||
241 | break; | ||
242 | |||
243 | case "sim_port": | ||
244 | TheSim.sim_port = Convert.ToUInt32(simnode.ChildNodes[i].InnerText); | ||
245 | break; | ||
246 | |||
247 | case "region_locx": | ||
248 | TheSim.RegionLocX = Convert.ToUInt32((string)simnode.ChildNodes[i].InnerText); | ||
249 | TheSim.regionhandle = Helpers.UIntsToLong((TheSim.RegionLocX * 256), (TheSim.RegionLocY * 256)); | ||
250 | break; | ||
251 | |||
252 | case "region_locy": | ||
253 | TheSim.RegionLocY = Convert.ToUInt32((string)simnode.ChildNodes[i].InnerText); | ||
254 | TheSim.regionhandle = Helpers.UIntsToLong((TheSim.RegionLocX * 256), (TheSim.RegionLocY * 256)); | ||
255 | break; | ||
256 | } | ||
257 | } | ||
258 | respstring = "OK"; | ||
259 | } | ||
260 | } | ||
261 | } | ||
262 | } | ||
263 | } | ||
264 | |||
265 | return respstring; | ||
266 | } | ||
267 | |||
268 | public string RestGetSimMethod(string request, string path, string param ) | ||
269 | { | ||
270 | string respstring = String.Empty; | ||
271 | |||
272 | SimProfileBase TheSim; | ||
273 | LLUUID UUID = new LLUUID(param); | ||
274 | TheSim = GetProfileByLLUUID(UUID); | ||
275 | |||
276 | if (!(TheSim == null)) | ||
277 | { | ||
278 | respstring = "<authkey>" + m_gridManager.SimSendKey + "</authkey>"; | ||
279 | respstring += "<sim>"; | ||
280 | respstring += "<uuid>" + TheSim.UUID.ToString() + "</uuid>"; | ||
281 | respstring += "<regionname>" + TheSim.regionname + "</regionname>"; | ||
282 | respstring += "<sim_ip>" + TheSim.sim_ip + "</sim_ip>"; | ||
283 | respstring += "<sim_port>" + TheSim.sim_port.ToString() + "</sim_port>"; | ||
284 | respstring += "<region_locx>" + TheSim.RegionLocX.ToString() + "</region_locx>"; | ||
285 | respstring += "<region_locy>" + TheSim.RegionLocY.ToString() + "</region_locy>"; | ||
286 | respstring += "<estate_id>1</estate_id>"; | ||
287 | respstring += "</sim>"; | ||
288 | } | ||
289 | |||
290 | return respstring; | ||
291 | } | ||
292 | |||
120 | } | 293 | } |
121 | 294 | ||
122 | /* is in OpenSim.Framework | ||
123 | public class SimProfileBase { | ||
124 | public LLUUID UUID; | ||
125 | public ulong regionhandle; | ||
126 | public string regionname; | ||
127 | public string sim_ip; | ||
128 | public uint sim_port; | ||
129 | public string caps_url; | ||
130 | public uint RegionLocX; | ||
131 | public uint RegionLocY; | ||
132 | public string sendkey; | ||
133 | public string recvkey; | ||
134 | |||
135 | |||
136 | public SimProfileBase() { | ||
137 | } | ||
138 | |||
139 | |||
140 | }*/ | ||
141 | 295 | ||
142 | } | 296 | } |