diff options
Diffstat (limited to 'OpenSim/ApplicationPlugins/RemoteController')
-rw-r--r-- | OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs | 120 |
1 files changed, 114 insertions, 6 deletions
diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index a634f1c..468eeb4 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs | |||
@@ -131,6 +131,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
131 | availableMethods["admin_region_query"] = XmlRpcRegionQueryMethod; | 131 | availableMethods["admin_region_query"] = XmlRpcRegionQueryMethod; |
132 | availableMethods["admin_shutdown"] = XmlRpcShutdownMethod; | 132 | availableMethods["admin_shutdown"] = XmlRpcShutdownMethod; |
133 | availableMethods["admin_broadcast"] = XmlRpcAlertMethod; | 133 | availableMethods["admin_broadcast"] = XmlRpcAlertMethod; |
134 | availableMethods["admin_dialog"] = XmlRpcDialogMethod; | ||
134 | availableMethods["admin_restart"] = XmlRpcRestartMethod; | 135 | availableMethods["admin_restart"] = XmlRpcRestartMethod; |
135 | availableMethods["admin_load_heightmap"] = XmlRpcLoadHeightmapMethod; | 136 | availableMethods["admin_load_heightmap"] = XmlRpcLoadHeightmapMethod; |
136 | availableMethods["admin_save_heightmap"] = XmlRpcSaveHeightmapMethod; | 137 | availableMethods["admin_save_heightmap"] = XmlRpcSaveHeightmapMethod; |
@@ -230,14 +231,50 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
230 | if (!m_application.SceneManager.TryGetScene(regionID, out rebootedScene)) | 231 | if (!m_application.SceneManager.TryGetScene(regionID, out rebootedScene)) |
231 | throw new Exception("region not found"); | 232 | throw new Exception("region not found"); |
232 | 233 | ||
234 | string message; | ||
235 | List<int> times = new List<int>(); | ||
236 | |||
237 | if (requestData.ContainsKey("alerts")) | ||
238 | { | ||
239 | string[] alertTimes = requestData["alerts"].ToString().Split( new char[] {','}); | ||
240 | foreach (string a in alertTimes) | ||
241 | times.Add(Convert.ToInt32(a)); | ||
242 | } | ||
243 | else | ||
244 | { | ||
245 | int timeout = 30; | ||
246 | if (requestData.ContainsKey("milliseconds")) | ||
247 | timeout = Int32.Parse(requestData["milliseconds"].ToString()) / 1000; | ||
248 | while (timeout > 0) | ||
249 | { | ||
250 | times.Add(timeout); | ||
251 | if (timeout > 300) | ||
252 | timeout -= 120; | ||
253 | else if (timeout > 30) | ||
254 | timeout -= 30; | ||
255 | else | ||
256 | timeout -= 15; | ||
257 | } | ||
258 | } | ||
259 | |||
260 | message = "Region is restarting in {0}. Please save what you are doing and log out."; | ||
261 | |||
262 | if (requestData.ContainsKey("message")) | ||
263 | message = requestData["message"].ToString(); | ||
264 | |||
265 | bool notice = true; | ||
266 | if (requestData.ContainsKey("noticetype") | ||
267 | && ((string)requestData["noticetype"] == "dialog")) | ||
268 | { | ||
269 | notice = false; | ||
270 | } | ||
271 | |||
233 | responseData["rebooting"] = true; | 272 | responseData["rebooting"] = true; |
234 | 273 | ||
235 | IRestartModule restartModule = rebootedScene.RequestModuleInterface<IRestartModule>(); | 274 | IRestartModule restartModule = rebootedScene.RequestModuleInterface<IRestartModule>(); |
236 | if (restartModule != null) | 275 | if (restartModule != null) |
237 | { | 276 | { |
238 | List<int> times = new List<int> { 30, 15 }; | 277 | restartModule.ScheduleRestart(UUID.Zero, message, times.ToArray(), notice); |
239 | |||
240 | restartModule.ScheduleRestart(UUID.Zero, "Region will restart in {0}", times.ToArray(), true); | ||
241 | responseData["success"] = true; | 278 | responseData["success"] = true; |
242 | } | 279 | } |
243 | 280 | ||
@@ -300,6 +337,53 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
300 | m_log.Info("[RADMIN]: Alert request complete"); | 337 | m_log.Info("[RADMIN]: Alert request complete"); |
301 | return response; | 338 | return response; |
302 | } | 339 | } |
340 | public XmlRpcResponse XmlRpcDialogMethod(XmlRpcRequest request, IPEndPoint remoteClient) | ||
341 | { | ||
342 | XmlRpcResponse response = new XmlRpcResponse(); | ||
343 | Hashtable responseData = new Hashtable(); | ||
344 | |||
345 | m_log.Info("[RADMIN]: Dialog request started"); | ||
346 | |||
347 | try | ||
348 | { | ||
349 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
350 | |||
351 | CheckStringParameters(request, new string[] { "password", "from", "message" }); | ||
352 | |||
353 | if (m_requiredPassword != String.Empty && | ||
354 | (!requestData.Contains("password") || (string)requestData["password"] != m_requiredPassword)) | ||
355 | throw new Exception("wrong password"); | ||
356 | |||
357 | string message = (string)requestData["message"]; | ||
358 | string fromuuid = (string)requestData["from"]; | ||
359 | m_log.InfoFormat("[RADMIN]: Broadcasting: {0}", message); | ||
360 | |||
361 | responseData["accepted"] = true; | ||
362 | responseData["success"] = true; | ||
363 | response.Value = responseData; | ||
364 | |||
365 | m_application.SceneManager.ForEachScene( | ||
366 | delegate(Scene scene) | ||
367 | { | ||
368 | IDialogModule dialogModule = scene.RequestModuleInterface<IDialogModule>(); | ||
369 | if (dialogModule != null) | ||
370 | dialogModule.SendNotificationToUsersInRegion(UUID.Zero, fromuuid, message); | ||
371 | }); | ||
372 | } | ||
373 | catch (Exception e) | ||
374 | { | ||
375 | m_log.ErrorFormat("[RADMIN]: Broadcasting: failed: {0}", e.Message); | ||
376 | m_log.DebugFormat("[RADMIN]: Broadcasting: failed: {0}", e.ToString()); | ||
377 | |||
378 | responseData["accepted"] = false; | ||
379 | responseData["success"] = false; | ||
380 | responseData["error"] = e.Message; | ||
381 | response.Value = responseData; | ||
382 | } | ||
383 | |||
384 | m_log.Info("[RADMIN]: Alert request complete"); | ||
385 | return response; | ||
386 | } | ||
303 | 387 | ||
304 | public XmlRpcResponse XmlRpcLoadHeightmapMethod(XmlRpcRequest request, IPEndPoint remoteClient) | 388 | public XmlRpcResponse XmlRpcLoadHeightmapMethod(XmlRpcRequest request, IPEndPoint remoteClient) |
305 | { | 389 | { |
@@ -434,13 +518,33 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
434 | message = "Region is going down now."; | 518 | message = "Region is going down now."; |
435 | } | 519 | } |
436 | 520 | ||
437 | m_application.SceneManager.ForEachScene( | 521 | if (requestData.ContainsKey("noticetype") |
522 | && ((string) requestData["noticetype"] == "dialog")) | ||
523 | { | ||
524 | m_application.SceneManager.ForEachScene( | ||
438 | delegate(Scene scene) | 525 | delegate(Scene scene) |
439 | { | 526 | { |
440 | IDialogModule dialogModule = scene.RequestModuleInterface<IDialogModule>(); | 527 | IDialogModule dialogModule = scene.RequestModuleInterface<IDialogModule>(); |
441 | if (dialogModule != null) | 528 | if (dialogModule != null) |
529 | dialogModule.SendNotificationToUsersInRegion(UUID.Zero, "System", message); | ||
530 | }); | ||
531 | } | ||
532 | else | ||
533 | { | ||
534 | if (!requestData.ContainsKey("noticetype") | ||
535 | || ((string)requestData["noticetype"] != "none")) | ||
536 | { | ||
537 | m_application.SceneManager.ForEachScene( | ||
538 | delegate(Scene scene) | ||
539 | { | ||
540 | IDialogModule dialogModule = scene.RequestModuleInterface<IDialogModule>(); | ||
541 | if (dialogModule != null) | ||
442 | dialogModule.SendGeneralAlert(message); | 542 | dialogModule.SendGeneralAlert(message); |
443 | }); | 543 | }); |
544 | } | ||
545 | } | ||
546 | |||
547 | |||
444 | 548 | ||
445 | // Perform shutdown | 549 | // Perform shutdown |
446 | System.Timers.Timer shutdownTimer = new System.Timers.Timer(timeout); // Wait before firing | 550 | System.Timers.Timer shutdownTimer = new System.Timers.Timer(timeout); // Wait before firing |
@@ -2616,8 +2720,12 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
2616 | else throw new Exception("neither region_name nor region_uuid given"); | 2720 | else throw new Exception("neither region_name nor region_uuid given"); |
2617 | 2721 | ||
2618 | Scene scene = m_application.SceneManager.CurrentScene; | 2722 | Scene scene = m_application.SceneManager.CurrentScene; |
2619 | int health = scene.GetHealth(); | 2723 | int flags; |
2724 | string text; | ||
2725 | int health = scene.GetHealth(out flags, out text); | ||
2620 | responseData["health"] = health; | 2726 | responseData["health"] = health; |
2727 | responseData["flags"] = flags; | ||
2728 | responseData["message"] = text; | ||
2621 | 2729 | ||
2622 | response.Value = responseData; | 2730 | response.Value = responseData; |
2623 | } | 2731 | } |
@@ -3179,4 +3287,4 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
3179 | return true; | 3287 | return true; |
3180 | } | 3288 | } |
3181 | } | 3289 | } |
3182 | } \ No newline at end of file | 3290 | } |