aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
diff options
context:
space:
mode:
authorSean Dague2008-04-21 12:42:56 +0000
committerSean Dague2008-04-21 12:42:56 +0000
commitbf1580fba45df7624180b07599c8170074500c99 (patch)
tree696a69c94554f0789b123c82fb34c658e9a0b6af /OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
parent* Various refactorings. (diff)
downloadopensim-SC_OLD-bf1580fba45df7624180b07599c8170074500c99.zip
opensim-SC_OLD-bf1580fba45df7624180b07599c8170074500c99.tar.gz
opensim-SC_OLD-bf1580fba45df7624180b07599c8170074500c99.tar.bz2
opensim-SC_OLD-bf1580fba45df7624180b07599c8170074500c99.tar.xz
From: Dr Scofield <hud@zurich.ibm.com>
the attached patch set is centered around RemoteAdminPlugin and focuses mainly on making it more robust (i.e. more parameter checking and better error reporting) but also we've re-implemented the LoadTerrain stuff that got disabled during the terrain code reworking: * missing PostInitialize() calls on region modules that were loaded for regions created via RemoteAdmin's CreateRegion XmlRpc call * re-implements RemoteAdmin's LoadTerrain XmlRpc call (probably lost during the TerrainModule rework) * adds lots more parameter checking and error reporting to RemoteAdmin * adds a read-only property to RegionApplicationBase so that we can access the CommsManager * adds Exceptions to TerrainModule so that we get better error case feedback (and can report more meaningful errors in turn) * adds a CheckForTerrainUpdate() call to TerrainModule.LoadFromFile() to make terrain changes effective * adds TryGetCurrentScene(LLUUID) to SceneManager so that we can retrieve Scenes not only by name but also by LLUUID cheers, dr scofield
Diffstat (limited to 'OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs')
-rw-r--r--OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs160
1 files changed, 100 insertions, 60 deletions
diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
index 3e0f4f6..b8ee3ee 100644
--- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
+++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
@@ -38,6 +38,7 @@ using Nwc.XmlRpc;
38using OpenSim.Framework; 38using OpenSim.Framework;
39using OpenSim.Framework.Servers; 39using OpenSim.Framework.Servers;
40using OpenSim.Region.Environment.Scenes; 40using OpenSim.Region.Environment.Scenes;
41using OpenSim.Region.Environment.Modules.Terrain;
41 42
42[assembly : Addin] 43[assembly : Addin]
43[assembly : AddinDependency("OpenSim", "0.5")] 44[assembly : AddinDependency("OpenSim", "0.5")]
@@ -88,6 +89,9 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
88 LLUUID regionID = new LLUUID((string) requestData["regionID"]); 89 LLUUID regionID = new LLUUID((string) requestData["regionID"]);
89 90
90 Hashtable responseData = new Hashtable(); 91 Hashtable responseData = new Hashtable();
92
93 m_log.Info("[RADMIN]: Request to restart Region.");
94
91 if (requiredPassword != String.Empty && 95 if (requiredPassword != String.Empty &&
92 (!requestData.Contains("password") || (string) requestData["password"] != requiredPassword)) 96 (!requestData.Contains("password") || (string) requestData["password"] != requiredPassword))
93 { 97 {
@@ -119,24 +123,30 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
119 { 123 {
120 XmlRpcResponse response = new XmlRpcResponse(); 124 XmlRpcResponse response = new XmlRpcResponse();
121 Hashtable requestData = (Hashtable) request.Params[0]; 125 Hashtable requestData = (Hashtable) request.Params[0];
122
123 Hashtable responseData = new Hashtable(); 126 Hashtable responseData = new Hashtable();
124 if (requiredPassword != String.Empty && 127
125 (!requestData.Contains("password") || (string) requestData["password"] != requiredPassword)) 128 try {
126 { 129 checkStringParameters(request, new string[] { "password", "message" });
127 responseData["accepted"] = "false"; 130
128 response.Value = responseData; 131 if (requiredPassword != String.Empty &&
129 } 132 (!requestData.Contains("password") || (string) requestData["password"] != requiredPassword))
130 else 133 throw new Exception("wrong password");
131 { 134
132 string message = (string) requestData["message"]; 135 string message = (string) requestData["message"];
133 m_log.Info("[RADMIN]: Broadcasting: " + message); 136 m_log.InfoFormat("[RADMIN]: Broadcasting: {0}", message);
134 137
135 responseData["accepted"] = "true"; 138 responseData["accepted"] = "true";
136 response.Value = responseData; 139 response.Value = responseData;
137 140
138 m_app.SceneManager.SendGeneralMessage(message); 141 m_app.SceneManager.SendGeneralMessage(message);
139 } 142 }
143 catch(Exception e)
144 {
145 m_log.ErrorFormat("[RADMIN]: Broadcasting: failed: {0}", e.Message);
146 m_log.DebugFormat("[RADMIN]: Broadcasting: failed: {0}", e.ToString());
147 responseData["accepted"] = "false";
148 response.Value = responseData;
149 }
140 150
141 return response; 151 return response;
142 } 152 }
@@ -146,35 +156,48 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
146 XmlRpcResponse response = new XmlRpcResponse(); 156 XmlRpcResponse response = new XmlRpcResponse();
147 Hashtable requestData = (Hashtable)request.Params[0]; 157 Hashtable requestData = (Hashtable)request.Params[0];
148 158
149 Hashtable responseData = new Hashtable(); 159 m_log.DebugFormat("[RADMIN]: Load Terrain: XmlRpc {0}", request.ToString());
150 if (requiredPassword != String.Empty && 160 foreach (string k in requestData.Keys)
151 (!requestData.Contains("password") || (string)requestData["password"] != requiredPassword))
152 { 161 {
153 responseData["accepted"] = "false"; 162 m_log.DebugFormat("[RADMIN]: Load Terrain: XmlRpc {0}: >{1}< {2}",
154 response.Value = responseData; 163 k, (string)requestData[k], ((string)requestData[k]).Length);
155 } 164 }
156 else 165
157 { 166 Hashtable responseData = new Hashtable();
167 try {
168 checkStringParameters(request, new string[] { "password", "filename", "regionid"});
169
170 if (requiredPassword != String.Empty &&
171 (!requestData.Contains("password") || (string)requestData["password"] != requiredPassword))
172 throw new Exception("wrong password");
173
158 string file = (string)requestData["filename"]; 174 string file = (string)requestData["filename"];
159 LLUUID regionID = LLUUID.Parse((string)requestData["regionid"]); 175 LLUUID regionID = (string) requestData["regionid"];
160 m_log.Info("[RADMIN]: Terrain Loading: " + file); 176 m_log.InfoFormat("[RADMIN]: Terrain Loading: {0}", file);
161 177
162 responseData["accepted"] = "true"; 178 responseData["accepted"] = "true";
163 179
164 Scene region = null; 180 Scene region = null;
165 181
166 if (m_app.SceneManager.TryGetScene(regionID, out region)) 182 if (!m_app.SceneManager.TryGetScene(regionID, out region))
167 { 183 throw new Exception("1: unable to get a scene with that name");
168 //region.LoadWorldMap(file); 184
169 responseData["success"] = "true"; 185 ITerrainModule terrainModule = region.RequestModuleInterface<ITerrainModule>();
170 } 186 if (null == terrainModule) throw new Exception("terrain module not available");
171 else 187 terrainModule.LoadFromFile(file);
172 { 188
173 responseData["success"] = "false"; 189 responseData["success"] = "true";
174 responseData["error"] = "1: Unable to get a scene with that name."; 190
175 }
176 response.Value = responseData; 191 response.Value = responseData;
177 } 192 }
193 catch (Exception e)
194 {
195 m_log.ErrorFormat("[RADMIN] Terrain Loading: failed: {0}", e.Message);
196 m_log.DebugFormat("[RADMIN] Terrain Loading: failed: {0}", e.ToString());
197
198 responseData["success"] = "false";
199 responseData["error"] = e.Message;
200 }
178 201
179 return response; 202 return response;
180 } 203 }
@@ -185,37 +208,32 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
185 XmlRpcResponse response = new XmlRpcResponse(); 208 XmlRpcResponse response = new XmlRpcResponse();
186 Hashtable requestData = (Hashtable) request.Params[0]; 209 Hashtable requestData = (Hashtable) request.Params[0];
187 Hashtable responseData = new Hashtable(); 210 Hashtable responseData = new Hashtable();
188 if (requiredPassword != String.Empty && 211
189 (!requestData.Contains("password") || (string) requestData["password"] != requiredPassword)) 212 try {
190 { 213 checkStringParameters(request, new string[] { "password", "shutdown" });
191 responseData["accepted"] = "false"; 214 checkIntegerParams(request, new string[] { "milliseconds"});
215
216 if (requiredPassword != String.Empty &&
217 (!requestData.Contains("password") || (string) requestData["password"] != requiredPassword))
218 throw new Exception("wrong password");
219
220 responseData["accepted"] = "true";
192 response.Value = responseData; 221 response.Value = responseData;
193 } 222
194 else
195 {
196 if ((string) requestData["shutdown"] == "delayed") 223 if ((string) requestData["shutdown"] == "delayed")
197 { 224 {
198 int timeout = (Int32) requestData["milliseconds"]; 225 int timeout = (Int32) requestData["milliseconds"];
199
200 responseData["accepted"] = "true";
201 response.Value = responseData;
202
203 m_app.SceneManager.SendGeneralMessage("Region is going down in " + ((int) (timeout/1000)).ToString() + 226 m_app.SceneManager.SendGeneralMessage("Region is going down in " + ((int) (timeout/1000)).ToString() +
204 " second(s). Please save what you are doing and log out."); 227 " second(s). Please save what you are doing and log out.");
205 228
206 // Perform shutdown 229 // Perform shutdown
207 Timer shutdownTimer = new Timer(timeout); // Wait before firing 230 Timer shutdownTimer = new Timer(timeout); // Wait before firing
208 shutdownTimer.AutoReset = false; 231 shutdownTimer.AutoReset = false;
209 shutdownTimer.Elapsed += new ElapsedEventHandler(shutdownTimer_Elapsed); 232 shutdownTimer.Elapsed += new ElapsedEventHandler(shutdownTimer_Elapsed);
210 shutdownTimer.Start(); 233 shutdownTimer.Start();
211 234 }
212 return response;
213 }
214 else 235 else
215 { 236 {
216 responseData["accepted"] = "true";
217 response.Value = responseData;
218
219 m_app.SceneManager.SendGeneralMessage("Region is going down now."); 237 m_app.SceneManager.SendGeneralMessage("Region is going down now.");
220 238
221 // Perform shutdown 239 // Perform shutdown
@@ -223,10 +241,18 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
223 shutdownTimer.AutoReset = false; 241 shutdownTimer.AutoReset = false;
224 shutdownTimer.Elapsed += new ElapsedEventHandler(shutdownTimer_Elapsed); 242 shutdownTimer.Elapsed += new ElapsedEventHandler(shutdownTimer_Elapsed);
225 shutdownTimer.Start(); 243 shutdownTimer.Start();
226
227 return response;
228 } 244 }
229 } 245 }
246 catch (Exception e)
247 {
248 m_log.ErrorFormat("[RADMIN] Shutdown: failed: {0}", e.Message);
249 m_log.DebugFormat("[RADMIN] Shutdown: failed: {0}", e.ToString());
250
251 responseData["accepted"] = "false";
252 responseData["error"] = e.Message;
253
254 response.Value = responseData;
255 }
230 return response; 256 return response;
231 } 257 }
232 258
@@ -401,7 +427,7 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
401 region.SaveRegionToFile("dynamic region", regionConfigPath); 427 region.SaveRegionToFile("dynamic region", regionConfigPath);
402 } 428 }
403 429
404 m_app.CreateRegion(region, true); 430 m_app.CreateRegion(region);
405 431
406 responseData["success"] = "true"; 432 responseData["success"] = "true";
407 responseData["region_name"] = region.RegionName; 433 responseData["region_name"] = region.RegionName;
@@ -484,8 +510,10 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
484 uint regX = Convert.ToUInt32((Int32)requestData["start_region_x"]); 510 uint regX = Convert.ToUInt32((Int32)requestData["start_region_x"]);
485 uint regY = Convert.ToUInt32((Int32)requestData["start_region_y"]); 511 uint regY = Convert.ToUInt32((Int32)requestData["start_region_y"]);
486 512
487 // FIXME: need to check whether "firstname lastname" 513 UserProfileData userProfile = m_app.CommunicationsManager.UserService.GetUserProfile(firstname, lastname);
488 // already exists! 514 if (null != userProfile)
515 throw new Exception(String.Format("avatar {0} {1} already exists", firstname, lastname));
516
489 LLUUID userID = m_app.CreateUser(firstname, lastname, passwd, regX, regY); 517 LLUUID userID = m_app.CreateUser(firstname, lastname, passwd, regX, regY);
490 518
491 if (userID == LLUUID.Zero) throw new Exception(String.Format("failed to create new user {0} {1}", 519 if (userID == LLUUID.Zero) throw new Exception(String.Format("failed to create new user {0} {1}",
@@ -523,22 +551,34 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
523 try 551 try
524 { 552 {
525 // check completeness 553 // check completeness
526 foreach (string p in new string[] { "password", "region_name", "filename" }) 554 foreach (string p in new string[] { "password", "filename" })
527 { 555 {
528 if (!requestData.Contains(p)) 556 if (!requestData.Contains(p))
529 throw new Exception(String.Format("missing parameter {0}", p)); 557 throw new Exception(String.Format("missing parameter {0}", p));
558 if (String.IsNullOrEmpty((string)requestData[p]))
559 throw new Exception(String.Format("parameter {0} is empty"));
530 } 560 }
531 561
532 // check password 562 // check password
533 if (!String.IsNullOrEmpty(requiredPassword) && 563 if (!String.IsNullOrEmpty(requiredPassword) &&
534 (string)requestData["password"] != requiredPassword) throw new Exception("wrong password"); 564 (string)requestData["password"] != requiredPassword) throw new Exception("wrong password");
535 565
536 string region_name = (string)requestData["region_name"]; 566 string filename = (string)requestData["filename"];
537 string filename = (string)requestData["filename"]; 567 if (requestData.Contains("region_uuid"))
538 568 {
539 if (!m_app.SceneManager.TrySetCurrentScene(region_name)) 569 LLUUID region_uuid = (string)requestData["region_uuid"];
540 throw new Exception(String.Format("failed to switch to region {0}", region_name)); 570 if (!m_app.SceneManager.TrySetCurrentScene(region_uuid))
541 m_log.InfoFormat("[RADMIN] Switched to region {0}"); 571 throw new Exception(String.Format("failed to switch to region {0}", region_uuid.ToString()));
572 m_log.InfoFormat("[RADMIN] Switched to region {0}", region_uuid.ToString());
573 }
574 else if (requestData.Contains("region_name"))
575 {
576 string region_name = (string)requestData["region_name"];
577 if (!m_app.SceneManager.TrySetCurrentScene(region_name))
578 throw new Exception(String.Format("failed to switch to region {0}", region_name));
579 m_log.InfoFormat("[RADMIN] Switched to region {0}", region_name);
580 }
581 else throw new Exception("neither region_name nor region_uuid given");
542 582
543 responseData["switched"] = "true"; 583 responseData["switched"] = "true";
544 584
@@ -550,7 +590,7 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
550 catch (Exception e) 590 catch (Exception e)
551 { 591 {
552 m_log.InfoFormat("[RADMIN] LoadXml: {0}", e.Message); 592 m_log.InfoFormat("[RADMIN] LoadXml: {0}", e.Message);
553 m_log.DebugFormat("[RADMIN] LoadXML {0}: {1}", e.ToString()); 593 m_log.DebugFormat("[RADMIN] LoadXml: {0}", e.ToString());
554 594
555 responseData["loaded"] = "false"; 595 responseData["loaded"] = "false";
556 responseData["switched"] = "false"; 596 responseData["switched"] = "false";