Donation of robust network connectors for estate service, as promised. This allows to have one central database for estates without having to open the MySql port. This is off by default, so not to disturb everyone's existing installations. To use it, see GridCommon.ini.example [EstateDataStore] section and Robust*.ini.example's new additions.

Note that I also made things consistent by removing both the EstateDataService and the SimulationService into their own dlls, just like all other services. They really didn't belong in Services.Connectors, since everything in that component is about network connectors to robust backends. We may have too many dlls, and at some point it might not be a bad idea to merge all services into one single dll, since they all have more or less the same dependencies.
sedebug
Diva Canto 2015-01-06 21:24:44 -08:00
parent 502aa7bb15
commit 8e562f04d1
13 changed files with 779 additions and 16 deletions

View File

@ -0,0 +1,345 @@
/*
* 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.IO;
using System.Reflection;
using System.Net;
using Nini.Config;
using log4net;
using OpenMetaverse;
using OpenSim.Server.Base;
using OpenSim.Services.Interfaces;
using OpenSim.Framework;
using OpenSim.Framework.ServiceAuth;
using OpenSim.Framework.Servers.HttpServer;
using OpenSim.Server.Handlers.Base;
namespace OpenSim.Server.Handlers
{
public class EstateDataRobustConnector : ServiceConnector
{
private string m_ConfigName = "EstateService";
public EstateDataRobustConnector(IConfigSource config, IHttpServer server, string configName) :
base(config, server, configName)
{
IConfig serverConfig = config.Configs[m_ConfigName];
if (serverConfig == null)
throw new Exception(String.Format("No section {0} in config file", m_ConfigName));
string service = serverConfig.GetString("LocalServiceModule",
String.Empty);
if (service == String.Empty)
throw new Exception("No LocalServiceModule in config file");
Object[] args = new Object[] { config };
IEstateDataService e_service = ServerUtils.LoadPlugin<IEstateDataService>(service, args);
IServiceAuth auth = ServiceAuth.Create(config, m_ConfigName); ;
server.AddStreamHandler(new EstateServerGetHandler(e_service, auth));
server.AddStreamHandler(new EstateServerPostHandler(e_service, auth));
}
}
public class EstateServerGetHandler : BaseStreamHandler
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
IEstateDataService m_EstateService;
// Possibilities
// /estates/estate/?region=uuid&create=[t|f]
// /estates/estate/?eid=int
// /estates/?name=string
// /estates/?owner=uuid
// /estates/ (all)
// /estates/regions/?eid=int
public EstateServerGetHandler(IEstateDataService service, IServiceAuth auth) :
base("GET", "/estates", auth)
{
m_EstateService = service;
}
protected override byte[] ProcessRequest(string path, Stream request,
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
{
byte[] result = new byte[0];
Dictionary<string, object> data = null;
string[] p = SplitParams(path);
// /estates/ (all)
// /estates/?name=string
// /estates/?owner=uuid
if (p.Length == 0)
data = GetEstates(httpRequest, httpResponse);
else
{
string resource = p[0];
// /estates/estate/?region=uuid&create=[t|f]
// /estates/estate/?eid=int
if ("estate".Equals(resource))
data = GetEstate(httpRequest, httpResponse);
// /estates/regions/?eid=int
else if ("regions".Equals(resource))
data = GetRegions(httpRequest, httpResponse);
}
if (data == null)
data = new Dictionary<string, object>();
string xmlString = ServerUtils.BuildXmlResponse(data);
return Util.UTF8NoBomEncoding.GetBytes(xmlString);
}
private Dictionary<string, object> GetEstates(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
{
// /estates/ (all)
// /estates/?name=string
// /estates/?owner=uuid
Dictionary<string, object> data = null;
string name = (string)httpRequest.Query["name"];
string owner = (string)httpRequest.Query["owner"];
if (!string.IsNullOrEmpty(name) || !string.IsNullOrEmpty(owner))
{
List<int> estateIDs = null;
if (!string.IsNullOrEmpty(name))
{
estateIDs = m_EstateService.GetEstates(name);
}
else if (!string.IsNullOrEmpty(owner))
{
UUID ownerID = UUID.Zero;
if (UUID.TryParse(owner, out ownerID))
estateIDs = m_EstateService.GetEstatesByOwner(ownerID);
}
if (estateIDs == null || (estateIDs != null && estateIDs.Count == 0))
httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
else
{
httpResponse.StatusCode = (int)HttpStatusCode.OK;
httpResponse.ContentType = "text/xml";
data = new Dictionary<string, object>();
int i = 0;
foreach (int id in estateIDs)
data["estate" + i++] = id;
}
}
else
{
List<EstateSettings> estates = m_EstateService.LoadEstateSettingsAll();
if (estates == null || estates.Count == 0)
{
httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
}
else
{
httpResponse.StatusCode = (int)HttpStatusCode.OK;
httpResponse.ContentType = "text/xml";
data = new Dictionary<string, object>();
int i = 0;
foreach (EstateSettings es in estates)
data["estate" + i++] = es.ToMap();
}
}
return data;
}
private Dictionary<string, object> GetEstate(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
{
// /estates/estate/?region=uuid&create=[t|f]
// /estates/estate/?eid=int
Dictionary<string, object> data = null;
string region = (string)httpRequest.Query["region"];
string eid = (string)httpRequest.Query["eid"];
EstateSettings estate = null;
if (!string.IsNullOrEmpty(region))
{
UUID regionID = UUID.Zero;
if (UUID.TryParse(region, out regionID))
{
string create = (string)httpRequest.Query["create"];
bool createYN = false;
Boolean.TryParse(create, out createYN);
estate = m_EstateService.LoadEstateSettings(regionID, createYN);
}
}
else if (!string.IsNullOrEmpty(eid))
{
int id = 0;
if (Int32.TryParse(eid, out id))
estate = m_EstateService.LoadEstateSettings(id);
}
if (estate != null)
{
httpResponse.StatusCode = (int)HttpStatusCode.OK;
httpResponse.ContentType = "text/xml";
data = estate.ToMap();
}
else
httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
return data;
}
private Dictionary<string, object> GetRegions(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
{
// /estates/regions/?eid=int
Dictionary<string, object> data = null;
string eid = (string)httpRequest.Query["eid"];
httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
if (!string.IsNullOrEmpty(eid))
{
int id = 0;
if (Int32.TryParse(eid, out id))
{
List<UUID> regions = m_EstateService.GetRegions(id);
if (regions != null && regions.Count > 0)
{
data = new Dictionary<string, object>();
int i = 0;
foreach (UUID uuid in regions)
data["region" + i++] = uuid.ToString();
httpResponse.StatusCode = (int)HttpStatusCode.OK;
httpResponse.ContentType = "text/xml";
}
}
}
return data;
}
}
public class EstateServerPostHandler : BaseStreamHandler
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
IEstateDataService m_EstateService;
// Possibilities
// /estates/estate/ (post an estate)
// /estates/estate/?eid=int&region=uuid (link a region to an estate)
public EstateServerPostHandler(IEstateDataService service, IServiceAuth auth) :
base("POST", "/estates", auth)
{
m_EstateService = service;
}
protected override byte[] ProcessRequest(string path, Stream request,
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
{
byte[] result = new byte[0];
Dictionary<string, object> data = null;
string[] p = SplitParams(path);
if (p.Length > 0)
{
string resource = p[0];
// /estates/estate/
// /estates/estate/?eid=int&region=uuid
if ("estate".Equals(resource))
{
StreamReader sr = new StreamReader(request);
string body = sr.ReadToEnd();
sr.Close();
body = body.Trim();
Dictionary<string, object> requestData = ServerUtils.ParseQueryString(body);
data = UpdateEstate(requestData, httpRequest, httpResponse);
}
}
if (data == null)
data = new Dictionary<string, object>();
string xmlString = ServerUtils.BuildXmlResponse(data);
return Util.UTF8NoBomEncoding.GetBytes(xmlString);
}
private Dictionary<string, object> UpdateEstate(Dictionary<string, object> requestData, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
{
// /estates/estate/
// /estates/estate/?eid=int&region=uuid
Dictionary<string, object> result = new Dictionary<string, object>();
string eid = (string)httpRequest.Query["eid"];
string region = (string)httpRequest.Query["region"];
httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
if (string.IsNullOrEmpty(eid) && string.IsNullOrEmpty(region) &&
requestData.ContainsKey("OP") && requestData["OP"] != null && "STORE".Equals(requestData["OP"]))
{
// /estates/estate/
EstateSettings es = new EstateSettings(requestData);
m_EstateService.StoreEstateSettings(es);
//m_log.DebugFormat("[EstateServerPostHandler]: Store estate {0}", es.ToString());
httpResponse.StatusCode = (int)HttpStatusCode.OK;
result["Result"] = true;
}
else if (!string.IsNullOrEmpty(region) && !string.IsNullOrEmpty(eid) &&
requestData.ContainsKey("OP") && requestData["OP"] != null && "LINK".Equals(requestData["OP"]))
{
int id = 0;
UUID regionID = UUID.Zero;
if (UUID.TryParse(region, out regionID) && Int32.TryParse(eid, out id))
{
m_log.DebugFormat("[EstateServerPostHandler]: Link region {0} to estate {1}", regionID, id);
httpResponse.StatusCode = (int)HttpStatusCode.OK;
result["Result"] = m_EstateService.LinkRegion(regionID, id);
}
}
else
m_log.WarnFormat("[EstateServerPostHandler]: something wrong with POST request {0}", httpRequest.RawUrl);
return result;
}
}
}

View File

@ -0,0 +1,340 @@
/*
* 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.Net;
using System.Reflection;
using log4net;
using OpenMetaverse;
using Nini.Config;
using OpenSim.Framework;
using OpenSim.Framework.ServiceAuth;
using OpenSim.Services.Connectors;
using OpenSim.Services.Interfaces;
using OpenSim.Server.Base;
namespace OpenSim.Service.Connectors
{
public class EstateDataRemoteConnector : BaseServiceConnector, IEstateDataService
{
private static readonly ILog m_log =
LogManager.GetLogger(
MethodBase.GetCurrentMethod().DeclaringType);
private string m_ServerURI = String.Empty;
private ExpiringCache<string, List<EstateSettings>> m_EstateCache = new ExpiringCache<string, List<EstateSettings>>();
private const int EXPIRATION = 5 * 60; // 5 minutes in secs
public EstateDataRemoteConnector(IConfigSource source)
{
Initialise(source);
}
public virtual void Initialise(IConfigSource source)
{
IConfig gridConfig = source.Configs["EstateService"];
if (gridConfig == 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);
if (serviceURI == String.Empty)
{
m_log.Error("[ESTATE CONNECTOR]: No Server URI named in section EstateService");
throw new Exception("Estate connector init error");
}
m_ServerURI = serviceURI;
base.Initialise(source, "EstateService");
}
#region IEstateDataService
public List<EstateSettings> LoadEstateSettingsAll()
{
string reply = string.Empty;
string uri = m_ServerURI + "/estates";
reply = MakeRequest("GET", uri, string.Empty);
if (String.IsNullOrEmpty(reply))
return new List<EstateSettings>();
Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
List<EstateSettings> estates = new List<EstateSettings>();
if (replyData != null && replyData.Count > 0)
{
m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettingsAll returned {0} elements", replyData.Count);
Dictionary<string, object>.ValueCollection estateData = replyData.Values;
foreach (object r in estateData)
{
if (r is Dictionary<string, object>)
{
EstateSettings es = new EstateSettings((Dictionary<string, object>)r);
estates.Add(es);
}
}
m_EstateCache.AddOrUpdate("estates", estates, EXPIRATION);
}
else
m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettingsAll from {0} received null or zero response", uri);
return estates;
}
public List<int> GetEstatesAll()
{
List<int> eids = new List<int>();
// If we don't have them, load them from the server
List<EstateSettings> estates = null;
if (!m_EstateCache.TryGetValue("estates", out estates))
LoadEstateSettingsAll();
foreach (EstateSettings es in estates)
eids.Add((int)es.EstateID);
return eids;
}
public List<int> GetEstates(string search)
{
// If we don't have them, load them from the server
List<EstateSettings> estates = null;
if (!m_EstateCache.TryGetValue("estates", out estates))
LoadEstateSettingsAll();
List<int> eids = new List<int>();
foreach (EstateSettings es in estates)
if (es.EstateName == search)
eids.Add((int)es.EstateID);
return eids;
}
public List<int> GetEstatesByOwner(UUID ownerID)
{
// If we don't have them, load them from the server
List<EstateSettings> estates = null;
if (!m_EstateCache.TryGetValue("estates", out estates))
LoadEstateSettingsAll();
List<int> eids = new List<int>();
foreach (EstateSettings es in estates)
if (es.EstateOwner == ownerID)
eids.Add((int)es.EstateID);
return eids;
}
public List<UUID> 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);
if (String.IsNullOrEmpty(reply))
return new List<UUID>();
Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
List<UUID> regions = new List<UUID>();
if (replyData != null && replyData.Count > 0)
{
m_log.DebugFormat("[ESTATE CONNECTOR]: GetRegions for estate {0} returned {1} elements", estateID, replyData.Count);
Dictionary<string, object>.ValueCollection data = replyData.Values;
foreach (object r in data)
{
UUID uuid = UUID.Zero;
if (UUID.TryParse(r.ToString(), out uuid))
regions.Add(uuid);
}
}
else
m_log.DebugFormat("[ESTATE CONNECTOR]: GetRegions from {0} received null or zero response", uri);
return regions;
}
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 (String.IsNullOrEmpty(reply))
return null;
Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
if (replyData != null && replyData.Count > 0)
{
m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettings({0}) returned {1} elements", regionID, replyData.Count);
EstateSettings es = new EstateSettings(replyData);
return es;
}
else
m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettings(regionID) from {0} received null or zero response", uri);
return null;
}
public EstateSettings LoadEstateSettings(int estateID)
{
string reply = string.Empty;
// /estates/estate/?eid=int
string uri = m_ServerURI + string.Format("/estates/estate/?eid={0}", estateID);
reply = MakeRequest("GET", uri, string.Empty);
if (String.IsNullOrEmpty(reply))
return null;
Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
if (replyData != null && replyData.Count > 0)
{
m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettings({0}) returned {1} elements", estateID, replyData.Count);
EstateSettings es = new EstateSettings(replyData);
return es;
}
else
m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettings(estateID) from {0} received null or zero response", uri);
return null;
}
/// <summary>
/// Forbidden operation
/// </summary>
/// <returns></returns>
public EstateSettings CreateNewEstate()
{
// No can do
return null;
}
public void StoreEstateSettings(EstateSettings es)
{
string reply = string.Empty;
// /estates/estate/
string uri = m_ServerURI + ("/estates/estate");
Dictionary<string, object> formdata = es.ToMap();
formdata["OP"] = "STORE";
PostRequest(uri, formdata);
}
public bool LinkRegion(UUID regionID, int estateID)
{
string reply = string.Empty;
// /estates/estate/?eid=int&region=uuid
string uri = m_ServerURI + String.Format("/estates/estate/?eid={0}&region={1}", estateID, regionID);
Dictionary<string, object> formdata = new Dictionary<string, object>();
formdata["OP"] = "LINK";
return PostRequest(uri, formdata);
}
private bool PostRequest(string uri, Dictionary<string, object> sendData)
{
string reqString = ServerUtils.BuildQueryString(sendData);
string reply = MakeRequest("POST", uri, reqString);
if (String.IsNullOrEmpty(reply))
return false;
Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
bool result = false;
if (replyData != null && replyData.Count > 0)
{
if (replyData.ContainsKey("Result"))
{
if (Boolean.TryParse(replyData["Result"].ToString(), out result))
m_log.DebugFormat("[ESTATE CONNECTOR]: PostRequest {0} returned {1}", uri, result);
}
}
else
m_log.DebugFormat("[ESTATE CONNECTOR]: PostRequest {0} received null or zero response", uri);
return result;
}
/// <summary>
/// Forbidden operation
/// </summary>
/// <returns></returns>
public bool DeleteEstate(int estateID)
{
return false;
}
#endregion
private string MakeRequest(string verb, string uri, string formdata)
{
string reply = string.Empty;
try
{
reply = SynchronousRestFormsRequester.MakeRequest(verb, uri, formdata, m_Auth);
}
catch (WebException e)
{
using (HttpWebResponse hwr = (HttpWebResponse)e.Response)
{
if (hwr != null)
{
if (hwr.StatusCode == HttpStatusCode.NotFound)
m_log.Error(string.Format("[ESTATE CONNECTOR]: Resource {0} not found ", uri));
if (hwr.StatusCode == HttpStatusCode.Unauthorized)
m_log.Error(string.Format("[ESTATE CONNECTOR]: Web request {0} requires authentication ", uri));
}
else
m_log.Error(string.Format(
"[ESTATE CONNECTOR]: WebException for {0} {1} {2} ",
verb, uri, formdata, e));
}
}
catch (Exception e)
{
m_log.DebugFormat("[ESTATE CONNECTOR]: Exception when contacting estate server at {0}: {1}", uri, e.Message);
}
return reply;
}
}
}

View File

@ -29,17 +29,14 @@ using System;
using System.Collections.Generic;
using OpenMetaverse;
using log4net;
using Mono.Addins;
using Nini.Config;
using System.Reflection;
using OpenSim.Services.Base;
using OpenSim.Services.Interfaces;
using OpenSim.Data;
using OpenSim.Framework;
//using OpenSim.Region.Framework.Interfaces;
//using OpenSim.Region.Framework.Scenes;
namespace OpenSim.Services.Connectors
namespace OpenSim.Services.EstateService
{
public class EstateDataService : ServiceBase, IEstateDataService
{

View File

@ -29,7 +29,6 @@ using System;
using System.Collections.Generic;
using OpenMetaverse;
using log4net;
using Mono.Addins;
using Nini.Config;
using System.Reflection;
using OpenSim.Services.Base;
@ -39,7 +38,7 @@ using OpenSim.Framework;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
namespace OpenSim.Services.Connectors
namespace OpenSim.Services.SimulationService
{
public class SimulationDataService : ServiceBase, ISimulationDataService
{

View File

@ -110,6 +110,8 @@
;; Uncomment for UserProfiles see [UserProfilesService] to configure...
; UserProfilesServiceConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:UserProfilesConnector"
;; Uncomment if you want to have centralized estate data
; EstateDataService = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:EstateDataRobustConnector"
; * This is common for all services, it's the network setup for the entire
; * server instance, if none is specified above
@ -379,6 +381,8 @@
; for the server connector
LocalServiceModule = "OpenSim.Services.FriendsService.dll:FriendsService"
[EstateService]
LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
[LibraryService]
LibraryName = "OpenSim Library"

View File

@ -89,6 +89,9 @@
;; Uncomment for UserProfiles see [UserProfilesService] to configure...
; UserProfilesServiceConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:UserProfilesConnector"
;; Uncomment if you want to have centralized estate data
; EstateDataService = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:EstateDataRobustConnector"
; * This is common for all services, it's the network setup for the entire
; * server instance, if none is specified above
; *
@ -339,6 +342,8 @@
; for the server connector
LocalServiceModule = "OpenSim.Services.FriendsService.dll:FriendsService"
[EstateService]
LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
[LibraryService]
LibraryName = "OpenSim Library"

View File

@ -46,10 +46,10 @@
ConnectorProtocolVersion = "SIMULATION/0.3"
[SimulationDataStore]
LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
LocalServiceModule = "OpenSim.Services.SimulationService.dll:SimulationDataService"
[EstateDataStore]
LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService"
LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
[GridService]
LocalServiceModule = "OpenSim.Services.GridService.dll:GridService"

View File

@ -108,6 +108,16 @@
;; Robust server in port ${Const|PublicPort}, but not always)
Gatekeeper="${Const|BaseURL}:${Const|PublicPort}"
[EstateDataStore]
;
; Uncomment if you want centralized estate data at robust server,
; in which case the URL in [EstateService] will be used
;
;LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataConnector"
[EstateService]
EstateServerURI = "${Const|BaseURL}:${Const|PrivatePort}"
[Messaging]
; === HG ONLY ===
;; Change this to the address of your Gatekeeper service

View File

@ -54,10 +54,10 @@
Module = "BasicProfileModule"
[SimulationDataStore]
LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
LocalServiceModule = "OpenSim.Services.SimulationService.dll:SimulationDataService"
[EstateDataStore]
LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService"
LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
[AssetService]
LocalGridAssetService = "OpenSim.Services.Connectors.dll:AssetServicesConnector"

View File

@ -42,10 +42,10 @@
AssetCaching = "FlotsamAssetCache"
[SimulationDataStore]
LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
LocalServiceModule = "OpenSim.Services.SimulationService.dll:SimulationDataService"
[EstateDataStore]
LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService"
LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
[Friends]
Connector = "OpenSim.Services.Connectors.dll:SimianFriendsServiceConnector"

View File

@ -43,10 +43,10 @@
ConnectorProtocolVersion = "SIMULATION/0.3"
[SimulationDataStore]
LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
LocalServiceModule = "OpenSim.Services.SimulationService.dll:SimulationDataService"
[EstateDataStore]
LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService"
LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
[AssetService]
LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService"

View File

@ -58,10 +58,10 @@
LureModule = HGLureModule
[SimulationDataStore]
LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
LocalServiceModule = "OpenSim.Services.SimulationService.dll:SimulationDataService"
[EstateDataStore]
LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService"
LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
[AssetService]
LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService"

View File

@ -839,6 +839,40 @@
</Files>
</Project>
<Project frameworkVersion="v4_0" name="OpenSim.Services.SimulationService" path="OpenSim/Services/SimulationService" type="Library">
<Configuration name="Debug">
<Options>
<OutputPath>../../../bin/</OutputPath>
</Options>
</Configuration>
<Configuration name="Release">
<Options>
<OutputPath>../../../bin/</OutputPath>
</Options>
</Configuration>
<ReferencePath>../../../bin/</ReferencePath>
<Reference name="System"/>
<Reference name="System.Core"/>
<Reference name="System.Web"/>
<Reference name="System.Xml"/>
<Reference name="System.Drawing"/>
<Reference name="OpenMetaverseTypes" path="../../../bin/"/>
<Reference name="OpenMetaverse" path="../../../bin/"/>
<Reference name="OpenSim.Data"/>
<Reference name="OpenSim.Framework"/>
<Reference name="OpenSim.Region.Framework"/>
<Reference name="OpenSim.Services.Base"/>
<Reference name="OpenSim.Services.Interfaces"/>
<Reference name="Nini" path="../../../bin/"/>
<Reference name="log4net" path="../../../bin/"/>
<Reference name="XMLRPC" path="../../../bin/"/>
<Files>
<Match pattern="*.cs" recurse="true"/>
</Files>
</Project>
<Project frameworkVersion="v4_0" name="OpenSim.Services.AssetService" path="OpenSim/Services/AssetService" type="Library">
<Configuration name="Debug">
<Options>
@ -1000,6 +1034,35 @@
</Files>
</Project>
<Project frameworkVersion="v4_0" name="OpenSim.Services.EstateService" path="OpenSim/Services/EstateService" type="Library">
<Configuration name="Debug">
<Options>
<OutputPath>../../../bin/</OutputPath>
</Options>
</Configuration>
<Configuration name="Release">
<Options>
<OutputPath>../../../bin/</OutputPath>
</Options>
</Configuration>
<ReferencePath>../../../bin/</ReferencePath>
<Reference name="System"/>
<Reference name="System.Core"/>
<Reference name="OpenMetaverseTypes" path="../../../bin/"/>
<Reference name="OpenMetaverse" path="../../../bin/"/>
<Reference name="OpenSim.Framework"/>
<Reference name="OpenSim.Services.Interfaces"/>
<Reference name="OpenSim.Services.Base"/>
<Reference name="OpenSim.Data"/>
<Reference name="Nini" path="../../../bin/"/>
<Reference name="log4net" path="../../../bin/"/>
<Files>
<Match pattern="*.cs" recurse="true"/>
</Files>
</Project>
<Project frameworkVersion="v4_0" name="OpenSim.Services.PresenceService" path="OpenSim/Services/PresenceService" type="Library">
<Configuration name="Debug">
<Options>