From a9be42a304d9113c889a59ef2041bdccfc37c6f3 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 22 Sep 2024 23:37:42 +0100 Subject: [PATCH] a few changes to EstateDataRemoteConnector, LoadEstateSettings can not be fatal so work around it --- .../RemoteController/RemoteAdminPlugin.cs | 3 +- OpenSim/Region/Application/OpenSimBase.cs | 2 +- OpenSim/Region/Framework/Scenes/Scene.cs | 12 +- .../Estate/EstateDataRobustConnector.cs | 9 +- .../Connectors/Estate/EstateDataConnector.cs | 125 +++++++----------- 5 files changed, 65 insertions(+), 86 deletions(-) diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index 9deea592f5..e44f6a3e95 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs @@ -878,7 +878,6 @@ namespace OpenSim.ApplicationPlugins.RemoteController int estateID = estateIDs[0]; region.EstateSettings = m_application.EstateDataService.LoadEstateSettings(region.RegionID, false); - if (region.EstateSettings.EstateID != estateID) { // The region is already part of an estate, but not the one we want. @@ -2114,7 +2113,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController m_log.Info("[RADMIN]: Received Estate Reload Request"); Hashtable responseData = (Hashtable)response.Value; -// Hashtable requestData = (Hashtable)request.Params[0]; + //Hashtable requestData = (Hashtable)request.Params[0]; m_application.SceneManager.ForEachScene(s => s.RegionInfo.EstateSettings = m_application.EstateDataService.LoadEstateSettings(s.RegionInfo.RegionID, false) diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 03c8fdd36f..ae38fb644e 100755 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -1059,7 +1059,7 @@ namespace OpenSim m_log.WarnFormat("[ESTATE] Region {0} is not part of an estate.", regInfo.RegionName); List estates = EstateDataService.LoadEstateSettingsAll(); - Dictionary estatesByName = new Dictionary(); + Dictionary estatesByName = []; foreach (EstateSettings estate in estates) estatesByName[estate.EstateName] = estate; diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 04d5ce160d..84910b5086 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -874,7 +874,12 @@ namespace OpenSim.Region.Framework.Scenes RegionInfo.RegionSettings = rs; if (estateDataService is not null) - RegionInfo.EstateSettings = estateDataService.LoadEstateSettings(RegionInfo.RegionID, false); + { + EstateSettings es = estateDataService.LoadEstateSettings(RegionInfo.RegionID, false); + if (es == null) + m_log.Error($"[SCENE]: Region {Name} failed to load estate settings. Using defaults"); + RegionInfo.EstateSettings = new EstateSettings(); + } SceneGridInfo = new GridInfo(config, RegionInfo.ServerURI); @@ -5815,7 +5820,10 @@ Environment.Exit(1); if (estateDataService is not null) { bool parcelEnvOvr = RegionInfo.EstateSettings.AllowEnvironmentOverride; - RegionInfo.EstateSettings = estateDataService.LoadEstateSettings(RegionInfo.RegionID, false); + EstateSettings es = estateDataService.LoadEstateSettings(RegionInfo.RegionID, false); + if (es == null) + m_log.Error($"[SCENE]: Region {RegionInfo.RegionName} failed to reload estate settings. Using defaults"); + RegionInfo.EstateSettings = es; if(parcelEnvOvr && !RegionInfo.EstateSettings.AllowEnvironmentOverride) ClearAllParcelEnvironments(); } diff --git a/OpenSim/Server/Handlers/Estate/EstateDataRobustConnector.cs b/OpenSim/Server/Handlers/Estate/EstateDataRobustConnector.cs index 84c2cf458f..e451f79012 100644 --- a/OpenSim/Server/Handlers/Estate/EstateDataRobustConnector.cs +++ b/OpenSim/Server/Handlers/Estate/EstateDataRobustConnector.cs @@ -194,19 +194,16 @@ namespace OpenSim.Server.Handlers if (!string.IsNullOrEmpty(region)) { - UUID regionID = UUID.Zero; - if (UUID.TryParse(region, out regionID)) + if (UUID.TryParse(region, out UUID regionID)) { string create = (string)httpRequest.Query["create"]; - bool createYN = false; - Boolean.TryParse(create, out createYN); + bool.TryParse(create, out bool createYN); estate = m_EstateService.LoadEstateSettings(regionID, createYN); } } else if (!string.IsNullOrEmpty(eid)) { - int id = 0; - if (Int32.TryParse(eid, out id)) + if (int.TryParse(eid, out int id)) estate = m_EstateService.LoadEstateSettings(id); } diff --git a/OpenSim/Services/Connectors/Estate/EstateDataConnector.cs b/OpenSim/Services/Connectors/Estate/EstateDataConnector.cs index 3aa6b22416..dda9e7f14b 100644 --- a/OpenSim/Services/Connectors/Estate/EstateDataConnector.cs +++ b/OpenSim/Services/Connectors/Estate/EstateDataConnector.cs @@ -35,8 +35,6 @@ using OpenMetaverse; using Nini.Config; using OpenSim.Framework; -using OpenSim.Framework.ServiceAuth; -using OpenSim.Services.Connectors; using OpenSim.Services.Interfaces; using OpenSim.Server.Base; using System.Net.Http; @@ -45,9 +43,7 @@ namespace OpenSim.Services.Connectors { public class EstateDataRemoteConnector : BaseServiceConnector, IEstateDataService { - private static readonly ILog m_log = - LogManager.GetLogger( - MethodBase.GetCurrentMethod().DeclaringType); + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private string m_ServerURI = String.Empty; private ExpiringCache> m_EstateCache = new ExpiringCache>(); @@ -61,15 +57,13 @@ namespace OpenSim.Services.Connectors public virtual void Initialise(IConfigSource source) { IConfig gridConfig = source.Configs["EstateService"]; - if (gridConfig == null) + if (gridConfig is null) { m_log.Error("[ESTATE CONNECTOR]: EstateService missing from OpenSim.ini"); throw new Exception("Estate connector init error"); } - string serviceURI = gridConfig.GetString("EstateServerURI", - String.Empty); - + string serviceURI = gridConfig.GetString("EstateServerURI", string.Empty); if (serviceURI.Length == 0) { m_log.Error("[ESTATE CONNECTOR]: No Server URI named in section EstateService"); @@ -84,45 +78,41 @@ namespace OpenSim.Services.Connectors public List LoadEstateSettingsAll() { - string reply = string.Empty; string uri = m_ServerURI + "/estates"; - - reply = MakeRequest("GET", uri, string.Empty); + string reply = MakeRequest("GET", uri, string.Empty); if (String.IsNullOrEmpty(reply)) - return new List(); + return []; Dictionary replyData = ServerUtils.ParseXmlResponse(reply); - - List estates = new List(); if (replyData != null && replyData.Count > 0) { - m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettingsAll returned {0} elements", replyData.Count); + m_log.Debug($"[ESTATE CONNECTOR]: LoadEstateSettingsAll returned {replyData.Count} elements"); Dictionary.ValueCollection estateData = replyData.Values; + List estates = []; foreach (object r in estateData) { - if (r is Dictionary) + if (r is Dictionary dr ) { - EstateSettings es = new EstateSettings((Dictionary)r); + EstateSettings es = new EstateSettings(dr); estates.Add(es); } } m_EstateCache.AddOrUpdate("estates", estates, EXPIRATION); + return estates; } else - m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettingsAll from {0} received null or zero response", uri); - - return estates; + m_log.Debug($"[ESTATE CONNECTOR]: LoadEstateSettingsAll from {uri} received empty response"); + return []; } public List GetEstatesAll() { - List eids = new List(); // If we don't have them, load them from the server - List estates = null; - if (!m_EstateCache.TryGetValue("estates", out estates)) + if (!m_EstateCache.TryGetValue("estates", out List estates)) estates = LoadEstateSettingsAll(); + List eids = []; foreach (EstateSettings es in estates) eids.Add((int)es.EstateID); @@ -132,11 +122,10 @@ namespace OpenSim.Services.Connectors public List GetEstates(string search) { // If we don't have them, load them from the server - List estates = null; - if (!m_EstateCache.TryGetValue("estates", out estates)) + if (!m_EstateCache.TryGetValue("estates", out List estates)) estates = LoadEstateSettingsAll(); - List eids = new List(); + List eids = []; foreach (EstateSettings es in estates) if (es.EstateName == search) eids.Add((int)es.EstateID); @@ -147,13 +136,12 @@ namespace OpenSim.Services.Connectors public List GetEstatesByOwner(UUID ownerID) { // If we don't have them, load them from the server - List estates = null; - if (!m_EstateCache.TryGetValue("estates", out estates)) + if (!m_EstateCache.TryGetValue("estates", out List estates)) estates = LoadEstateSettingsAll(); - List eids = new List(); + List eids = []; foreach (EstateSettings es in estates) - if (es.EstateOwner == ownerID) + if (es.EstateOwner.Equals(ownerID)) eids.Add((int)es.EstateID); return eids; @@ -161,49 +149,36 @@ namespace OpenSim.Services.Connectors public List GetRegions(int estateID) { - string reply = string.Empty; // /estates/regions/?eid=int string uri = m_ServerURI + "/estates/regions/?eid=" + estateID.ToString(); - reply = MakeRequest("GET", uri, string.Empty); + string reply = MakeRequest("GET", uri, string.Empty); if (String.IsNullOrEmpty(reply)) - return new List(); + return []; Dictionary replyData = ServerUtils.ParseXmlResponse(reply); - - List regions = new List(); if (replyData != null && replyData.Count > 0) { - m_log.DebugFormat("[ESTATE CONNECTOR]: GetRegions for estate {0} returned {1} elements", estateID, replyData.Count); + m_log.Debug($"[ESTATE CONNECTOR]: GetRegions for estate {estateID} returned {replyData.Count} elements"); + List regions = []; Dictionary.ValueCollection data = replyData.Values; foreach (object r in data) { - UUID uuid = UUID.Zero; - if (UUID.TryParse(r.ToString(), out uuid)) + if (UUID.TryParse(r.ToString(), out UUID uuid)) regions.Add(uuid); } + return regions; } else - m_log.DebugFormat("[ESTATE CONNECTOR]: GetRegions from {0} received null or zero response", uri); - - return regions; + m_log.Debug($"[ESTATE CONNECTOR]: GetRegions from {uri} received null or zero response"); + return []; } public EstateSettings LoadEstateSettings(UUID regionID, bool create) { - string reply = string.Empty; // /estates/estate/?region=uuid&create=[t|f] - string uri = m_ServerURI + string.Format("/estates/estate/?region={0}&create={1}", regionID, create); - - reply = MakeRequest("GET", uri, string.Empty); - if(reply == null) - { - // this is a fatal error - m_log.DebugFormat("[ESTATE CONNECTOR] connection to remote estates service failed"); - m_log.DebugFormat("[ESTATE CONNECTOR] simulator needs to terminate"); - Environment.Exit(-1); - } - + string uri = m_ServerURI + $"/estates/estate/?region={regionID}&create={create}"; + string reply = MakeRequest("GET", uri, string.Empty); if (String.IsNullOrEmpty(reply)) return null; @@ -223,11 +198,10 @@ namespace OpenSim.Services.Connectors public EstateSettings LoadEstateSettings(int estateID) { - string reply = string.Empty; // /estates/estate/?eid=int - string uri = m_ServerURI + string.Format("/estates/estate/?eid={0}", estateID); + string uri = m_ServerURI + $"/estates/estate/?eid={estateID}"; - reply = MakeRequest("GET", uri, string.Empty); + string reply = MakeRequest("GET", uri, string.Empty); if (String.IsNullOrEmpty(reply)) return null; @@ -235,7 +209,7 @@ namespace OpenSim.Services.Connectors if (replyData != null && replyData.Count > 0) { - m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettings({0}) returned {1} elements", estateID, replyData.Count); + m_log.Debug($"[ESTATE CONNECTOR]: LoadEstateSettings({estateID}) returned {replyData.Count} elements"); EstateSettings es = new EstateSettings(replyData); return es; } @@ -258,7 +232,7 @@ namespace OpenSim.Services.Connectors public void StoreEstateSettings(EstateSettings es) { // /estates/estate/ - string uri = m_ServerURI + ("/estates/estate"); + string uri = m_ServerURI + "/estates/estate"; Dictionary formdata = es.ToMap(); formdata["OP"] = "STORE"; @@ -269,10 +243,12 @@ namespace OpenSim.Services.Connectors public bool LinkRegion(UUID regionID, int estateID) { // /estates/estate/?eid=int®ion=uuid - string uri = m_ServerURI + String.Format("/estates/estate/?eid={0}®ion={1}", estateID, regionID); + string uri = m_ServerURI + $"/estates/estate/?eid={estateID}®ion={regionID}"; - Dictionary formdata = new Dictionary(); - formdata["OP"] = "LINK"; + Dictionary formdata = new() + { + ["OP"] = "LINK" + }; return PostRequest(uri, formdata); } @@ -285,20 +261,21 @@ namespace OpenSim.Services.Connectors return false; Dictionary replyData = ServerUtils.ParseXmlResponse(reply); - - bool result = false; if (replyData != null && replyData.Count > 0) { - if (replyData.ContainsKey("Result")) + if (replyData.TryGetValue("Result", out object ortmp) && ortmp is string srtmp) { - if (Boolean.TryParse(replyData["Result"].ToString(), out result)) - m_log.DebugFormat("[ESTATE CONNECTOR]: PostRequest {0} returned {1}", uri, result); + if (bool.TryParse(srtmp, out bool result)) + { + m_log.Debug($"[ESTATE CONNECTOR]: PostRequest {uri} returned {result}"); + return result; + } } } else - m_log.DebugFormat("[ESTATE CONNECTOR]: PostRequest {0} received null or zero response", uri); + m_log.Debug($"[ESTATE CONNECTOR]: PostRequest {uri} received empty response"); - return result; + return false; } /// @@ -326,22 +303,20 @@ namespace OpenSim.Services.Connectors { if (status == HttpStatusCode.Unauthorized) { - m_log.Error(string.Format("[ESTATE CONNECTOR]: Web request {0} requires authentication ", uri)); + m_log.Error($"[ESTATE CONNECTOR]: Web request {uri} requires authentication "); } else if (status != HttpStatusCode.NotFound) { - m_log.Error(string.Format("[ESTATE CONNECTOR]: Resource {0} not found ", uri)); + m_log.Error($"[ESTATE CONNECTOR]: Resource {uri} not found "); return reply; } } else - m_log.Error(string.Format( - "[ESTATE CONNECTOR]: WebException for {0} {1} {2} {3}", - verb, uri, formdata, e.Message)); + m_log.Error($"[ESTATE CONNECTOR]: WebException for {verb} {uri} {formdata} {e.Message}"); } catch (Exception e) { - m_log.DebugFormat("[ESTATE CONNECTOR]: Exception when contacting estate server at {0}: {1}", uri, e.Message); + m_log.DebugFormat($"[ESTATE CONNECTOR]: Exception when contacting estate server at {uri}: {e.Message}"); } return null;