diff --git a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml index 10e2ec2fca..bb67794cc4 100644 --- a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml +++ b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml @@ -23,6 +23,8 @@ + + diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/LocalInterregionComms.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/LocalInterregionComms.cs index 5d2fc37a1d..d2af2db0b3 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/LocalInterregionComms.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/LocalInterregionComms.cs @@ -258,23 +258,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Interregion } - /** - * Region-related communications - */ - - public bool SendHelloNeighbour(ulong regionHandle, RegionInfo thisRegion) - { - foreach (Scene s in m_sceneList) - { - if (s.RegionInfo.RegionHandle == regionHandle) - { - //m_log.Debug("[LOCAL COMMS]: Found region to SendHelloNeighbour"); - return s.IncomingHelloNeighbour(thisRegion); - } - } - return false; - } - #endregion /* IInterregionComms */ #region Misc diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/RESTInterregionComms.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/RESTInterregionComms.cs index dd37d47539..37305d5c53 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/RESTInterregionComms.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/RESTInterregionComms.cs @@ -130,7 +130,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Interregion { m_aScene.CommsManager.HttpServer.AddHTTPHandler("/agent/", AgentHandler); m_aScene.CommsManager.HttpServer.AddHTTPHandler("/object/", ObjectHandler); - m_aScene.CommsManager.HttpServer.AddHTTPHandler("/region/", RegionHandler); } #endregion /* IRegionModule */ @@ -291,32 +290,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Interregion return false; } - /** - * Region-related communications - */ - - public bool SendHelloNeighbour(ulong regionHandle, RegionInfo thisRegion) - { - // Try local first - if (m_localBackend.SendHelloNeighbour(regionHandle, thisRegion)) - { - //m_log.Debug("[REST COMMS]: LocalBackEnd SendHelloNeighbour succeeded"); - return true; - } - - // else do the remote thing - RegionInfo regInfo = m_commsManager.GridService.RequestNeighbourInfo(regionHandle); - if ((regInfo != null) && - // Don't remote-call this instance; that's a startup hickup - !((regInfo.ExternalHostName == thisRegion.ExternalHostName) && (regInfo.HttpPort == thisRegion.HttpPort))) - { - return m_regionClient.DoHelloNeighbourCall(regInfo, thisRegion); - } - //else - // m_log.Warn("[REST COMMS]: Region not found " + regionHandle); - return false; - } - #endregion /* IInterregionComms */ #region Incoming calls from remote instances @@ -702,98 +675,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Interregion responsedata["str_response_string"] = result.ToString(); } - /* - * Region-related incoming calls - * - */ - - public Hashtable RegionHandler(Hashtable request) - { - //m_log.Debug("[CONNECTION DEBUGGING]: RegionHandler Called"); - - //m_log.Debug("---------------------------"); - //m_log.Debug(" >> uri=" + request["uri"]); - //m_log.Debug(" >> content-type=" + request["content-type"]); - //m_log.Debug(" >> http-method=" + request["http-method"]); - //m_log.Debug("---------------------------\n"); - - Hashtable responsedata = new Hashtable(); - responsedata["content_type"] = "text/html"; - - UUID regionID; - string action; - ulong regionHandle; - if (!GetParams((string)request["uri"], out regionID, out regionHandle, out action)) - { - m_log.InfoFormat("[REST COMMS]: Invalid parameters for object message {0}", request["uri"]); - responsedata["int_response_code"] = 404; - responsedata["str_response_string"] = "false"; - - return responsedata; - } - - // Next, let's parse the verb - string method = (string)request["http-method"]; - if (method.Equals("POST")) - { - DoRegionPost(request, responsedata, regionID); - return responsedata; - } - //else if (method.Equals("PUT")) - //{ - // DoRegionPut(request, responsedata, regionID); - // return responsedata; - //} - //else if (method.Equals("DELETE")) - //{ - // DoRegionDelete(request, responsedata, regiontID); - // return responsedata; - //} - else - { - m_log.InfoFormat("[REST COMMS]: method {0} not supported in region message", method); - responsedata["int_response_code"] = 404; - responsedata["str_response_string"] = "false"; - - return responsedata; - } - - } - - protected virtual void DoRegionPost(Hashtable request, Hashtable responsedata, UUID id) - { - OSDMap args = RegionClient.GetOSDMap((string)request["body"]); - if (args == null) - { - responsedata["int_response_code"] = 400; - responsedata["str_response_string"] = "false"; - return; - } - - // retrieve the regionhandle - ulong regionhandle = 0; - if (args["destination_handle"] != null) - UInt64.TryParse(args["destination_handle"].AsString(), out regionhandle); - - RegionInfo aRegion = new RegionInfo(); - try - { - aRegion.UnpackRegionInfoData(args); - } - catch (Exception ex) - { - m_log.InfoFormat("[REST COMMS]: exception on unpacking HelloNeighbour message {0}", ex.Message); - return; - } - - // This is the meaning of POST region - bool result = m_localBackend.SendHelloNeighbour(regionhandle, aRegion); - - responsedata["int_response_code"] = 200; - responsedata["str_response_string"] = result.ToString(); - } - - #endregion #region Misc diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/LocalNeighbourServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/LocalNeighbourServiceConnector.cs new file mode 100644 index 0000000000..7f6186c9f6 --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/LocalNeighbourServiceConnector.cs @@ -0,0 +1,136 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using log4net; +using Nini.Config; +using System; +using System.Collections.Generic; +using System.Reflection; +using OpenSim.Framework; +using OpenSim.Server.Base; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Services.Interfaces; + +namespace OpenSim.Region.CoreModules.ServiceConnectors.Neighbour +{ + public class LocalNeighbourServicesConnector : + ISharedRegionModule, INeighbourService + { + private static readonly ILog m_log = + LogManager.GetLogger( + MethodBase.GetCurrentMethod().DeclaringType); + + private List m_Scenes = new List(); + + private bool m_Enabled = false; + + public LocalNeighbourServicesConnector() + { + } + + public LocalNeighbourServicesConnector(List scenes) + { + m_Scenes = scenes; + } + + #region ISharedRegionModule + + public string Name + { + get { return "LocalNeighbourServicesConnector"; } + } + + public void Initialise(IConfigSource source) + { + IConfig moduleConfig = source.Configs["Modules"]; + if (moduleConfig != null) + { + string name = moduleConfig.GetString("NeighbourServices", this.Name); + if (name == Name) + { + // m_Enabled rules whether this module registers as INeighbourService or not + m_Enabled = true; + m_log.Info("[NEIGHBOUR CONNECTOR]: Local neighbour connector enabled"); + } + } + } + + public void Close() + { + } + + public void AddRegion(Scene scene) + { + // Always add + m_Scenes.Add(scene); + + if (!m_Enabled) + return; + + scene.RegisterModuleInterface(this); + } + + public void RegionLoaded(Scene scene) + { + m_log.Info("[NEIGHBOUR CONNECTOR]: Local neighbour connector enabled for region " + scene.RegionInfo.RegionName); + } + + public void PostInitialise() + { + } + + public void RemoveRegion(Scene scene) + { + // Always remove + if (m_Scenes.Contains(scene)) + m_Scenes.Remove(scene); + } + + #endregion ISharedRegionModule + + #region INeighbourService + + public bool HelloNeighbour(ulong regionHandle, RegionInfo thisRegion) + { + m_log.DebugFormat("[NEIGHBOUR CONNECTOR]: HelloNeighbour from {0}, to {1}. Count = {2}", + thisRegion.RegionName, regionHandle, m_Scenes.Count); + foreach (Scene s in m_Scenes) + { + if (s.RegionInfo.RegionHandle == regionHandle) + { + m_log.Debug("[NEIGHBOUR CONNECTOR]: Found region to SendHelloNeighbour"); + return s.IncomingHelloNeighbour(thisRegion); + } + } + m_log.DebugFormat("[NEIGHBOUR CONNECTOR]: region handle {0} not found", regionHandle); + return false; + } + + #endregion INeighbourService + } +} diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/RemoteNeighourServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/RemoteNeighourServiceConnector.cs new file mode 100644 index 0000000000..b0bd428191 --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/RemoteNeighourServiceConnector.cs @@ -0,0 +1,146 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using log4net; +using System; +using System.Collections.Generic; +using System.Reflection; +using Nini.Config; +using OpenSim.Framework; +using OpenSim.Services.Connectors; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Services.Interfaces; +using OpenSim.Server.Base; + +namespace OpenSim.Region.CoreModules.ServiceConnectors.Neighbour +{ + public class RemoteNeighbourServicesConnector : + NeighbourServicesConnector, ISharedRegionModule, INeighbourService + { + private static readonly ILog m_log = + LogManager.GetLogger( + MethodBase.GetCurrentMethod().DeclaringType); + + private bool m_Enabled = false; + private LocalNeighbourServicesConnector m_LocalService; + private string serviceDll; + private List m_Scenes = new List(); + + public string Name + { + get { return "RemoteNeighbourServicesConnector"; } + } + + public void Initialise(IConfigSource source) + { + IConfig moduleConfig = source.Configs["Modules"]; + if (moduleConfig != null) + { + string name = moduleConfig.GetString("NeighbourServices"); + if (name == Name) + { + m_LocalService = new LocalNeighbourServicesConnector(); + + //IConfig neighbourConfig = source.Configs["NeighbourService"]; + //if (neighbourConfig == null) + //{ + // m_log.Error("[NEIGHBOUR CONNECTOR]: NeighbourService missing from OpenSim.ini"); + // return; + //} + //serviceDll = neighbourConfig.GetString("LocalServiceModule", String.Empty); + //if (serviceDll == String.Empty) + //{ + // m_log.Error("[NEIGHBOUR CONNECTOR]: No LocalServiceModule named in section NeighbourService"); + // return; + //} + + m_Enabled = true; + + m_log.Info("[NEIGHBOUR CONNECTOR]: Remote Neighbour connector enabled"); + } + } + } + + public void PostInitialise() + { + //if (m_Enabled) + //{ + // Object[] args = new Object[] { m_Scenes }; + // m_LocalService = + // ServerUtils.LoadPlugin(serviceDll, + // args); + + // if (m_LocalService == null) + // { + // m_log.Error("[NEIGHBOUR CONNECTOR]: Can't load neighbour service"); + // Unregister(); + // return; + // } + //} + } + + public void Close() + { + } + + public void AddRegion(Scene scene) + { + if (!m_Enabled) + return; + + scene.RegisterModuleInterface(this); + } + + public void RemoveRegion(Scene scene) + { + if (m_Enabled && m_Scenes.Contains(scene)) + m_Scenes.Remove(scene); + } + + public void RegionLoaded(Scene scene) + { + if (!m_Enabled) + return; + + m_log.InfoFormat("[NEIGHBOUR CONNECTOR]: Enabled remote neighbours for region {0}", scene.RegionInfo.RegionName); + + } + + #region INeighbourService + + public override bool HelloNeighbour(ulong regionHandle, RegionInfo thisRegion) + { + if (m_LocalService.HelloNeighbour(regionHandle, thisRegion)) + return true; + + return base.HelloNeighbour(regionHandle, thisRegion); + } + + #endregion INeighbourService + } +} diff --git a/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs b/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs index d239ef49a4..8f4d3d54eb 100644 --- a/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs +++ b/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs @@ -100,11 +100,6 @@ namespace OpenSim.Region.Framework.Interfaces #endregion Objects - #region Regions - - bool SendHelloNeighbour(ulong regionHandle, RegionInfo thisRegion); - - #endregion Regions } // This may not be needed, but having it here for now. diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 5349d874a5..d3437b9f58 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1198,7 +1198,7 @@ namespace OpenSim.Region.Framework.Scenes // These two 'commands' *must be* next to each other or sim rebooting fails. m_sceneGridService.RegisterRegion(m_interregionCommsOut, RegionInfo); - m_sceneGridService.InformNeighborsThatRegionisUp(RegionInfo); + m_sceneGridService.InformNeighborsThatRegionisUp(RequestModuleInterface(), RegionInfo); Dictionary dGridSettings = m_sceneGridService.GetGridSettings(); diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index 8cc5cd889c..833f8047e2 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -39,6 +39,7 @@ using OpenSim.Framework.Communications; using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Communications.Capabilities; using OpenSim.Region.Framework.Interfaces; +using OpenSim.Services.Interfaces; using OSD = OpenMetaverse.StructuredData.OSD; namespace OpenSim.Region.Framework.Scenes @@ -485,7 +486,7 @@ namespace OpenSim.Region.Framework.Scenes #endregion - public delegate void InformNeighbourThatRegionUpDelegate(RegionInfo region, ulong regionhandle); + public delegate void InformNeighbourThatRegionUpDelegate(INeighbourService nService, RegionInfo region, ulong regionhandle); private void InformNeighborsThatRegionisUpCompleted(IAsyncResult iar) { @@ -498,7 +499,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// /// - private void InformNeighboursThatRegionIsUpAsync(RegionInfo region, ulong regionhandle) + private void InformNeighboursThatRegionIsUpAsync(INeighbourService neighbourService, RegionInfo region, ulong regionhandle) { m_log.Info("[INTERGRID]: Starting to inform neighbors that I'm here"); //RegionUpData regiondata = new RegionUpData(region.RegionLocX, region.RegionLocY, region.ExternalHostName, region.InternalEndPoint.Port); @@ -506,7 +507,12 @@ namespace OpenSim.Region.Framework.Scenes //bool regionAccepted = // m_commsProvider.InterRegion.RegionUp(new SerializableRegionInfo(region), regionhandle); - bool regionAccepted = m_interregionCommsOut.SendHelloNeighbour(regionhandle, region); + //bool regionAccepted = m_interregionCommsOut.SendHelloNeighbour(regionhandle, region); + bool regionAccepted = false; + if (neighbourService != null) + regionAccepted = neighbourService.HelloNeighbour(regionhandle, region); + else + m_log.DebugFormat("[SCS]: No neighbour service provided for informing neigbhours of this region"); if (regionAccepted) { @@ -527,7 +533,7 @@ namespace OpenSim.Region.Framework.Scenes /// Called by scene when region is initialized (not always when it's listening for agents) /// This is an inter-region message that informs the surrounding neighbors that the sim is up. /// - public void InformNeighborsThatRegionisUp(RegionInfo region) + public void InformNeighborsThatRegionisUp(INeighbourService neighbourService, RegionInfo region) { //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: Sending InterRegion Notification that region is up " + region.RegionName); @@ -541,7 +547,7 @@ namespace OpenSim.Region.Framework.Scenes { InformNeighbourThatRegionUpDelegate d = InformNeighboursThatRegionIsUpAsync; - d.BeginInvoke(region, neighbours[i].RegionHandle, + d.BeginInvoke(neighbourService, region, neighbours[i].RegionHandle, InformNeighborsThatRegionisUpCompleted, d); } diff --git a/OpenSim/Server/Handlers/Simulation/Utils.cs b/OpenSim/Server/Handlers/Base/Utils.cs similarity index 95% rename from OpenSim/Server/Handlers/Simulation/Utils.cs rename to OpenSim/Server/Handlers/Base/Utils.cs index e21d1b841f..f1610ff157 100644 --- a/OpenSim/Server/Handlers/Simulation/Utils.cs +++ b/OpenSim/Server/Handlers/Base/Utils.cs @@ -1,97 +1,97 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections; -using System.Net; - -using OpenSim.Framework; -using OpenSim.Framework.Servers.HttpServer; -using OpenSim.Services.Interfaces; -using OpenMetaverse; - -namespace OpenSim.Server.Handlers.Simulation -{ - public class Utils - { - /// - /// Extract the param from an uri. - /// - /// Something like this: /uuid/ or /uuid/handle/release - /// uuid on uuid field - /// optional action - public static bool GetParams(string path, out UUID uuid, out ulong regionHandle, out string action) - { - uuid = UUID.Zero; - action = ""; - regionHandle = 0; - - path = path.Trim(new char[] { '/' }); - string[] parts = path.Split('/'); - if (parts.Length <= 1) - { - return false; - } - else - { - if (!UUID.TryParse(parts[0], out uuid)) - return false; - - if (parts.Length >= 2) - UInt64.TryParse(parts[1], out regionHandle); - if (parts.Length >= 3) - action = parts[2]; - - return true; - } - } - - public static bool GetAuthentication(OSHttpRequest httpRequest, out string authority, out string authKey) - { - authority = string.Empty; - authKey = string.Empty; - - Uri authUri; - - string auth = httpRequest.Headers["authentication"]; - // Authentication keys look like this: - // http://orgrid.org:8002/ - if ((auth != null) && (!string.Empty.Equals(auth)) && auth != "None") - { - if (Uri.TryCreate(auth, UriKind.Absolute, out authUri)) - { - authority = authUri.Authority; - authKey = authUri.PathAndQuery.Trim('/'); - return true; - } - } - - return false; - } - - } -} +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections; +using System.Net; + +using OpenSim.Framework; +using OpenSim.Framework.Servers.HttpServer; +using OpenSim.Services.Interfaces; +using OpenMetaverse; + +namespace OpenSim.Server.Handlers.Base +{ + public class RestHandlerUtils + { + /// + /// Extract the param from an uri. + /// + /// Something like this: /uuid/ or /uuid/handle/release + /// uuid on uuid field + /// optional action + public static bool GetParams(string path, out UUID uuid, out ulong regionHandle, out string action) + { + uuid = UUID.Zero; + action = ""; + regionHandle = 0; + + path = path.Trim(new char[] { '/' }); + string[] parts = path.Split('/'); + if (parts.Length <= 1) + { + return false; + } + else + { + if (!UUID.TryParse(parts[0], out uuid)) + return false; + + if (parts.Length >= 2) + UInt64.TryParse(parts[1], out regionHandle); + if (parts.Length >= 3) + action = parts[2]; + + return true; + } + } + + public static bool GetAuthentication(OSHttpRequest httpRequest, out string authority, out string authKey) + { + authority = string.Empty; + authKey = string.Empty; + + Uri authUri; + + string auth = httpRequest.Headers["authentication"]; + // Authentication keys look like this: + // http://orgrid.org:8002/ + if ((auth != null) && (!string.Empty.Equals(auth)) && auth != "None") + { + if (Uri.TryCreate(auth, UriKind.Absolute, out authUri)) + { + authority = authUri.Authority; + authKey = authUri.PathAndQuery.Trim('/'); + return true; + } + } + + return false; + } + + } +} diff --git a/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs b/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs new file mode 100644 index 0000000000..6336f4f194 --- /dev/null +++ b/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs @@ -0,0 +1,203 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.IO; +using System.Reflection; +using System.Net; +using System.Text; + +using OpenSim.Server.Base; +using OpenSim.Server.Handlers.Base; +using OpenSim.Services.Interfaces; +using OpenSim.Framework; +using OpenSim.Framework.Servers.HttpServer; + +using OpenMetaverse; +using OpenMetaverse.StructuredData; +using Nini.Config; +using log4net; + + +namespace OpenSim.Server.Handlers.Neighbour +{ + public class NeighbourGetHandler : BaseStreamHandler + { + // TODO: unused: private ISimulationService m_SimulationService; + // TODO: unused: private IAuthenticationService m_AuthenticationService; + + public NeighbourGetHandler(INeighbourService service, IAuthenticationService authentication) : + base("GET", "/region") + { + // TODO: unused: m_SimulationService = service; + // TODO: unused: m_AuthenticationService = authentication; + } + + public override byte[] Handle(string path, Stream request, + OSHttpRequest httpRequest, OSHttpResponse httpResponse) + { + // Not implemented yet + Console.WriteLine("--- Get region --- " + path); + httpResponse.StatusCode = (int)HttpStatusCode.NotImplemented; + return new byte[] { }; + } + } + + public class NeighbourPostHandler : BaseStreamHandler + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private INeighbourService m_NeighbourService; + private IAuthenticationService m_AuthenticationService; + // TODO: unused: private bool m_AllowForeignGuests; + + public NeighbourPostHandler(INeighbourService service, IAuthenticationService authentication) : + base("POST", "/region") + { + m_NeighbourService = service; + m_AuthenticationService = authentication; + // TODO: unused: m_AllowForeignGuests = foreignGuests; + } + + public override byte[] Handle(string path, Stream request, + OSHttpRequest httpRequest, OSHttpResponse httpResponse) + { + byte[] result = new byte[0]; + + UUID regionID; + string action; + ulong regionHandle; + if (RestHandlerUtils.GetParams(path, out regionID, out regionHandle, out action)) + { + m_log.InfoFormat("[RegionPostHandler]: Invalid parameters for neighbour message {0}", path); + httpResponse.StatusCode = (int)HttpStatusCode.BadRequest; + httpResponse.StatusDescription = "Invalid parameters for neighbour message " + path; + + return result; + } + + if (m_AuthenticationService != null) + { + // Authentication + string authority = string.Empty; + string authToken = string.Empty; + if (!RestHandlerUtils.GetAuthentication(httpRequest, out authority, out authToken)) + { + m_log.InfoFormat("[RegionPostHandler]: Authentication failed for neighbour message {0}", path); + httpResponse.StatusCode = (int)HttpStatusCode.Unauthorized; + return result; + } + if (!m_AuthenticationService.VerifyUserKey(regionID, authToken)) + { + m_log.InfoFormat("[RegionPostHandler]: Authentication failed for neighbour message {0}", path); + httpResponse.StatusCode = (int)HttpStatusCode.Forbidden; + return result; + } + m_log.DebugFormat("[RegionPostHandler]: Authentication succeeded for {0}", regionID); + } + + OSDMap args = Util.GetOSDMap(request, (int)httpRequest.ContentLength); + if (args == null) + { + httpResponse.StatusCode = (int)HttpStatusCode.BadRequest; + httpResponse.StatusDescription = "Unable to retrieve data"; + m_log.DebugFormat("[RegionPostHandler]: Unable to retrieve data for post {0}", path); + return result; + } + + // retrieve the regionhandle + ulong regionhandle = 0; + if (args["destination_handle"] != null) + UInt64.TryParse(args["destination_handle"].AsString(), out regionhandle); + + RegionInfo aRegion = new RegionInfo(); + try + { + aRegion.UnpackRegionInfoData(args); + } + catch (Exception ex) + { + m_log.InfoFormat("[RegionPostHandler]: exception on unpacking region info {0}", ex.Message); + httpResponse.StatusCode = (int)HttpStatusCode.BadRequest; + httpResponse.StatusDescription = "Problems with data deserialization"; + return result; + } + + // Finally! + bool success = m_NeighbourService.HelloNeighbour(regionhandle, aRegion); + + OSDMap resp = new OSDMap(1); + + resp["success"] = OSD.FromBoolean(success); + + httpResponse.StatusCode = (int)HttpStatusCode.OK; + + return Encoding.UTF8.GetBytes(OSDParser.SerializeJsonString(resp)); + } + } + + public class NeighbourPutHandler : BaseStreamHandler + { + // TODO: unused: private ISimulationService m_SimulationService; + // TODO: unused: private IAuthenticationService m_AuthenticationService; + + public NeighbourPutHandler(INeighbourService service, IAuthenticationService authentication) : + base("PUT", "/region") + { + // TODO: unused: m_SimulationService = service; + // TODO: unused: m_AuthenticationService = authentication; + } + + public override byte[] Handle(string path, Stream request, + OSHttpRequest httpRequest, OSHttpResponse httpResponse) + { + // Not implemented yet + httpResponse.StatusCode = (int)HttpStatusCode.NotImplemented; + return new byte[] { }; + } + } + + public class NeighbourDeleteHandler : BaseStreamHandler + { + // TODO: unused: private ISimulationService m_SimulationService; + // TODO: unused: private IAuthenticationService m_AuthenticationService; + + public NeighbourDeleteHandler(INeighbourService service, IAuthenticationService authentication) : + base("DELETE", "/region") + { + // TODO: unused: m_SimulationService = service; + // TODO: unused: m_AuthenticationService = authentication; + } + + public override byte[] Handle(string path, Stream request, + OSHttpRequest httpRequest, OSHttpResponse httpResponse) + { + // Not implemented yet + httpResponse.StatusCode = (int)HttpStatusCode.NotImplemented; + return new byte[] { }; + } + } +} diff --git a/OpenSim/Server/Handlers/Neighbour/NeighbourServiceInConnector.cs b/OpenSim/Server/Handlers/Neighbour/NeighbourServiceInConnector.cs new file mode 100644 index 0000000000..a708b3733c --- /dev/null +++ b/OpenSim/Server/Handlers/Neighbour/NeighbourServiceInConnector.cs @@ -0,0 +1,68 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Reflection; +using log4net; +using Nini.Config; +using OpenSim.Server.Base; +using OpenSim.Services.Interfaces; +using OpenSim.Framework; +using OpenSim.Framework.Servers.HttpServer; +using OpenSim.Server.Handlers.Base; + +namespace OpenSim.Server.Handlers.Neighbour +{ + public class NeighbourServiceInConnector : ServiceConnector + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private INeighbourService m_NeighbourService; + private IAuthenticationService m_AuthenticationService = null; + + public NeighbourServiceInConnector(IConfigSource source, IHttpServer server, INeighbourService nService, IScene scene) : + base(source, server) + { + + m_NeighbourService = nService; + if (m_NeighbourService == null) + { + m_log.Error("[NEIGHBOUR IN CONNECTOR]: neighbour service was not provided"); + return; + } + + //bool authentication = neighbourConfig.GetBoolean("RequireAuthentication", false); + //if (authentication) + // m_AuthenticationService = scene.RequestModuleInterface(); + + + server.AddStreamHandler(new NeighbourPostHandler(m_NeighbourService, m_AuthenticationService)); + server.AddStreamHandler(new NeighbourGetHandler(m_NeighbourService, m_AuthenticationService)); + } + } +} diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs index c14ad99a67..8e4d7d098d 100644 --- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs @@ -32,6 +32,7 @@ using System.Net; using System.Text; using OpenSim.Server.Base; +using OpenSim.Server.Handlers.Base; using OpenSim.Services.Interfaces; using OpenSim.Framework; using OpenSim.Framework.Servers.HttpServer; @@ -88,7 +89,7 @@ namespace OpenSim.Server.Handlers.Simulation UUID agentID; string action; ulong regionHandle; - if (!Utils.GetParams(path, out agentID, out regionHandle, out action)) + if (!RestHandlerUtils.GetParams(path, out agentID, out regionHandle, out action)) { m_log.InfoFormat("[AgentPostHandler]: Invalid parameters for agent message {0}", path); httpResponse.StatusCode = (int)HttpStatusCode.BadRequest; @@ -102,7 +103,7 @@ namespace OpenSim.Server.Handlers.Simulation // Authentication string authority = string.Empty; string authToken = string.Empty; - if (!Utils.GetAuthentication(httpRequest, out authority, out authToken)) + if (!RestHandlerUtils.GetAuthentication(httpRequest, out authority, out authToken)) { m_log.InfoFormat("[AgentPostHandler]: Authentication failed for agent message {0}", path); httpResponse.StatusCode = (int)HttpStatusCode.Unauthorized; diff --git a/OpenSim/SimulatorServices/NeighbourServiceInConnectorModule.cs b/OpenSim/SimulatorServices/NeighbourServiceInConnectorModule.cs new file mode 100644 index 0000000000..e281ebb8ec --- /dev/null +++ b/OpenSim/SimulatorServices/NeighbourServiceInConnectorModule.cs @@ -0,0 +1,137 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Reflection; +using System.Collections.Generic; +using log4net; +using Nini.Config; +using OpenSim.Framework; +using OpenSim.Framework.Servers.HttpServer; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Server.Base; +using OpenSim.Server.Handlers.Base; +using OpenSim.Services.Interfaces; + + +namespace OpenSim.SimulatorServices +{ + public class NeighbourServiceInConnectorModule : ISharedRegionModule, INeighbourService + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static bool m_Enabled = false; + private static bool m_Registered = false; + + private IConfigSource m_Config; + private List m_Scenes = new List(); + + #region IRegionModule interface + + public void Initialise(IConfigSource config) + { + m_Config = config; + + IConfig moduleConfig = config.Configs["Modules"]; + if (moduleConfig != null) + { + m_Enabled = moduleConfig.GetBoolean("NeighbourServiceInConnector", false); + if (m_Enabled) + { + m_log.Info("[NEIGHBOUR IN CONNECTOR]: NeighbourServiceInConnector enabled"); + } + + } + + } + + public void PostInitialise() + { + if (!m_Enabled) + return; + + m_log.Info("[NEIGHBOUR IN CONNECTOR]: Starting..."); + } + + public void Close() + { + } + + public string Name + { + get { return "NeighbourServiceInConnectorModule"; } + } + + public void AddRegion(Scene scene) + { + if (!m_Enabled) + return; + + if (!m_Registered) + { + m_Registered = true; + Object[] args = new Object[] { m_Config, scene.CommsManager.HttpServer, this, scene }; + ServerUtils.LoadPlugin("OpenSim.Server.Handlers.dll:NeighbourServiceInConnector", args); + } + + m_Scenes.Add(scene); + + } + + public void RemoveRegion(Scene scene) + { + if (m_Enabled && m_Scenes.Contains(scene)) + m_Scenes.Remove(scene); + } + + public void RegionLoaded(Scene scene) + { + } + + #endregion + + #region INeighbourService + + public bool HelloNeighbour(ulong regionHandle, RegionInfo thisRegion) + { + m_log.DebugFormat("[NEIGHBOUR IN CONNECTOR]: HelloNeighbour from {0}, to {1}. Count = {2}", + thisRegion.RegionName, regionHandle, m_Scenes.Count); + foreach (Scene s in m_Scenes) + { + if (s.RegionInfo.RegionHandle == regionHandle) + { + m_log.Debug("[NEIGHBOUR IN CONNECTOR]: Found region to SendHelloNeighbour"); + return s.IncomingHelloNeighbour(thisRegion); + } + } + m_log.DebugFormat("[NEIGHBOUR IN CONNECTOR]: region handle {0} not found", regionHandle); + return false; + } + + #endregion INeighbourService + } +} diff --git a/OpenSim/SimulatorServices/Resources/SimulatorServices.addin.xml b/OpenSim/SimulatorServices/Resources/SimulatorServices.addin.xml index 77d7d703a1..c83af7b83a 100644 --- a/OpenSim/SimulatorServices/Resources/SimulatorServices.addin.xml +++ b/OpenSim/SimulatorServices/Resources/SimulatorServices.addin.xml @@ -9,7 +9,8 @@ - + + diff --git a/bin/config-include/Grid.ini b/bin/config-include/Grid.ini index 68326b8b9d..f9ded418e8 100644 --- a/bin/config-include/Grid.ini +++ b/bin/config-include/Grid.ini @@ -10,4 +10,6 @@ [Modules] AssetServices = "RemoteAssetServicesConnector" InventoryServices = "RemoteInventoryServicesConnector" + NeighbourServices = "RemoteNeighbourServicesConnector" + NeighbourServiceInConnector = true diff --git a/bin/config-include/GridHypergrid.ini b/bin/config-include/GridHypergrid.ini index 30d520e9de..fa3c4edc0f 100644 --- a/bin/config-include/GridHypergrid.ini +++ b/bin/config-include/GridHypergrid.ini @@ -10,6 +10,9 @@ [Modules] AssetServices = "HGAssetBroker" InventoryServices = "HGInventoryBroker" + NeighbourServices = "RemoteNeighbourServicesConnector" + NeighbourServiceInConnector = true + [AssetService] LocalGridAssetService = "OpenSim.Services.Connectors.dll:AssetServicesConnector" diff --git a/bin/config-include/Standalone.ini b/bin/config-include/Standalone.ini index a0cd098c45..c1873584d1 100644 --- a/bin/config-include/Standalone.ini +++ b/bin/config-include/Standalone.ini @@ -6,12 +6,11 @@ [Includes] Include-Common = "config-include/StandaloneCommon.ini" - Include-Stable = "config-include/StableSettings.ini" [Modules] AssetServices = "LocalAssetServicesConnector" InventoryServices = "LocalInventoryServicesConnector" - + NeighbourServices = "LocalNeighbourServicesConnector" [AssetService] LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService" diff --git a/bin/config-include/StandaloneHypergrid.ini b/bin/config-include/StandaloneHypergrid.ini index f9621326a3..d8aec4925a 100644 --- a/bin/config-include/StandaloneHypergrid.ini +++ b/bin/config-include/StandaloneHypergrid.ini @@ -10,7 +10,7 @@ [Modules] AssetServices = "HGAssetBroker" InventoryServices = "HGInventoryBroker" - + NeighbourServices = "LocalNeighbourServicesConnector" [AssetService] ; For the RegionAssetService diff --git a/prebuild.xml b/prebuild.xml index 5b521d5928..6a17b9de47 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -1316,6 +1316,7 @@ + @@ -1323,6 +1324,7 @@ +