aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/ThirdParty/3Di/RegionProxy/RegionProxyPlugin.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ThirdParty/3Di/RegionProxy/RegionProxyPlugin.cs')
-rw-r--r--ThirdParty/3Di/RegionProxy/RegionProxyPlugin.cs292
1 files changed, 166 insertions, 126 deletions
diff --git a/ThirdParty/3Di/RegionProxy/RegionProxyPlugin.cs b/ThirdParty/3Di/RegionProxy/RegionProxyPlugin.cs
index 162b34d..6d55094 100644
--- a/ThirdParty/3Di/RegionProxy/RegionProxyPlugin.cs
+++ b/ThirdParty/3Di/RegionProxy/RegionProxyPlugin.cs
@@ -37,8 +37,8 @@ using Nwc.XmlRpc;
37using OpenSim.Framework; 37using OpenSim.Framework;
38using OpenSim.Framework.Servers; 38using OpenSim.Framework.Servers;
39 39
40[assembly:Addin ("RegionProxy", "0.1")] 40[assembly : Addin("RegionProxy", "0.1")]
41[assembly:AddinDependency ("OpenSim", "0.5")] 41[assembly : AddinDependency("OpenSim", "0.5")]
42 42
43namespace OpenSim.ApplicationPlugins.RegionProxy 43namespace OpenSim.ApplicationPlugins.RegionProxy
44{ 44{
@@ -63,17 +63,19 @@ namespace OpenSim.ApplicationPlugins.RegionProxy
63 [Extension("/OpenSim/Startup")] 63 [Extension("/OpenSim/Startup")]
64 public class RegionProxyPlugin : IApplicationPlugin 64 public class RegionProxyPlugin : IApplicationPlugin
65 { 65 {
66 private ProxyServer proxy;
67 private BaseHttpServer command_server;
68 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 66 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
67 private BaseHttpServer command_server;
68 private ProxyServer proxy;
69
70 #region IApplicationPlugin Members
69 71
70 public void Initialise(OpenSimMain openSim) 72 public void Initialise(OpenSimMain openSim)
71 { 73 {
72 Console.WriteLine("Starting proxy"); 74 Console.WriteLine("Starting proxy");
73 string proxyURL = openSim.ConfigSource.Configs["Network"].GetString("proxy_url", ""); 75 string proxyURL = openSim.ConfigSource.Configs["Network"].GetString("proxy_url", "");
74 if(proxyURL.Length==0) return; 76 if (proxyURL.Length == 0) return;
75 77
76 uint port = (uint) Int32.Parse(proxyURL.Split(new char[] { ':' })[2]); 78 uint port = (uint) Int32.Parse(proxyURL.Split(new char[] {':'})[2]);
77 command_server = new BaseHttpServer(port); 79 command_server = new BaseHttpServer(port);
78 command_server.Start(); 80 command_server.Start();
79 command_server.AddXmlRPCHandler("AddPort", AddPort); 81 command_server.AddXmlRPCHandler("AddPort", AddPort);
@@ -84,13 +86,15 @@ namespace OpenSim.ApplicationPlugins.RegionProxy
84 command_server.AddXmlRPCHandler("UnblockClientMessages", UnblockClientMessages); 86 command_server.AddXmlRPCHandler("UnblockClientMessages", UnblockClientMessages);
85 command_server.AddXmlRPCHandler("Stop", Stop); 87 command_server.AddXmlRPCHandler("Stop", Stop);
86 88
87 proxy=new ProxyServer(m_log); 89 proxy = new ProxyServer(m_log);
88 } 90 }
89 91
90 public void Close() 92 public void Close()
91 { 93 {
92 } 94 }
93 95
96 #endregion
97
94 private XmlRpcResponse Stop(XmlRpcRequest request) 98 private XmlRpcResponse Stop(XmlRpcRequest request)
95 { 99 {
96 try 100 try
@@ -107,176 +111,118 @@ namespace OpenSim.ApplicationPlugins.RegionProxy
107 111
108 private XmlRpcResponse AddPort(XmlRpcRequest request) 112 private XmlRpcResponse AddPort(XmlRpcRequest request)
109 { 113 {
110 try { 114 try
115 {
111 int clientPort = (int) request.Params[0]; 116 int clientPort = (int) request.Params[0];
112 int regionPort = (int) request.Params[1]; 117 int regionPort = (int) request.Params[1];
113 string regionUrl = (string) request.Params[2]; 118 string regionUrl = (string) request.Params[2];
114 proxy.AddPort(clientPort, regionPort, regionUrl); 119 proxy.AddPort(clientPort, regionPort, regionUrl);
115 } catch(Exception e) { 120 }
116 m_log.Error("[PROXY]"+e.Message); 121 catch (Exception e)
117 m_log.Error("[PROXY]"+e.StackTrace); 122 {
123 m_log.Error("[PROXY]" + e.Message);
124 m_log.Error("[PROXY]" + e.StackTrace);
118 } 125 }
119 return new XmlRpcResponse(); 126 return new XmlRpcResponse();
120 } 127 }
121 128
122 private XmlRpcResponse AddRegion(XmlRpcRequest request) 129 private XmlRpcResponse AddRegion(XmlRpcRequest request)
123 { 130 {
124 try { 131 try
132 {
125 int currentRegionPort = (int) request.Params[0]; 133 int currentRegionPort = (int) request.Params[0];
126 string currentRegionUrl = (string) request.Params[1]; 134 string currentRegionUrl = (string) request.Params[1];
127 int newRegionPort = (int) request.Params[2]; 135 int newRegionPort = (int) request.Params[2];
128 string newRegionUrl = (string) request.Params[3]; 136 string newRegionUrl = (string) request.Params[3];
129 proxy.AddRegion(currentRegionPort, currentRegionUrl, newRegionPort, newRegionUrl); 137 proxy.AddRegion(currentRegionPort, currentRegionUrl, newRegionPort, newRegionUrl);
130 } catch(Exception e) { 138 }
131 m_log.Error("[PROXY]"+e.Message); 139 catch (Exception e)
132 m_log.Error("[PROXY]"+e.StackTrace); 140 {
141 m_log.Error("[PROXY]" + e.Message);
142 m_log.Error("[PROXY]" + e.StackTrace);
133 } 143 }
134 return new XmlRpcResponse(); 144 return new XmlRpcResponse();
135 } 145 }
136 146
137 private XmlRpcResponse ChangeRegion(XmlRpcRequest request) 147 private XmlRpcResponse ChangeRegion(XmlRpcRequest request)
138 { 148 {
139 try { 149 try
150 {
140 int currentRegionPort = (int) request.Params[0]; 151 int currentRegionPort = (int) request.Params[0];
141 string currentRegionUrl = (string) request.Params[1]; 152 string currentRegionUrl = (string) request.Params[1];
142 int newRegionPort = (int) request.Params[2]; 153 int newRegionPort = (int) request.Params[2];
143 string newRegionUrl = (string) request.Params[3]; 154 string newRegionUrl = (string) request.Params[3];
144 proxy.ChangeRegion(currentRegionPort, currentRegionUrl, newRegionPort, newRegionUrl); 155 proxy.ChangeRegion(currentRegionPort, currentRegionUrl, newRegionPort, newRegionUrl);
145 } catch(Exception e) { 156 }
146 m_log.Error("[PROXY]"+e.Message); 157 catch (Exception e)
147 m_log.Error("[PROXY]"+e.StackTrace); 158 {
159 m_log.Error("[PROXY]" + e.Message);
160 m_log.Error("[PROXY]" + e.StackTrace);
148 } 161 }
149 return new XmlRpcResponse(); 162 return new XmlRpcResponse();
150 } 163 }
151 164
152 private XmlRpcResponse DeleteRegion(XmlRpcRequest request) 165 private XmlRpcResponse DeleteRegion(XmlRpcRequest request)
153 { 166 {
154 try { 167 try
168 {
155 int currentRegionPort = (int) request.Params[0]; 169 int currentRegionPort = (int) request.Params[0];
156 string currentRegionUrl = (string) request.Params[1]; 170 string currentRegionUrl = (string) request.Params[1];
157 proxy.DeleteRegion(currentRegionPort, currentRegionUrl); 171 proxy.DeleteRegion(currentRegionPort, currentRegionUrl);
158 } catch(Exception e) { 172 }
159 m_log.Error("[PROXY]"+e.Message); 173 catch (Exception e)
160 m_log.Error("[PROXY]"+e.StackTrace); 174 {
175 m_log.Error("[PROXY]" + e.Message);
176 m_log.Error("[PROXY]" + e.StackTrace);
161 } 177 }
162 return new XmlRpcResponse(); 178 return new XmlRpcResponse();
163 } 179 }
164 180
165 private XmlRpcResponse BlockClientMessages(XmlRpcRequest request) 181 private XmlRpcResponse BlockClientMessages(XmlRpcRequest request)
166 { 182 {
167 try { 183 try
184 {
168 string regionUrl = (string) request.Params[0]; 185 string regionUrl = (string) request.Params[0];
169 int regionPort = (int) request.Params[1]; 186 int regionPort = (int) request.Params[1];
170 proxy.BlockClientMessages(regionUrl, regionPort); 187 proxy.BlockClientMessages(regionUrl, regionPort);
171 } catch(Exception e) { 188 }
172 m_log.Error("[PROXY]"+e.Message); 189 catch (Exception e)
173 m_log.Error("[PROXY]"+e.StackTrace); 190 {
191 m_log.Error("[PROXY]" + e.Message);
192 m_log.Error("[PROXY]" + e.StackTrace);
174 } 193 }
175 return new XmlRpcResponse(); 194 return new XmlRpcResponse();
176 } 195 }
177 196
178 private XmlRpcResponse UnblockClientMessages(XmlRpcRequest request) 197 private XmlRpcResponse UnblockClientMessages(XmlRpcRequest request)
179 { 198 {
180 try { 199 try
200 {
181 string regionUrl = (string) request.Params[0]; 201 string regionUrl = (string) request.Params[0];
182 int regionPort = (int) request.Params[1]; 202 int regionPort = (int) request.Params[1];
183 proxy.UnblockClientMessages(regionUrl, regionPort); 203 proxy.UnblockClientMessages(regionUrl, regionPort);
184 } catch(Exception e) { 204 }
185 m_log.Error("[PROXY]"+e.Message); 205 catch (Exception e)
186 m_log.Error("[PROXY]"+e.StackTrace); 206 {
207 m_log.Error("[PROXY]" + e.Message);
208 m_log.Error("[PROXY]" + e.StackTrace);
187 } 209 }
188 return new XmlRpcResponse(); 210 return new XmlRpcResponse();
189 } 211 }
190 } 212 }
191 213
192 214
193 public class ProxyServer { 215 public class ProxyServer
194 protected AsyncCallback receivedData; 216 {
195 protected ProxyMap proxy_map = new ProxyMap();
196 protected readonly ILog m_log; 217 protected readonly ILog m_log;
218 protected ProxyMap proxy_map = new ProxyMap();
219 protected AsyncCallback receivedData;
197 protected bool running; 220 protected bool running;
198 221
199 protected class ProxyMap
200 {
201 public class RegionData
202 {
203 public bool isBlocked = false;
204 public Queue storedMessages = new Queue();
205 public List<EndPoint> regions = new List<EndPoint>();
206 }
207
208 private Dictionary<EndPoint, RegionData> map;
209
210 public ProxyMap() {
211 map = new Dictionary<EndPoint, RegionData>();
212 }
213
214 public void Add(EndPoint client, EndPoint region)
215 {
216 if(map.ContainsKey(client))
217 {
218 map[client].regions.Add(region);
219 }
220 else
221 {
222 RegionData regions = new RegionData();
223 map.Add(client, regions);
224 regions.regions.Add(region);
225 }
226 }
227
228 public RegionData GetRegionData(EndPoint client)
229 {
230 return map[client];
231 }
232
233 public EndPoint GetClient(EndPoint region)
234 {
235 foreach (KeyValuePair<EndPoint, RegionData> pair in map)
236 {
237 if(pair.Value.regions.Contains(region))
238 {
239 return pair.Key;
240 }
241 }
242 return null;
243 }
244 }
245
246 protected class ServerData {
247 public Socket server;
248 public EndPoint clientEP;
249 public EndPoint senderEP;
250 public IPEndPoint serverIP;
251 public byte[] recvBuffer = new byte[4096];
252
253 public ServerData()
254 {
255 server = null;
256 }
257 }
258
259 protected class StoredMessage
260 {
261 public byte[] buffer;
262 public int length;
263 public EndPoint senderEP;
264 public ServerData sd;
265
266 public StoredMessage(byte[] buffer, int length, int maxLength, EndPoint senderEP, ServerData sd)
267 {
268 this.buffer = new byte[maxLength];
269 this.length = length;
270 for(int i=0; i<length; i++) this.buffer[i]=buffer[i];
271 this.senderEP = senderEP;
272 this.sd = sd;
273 }
274 }
275
276 public ProxyServer(ILog log) 222 public ProxyServer(ILog log)
277 { 223 {
278 m_log = log; 224 m_log = log;
279 running=false; 225 running = false;
280 receivedData = new AsyncCallback(OnReceivedData); 226 receivedData = new AsyncCallback(OnReceivedData);
281 } 227 }
282 228
@@ -293,7 +239,8 @@ namespace OpenSim.ApplicationPlugins.RegionProxy
293 ProxyMap.RegionData rd = proxy_map.GetRegionData(client); 239 ProxyMap.RegionData rd = proxy_map.GetRegionData(client);
294 240
295 rd.isBlocked = false; 241 rd.isBlocked = false;
296 while(rd.storedMessages.Count > 0) { 242 while (rd.storedMessages.Count > 0)
243 {
297 StoredMessage msg = (StoredMessage) rd.storedMessages.Dequeue(); 244 StoredMessage msg = (StoredMessage) rd.storedMessages.Dequeue();
298 //m_log.Verbose("[PROXY]"+"Resending blocked message from {0}", msg.senderEP); 245 //m_log.Verbose("[PROXY]"+"Resending blocked message from {0}", msg.senderEP);
299 SendMessage(msg.buffer, msg.length, msg.senderEP, msg.sd); 246 SendMessage(msg.buffer, msg.length, msg.senderEP, msg.sd);
@@ -316,10 +263,10 @@ namespace OpenSim.ApplicationPlugins.RegionProxy
316 data.regions.Clear(); 263 data.regions.Clear();
317 data.regions.Add(new IPEndPoint(IPAddress.Parse(newRegionUrl), newRegionPort)); 264 data.regions.Add(new IPEndPoint(IPAddress.Parse(newRegionUrl), newRegionPort));
318 } 265 }
319 266
320 public void DeleteRegion(int oldRegionPort, string oldRegionUrl) 267 public void DeleteRegion(int oldRegionPort, string oldRegionUrl)
321 { 268 {
322 m_log.InfoFormat("[PROXY]"+"DeleteRegion {0} {1}", oldRegionPort, oldRegionUrl); 269 m_log.InfoFormat("[PROXY]" + "DeleteRegion {0} {1}", oldRegionPort, oldRegionUrl);
323 EndPoint regionEP = new IPEndPoint(IPAddress.Parse(oldRegionUrl), oldRegionPort); 270 EndPoint regionEP = new IPEndPoint(IPAddress.Parse(oldRegionUrl), oldRegionPort);
324 EndPoint client = proxy_map.GetClient(regionEP); 271 EndPoint client = proxy_map.GetClient(regionEP);
325 ProxyMap.RegionData data = proxy_map.GetRegionData(client); 272 ProxyMap.RegionData data = proxy_map.GetRegionData(client);
@@ -348,9 +295,8 @@ namespace OpenSim.ApplicationPlugins.RegionProxy
348 295
349 try 296 try
350 { 297 {
351
352 m_log.InfoFormat("[PROXY] Opening UDP socket on {0}", sd.clientEP); 298 m_log.InfoFormat("[PROXY] Opening UDP socket on {0}", sd.clientEP);
353 sd.serverIP = new IPEndPoint(IPAddress.Parse("0.0.0.0"), ((IPEndPoint)sd.clientEP).Port); 299 sd.serverIP = new IPEndPoint(IPAddress.Parse("0.0.0.0"), ((IPEndPoint) sd.clientEP).Port);
354 sd.server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 300 sd.server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
355 sd.server.Bind(sd.serverIP); 301 sd.server.Bind(sd.serverIP);
356 302
@@ -385,15 +331,14 @@ namespace OpenSim.ApplicationPlugins.RegionProxy
385 { 331 {
386 running = false; 332 running = false;
387 m_log.InfoFormat("[PROXY] Stopping the proxy server"); 333 m_log.InfoFormat("[PROXY] Stopping the proxy server");
388
389 } 334 }
390 335
391 336
392 protected virtual void OnReceivedData(IAsyncResult result) 337 protected virtual void OnReceivedData(IAsyncResult result)
393 { 338 {
394 if(!running) return; 339 if (!running) return;
395 340
396 ServerData sd = (ServerData)result.AsyncState; 341 ServerData sd = (ServerData) result.AsyncState;
397 sd.senderEP = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0); 342 sd.senderEP = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0);
398 343
399 try 344 try
@@ -431,7 +376,7 @@ namespace OpenSim.ApplicationPlugins.RegionProxy
431 m_log.ErrorFormat("[PROXY] BeginReceiveFrom failed, retrying... {0}", sd.clientEP); 376 m_log.ErrorFormat("[PROXY] BeginReceiveFrom failed, retrying... {0}", sd.clientEP);
432 m_log.Error("[PROXY]" + e.Message); 377 m_log.Error("[PROXY]" + e.Message);
433 m_log.Error("[PROXY]" + e.StackTrace); 378 m_log.Error("[PROXY]" + e.StackTrace);
434 OpenPort(sd); 379 OpenPort(sd);
435 } 380 }
436 } 381 }
437 } 382 }
@@ -471,7 +416,6 @@ namespace OpenSim.ApplicationPlugins.RegionProxy
471 m_log.Error("[PROXY]" + e.StackTrace); 416 m_log.Error("[PROXY]" + e.StackTrace);
472 return; 417 return;
473 } 418 }
474
475 } 419 }
476 else 420 else
477 { 421 {
@@ -480,7 +424,8 @@ namespace OpenSim.ApplicationPlugins.RegionProxy
480 ProxyMap.RegionData rd = proxy_map.GetRegionData(sd.clientEP); 424 ProxyMap.RegionData rd = proxy_map.GetRegionData(sd.clientEP);
481 foreach (EndPoint region in rd.regions) 425 foreach (EndPoint region in rd.regions)
482 { 426 {
483 if(rd.isBlocked) { 427 if (rd.isBlocked)
428 {
484 rd.storedMessages.Enqueue(new StoredMessage(buffer, length, numBytes, senderEP, sd)); 429 rd.storedMessages.Enqueue(new StoredMessage(buffer, length, numBytes, senderEP, sd));
485 } 430 }
486 else 431 else
@@ -502,5 +447,100 @@ namespace OpenSim.ApplicationPlugins.RegionProxy
502 } 447 }
503 } 448 }
504 } 449 }
450
451 #region Nested type: ProxyMap
452
453 protected class ProxyMap
454 {
455 private Dictionary<EndPoint, RegionData> map;
456
457 public ProxyMap()
458 {
459 map = new Dictionary<EndPoint, RegionData>();
460 }
461
462 public void Add(EndPoint client, EndPoint region)
463 {
464 if (map.ContainsKey(client))
465 {
466 map[client].regions.Add(region);
467 }
468 else
469 {
470 RegionData regions = new RegionData();
471 map.Add(client, regions);
472 regions.regions.Add(region);
473 }
474 }
475
476 public RegionData GetRegionData(EndPoint client)
477 {
478 return map[client];
479 }
480
481 public EndPoint GetClient(EndPoint region)
482 {
483 foreach (KeyValuePair<EndPoint, RegionData> pair in map)
484 {
485 if (pair.Value.regions.Contains(region))
486 {
487 return pair.Key;
488 }
489 }
490 return null;
491 }
492
493 #region Nested type: RegionData
494
495 public class RegionData
496 {
497 public bool isBlocked = false;
498 public List<EndPoint> regions = new List<EndPoint>();
499 public Queue storedMessages = new Queue();
500 }
501
502 #endregion
503 }
504
505 #endregion
506
507 #region Nested type: ServerData
508
509 protected class ServerData
510 {
511 public EndPoint clientEP;
512 public byte[] recvBuffer = new byte[4096];
513 public EndPoint senderEP;
514 public Socket server;
515 public IPEndPoint serverIP;
516
517 public ServerData()
518 {
519 server = null;
520 }
521 }
522
523 #endregion
524
525 #region Nested type: StoredMessage
526
527 protected class StoredMessage
528 {
529 public byte[] buffer;
530 public int length;
531 public ServerData sd;
532 public EndPoint senderEP;
533
534 public StoredMessage(byte[] buffer, int length, int maxLength, EndPoint senderEP, ServerData sd)
535 {
536 this.buffer = new byte[maxLength];
537 this.length = length;
538 for (int i = 0; i < length; i++) this.buffer[i] = buffer[i];
539 this.senderEP = senderEP;
540 this.sd = sd;
541 }
542 }
543
544 #endregion
505 } 545 }
506} 546} \ No newline at end of file