Thank you kindly, RandomHuman for a patch that:
The admin_close_region method removes a region from the simulator without deleting it. The region can then be recreated by calling admin_create_region with the same UUID. There is also a change to admin_create_region to facilitate this.The reason I want to have this functionality is to make it possible to detach regions when they are idle and recreate them on demand through a web interface. It's probably doable using the existing methods by saving and loading oars, but it also doesn't seem like that should be necessary.trunk
parent
9d5d2f8fd4
commit
525ab2c278
|
@ -107,6 +107,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
|
||||||
Dictionary<string, XmlRpcMethod> availableMethods = new Dictionary<string, XmlRpcMethod>();
|
Dictionary<string, XmlRpcMethod> availableMethods = new Dictionary<string, XmlRpcMethod>();
|
||||||
availableMethods["admin_create_region"] = XmlRpcCreateRegionMethod;
|
availableMethods["admin_create_region"] = XmlRpcCreateRegionMethod;
|
||||||
availableMethods["admin_delete_region"] = XmlRpcDeleteRegionMethod;
|
availableMethods["admin_delete_region"] = XmlRpcDeleteRegionMethod;
|
||||||
|
availableMethods["admin_close_region"] = XmlRpcCloseRegionMethod;
|
||||||
availableMethods["admin_modify_region"] = XmlRpcModifyRegionMethod;
|
availableMethods["admin_modify_region"] = XmlRpcModifyRegionMethod;
|
||||||
availableMethods["admin_region_query"] = XmlRpcRegionQueryMethod;
|
availableMethods["admin_region_query"] = XmlRpcRegionQueryMethod;
|
||||||
availableMethods["admin_shutdown"] = XmlRpcShutdownMethod;
|
availableMethods["admin_shutdown"] = XmlRpcShutdownMethod;
|
||||||
|
@ -507,6 +508,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
|
||||||
RegionInfo region = new RegionInfo();
|
RegionInfo region = new RegionInfo();
|
||||||
|
|
||||||
region.RegionID = regionID;
|
region.RegionID = regionID;
|
||||||
|
region.originRegionID = regionID;
|
||||||
region.RegionName = (string) requestData["region_name"];
|
region.RegionName = (string) requestData["region_name"];
|
||||||
region.RegionLocX = Convert.ToUInt32(requestData["region_x"]);
|
region.RegionLocX = Convert.ToUInt32(requestData["region_x"]);
|
||||||
region.RegionLocY = Convert.ToUInt32(requestData["region_y"]);
|
region.RegionLocY = Convert.ToUInt32(requestData["region_y"]);
|
||||||
|
@ -735,6 +737,98 @@ namespace OpenSim.ApplicationPlugins.RemoteController
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Close a region.
|
||||||
|
/// <summary>
|
||||||
|
/// <param name="request">incoming XML RPC request</param>
|
||||||
|
/// <remarks>
|
||||||
|
/// XmlRpcCloseRegionMethod takes the following XMLRPC
|
||||||
|
/// parameters
|
||||||
|
/// <list type="table">
|
||||||
|
/// <listheader><term>parameter name</term><description>description</description></listheader>
|
||||||
|
/// <item><term>password</term>
|
||||||
|
/// <description>admin password as set in OpenSim.ini</description></item>
|
||||||
|
/// <item><term>region_name</term>
|
||||||
|
/// <description>desired region name</description></item>
|
||||||
|
/// <item><term>region_id</term>
|
||||||
|
/// <description>(optional) desired region UUID</description></item>
|
||||||
|
/// </list>
|
||||||
|
///
|
||||||
|
/// XmlRpcShutdownRegionMethod returns
|
||||||
|
/// <list type="table">
|
||||||
|
/// <listheader><term>name</term><description>description</description></listheader>
|
||||||
|
/// <item><term>success</term>
|
||||||
|
/// <description>true or false</description></item>
|
||||||
|
/// <item><term>region_name</term>
|
||||||
|
/// <description>the region name if success is true</description></item>
|
||||||
|
/// <item><term>error</term>
|
||||||
|
/// <description>error message if success is false</description></item>
|
||||||
|
/// </list>
|
||||||
|
/// </remarks>
|
||||||
|
public XmlRpcResponse XmlRpcCloseRegionMethod(XmlRpcRequest request, IPEndPoint remoteClient)
|
||||||
|
{
|
||||||
|
m_log.Info("[RADMIN]: CloseRegion: new request");
|
||||||
|
XmlRpcResponse response = new XmlRpcResponse();
|
||||||
|
Hashtable responseData = new Hashtable();
|
||||||
|
Scene scene = null;
|
||||||
|
|
||||||
|
lock (rslock)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Hashtable requestData = (Hashtable) request.Params[0];
|
||||||
|
checkStringParameters(request, new string[] {"password"});
|
||||||
|
|
||||||
|
if (requestData.ContainsKey("region_id") &&
|
||||||
|
!String.IsNullOrEmpty((string) requestData["region_id"]))
|
||||||
|
{
|
||||||
|
// Region specified by UUID
|
||||||
|
UUID regionID = (UUID) (string) requestData["region_id"];
|
||||||
|
if (!m_app.SceneManager.TryGetScene(regionID, out scene))
|
||||||
|
throw new Exception(String.Format("region \"{0}\" does not exist", regionID));
|
||||||
|
|
||||||
|
m_app.CloseRegion(scene);
|
||||||
|
|
||||||
|
responseData["success"] = true;
|
||||||
|
responseData["region_id"] = regionID;
|
||||||
|
|
||||||
|
response.Value = responseData;
|
||||||
|
}
|
||||||
|
else if (requestData.ContainsKey("region_name") &&
|
||||||
|
!String.IsNullOrEmpty((string) requestData["region_name"]))
|
||||||
|
{
|
||||||
|
// Region specified by name
|
||||||
|
|
||||||
|
string regionName = (string) requestData["region_name"];
|
||||||
|
if (!m_app.SceneManager.TryGetScene(regionName, out scene))
|
||||||
|
throw new Exception(String.Format("region \"{0}\" does not exist", regionName));
|
||||||
|
|
||||||
|
m_app.CloseRegion(scene);
|
||||||
|
|
||||||
|
responseData["success"] = true;
|
||||||
|
responseData["region_name"] = regionName;
|
||||||
|
|
||||||
|
response.Value = responseData;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw new Exception("no region specified");
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat("[RADMIN] CloseRegion: failed {0}", e.Message);
|
||||||
|
m_log.DebugFormat("[RADMIN] CloseRegion: failed {0}", e.ToString());
|
||||||
|
|
||||||
|
responseData["success"] = false;
|
||||||
|
responseData["error"] = e.Message;
|
||||||
|
|
||||||
|
response.Value = responseData;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_log.Info("[RADMIN]: CloseRegion: request complete");
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Change characteristics of an existing region.
|
/// Change characteristics of an existing region.
|
||||||
|
|
|
@ -503,6 +503,37 @@ namespace OpenSim
|
||||||
RemoveRegion(target, cleanUp);
|
RemoveRegion(target, cleanUp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Remove a region from the simulator without deleting it permanently.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="scene"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public void CloseRegion(Scene scene)
|
||||||
|
{
|
||||||
|
// only need to check this if we are not at the
|
||||||
|
// root level
|
||||||
|
if ((m_sceneManager.CurrentScene != null) &&
|
||||||
|
(m_sceneManager.CurrentScene.RegionInfo.RegionID == scene.RegionInfo.RegionID))
|
||||||
|
{
|
||||||
|
m_sceneManager.TrySetCurrentScene("..");
|
||||||
|
}
|
||||||
|
|
||||||
|
m_sceneManager.CloseScene(scene);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Remove a region from the simulator without deleting it permanently.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public void CloseRegion(string name)
|
||||||
|
{
|
||||||
|
Scene target;
|
||||||
|
if (m_sceneManager.TryGetScene(name, out target))
|
||||||
|
CloseRegion(target);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create a scene and its initial base structures.
|
/// Create a scene and its initial base structures.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
Loading…
Reference in New Issue