* 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.
afrisby
Adam Frisby 2007-10-25 12:13:58 +00:00
parent 60e4541865
commit 2048d611cf
5 changed files with 148 additions and 1 deletions

View File

@ -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;
}
}
}

View File

@ -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();

View File

@ -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;

View File

@ -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)

View File

@ -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))