From 2048d611cf2ecccfbdb6b234c995e19d72ad03f2 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Thu, 25 Oct 2007 12:13:58 +0000 Subject: [PATCH] * Added XMLRPC Controller Module to OpenSimMain which allows XML-RPC queries to be sent to the core application. * Disabled by default, but has two functions so far -- shutdown (timed or now), and create-region. * Added SendGeneralAlert function to SceneManager allowing all-user alerts to be sent from OpenSimMain. --- .../Region/Application/OpenSimController.cs | 132 ++++++++++++++++++ OpenSim/Region/Application/OpenSimMain.cs | 3 + .../ClientStack/RegionApplicationBase.cs | 5 + OpenSim/Region/Environment/Scenes/Scene.cs | 1 - .../Region/Environment/Scenes/SceneManager.cs | 8 ++ 5 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 OpenSim/Region/Application/OpenSimController.cs diff --git a/OpenSim/Region/Application/OpenSimController.cs b/OpenSim/Region/Application/OpenSimController.cs new file mode 100644 index 0000000000..14e4a4ce68 --- /dev/null +++ b/OpenSim/Region/Application/OpenSimController.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections.Generic; +using System.Collections; +using System.IO; +using System.Text; +using Nini.Config; +using OpenSim.Framework.Communications.Cache; +using OpenSim.Framework.Console; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Servers; +using OpenSim.Framework.Types; +using OpenSim.Framework.Utilities; +using OpenSim.Region.ClientStack; +using OpenSim.Region.Communications.Local; +using OpenSim.Region.Communications.OGS1; +using OpenSim.Region.Environment; +using OpenSim.Region.Environment.Scenes; +using OpenSim.Region.Physics.Manager; +using System.Globalization; +using Nwc.XmlRpc; +using RegionInfo = OpenSim.Framework.Types.RegionInfo; + +namespace OpenSim +{ + class OpenSimController + { + private OpenSimMain m_app; + private BaseHttpServer m_httpServer; + private const bool m_enablexmlrpc = false; + + public OpenSimController(OpenSimMain core, BaseHttpServer httpd) + { + m_app = core; + m_httpServer = httpd; + + if (m_enablexmlrpc) + { + m_httpServer.AddXmlRPCHandler("admin_create_region", XmlRpcCreateRegionMethod); + m_httpServer.AddXmlRPCHandler("admin_shutdown", XmlRpcShutdownMethod); + } + } + + public XmlRpcResponse XmlRpcShutdownMethod(XmlRpcRequest request) + { + MainLog.Instance.Verbose("CONTROLLER", "Recieved Shutdown Administrator Request"); + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable requestData = (Hashtable)request.Params[0]; + + if ((string)requestData["shutdown"] == "delayed") + { + int timeout = Convert.ToInt32((string)requestData["milliseconds"]); + + Hashtable responseData = new Hashtable(); + responseData["accepted"] = "true"; + response.Value = responseData; + + m_app.SceneManager.SendGeneralMessage("Region is going down in " + ((int)(timeout / 1000)).ToString() + " second(s). Please save what you are doing and log out."); + + // Perform shutdown + System.Timers.Timer shutdownTimer = new System.Timers.Timer(timeout); // Wait before firing + shutdownTimer.AutoReset = false; + shutdownTimer.Elapsed += new System.Timers.ElapsedEventHandler(shutdownTimer_Elapsed); + + return response; + } + else + { + Hashtable responseData = new Hashtable(); + responseData["accepted"] = "true"; + response.Value = responseData; + + m_app.SceneManager.SendGeneralMessage("Region is going down now."); + + // Perform shutdown + System.Timers.Timer shutdownTimer = new System.Timers.Timer(2000); // Wait 2 seconds before firing + shutdownTimer.AutoReset = false; + shutdownTimer.Elapsed += new System.Timers.ElapsedEventHandler(shutdownTimer_Elapsed); + + return response; + } + } + + void shutdownTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + { + m_app.Shutdown(); + } + + public XmlRpcResponse XmlRpcCreateRegionMethod(XmlRpcRequest request) + { + MainLog.Instance.Verbose("CONTROLLER", "Recieved Create Region Administrator Request"); + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable requestData = (Hashtable)request.Params[0]; + + RegionInfo newRegionData = new RegionInfo(); + + try + { + newRegionData.RegionID = (string)requestData["region_id"]; + newRegionData.RegionName = (string)requestData["region_name"]; + newRegionData.RegionLocX = Convert.ToUInt32((string)requestData["region_x"]); + newRegionData.RegionLocY = Convert.ToUInt32((string)requestData["region_y"]); + + // Security risk + newRegionData.DataStore = (string)requestData["datastore"]; + + newRegionData.InternalEndPoint = new System.Net.IPEndPoint( + System.Net.IPAddress.Parse((string)requestData["listen_ip"]), 0); + + newRegionData.InternalEndPoint.Port = Convert.ToInt32((string)requestData["listen_port"]); + newRegionData.ExternalHostName = (string)requestData["external_address"]; + + newRegionData.MasterAvatarFirstName = (string)requestData["region_master_first"]; + newRegionData.MasterAvatarLastName = (string)requestData["region_master_last"]; + + m_app.CreateRegion(newRegionData); + + Hashtable responseData = new Hashtable(); + responseData["created"] = "true"; + response.Value = responseData; + } + catch (Exception e) + { + Hashtable responseData = new Hashtable(); + responseData["created"] = "false"; + responseData["error"] = e.ToString(); + response.Value = responseData; + } + + return response; + } + } +} diff --git a/OpenSim/Region/Application/OpenSimMain.cs b/OpenSim/Region/Application/OpenSimMain.cs index 84c8bffdf1..a34533422c 100644 --- a/OpenSim/Region/Application/OpenSimMain.cs +++ b/OpenSim/Region/Application/OpenSimMain.cs @@ -60,6 +60,7 @@ namespace OpenSim public bool user_accounts; public bool m_gridLocalAsset; + private OpenSimController m_controller; protected ModuleLoader m_moduleLoader; protected LocalLoginService m_loginService; @@ -162,6 +163,8 @@ namespace OpenSim base.StartUp(); + m_controller = new OpenSimController(this, m_httpServer); + if (m_sandbox) { LocalInventoryService inventoryService = new LocalInventoryService(); diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs index 62e2afdd7a..bab5d162db 100644 --- a/OpenSim/Region/ClientStack/RegionApplicationBase.cs +++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs @@ -57,6 +57,11 @@ namespace OpenSim.Region.ClientStack protected SceneManager m_sceneManager = new SceneManager(); + public SceneManager SceneManager + { + get { return m_sceneManager; } + } + public RegionApplicationBase() { m_startuptime = DateTime.Now; diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 84eb503a74..d7c1759850 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -1319,7 +1319,6 @@ namespace OpenSim.Region.Environment.Scenes SendAlertToUser(user, reason, false); } - public void SendGeneralAlert(string message) { foreach (ScenePresence presence in m_scenePresences.Values) diff --git a/OpenSim/Region/Environment/Scenes/SceneManager.cs b/OpenSim/Region/Environment/Scenes/SceneManager.cs index 3fe94799c0..7db6927919 100644 --- a/OpenSim/Region/Environment/Scenes/SceneManager.cs +++ b/OpenSim/Region/Environment/Scenes/SceneManager.cs @@ -150,6 +150,14 @@ namespace OpenSim.Region.Environment.Scenes ForEachCurrentScene(delegate(Scene scene) { scene.HandleAlertCommand(cmdparams); }); } + public void SendGeneralMessage(string msg) + { + ForEachCurrentScene(delegate(Scene scene) + { + scene.SendGeneralAlert(msg); + }); + } + public bool TrySetCurrentScene(string regionName) { if ((String.Compare(regionName, "root") == 0) || (String.Compare(regionName, "..") == 0))