From 96689723e5002075b45d01fe4243bf2d87d916b4 Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Fri, 10 Oct 2008 01:10:33 +0000 Subject: [PATCH] Add the beginnings of a sim health check (through remote admin) --- .../RemoteController/RemoteAdminPlugin.cs | 56 +++++++++++++++++++ .../World/Estate/EstateManagementModule.cs | 5 ++ OpenSim/Region/Environment/Scenes/Scene.cs | 14 +++++ 3 files changed, 75 insertions(+) diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index 3a64ec2c21..574486795e 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs @@ -97,6 +97,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController m_httpd.AddXmlRPCHandler("admin_load_xml", XmlRpcLoadXMLMethod); m_httpd.AddXmlRPCHandler("admin_save_xml", XmlRpcSaveXMLMethod); m_httpd.AddXmlRPCHandler("admin_load_oar", XmlRpcLoadOARMethod); + m_httpd.AddXmlRPCHandler("admin_region_query", XmlRpcRegionQueryMethod); } } catch (NullReferenceException) @@ -1084,6 +1085,61 @@ namespace OpenSim.ApplicationPlugins.RemoteController return response; } + public XmlRpcResponse XmlRpcRegionQueryMethod(XmlRpcRequest request) + { + m_log.Info("[RADMIN]: Received Save XML Administrator Request"); + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable responseData = new Hashtable(); + + try + { + responseData["success"] = "true"; + + Hashtable requestData = (Hashtable)request.Params[0]; + + // check completeness + if (!requestData.Contains("password")) + throw new Exception(String.Format("missing required parameter")); + if (!String.IsNullOrEmpty(requiredPassword) && + (string)requestData["password"] != requiredPassword) throw new Exception("wrong password"); + + if (requestData.Contains("region_uuid")) + { + UUID region_uuid = (UUID)(string)requestData["region_uuid"]; + if (!m_app.SceneManager.TrySetCurrentScene(region_uuid)) + throw new Exception(String.Format("failed to switch to region {0}", region_uuid.ToString())); + m_log.InfoFormat("[RADMIN] Switched to region {0}", region_uuid.ToString()); + } + else if (requestData.Contains("region_name")) + { + string region_name = (string)requestData["region_name"]; + if (!m_app.SceneManager.TrySetCurrentScene(region_name)) + throw new Exception(String.Format("failed to switch to region {0}", region_name)); + m_log.InfoFormat("[RADMIN] Switched to region {0}", region_name); + } + else throw new Exception("neither region_name nor region_uuid given"); + + Scene s = m_app.SceneManager.CurrentScene; + + int health = s.GetHealth(); + + responseData["health"] = health; + + response.Value = responseData; + } + catch (Exception e) + { + m_log.InfoFormat("[RADMIN] RegionQuery: {0}", e.Message); + + responseData["success"] = "false"; + responseData["error"] = e.Message; + + response.Value = responseData; + } + + return response; + } + public void Dispose() { } diff --git a/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs index 616132b15a..7a9dc7246b 100644 --- a/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs @@ -585,6 +585,11 @@ namespace OpenSim.Region.Environment.Modules.World.Estate args.SimOwner = m_scene.RegionInfo.EstateSettings.EstateOwner; else args.SimOwner = m_scene.RegionInfo.MasterAvatarAssignedUUID; + + // Fudge estate owner + if (m_scene.ExternalChecks.ExternalChecksCanBeGodLike(remoteClient.AgentId)) + args.SimOwner = remoteClient.AgentId; + args.terrainBase0 = UUID.Zero; args.terrainBase1 = UUID.Zero; args.terrainBase2 = UUID.Zero; diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 27c315cdda..8bd36424c0 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -168,6 +168,7 @@ namespace OpenSim.Region.Environment.Scenes private bool m_physics_enabled = true; private bool m_scripts_enabled = true; private string m_defaultScriptEngine; + private int m_LastLogin = 0; #endregion @@ -2142,6 +2143,7 @@ namespace OpenSim.Region.Environment.Scenes CreateAndAddScenePresence(client, child); } + m_LastLogin = System.Environment.TickCount; EventManager.TriggerOnNewClient(client); } @@ -4258,5 +4260,17 @@ namespace OpenSim.Region.Environment.Scenes { m_storageManager.DataStore.RemoveObject(uuid, m_regInfo.RegionID); } + + public int GetHealth() + { + int health=1; // Start at 1, means we're up + + // A login in the last 4 mins? We can't be doing too badly + // + if ((System.Environment.TickCount - m_LastLogin) < 240000) + health++; + + return 0; + } } }