diff options
Added the "out" connector (aka client) for the Grid services. Not used yet.
Diffstat (limited to 'OpenSim/Framework/Communications')
-rw-r--r-- | OpenSim/Framework/Communications/Clients/GridClient.cs | 378 |
1 files changed, 378 insertions, 0 deletions
diff --git a/OpenSim/Framework/Communications/Clients/GridClient.cs b/OpenSim/Framework/Communications/Clients/GridClient.cs new file mode 100644 index 0000000..48083b7 --- /dev/null +++ b/OpenSim/Framework/Communications/Clients/GridClient.cs | |||
@@ -0,0 +1,378 @@ | |||
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 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Net; | ||
32 | |||
33 | using OpenMetaverse; | ||
34 | using Nwc.XmlRpc; | ||
35 | |||
36 | namespace OpenSim.Framework.Communications.Clients | ||
37 | { | ||
38 | public class GridClient | ||
39 | { | ||
40 | |||
41 | public bool RegisterRegion(string gridServerURL, string sendKey, string receiveKey, RegionInfo regionInfo, out bool forcefulBanLines) | ||
42 | { | ||
43 | forcefulBanLines = true; | ||
44 | |||
45 | Hashtable GridParams = new Hashtable(); | ||
46 | // Login / Authentication | ||
47 | |||
48 | GridParams["authkey"] = sendKey; | ||
49 | GridParams["recvkey"] = receiveKey; | ||
50 | GridParams["UUID"] = regionInfo.RegionID.ToString(); | ||
51 | GridParams["sim_ip"] = regionInfo.ExternalHostName; | ||
52 | GridParams["sim_port"] = regionInfo.InternalEndPoint.Port.ToString(); | ||
53 | GridParams["region_locx"] = regionInfo.RegionLocX.ToString(); | ||
54 | GridParams["region_locy"] = regionInfo.RegionLocY.ToString(); | ||
55 | GridParams["sim_name"] = regionInfo.RegionName; | ||
56 | GridParams["http_port"] = regionInfo.HttpPort.ToString(); | ||
57 | GridParams["remoting_port"] = ConfigSettings.DefaultRegionRemotingPort.ToString(); | ||
58 | GridParams["map-image-id"] = regionInfo.RegionSettings.TerrainImageID.ToString(); | ||
59 | GridParams["originUUID"] = regionInfo.originRegionID.ToString(); | ||
60 | GridParams["server_uri"] = regionInfo.ServerURI; | ||
61 | GridParams["region_secret"] = regionInfo.regionSecret; | ||
62 | GridParams["major_interface_version"] = VersionInfo.MajorInterfaceVersion.ToString(); | ||
63 | |||
64 | if (regionInfo.MasterAvatarAssignedUUID != UUID.Zero) | ||
65 | GridParams["master_avatar_uuid"] = regionInfo.MasterAvatarAssignedUUID.ToString(); | ||
66 | else | ||
67 | GridParams["master_avatar_uuid"] = regionInfo.EstateSettings.EstateOwner.ToString(); | ||
68 | |||
69 | // Package into an XMLRPC Request | ||
70 | ArrayList SendParams = new ArrayList(); | ||
71 | SendParams.Add(GridParams); | ||
72 | |||
73 | // Send Request | ||
74 | XmlRpcRequest GridReq = new XmlRpcRequest("simulator_login", SendParams); | ||
75 | XmlRpcResponse GridResp; | ||
76 | |||
77 | try | ||
78 | { | ||
79 | // The timeout should always be significantly larger than the timeout for the grid server to request | ||
80 | // the initial status of the region before confirming registration. | ||
81 | GridResp = GridReq.Send(gridServerURL, 90000); | ||
82 | } | ||
83 | catch (Exception e) | ||
84 | { | ||
85 | Exception e2 | ||
86 | = new Exception( | ||
87 | String.Format( | ||
88 | "Unable to register region with grid at {0}. Grid service not running?", | ||
89 | gridServerURL), | ||
90 | e); | ||
91 | |||
92 | throw e2; | ||
93 | } | ||
94 | |||
95 | Hashtable GridRespData = (Hashtable)GridResp.Value; | ||
96 | // Hashtable griddatahash = GridRespData; | ||
97 | |||
98 | // Process Response | ||
99 | if (GridRespData.ContainsKey("error")) | ||
100 | { | ||
101 | string errorstring = (string)GridRespData["error"]; | ||
102 | |||
103 | Exception e = new Exception( | ||
104 | String.Format("Unable to connect to grid at {0}: {1}", gridServerURL, errorstring)); | ||
105 | |||
106 | throw e; | ||
107 | } | ||
108 | else | ||
109 | { | ||
110 | // m_knownRegions = RequestNeighbours(regionInfo.RegionLocX, regionInfo.RegionLocY); | ||
111 | if (GridRespData.ContainsKey("allow_forceful_banlines")) | ||
112 | { | ||
113 | if ((string)GridRespData["allow_forceful_banlines"] != "TRUE") | ||
114 | { | ||
115 | forcefulBanLines = false; | ||
116 | } | ||
117 | } | ||
118 | |||
119 | } | ||
120 | return true; | ||
121 | } | ||
122 | |||
123 | public bool DeregisterRegion(string gridServerURL, string sendKey, string receiveKey, RegionInfo regionInfo, out string errorMsg) | ||
124 | { | ||
125 | errorMsg = ""; | ||
126 | Hashtable GridParams = new Hashtable(); | ||
127 | |||
128 | GridParams["UUID"] = regionInfo.RegionID.ToString(); | ||
129 | |||
130 | // Package into an XMLRPC Request | ||
131 | ArrayList SendParams = new ArrayList(); | ||
132 | SendParams.Add(GridParams); | ||
133 | |||
134 | // Send Request | ||
135 | XmlRpcRequest GridReq = new XmlRpcRequest("simulator_after_region_moved", SendParams); | ||
136 | XmlRpcResponse GridResp = null; | ||
137 | |||
138 | try | ||
139 | { | ||
140 | GridResp = GridReq.Send(gridServerURL, 10000); | ||
141 | } | ||
142 | catch (Exception e) | ||
143 | { | ||
144 | Exception e2 | ||
145 | = new Exception( | ||
146 | String.Format( | ||
147 | "Unable to deregister region with grid at {0}. Grid service not running?", | ||
148 | gridServerURL), | ||
149 | e); | ||
150 | |||
151 | throw e2; | ||
152 | } | ||
153 | |||
154 | Hashtable GridRespData = (Hashtable)GridResp.Value; | ||
155 | |||
156 | // Hashtable griddatahash = GridRespData; | ||
157 | |||
158 | // Process Response | ||
159 | if (GridRespData != null && GridRespData.ContainsKey("error")) | ||
160 | { | ||
161 | errorMsg = (string)GridRespData["error"]; | ||
162 | return false; | ||
163 | } | ||
164 | |||
165 | return true; | ||
166 | } | ||
167 | |||
168 | public bool RequestNeighborInfo(string gridServerURL, string sendKey, string receiveKey, UUID regionUUID, out RegionInfo regionInfo, out string errorMsg) | ||
169 | { | ||
170 | // didn't find it so far, we have to go the long way | ||
171 | regionInfo = null; | ||
172 | errorMsg = string.Empty; | ||
173 | Hashtable requestData = new Hashtable(); | ||
174 | requestData["region_UUID"] = regionUUID.ToString(); | ||
175 | requestData["authkey"] = sendKey; | ||
176 | ArrayList SendParams = new ArrayList(); | ||
177 | SendParams.Add(requestData); | ||
178 | XmlRpcRequest gridReq = new XmlRpcRequest("simulator_data_request", SendParams); | ||
179 | XmlRpcResponse gridResp = null; | ||
180 | |||
181 | try | ||
182 | { | ||
183 | gridResp = gridReq.Send(gridServerURL, 3000); | ||
184 | } | ||
185 | catch (Exception e) | ||
186 | { | ||
187 | errorMsg = e.Message; | ||
188 | return false; | ||
189 | } | ||
190 | |||
191 | Hashtable responseData = (Hashtable)gridResp.Value; | ||
192 | |||
193 | if (responseData.ContainsKey("error")) | ||
194 | { | ||
195 | errorMsg = (string)responseData["error"]; | ||
196 | return false; ; | ||
197 | } | ||
198 | |||
199 | regionInfo = BuildRegionInfo(responseData, String.Empty); | ||
200 | |||
201 | return true; | ||
202 | } | ||
203 | |||
204 | public bool RequestNeighborInfo(string gridServerURL, string sendKey, string receiveKey, ulong regionHandle, out RegionInfo regionInfo, out string errorMsg) | ||
205 | { | ||
206 | // didn't find it so far, we have to go the long way | ||
207 | regionInfo = null; | ||
208 | errorMsg = string.Empty; | ||
209 | |||
210 | try | ||
211 | { | ||
212 | Hashtable requestData = new Hashtable(); | ||
213 | requestData["region_handle"] = regionHandle.ToString(); | ||
214 | requestData["authkey"] = sendKey; | ||
215 | ArrayList SendParams = new ArrayList(); | ||
216 | SendParams.Add(requestData); | ||
217 | XmlRpcRequest GridReq = new XmlRpcRequest("simulator_data_request", SendParams); | ||
218 | XmlRpcResponse GridResp = GridReq.Send(gridServerURL, 3000); | ||
219 | |||
220 | Hashtable responseData = (Hashtable)GridResp.Value; | ||
221 | |||
222 | if (responseData.ContainsKey("error")) | ||
223 | { | ||
224 | errorMsg = (string)responseData["error"]; | ||
225 | return false; | ||
226 | } | ||
227 | |||
228 | uint regX = Convert.ToUInt32((string)responseData["region_locx"]); | ||
229 | uint regY = Convert.ToUInt32((string)responseData["region_locy"]); | ||
230 | string externalHostName = (string)responseData["sim_ip"]; | ||
231 | uint simPort = Convert.ToUInt32(responseData["sim_port"]); | ||
232 | string regionName = (string)responseData["region_name"]; | ||
233 | UUID regionID = new UUID((string)responseData["region_UUID"]); | ||
234 | uint remotingPort = Convert.ToUInt32((string)responseData["remoting_port"]); | ||
235 | |||
236 | uint httpPort = 9000; | ||
237 | if (responseData.ContainsKey("http_port")) | ||
238 | { | ||
239 | httpPort = Convert.ToUInt32((string)responseData["http_port"]); | ||
240 | } | ||
241 | |||
242 | // Ok, so this is definitively the wrong place to do this, way too hard coded, but it doesn't seem we GET this info? | ||
243 | |||
244 | string simURI = "http://" + externalHostName + ":" + simPort; | ||
245 | |||
246 | // string externalUri = (string) responseData["sim_uri"]; | ||
247 | |||
248 | //IPEndPoint neighbourInternalEndPoint = new IPEndPoint(IPAddress.Parse(internalIpStr), (int) port); | ||
249 | regionInfo = RegionInfo.Create(regionID, regionName, regX, regY, externalHostName, httpPort, simPort, remotingPort, simURI); | ||
250 | } | ||
251 | catch (Exception e) | ||
252 | { | ||
253 | errorMsg = e.Message; | ||
254 | return false; | ||
255 | } | ||
256 | |||
257 | return true; | ||
258 | } | ||
259 | |||
260 | public bool RequestClosestRegion(string gridServerURL, string sendKey, string receiveKey, string regionName, out RegionInfo regionInfo, out string errorMsg) | ||
261 | { | ||
262 | regionInfo = null; | ||
263 | errorMsg = string.Empty; | ||
264 | try | ||
265 | { | ||
266 | Hashtable requestData = new Hashtable(); | ||
267 | requestData["region_name_search"] = regionName; | ||
268 | requestData["authkey"] = sendKey; | ||
269 | ArrayList SendParams = new ArrayList(); | ||
270 | SendParams.Add(requestData); | ||
271 | XmlRpcRequest GridReq = new XmlRpcRequest("simulator_data_request", SendParams); | ||
272 | XmlRpcResponse GridResp = GridReq.Send(gridServerURL, 3000); | ||
273 | |||
274 | Hashtable responseData = (Hashtable)GridResp.Value; | ||
275 | |||
276 | if (responseData.ContainsKey("error")) | ||
277 | { | ||
278 | errorMsg = (string)responseData["error"]; | ||
279 | return false; | ||
280 | } | ||
281 | |||
282 | regionInfo = BuildRegionInfo(responseData, ""); | ||
283 | |||
284 | } | ||
285 | catch (Exception e) | ||
286 | { | ||
287 | errorMsg = e.Message; | ||
288 | return false; | ||
289 | } | ||
290 | return true; | ||
291 | } | ||
292 | |||
293 | /// <summary> | ||
294 | /// Performs a XML-RPC query against the grid server returning mapblock information in the specified coordinates | ||
295 | /// </summary> | ||
296 | /// <remarks>REDUNDANT - OGS1 is to be phased out in favour of OGS2</remarks> | ||
297 | /// <param name="minX">Minimum X value</param> | ||
298 | /// <param name="minY">Minimum Y value</param> | ||
299 | /// <param name="maxX">Maximum X value</param> | ||
300 | /// <param name="maxY">Maximum Y value</param> | ||
301 | /// <returns>Hashtable of hashtables containing map data elements</returns> | ||
302 | public bool MapBlockQuery(string gridServerURL, int minX, int minY, int maxX, int maxY, out Hashtable respData, out string errorMsg) | ||
303 | { | ||
304 | respData = new Hashtable(); | ||
305 | errorMsg = string.Empty; | ||
306 | |||
307 | Hashtable param = new Hashtable(); | ||
308 | param["xmin"] = minX; | ||
309 | param["ymin"] = minY; | ||
310 | param["xmax"] = maxX; | ||
311 | param["ymax"] = maxY; | ||
312 | IList parameters = new ArrayList(); | ||
313 | parameters.Add(param); | ||
314 | |||
315 | try | ||
316 | { | ||
317 | XmlRpcRequest req = new XmlRpcRequest("map_block", parameters); | ||
318 | XmlRpcResponse resp = req.Send(gridServerURL, 10000); | ||
319 | respData = (Hashtable)resp.Value; | ||
320 | return true; | ||
321 | } | ||
322 | catch (Exception e) | ||
323 | { | ||
324 | errorMsg = e.Message; | ||
325 | return false; | ||
326 | } | ||
327 | } | ||
328 | |||
329 | public bool SearchRegionByName(string gridServerURL, IList parameters, out Hashtable respData, out string errorMsg) | ||
330 | { | ||
331 | respData = null; | ||
332 | errorMsg = string.Empty; | ||
333 | try | ||
334 | { | ||
335 | XmlRpcRequest request = new XmlRpcRequest("search_for_region_by_name", parameters); | ||
336 | XmlRpcResponse resp = request.Send(gridServerURL, 10000); | ||
337 | respData = (Hashtable)resp.Value; | ||
338 | if (respData != null && respData.Contains("faultCode")) | ||
339 | { | ||
340 | errorMsg = (string)respData["faultString"]; | ||
341 | return false; | ||
342 | } | ||
343 | |||
344 | return true; | ||
345 | } | ||
346 | catch (Exception e) | ||
347 | { | ||
348 | errorMsg = e.Message; | ||
349 | return false; | ||
350 | } | ||
351 | } | ||
352 | |||
353 | public RegionInfo BuildRegionInfo(Hashtable responseData, string prefix) | ||
354 | { | ||
355 | uint regX = Convert.ToUInt32((string)responseData[prefix + "region_locx"]); | ||
356 | uint regY = Convert.ToUInt32((string)responseData[prefix + "region_locy"]); | ||
357 | string internalIpStr = (string)responseData[prefix + "sim_ip"]; | ||
358 | uint port = Convert.ToUInt32(responseData[prefix + "sim_port"]); | ||
359 | |||
360 | IPEndPoint neighbourInternalEndPoint = new IPEndPoint(Util.GetHostFromDNS(internalIpStr), (int)port); | ||
361 | |||
362 | RegionInfo regionInfo = new RegionInfo(regX, regY, neighbourInternalEndPoint, internalIpStr); | ||
363 | regionInfo.RemotingPort = Convert.ToUInt32((string)responseData[prefix + "remoting_port"]); | ||
364 | regionInfo.RemotingAddress = internalIpStr; | ||
365 | |||
366 | if (responseData.ContainsKey(prefix + "http_port")) | ||
367 | { | ||
368 | regionInfo.HttpPort = Convert.ToUInt32((string)responseData[prefix + "http_port"]); | ||
369 | } | ||
370 | |||
371 | regionInfo.RegionID = new UUID((string)responseData[prefix + "region_UUID"]); | ||
372 | regionInfo.RegionName = (string)responseData[prefix + "region_name"]; | ||
373 | |||
374 | regionInfo.RegionSettings.TerrainImageID = new UUID((string)responseData[prefix + "map_UUID"]); | ||
375 | return regionInfo; | ||
376 | } | ||
377 | } | ||
378 | } | ||