aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Grid/GridServer/GridManager.cs235
1 files changed, 121 insertions, 114 deletions
diff --git a/OpenSim/Grid/GridServer/GridManager.cs b/OpenSim/Grid/GridServer/GridManager.cs
index a6cefbc..69c56d2 100644
--- a/OpenSim/Grid/GridServer/GridManager.cs
+++ b/OpenSim/Grid/GridServer/GridManager.cs
@@ -239,6 +239,15 @@ namespace OpenSim.Grid.GridServer
239 return validated; 239 return validated;
240 } 240 }
241 241
242 private XmlRpcResponse ErrorResponse(string error)
243 {
244 XmlRpcResponse errorResponse = new XmlRpcResponse();
245 Hashtable errorResponseData = new Hashtable();
246 errorResponse.Value = errorResponseData;
247 errorResponseData["error"] = error;
248 return errorResponse;
249 }
250
242 /// <summary> 251 /// <summary>
243 /// Performed when a region connects to the grid server initially. 252 /// Performed when a region connects to the grid server initially.
244 /// </summary> 253 /// </summary>
@@ -246,9 +255,6 @@ namespace OpenSim.Grid.GridServer
246 /// <returns>Startup parameters</returns> 255 /// <returns>Startup parameters</returns>
247 public XmlRpcResponse XmlRpcSimulatorLoginMethod(XmlRpcRequest request) 256 public XmlRpcResponse XmlRpcSimulatorLoginMethod(XmlRpcRequest request)
248 { 257 {
249 XmlRpcResponse response = new XmlRpcResponse();
250 Hashtable responseData = new Hashtable();
251 response.Value = responseData;
252 258
253 RegionProfileData sim; 259 RegionProfileData sim;
254 RegionProfileData existingSim; 260 RegionProfileData existingSim;
@@ -258,13 +264,11 @@ namespace OpenSim.Grid.GridServer
258 264
259 if (requestData.ContainsKey("UUID") && LLUUID.TryParse((string)requestData["UUID"], out uuid)) 265 if (requestData.ContainsKey("UUID") && LLUUID.TryParse((string)requestData["UUID"], out uuid))
260 { 266 {
261 existingSim = getRegion(uuid);
262 } 267 }
263 else 268 else
264 { 269 {
265 m_log.Info("[GRID]: Region connected without a UUID, ignoring."); 270 m_log.Info("[GRID]: Region connected without a UUID, ignoring.");
266 responseData["error"] = "No UUID passed to grid server - unable to connect you"; 271 return ErrorResponse("No UUID passed to grid server - unable to connect you");
267 return response;
268 } 272 }
269 273
270 try 274 try
@@ -274,8 +278,7 @@ namespace OpenSim.Grid.GridServer
274 catch (FormatException e) 278 catch (FormatException e)
275 { 279 {
276 m_log.Info("[GRID]: Invalid login parameters, ignoring."); 280 m_log.Info("[GRID]: Invalid login parameters, ignoring.");
277 responseData["error"] = "Wrong format in login parameters. Please verify parameters."; 281 return ErrorResponse("Wrong format in login parameters. Please verify parameters.");
278 return response;
279 } 282 }
280 283
281 existingSim = getRegion(sim.regionHandle); 284 existingSim = getRegion(sim.regionHandle);
@@ -325,110 +328,10 @@ namespace OpenSim.Grid.GridServer
325 "Unable to add region " + sim.UUID.ToString() + " via " + kvp.Key); 328 "Unable to add region " + sim.UUID.ToString() + " via " + kvp.Key);
326 m_log.Warn("[storage]: " + e.ToString()); 329 m_log.Warn("[storage]: " + e.ToString());
327 } 330 }
328
329
330 if (getRegion(sim.regionHandle) == null)
331 {
332 responseData["error"] = "Unable to add new region";
333 return response;
334 }
335 } 331 }
336 332
333 XmlRpcResponse response = CreateLoginResponse(sim);
337 334
338
339 ArrayList SimNeighboursData = new ArrayList();
340
341 RegionProfileData neighbour;
342 Hashtable NeighbourBlock;
343
344 bool fastMode = false; // Only compatible with MySQL right now
345
346 if (fastMode)
347 {
348 Dictionary<ulong, RegionProfileData> neighbours =
349 getRegions(sim.regionLocX - 1, sim.regionLocY - 1, sim.regionLocX + 1,
350 sim.regionLocY + 1);
351
352 foreach (KeyValuePair<ulong, RegionProfileData> aSim in neighbours)
353 {
354 NeighbourBlock = new Hashtable();
355 NeighbourBlock["sim_ip"] = Util.GetHostFromDNS(aSim.Value.serverIP.ToString()).ToString();
356 NeighbourBlock["sim_port"] = aSim.Value.serverPort.ToString();
357 NeighbourBlock["region_locx"] = aSim.Value.regionLocX.ToString();
358 NeighbourBlock["region_locy"] = aSim.Value.regionLocY.ToString();
359 NeighbourBlock["UUID"] = aSim.Value.UUID.ToString();
360 NeighbourBlock["regionHandle"] = aSim.Value.regionHandle.ToString();
361
362 if (aSim.Value.UUID != sim.UUID)
363 {
364 SimNeighboursData.Add(NeighbourBlock);
365 }
366 }
367 }
368 else
369 {
370 for (int x = -1; x < 2; x++)
371 for (int y = -1; y < 2; y++)
372 {
373 if (
374 getRegion(
375 Helpers.UIntsToLong((uint)((sim.regionLocX + x) * Constants.RegionSize),
376 (uint)(sim.regionLocY + y) * Constants.RegionSize)) != null)
377 {
378 neighbour =
379 getRegion(
380 Helpers.UIntsToLong((uint)((sim.regionLocX + x) * Constants.RegionSize),
381 (uint)(sim.regionLocY + y) * Constants.RegionSize));
382
383 NeighbourBlock = new Hashtable();
384 NeighbourBlock["sim_ip"] = Util.GetHostFromDNS(neighbour.serverIP).ToString();
385 NeighbourBlock["sim_port"] = neighbour.serverPort.ToString();
386 NeighbourBlock["region_locx"] = neighbour.regionLocX.ToString();
387 NeighbourBlock["region_locy"] = neighbour.regionLocY.ToString();
388 NeighbourBlock["UUID"] = neighbour.UUID.ToString();
389 NeighbourBlock["regionHandle"] = neighbour.regionHandle.ToString();
390
391 if (neighbour.UUID != sim.UUID) SimNeighboursData.Add(NeighbourBlock);
392 }
393 }
394 }
395
396 responseData["UUID"] = sim.UUID.ToString();
397 responseData["region_locx"] = sim.regionLocX.ToString();
398 responseData["region_locy"] = sim.regionLocY.ToString();
399 responseData["regionname"] = sim.regionName;
400 responseData["estate_id"] = "1";
401 responseData["neighbours"] = SimNeighboursData;
402
403 responseData["sim_ip"] = sim.serverIP;
404 responseData["sim_port"] = sim.serverPort.ToString();
405 responseData["asset_url"] = sim.regionAssetURI;
406 responseData["asset_sendkey"] = sim.regionAssetSendKey;
407 responseData["asset_recvkey"] = sim.regionAssetRecvKey;
408 responseData["user_url"] = sim.regionUserURI;
409 responseData["user_sendkey"] = sim.regionUserSendKey;
410 responseData["user_recvkey"] = sim.regionUserRecvKey;
411 responseData["authkey"] = sim.regionSecret;
412
413 // New! If set, use as URL to local sim storage (ie http://remotehost/region.yap)
414 responseData["data_uri"] = sim.regionDataURI;
415
416 responseData["allow_forceful_banlines"] = Config.AllowForcefulBanlines;
417
418 // Instead of sending a multitude of message servers to the registering sim
419 // we should probably be sending a single one and parhaps it's backup
420 // that has responsibility over routing it's messages.
421
422 // The Sim won't be contacting us again about any of the message server stuff during it's time up.
423
424 responseData["messageserver_count"] = _MessageServers.Count;
425
426 for (int i = 0; i < _MessageServers.Count; i++)
427 {
428 responseData["messageserver_uri" + i] = _MessageServers[i].URI;
429 responseData["messageserver_sendkey" + i] = _MessageServers[i].sendkey;
430 responseData["messageserver_recvkey" + i] = _MessageServers[i].recvkey;
431 }
432 return response; 335 return response;
433 } 336 }
434 else 337 else
@@ -446,18 +349,122 @@ namespace OpenSim.Grid.GridServer
446 " " + sim.regionLocY + " currently occupied by " + existingSim.regionName); 349 " " + sim.regionLocY + " currently occupied by " + existingSim.regionName);
447 } 350 }
448 351
449 responseData["error"] = 352 return ErrorResponse("The key required to connect to your region did not match. Please check your send and recieve keys.");
450 "The key required to connect to your region did not match. Please check your send and recieve keys.";
451 return response;
452 } 353 }
453 } 354 }
454 else 355 else
455 { 356 {
456 m_log.Warn("[grid]: Failed to add new region " + sim.regionName + " at location " + sim.regionLocX + " " + sim.regionLocY + " currently occupied by " + existingSim.regionName); 357 m_log.Warn("[grid]: Failed to add new region " + sim.regionName + " at location " + sim.regionLocX + " " + sim.regionLocY + " currently occupied by " + existingSim.regionName);
457 responseData["error"] = "Another region already exists at that location. Try another"; 358 return ErrorResponse("Another region already exists at that location. Try another");
458 return response;
459 } 359 }
360 }
460 361
362 private XmlRpcResponse CreateLoginResponse(RegionProfileData sim)
363 {
364 XmlRpcResponse response = new XmlRpcResponse();
365 Hashtable responseData = new Hashtable();
366 response.Value = responseData;
367
368 ArrayList SimNeighboursData = GetSimNeighboursData(sim);
369
370 responseData["UUID"] = sim.UUID.ToString();
371 responseData["region_locx"] = sim.regionLocX.ToString();
372 responseData["region_locy"] = sim.regionLocY.ToString();
373 responseData["regionname"] = sim.regionName;
374 responseData["estate_id"] = "1";
375 responseData["neighbours"] = SimNeighboursData;
376
377 responseData["sim_ip"] = sim.serverIP;
378 responseData["sim_port"] = sim.serverPort.ToString();
379 responseData["asset_url"] = sim.regionAssetURI;
380 responseData["asset_sendkey"] = sim.regionAssetSendKey;
381 responseData["asset_recvkey"] = sim.regionAssetRecvKey;
382 responseData["user_url"] = sim.regionUserURI;
383 responseData["user_sendkey"] = sim.regionUserSendKey;
384 responseData["user_recvkey"] = sim.regionUserRecvKey;
385 responseData["authkey"] = sim.regionSecret;
386
387 // New! If set, use as URL to local sim storage (ie http://remotehost/region.yap)
388 responseData["data_uri"] = sim.regionDataURI;
389
390 responseData["allow_forceful_banlines"] = Config.AllowForcefulBanlines;
391
392 // Instead of sending a multitude of message servers to the registering sim
393 // we should probably be sending a single one and parhaps it's backup
394 // that has responsibility over routing it's messages.
395
396 // The Sim won't be contacting us again about any of the message server stuff during it's time up.
397
398 responseData["messageserver_count"] = _MessageServers.Count;
399
400 for (int i = 0; i < _MessageServers.Count; i++)
401 {
402 responseData["messageserver_uri" + i] = _MessageServers[i].URI;
403 responseData["messageserver_sendkey" + i] = _MessageServers[i].sendkey;
404 responseData["messageserver_recvkey" + i] = _MessageServers[i].recvkey;
405 }
406 return response;
407 }
408
409 private ArrayList GetSimNeighboursData(RegionProfileData sim)
410 {
411 ArrayList SimNeighboursData = new ArrayList();
412
413 RegionProfileData neighbour;
414 Hashtable NeighbourBlock;
415
416 bool fastMode = false; // Only compatible with MySQL right now
417
418 if (fastMode)
419 {
420 Dictionary<ulong, RegionProfileData> neighbours =
421 getRegions(sim.regionLocX - 1, sim.regionLocY - 1, sim.regionLocX + 1,
422 sim.regionLocY + 1);
423
424 foreach (KeyValuePair<ulong, RegionProfileData> aSim in neighbours)
425 {
426 NeighbourBlock = new Hashtable();
427 NeighbourBlock["sim_ip"] = Util.GetHostFromDNS(aSim.Value.serverIP.ToString()).ToString();
428 NeighbourBlock["sim_port"] = aSim.Value.serverPort.ToString();
429 NeighbourBlock["region_locx"] = aSim.Value.regionLocX.ToString();
430 NeighbourBlock["region_locy"] = aSim.Value.regionLocY.ToString();
431 NeighbourBlock["UUID"] = aSim.Value.UUID.ToString();
432 NeighbourBlock["regionHandle"] = aSim.Value.regionHandle.ToString();
433
434 if (aSim.Value.UUID != sim.UUID)
435 {
436 SimNeighboursData.Add(NeighbourBlock);
437 }
438 }
439 }
440 else
441 {
442 for (int x = -1; x < 2; x++)
443 for (int y = -1; y < 2; y++)
444 {
445 if (
446 getRegion(
447 Helpers.UIntsToLong((uint)((sim.regionLocX + x) * Constants.RegionSize),
448 (uint)(sim.regionLocY + y) * Constants.RegionSize)) != null)
449 {
450 neighbour =
451 getRegion(
452 Helpers.UIntsToLong((uint)((sim.regionLocX + x) * Constants.RegionSize),
453 (uint)(sim.regionLocY + y) * Constants.RegionSize));
454
455 NeighbourBlock = new Hashtable();
456 NeighbourBlock["sim_ip"] = Util.GetHostFromDNS(neighbour.serverIP).ToString();
457 NeighbourBlock["sim_port"] = neighbour.serverPort.ToString();
458 NeighbourBlock["region_locx"] = neighbour.regionLocX.ToString();
459 NeighbourBlock["region_locy"] = neighbour.regionLocY.ToString();
460 NeighbourBlock["UUID"] = neighbour.UUID.ToString();
461 NeighbourBlock["regionHandle"] = neighbour.regionHandle.ToString();
462
463 if (neighbour.UUID != sim.UUID) SimNeighboursData.Add(NeighbourBlock);
464 }
465 }
466 }
467 return SimNeighboursData;
461 } 468 }
462 469
463 private RegionProfileData RegionFromRequest(Hashtable requestData) 470 private RegionProfileData RegionFromRequest(Hashtable requestData)