From 03f246d6fea009f1812019f5f036987b96b47a2b Mon Sep 17 00:00:00 2001 From: Dr Scofield Date: Thu, 18 Sep 2008 15:44:05 +0000 Subject: [PATCH] adds support to delete a region completely and offers that functionality via the console command "delete-region" and also via RemoteAdminPlugin. minor typo fix. --- .../RemoteController/RemoteAdminPlugin.cs | 69 +++++++++++++++++-- OpenSim/Data/RegionProfileData.cs | 1 - OpenSim/Framework/RegionInfo.cs | 3 + OpenSim/Region/Application/OpenSim.cs | 30 ++++---- OpenSim/Region/Application/OpenSimBase.cs | 31 +++++++++ OpenSim/Region/Environment/Scenes/Scene.cs | 7 +- 6 files changed, 118 insertions(+), 23 deletions(-) diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index fc57386729..1c924c0200 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs @@ -86,6 +86,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController m_httpd = openSim.HttpServer; m_httpd.AddXmlRPCHandler("admin_create_region", XmlRpcCreateRegionMethod); + m_httpd.AddXmlRPCHandler("admin_delete_region", XmlRpcDeleteRegionMethod); m_httpd.AddXmlRPCHandler("admin_shutdown", XmlRpcShutdownMethod); m_httpd.AddXmlRPCHandler("admin_broadcast", XmlRpcAlertMethod); m_httpd.AddXmlRPCHandler("admin_restart", XmlRpcRestartMethod); @@ -344,8 +345,6 @@ namespace OpenSim.ApplicationPlugins.RemoteController /// internal port (integer) /// external_address /// external IP address - /// datastore - /// datastore parameter (?) /// persist /// if true, persist the region info /// ('true' or 'false') @@ -378,7 +377,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController "region_master_first", "region_master_last", "region_master_password", "listen_ip", "external_address"}); - checkIntegerParams(request, new string[] { "region_x", "region_y", "listen_port"}); + checkIntegerParams(request, new string[] {"region_x", "region_y", "listen_port"}); // check password if (!String.IsNullOrEmpty(requiredPassword) && @@ -390,7 +389,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController if (requestData.ContainsKey("region_id") && !String.IsNullOrEmpty((string)requestData["region_id"])) { - regionID = (string) requestData["region_id"]; + regionID = (string)requestData["region_id"]; if (m_app.SceneManager.TryGetScene(regionID, out scene)) throw new Exception(String.Format("region UUID already in use by region {0}, UUID {1}, <{2},{3}>", scene.RegionInfo.RegionName, scene.RegionInfo.RegionID, @@ -492,6 +491,68 @@ namespace OpenSim.ApplicationPlugins.RemoteController return response; } + /// + /// Delete a new region. + /// + /// incoming XML RPC request + /// + /// XmlRpcCreateRegionMethod takes the following XMLRPC + /// parameters + /// + /// parameter namedescription + /// password + /// admin password as set in OpenSim.ini + /// region_name + /// desired region name + /// region_id + /// (optional) desired region UUID + /// + /// + /// XmlRpcCreateRegionMethod returns + /// + /// namedescription + /// success + /// true or false + /// error + /// error message if success is false + /// + /// + public XmlRpcResponse XmlRpcDeleteRegionMethod(XmlRpcRequest request) + { + m_log.Info("[RADMIN]: DeleteRegion: new request"); + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable responseData = new Hashtable(); + + try { + Hashtable requestData = (Hashtable) request.Params[0]; + checkStringParameters(request, new string[] {"password", "region_name"}); + + Scene scene = null; + 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.RemoveRegion(scene, true); + + responseData["success"] = "true"; + responseData["region_name"] = regionName; + + response.Value = responseData; + } + catch (Exception e) + { + m_log.ErrorFormat("[RADMIN] DeleteRegion: failed {0}", e.Message); + m_log.DebugFormat("[RADMIN] DeleteRegion: failed {0}", e.ToString()); + + responseData["success"] = "false"; + responseData["error"] = e.Message; + + response.Value = responseData; + } + + return response; + } + /// /// Create a new user account. /// diff --git a/OpenSim/Data/RegionProfileData.cs b/OpenSim/Data/RegionProfileData.cs index b4c7b3cca8..b30fcf5d16 100644 --- a/OpenSim/Data/RegionProfileData.cs +++ b/OpenSim/Data/RegionProfileData.cs @@ -30,7 +30,6 @@ using System.Collections; using OpenMetaverse; using Nwc.XmlRpc; using OpenSim.Framework; -using OpenMetaverse; namespace OpenSim.Data { diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs index 925c5beda2..5cbc776531 100644 --- a/OpenSim/Framework/RegionInfo.cs +++ b/OpenSim/Framework/RegionInfo.cs @@ -196,6 +196,7 @@ namespace OpenSim.Framework public bool commFailTF = false; public ConfigurationMember configMember; public string DataStore = String.Empty; + public string RegionFile = String.Empty; public bool isSandbox = false; private EstateSettings m_estateSettings; private RegionSettings m_regionSettings; @@ -221,6 +222,7 @@ namespace OpenSim.Framework configMember = new ConfigurationMember(filename, description, loadConfigurationOptions, handleIncomingConfiguration, !skipConsoleConfig); configMember.performConfigurationRetrieve(); + RegionFile = filename; } public RegionInfo(string description, XmlNode xmlNode, bool skipConsoleConfig) @@ -364,6 +366,7 @@ namespace OpenSim.Framework configMember = new ConfigurationMember(filename, description, loadConfigurationOptionsFromMe, ignoreIncomingConfiguration, false); configMember.performConfigurationRetrieve(); + RegionFile = filename; } public void loadConfigurationOptionsFromMe() diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index e48df8188a..9f313ebd9c 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -311,22 +311,23 @@ namespace OpenSim break; case "remove-region": - string regName = CombineParams(cmdparams, 0); + string regRemoveName = CombineParams(cmdparams, 0); + + Scene removeScene; + if (m_sceneManager.TryGetScene(regRemoveName, out removeScene)) + RemoveRegion(removeScene, false); + else + m_console.Error("no region with that name"); + break; + + case "delete-region": + string regDeleteName = CombineParams(cmdparams, 0); Scene killScene; - if (m_sceneManager.TryGetScene(regName, out killScene)) - { - // only need to check this if we are not at the - // root level - if ((m_sceneManager.CurrentScene != null) && - (m_sceneManager.CurrentScene.RegionInfo.RegionID == killScene.RegionInfo.RegionID)) - { - m_sceneManager.TrySetCurrentScene(".."); - } - - m_regionData.Remove(killScene.RegionInfo); - m_sceneManager.CloseScene(killScene); - } + if (m_sceneManager.TryGetScene(regDeleteName, out killScene)) + RemoveRegion(killScene, true); + else + m_console.Error("no region with that name"); break; case "restart": @@ -610,6 +611,7 @@ namespace OpenSim m_console.Notice("force-update - force an update of prims in the scene"); m_console.Notice("restart - disconnects all clients and restarts the sims in the instance."); m_console.Notice("remove-region [name] - remove a region"); + m_console.Notice("delete-region [name] - delete a region"); m_console.Notice("load-xml [filename] - load prims from XML (DEPRECATED)"); m_console.Notice("save-xml [filename] - save prims to XML (DEPRECATED)"); m_console.Notice("save-xml2 [filename] - save prims to XML using version 2 format"); diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 4a022644f8..e5cf07a98f 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -589,6 +589,37 @@ namespace OpenSim return clientServer; } + public void RemoveRegion(Scene scene, bool cleanup) + { + // 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(".."); + } + + scene.DeleteAllSceneObjects(); + m_regionData.Remove(scene.RegionInfo); + m_sceneManager.CloseScene(scene); + + if (!cleanup) + return; + + if (!String.IsNullOrEmpty(scene.RegionInfo.RegionFile)) + { + File.Delete(scene.RegionInfo.RegionFile); + m_log.InfoFormat("[OPENSIM MAIN] deleting region file \"{0}\"", scene.RegionInfo.RegionFile); + } + } + + public void RemoveRegion(string name, bool cleanUp) + { + Scene target; + if (m_sceneManager.TryGetScene(name, out target)) + RemoveRegion(target, cleanUp); + } + protected override StorageManager CreateStorageManager(string connectionstring, string estateconnectionstring) { return new StorageManager(m_storageDll, connectionstring, estateconnectionstring); diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 8ee217958b..88f2928b81 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -624,7 +624,7 @@ namespace OpenSim.Region.Environment.Scenes // close the inner scene m_innerScene.Close(); // De-register with region communications (events cleanup) - UnRegisterReginWithComms(); + UnRegisterRegionWithComms(); // Shut down all non shared modules. foreach (IRegionModule module in Modules.Values) @@ -1775,10 +1775,9 @@ namespace OpenSim.Region.Environment.Scenes /// true if the object was in the scene, false if it was not public bool UnlinkSceneObject(UUID uuid, bool resultOfLinkingObjects) { - if (m_innerScene.DeleteSceneObject(uuid,resultOfLinkingObjects)) + if (m_innerScene.DeleteSceneObject(uuid, resultOfLinkingObjects)) { m_storageManager.DataStore.RemoveObject(uuid, m_regInfo.RegionID); - return true; } @@ -2568,7 +2567,7 @@ namespace OpenSim.Region.Environment.Scenes /// /// /// - public void UnRegisterReginWithComms() + public void UnRegisterRegionWithComms() { m_sceneGridService.KiPrimitive -= SendKiPrimitive; m_sceneGridService.OnLogOffUser -= HandleLogOffUserFromGrid;