From 981c97502a25c12473328e332bb0505f8c779d73 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Mon, 3 Dec 2007 07:06:46 +0000 Subject: * Moved XMLRPC Controller to a Application Plugin. Requires testing. --- .../RemoteController/Properties/AssemblyInfo.cs | 33 +++++ .../Properties/Settings.Designer.cs | 30 +++++ .../RemoteController/RemoteAdminPlugin.cs | 139 +++++++++++++++++++++ 3 files changed, 202 insertions(+) create mode 100644 OpenSim/ApplicationPlugins/RemoteController/Properties/AssemblyInfo.cs create mode 100644 OpenSim/ApplicationPlugins/RemoteController/Properties/Settings.Designer.cs create mode 100644 OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs (limited to 'OpenSim/ApplicationPlugins') diff --git a/OpenSim/ApplicationPlugins/RemoteController/Properties/AssemblyInfo.cs b/OpenSim/ApplicationPlugins/RemoteController/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..869efe2 --- /dev/null +++ b/OpenSim/ApplicationPlugins/RemoteController/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("RemoteController")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("RemoteController")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a8d10dbc-371b-4514-8d1d-7d3589f658af")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/ApplicationPlugins/RemoteController/Properties/Settings.Designer.cs b/OpenSim/ApplicationPlugins/RemoteController/Properties/Settings.Designer.cs new file mode 100644 index 0000000..86daae1 --- /dev/null +++ b/OpenSim/ApplicationPlugins/RemoteController/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.832 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace RemoteController.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs new file mode 100644 index 0000000..2566a6b --- /dev/null +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Net; +using OpenSim; +using OpenSim.Framework.Console; +using OpenSim.Framework; +using OpenSim.Framework.Servers; +using Mono.Addins; +using Mono.Addins.Description; +using Nini; +using Nini.Config; +using Nwc.XmlRpc; +using System.Collections; +using System.Timers; + +[assembly: Addin] +[assembly: AddinDependency("OpenSim", "0.4")] + +namespace OpenSim.ApplicationPlugins.LoadRegions +{ + [Extension("/OpenSim/Startup")] + public class RemoteAdminPlugin : IApplicationPlugin + { + private OpenSimMain m_app; + private BaseHttpServer m_httpd; + + public void Initialise(OpenSimMain openSim) + { + if (openSim.ConfigSource.Configs["RemoteAdmin"].GetBoolean("enabled", false)) + { + System.Console.WriteLine("RADMIN","Remote Admin Plugin Enabled"); + + m_app = openSim; + m_httpd = openSim.HttpServer; + + m_httpd.AddXmlRPCHandler("admin_create_region", XmlRpcCreateRegionMethod); + m_httpd.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 = (Int32)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 + Timer shutdownTimer = new Timer(timeout); // Wait before firing + shutdownTimer.AutoReset = false; + shutdownTimer.Elapsed += new ElapsedEventHandler(shutdownTimer_Elapsed); + shutdownTimer.Start(); + + return response; + } + else + { + Hashtable responseData = new Hashtable(); + responseData["accepted"] = "true"; + response.Value = responseData; + + m_app.SceneManager.SendGeneralMessage("Region is going down now."); + + // Perform shutdown + Timer shutdownTimer = new Timer(2000); // Wait 2 seconds before firing + shutdownTimer.AutoReset = false; + shutdownTimer.Elapsed += new ElapsedEventHandler(shutdownTimer_Elapsed); + shutdownTimer.Start(); + + return response; + } + } + + private void shutdownTimer_Elapsed(object sender, 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((Int32)requestData["region_x"]); + newRegionData.RegionLocY = Convert.ToUInt32((Int32)requestData["region_y"]); + + // Security risk + newRegionData.DataStore = (string)requestData["datastore"]; + + newRegionData.InternalEndPoint = new IPEndPoint( + IPAddress.Parse((string)requestData["listen_ip"]), 0); + + newRegionData.InternalEndPoint.Port = (Int32)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; + } + + public void Close() + { + + } + } +} \ No newline at end of file -- cgit v1.1