aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorBrian McBee2008-01-06 19:59:58 +0000
committerBrian McBee2008-01-06 19:59:58 +0000
commit9985d53681942567c7fef8bba1659aaf3b0eb385 (patch)
treeb6aa180634147370f2cba07cb3ba0ed080a0c283
parent* Added some userserver glue for communications with the message server (diff)
downloadopensim-SC-9985d53681942567c7fef8bba1659aaf3b0eb385.zip
opensim-SC-9985d53681942567c7fef8bba1659aaf3b0eb385.tar.gz
opensim-SC-9985d53681942567c7fef8bba1659aaf3b0eb385.tar.bz2
opensim-SC-9985d53681942567c7fef8bba1659aaf3b0eb385.tar.xz
Added code to gridserver to prevent new region from connecting at X,Y location already used by an existing region.
-rw-r--r--OpenSim/Grid/GridServer/GridManager.cs240
1 files changed, 128 insertions, 112 deletions
diff --git a/OpenSim/Grid/GridServer/GridManager.cs b/OpenSim/Grid/GridServer/GridManager.cs
index 65df708..31500c0 100644
--- a/OpenSim/Grid/GridServer/GridManager.cs
+++ b/OpenSim/Grid/GridServer/GridManager.cs
@@ -228,18 +228,20 @@ namespace OpenSim.Grid.GridServer
228 response.Value = responseData; 228 response.Value = responseData;
229 229
230 RegionProfileData TheSim = null; 230 RegionProfileData TheSim = null;
231 Hashtable requestData = (Hashtable) request.Params[0]; 231 RegionProfileData OldSim = null;
232
233 Hashtable requestData = (Hashtable)request.Params[0];
232 string myword; 234 string myword;
233 if (requestData.ContainsKey("UUID")) 235 if (requestData.ContainsKey("UUID"))
234 { 236 {
235 TheSim = getRegion(new LLUUID((string) requestData["UUID"])); 237 TheSim = getRegion(new LLUUID((string)requestData["UUID"]));
236 238
237// logToDB((new LLUUID((string)requestData["UUID"])).ToString(),"XmlRpcSimulatorLoginMethod","", 5,"Region attempting login with UUID."); 239 // logToDB((new LLUUID((string)requestData["UUID"])).ToString(),"XmlRpcSimulatorLoginMethod","", 5,"Region attempting login with UUID.");
238 } 240 }
239 else if (requestData.ContainsKey("region_handle")) 241 else if (requestData.ContainsKey("region_handle"))
240 { 242 {
241// TheSim = getRegion((ulong)Convert.ToUInt64(requestData["region_handle"])); 243 // TheSim = getRegion((ulong)Convert.ToUInt64(requestData["region_handle"]));
242// logToDB((string)requestData["region_handle"], "XmlRpcSimulatorLoginMethod", "", 5, "Region attempting login with regionHandle."); 244 // logToDB((string)requestData["region_handle"], "XmlRpcSimulatorLoginMethod", "", 5, "Region attempting login with regionHandle.");
243 } 245 }
244 else 246 else
245 { 247 {
@@ -270,144 +272,158 @@ namespace OpenSim.Grid.GridServer
270 TheSim.regionUserSendKey = config.UserSendKey; 272 TheSim.regionUserSendKey = config.UserSendKey;
271 TheSim.regionUserRecvKey = config.UserRecvKey; 273 TheSim.regionUserRecvKey = config.UserRecvKey;
272 274
273 TheSim.serverIP = (string) requestData["sim_ip"]; 275 TheSim.serverIP = (string)requestData["sim_ip"];
274 TheSim.serverPort = Convert.ToUInt32((string) requestData["sim_port"]); 276 TheSim.serverPort = Convert.ToUInt32((string)requestData["sim_port"]);
275 TheSim.httpPort = Convert.ToUInt32((string) requestData["http_port"]); 277 TheSim.httpPort = Convert.ToUInt32((string)requestData["http_port"]);
276 TheSim.remotingPort = Convert.ToUInt32((string) requestData["remoting_port"]); 278 TheSim.remotingPort = Convert.ToUInt32((string)requestData["remoting_port"]);
277 TheSim.regionLocX = Convert.ToUInt32((string) requestData["region_locx"]); 279 TheSim.regionLocX = Convert.ToUInt32((string)requestData["region_locx"]);
278 TheSim.regionLocY = Convert.ToUInt32((string) requestData["region_locy"]); 280 TheSim.regionLocY = Convert.ToUInt32((string)requestData["region_locy"]);
279 TheSim.regionLocZ = 0; 281 TheSim.regionLocZ = 0;
280 TheSim.regionMapTextureID = new LLUUID((string) requestData["map-image-id"]); 282 TheSim.regionMapTextureID = new LLUUID((string)requestData["map-image-id"]);
281 283
282 TheSim.regionHandle = Helpers.UIntsToLong((TheSim.regionLocX*256), (TheSim.regionLocY*256)); 284 TheSim.regionHandle = Helpers.UIntsToLong((TheSim.regionLocX * 256), (TheSim.regionLocY * 256));
283 TheSim.serverURI = "http://" + TheSim.serverIP + ":" + TheSim.serverPort + "/"; 285 TheSim.serverURI = "http://" + TheSim.serverIP + ":" + TheSim.serverPort + "/";
284 Console.WriteLine("adding region " + TheSim.regionLocX + " , " + TheSim.regionLocY + " , " + 286
285 TheSim.serverURI);
286 TheSim.httpServerURI = "http://" + TheSim.serverIP + ":" + TheSim.httpPort + "/"; 287 TheSim.httpServerURI = "http://" + TheSim.serverIP + ":" + TheSim.httpPort + "/";
287 288
288 289
289 TheSim.regionName = (string) requestData["sim_name"]; 290 TheSim.regionName = (string)requestData["sim_name"];
290 TheSim.UUID = new LLUUID((string) requestData["UUID"]); 291 TheSim.UUID = new LLUUID((string)requestData["UUID"]);
291 292
292 foreach (KeyValuePair<string, IGridData> kvp in _plugins) 293 //make sure there is not an existing region at this location
294 OldSim = getRegion(TheSim.regionHandle);
295 if (OldSim == null || OldSim.UUID == TheSim.UUID)
293 { 296 {
294 try 297 Console.WriteLine("adding region " + TheSim.regionLocX + " , " + TheSim.regionLocY + " , " +
298 TheSim.serverURI);
299 foreach (KeyValuePair<string, IGridData> kvp in _plugins)
295 { 300 {
296 DataResponse insertResponse = kvp.Value.AddProfile(TheSim); 301 try
297 switch (insertResponse)
298 { 302 {
299 case DataResponse.RESPONSE_OK: 303 DataResponse insertResponse = kvp.Value.AddProfile(TheSim);
300 MainLog.Instance.Verbose("grid", "New sim " + myword + " successful: " + TheSim.regionName); 304 switch (insertResponse)
301 break; 305 {
302 case DataResponse.RESPONSE_ERROR: 306 case DataResponse.RESPONSE_OK:
303 MainLog.Instance.Warn("storage", "New sim creation failed (Error): " + TheSim.regionName); 307 MainLog.Instance.Verbose("grid", "New sim " + myword + " successful: " + TheSim.regionName);
304 break; 308 break;
305 case DataResponse.RESPONSE_INVALIDCREDENTIALS: 309 case DataResponse.RESPONSE_ERROR:
306 MainLog.Instance.Warn("storage", 310 MainLog.Instance.Warn("storage", "New sim creation failed (Error): " + TheSim.regionName);
307 "New sim creation failed (Invalid Credentials): " + TheSim.regionName); 311 break;
308 break; 312 case DataResponse.RESPONSE_INVALIDCREDENTIALS:
309 case DataResponse.RESPONSE_AUTHREQUIRED: 313 MainLog.Instance.Warn("storage",
310 MainLog.Instance.Warn("storage", 314 "New sim creation failed (Invalid Credentials): " + TheSim.regionName);
311 "New sim creation failed (Authentication Required): " + 315 break;
312 TheSim.regionName); 316 case DataResponse.RESPONSE_AUTHREQUIRED:
313 break; 317 MainLog.Instance.Warn("storage",
318 "New sim creation failed (Authentication Required): " +
319 TheSim.regionName);
320 break;
321 }
322 }
323 catch (Exception e)
324 {
325 MainLog.Instance.Warn("storage",
326 "Unable to add region " + TheSim.UUID.ToString() + " via " + kvp.Key);
327 MainLog.Instance.Warn("storage", e.ToString());
314 } 328 }
315 }
316 catch (Exception e)
317 {
318 MainLog.Instance.Warn("storage",
319 "Unable to add region " + TheSim.UUID.ToString() + " via " + kvp.Key);
320 MainLog.Instance.Warn("storage", e.ToString());
321 }
322 329
323 330
324 if (getRegion(TheSim.regionHandle) == null) 331 if (getRegion(TheSim.regionHandle) == null)
325 { 332 {
326 responseData["error"] = "Unable to add new region"; 333 responseData["error"] = "Unable to add new region";
327 return response; 334 return response;
335 }
328 } 336 }
329 }
330 337
331 338
332 ArrayList SimNeighboursData = new ArrayList();
333 339
334 RegionProfileData neighbour; 340 ArrayList SimNeighboursData = new ArrayList();
335 Hashtable NeighbourBlock;
336 341
337 bool fastMode = false; // Only compatible with MySQL right now 342 RegionProfileData neighbour;
343 Hashtable NeighbourBlock;
338 344
339 if (fastMode) 345 bool fastMode = false; // Only compatible with MySQL right now
340 {
341 Dictionary<ulong, RegionProfileData> neighbours =
342 getRegions(TheSim.regionLocX - 1, TheSim.regionLocY - 1, TheSim.regionLocX + 1,
343 TheSim.regionLocY + 1);
344 346
345 foreach (KeyValuePair<ulong, RegionProfileData> aSim in neighbours) 347 if (fastMode)
346 { 348 {
347 NeighbourBlock = new Hashtable(); 349 Dictionary<ulong, RegionProfileData> neighbours =
348 NeighbourBlock["sim_ip"] = Util.GetHostFromDNS(aSim.Value.serverIP.ToString()).ToString(); 350 getRegions(TheSim.regionLocX - 1, TheSim.regionLocY - 1, TheSim.regionLocX + 1,
349 NeighbourBlock["sim_port"] = aSim.Value.serverPort.ToString(); 351 TheSim.regionLocY + 1);
350 NeighbourBlock["region_locx"] = aSim.Value.regionLocX.ToString(); 352
351 NeighbourBlock["region_locy"] = aSim.Value.regionLocY.ToString(); 353 foreach (KeyValuePair<ulong, RegionProfileData> aSim in neighbours)
352 NeighbourBlock["UUID"] = aSim.Value.UUID.ToString();
353 NeighbourBlock["regionHandle"] = aSim.Value.regionHandle.ToString();
354
355 if (aSim.Value.UUID != TheSim.UUID)
356 SimNeighboursData.Add(NeighbourBlock);
357 }
358 }
359 else
360 {
361 for (int x = -1; x < 2; x++)
362 for (int y = -1; y < 2; y++)
363 { 354 {
364 if ( 355 NeighbourBlock = new Hashtable();
365 getRegion( 356 NeighbourBlock["sim_ip"] = Util.GetHostFromDNS(aSim.Value.serverIP.ToString()).ToString();
366 Helpers.UIntsToLong((uint) ((TheSim.regionLocX + x)*256), 357 NeighbourBlock["sim_port"] = aSim.Value.serverPort.ToString();
367 (uint) (TheSim.regionLocY + y)*256)) != null) 358 NeighbourBlock["region_locx"] = aSim.Value.regionLocX.ToString();
359 NeighbourBlock["region_locy"] = aSim.Value.regionLocY.ToString();
360 NeighbourBlock["UUID"] = aSim.Value.UUID.ToString();
361 NeighbourBlock["regionHandle"] = aSim.Value.regionHandle.ToString();
362
363 if (aSim.Value.UUID != TheSim.UUID)
364 SimNeighboursData.Add(NeighbourBlock);
365 }
366 }
367 else
368 {
369 for (int x = -1; x < 2; x++)
370 for (int y = -1; y < 2; y++)
368 { 371 {
369 neighbour = 372 if (
370 getRegion( 373 getRegion(
371 Helpers.UIntsToLong((uint) ((TheSim.regionLocX + x)*256), 374 Helpers.UIntsToLong((uint)((TheSim.regionLocX + x) * 256),
372 (uint) (TheSim.regionLocY + y)*256)); 375 (uint)(TheSim.regionLocY + y) * 256)) != null)
373 376 {
374 NeighbourBlock = new Hashtable(); 377 neighbour =
375 NeighbourBlock["sim_ip"] = Util.GetHostFromDNS(neighbour.serverIP).ToString(); 378 getRegion(
376 NeighbourBlock["sim_port"] = neighbour.serverPort.ToString(); 379 Helpers.UIntsToLong((uint)((TheSim.regionLocX + x) * 256),
377 NeighbourBlock["region_locx"] = neighbour.regionLocX.ToString(); 380 (uint)(TheSim.regionLocY + y) * 256));
378 NeighbourBlock["region_locy"] = neighbour.regionLocY.ToString(); 381
379 NeighbourBlock["UUID"] = neighbour.UUID.ToString(); 382 NeighbourBlock = new Hashtable();
380 NeighbourBlock["regionHandle"] = neighbour.regionHandle.ToString(); 383 NeighbourBlock["sim_ip"] = Util.GetHostFromDNS(neighbour.serverIP).ToString();
381 384 NeighbourBlock["sim_port"] = neighbour.serverPort.ToString();
382 if (neighbour.UUID != TheSim.UUID) SimNeighboursData.Add(NeighbourBlock); 385 NeighbourBlock["region_locx"] = neighbour.regionLocX.ToString();
386 NeighbourBlock["region_locy"] = neighbour.regionLocY.ToString();
387 NeighbourBlock["UUID"] = neighbour.UUID.ToString();
388 NeighbourBlock["regionHandle"] = neighbour.regionHandle.ToString();
389
390 if (neighbour.UUID != TheSim.UUID) SimNeighboursData.Add(NeighbourBlock);
391 }
383 } 392 }
384 } 393 }
385 }
386 394
387 responseData["UUID"] = TheSim.UUID.ToString(); 395 responseData["UUID"] = TheSim.UUID.ToString();
388 responseData["region_locx"] = TheSim.regionLocX.ToString(); 396 responseData["region_locx"] = TheSim.regionLocX.ToString();
389 responseData["region_locy"] = TheSim.regionLocY.ToString(); 397 responseData["region_locy"] = TheSim.regionLocY.ToString();
390 responseData["regionname"] = TheSim.regionName; 398 responseData["regionname"] = TheSim.regionName;
391 responseData["estate_id"] = "1"; 399 responseData["estate_id"] = "1";
392 responseData["neighbours"] = SimNeighboursData; 400 responseData["neighbours"] = SimNeighboursData;
393 401
394 responseData["sim_ip"] = TheSim.serverIP; 402 responseData["sim_ip"] = TheSim.serverIP;
395 responseData["sim_port"] = TheSim.serverPort.ToString(); 403 responseData["sim_port"] = TheSim.serverPort.ToString();
396 responseData["asset_url"] = TheSim.regionAssetURI; 404 responseData["asset_url"] = TheSim.regionAssetURI;
397 responseData["asset_sendkey"] = TheSim.regionAssetSendKey; 405 responseData["asset_sendkey"] = TheSim.regionAssetSendKey;
398 responseData["asset_recvkey"] = TheSim.regionAssetRecvKey; 406 responseData["asset_recvkey"] = TheSim.regionAssetRecvKey;
399 responseData["user_url"] = TheSim.regionUserURI; 407 responseData["user_url"] = TheSim.regionUserURI;
400 responseData["user_sendkey"] = TheSim.regionUserSendKey; 408 responseData["user_sendkey"] = TheSim.regionUserSendKey;
401 responseData["user_recvkey"] = TheSim.regionUserRecvKey; 409 responseData["user_recvkey"] = TheSim.regionUserRecvKey;
402 responseData["authkey"] = TheSim.regionSecret; 410 responseData["authkey"] = TheSim.regionSecret;
403 411
404 // New! If set, use as URL to local sim storage (ie http://remotehost/region.yap) 412 // New! If set, use as URL to local sim storage (ie http://remotehost/region.yap)
405 responseData["data_uri"] = TheSim.regionDataURI; 413 responseData["data_uri"] = TheSim.regionDataURI;
406 414
407 responseData["allow_forceful_banlines"] = config.AllowForcefulBanlines; 415 responseData["allow_forceful_banlines"] = config.AllowForcefulBanlines;
408 416
409 417
410 return response; 418 return response;
419
420 }
421 else
422 {
423 MainLog.Instance.Warn("grid", "Failed to add new region " + TheSim.regionName + " at location " + TheSim.regionLocX + " " + TheSim.regionLocY + " currently occupied by " + OldSim.regionName);
424 responseData["error"] = "Another region already exists at that location. Try another";
425 return response;
426 }
411 } 427 }
412 428
413 public XmlRpcResponse XmlRpcSimulatorDataRequestMethod(XmlRpcRequest request) 429 public XmlRpcResponse XmlRpcSimulatorDataRequestMethod(XmlRpcRequest request)