From 2048d611cf2ecccfbdb6b234c995e19d72ad03f2 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Thu, 25 Oct 2007 12:13:58 +0000 Subject: * 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. --- OpenSim/Region/Application/OpenSimController.cs | 132 ++++++++++++++++++++++++ OpenSim/Region/Application/OpenSimMain.cs | 3 + 2 files changed, 135 insertions(+) create mode 100644 OpenSim/Region/Application/OpenSimController.cs (limited to 'OpenSim/Region/Application') diff --git a/OpenSim/Region/Application/OpenSimController.cs b/OpenSim/Region/Application/OpenSimController.cs new file mode 100644 index 0000000..14e4a4c --- /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 84c8bff..a345334 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(); -- cgit v1.1