aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDiva Canto2015-01-06 21:24:44 -0800
committerDiva Canto2015-01-06 21:24:44 -0800
commit8e562f04d1576bd51138ac656f796ba18965fdcf (patch)
treec06dce809cb04c971ac545e9793d885ea555e611
parentMerge branch 'master' of ssh://opensimulator.org/var/git/opensim (diff)
downloadopensim-SC-8e562f04d1576bd51138ac656f796ba18965fdcf.zip
opensim-SC-8e562f04d1576bd51138ac656f796ba18965fdcf.tar.gz
opensim-SC-8e562f04d1576bd51138ac656f796ba18965fdcf.tar.bz2
opensim-SC-8e562f04d1576bd51138ac656f796ba18965fdcf.tar.xz
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.
-rw-r--r--OpenSim/Server/Handlers/Estate/EstateDataRobustConnector.cs345
-rw-r--r--OpenSim/Services/Connectors/Estate/EstateDataConnector.cs340
-rw-r--r--OpenSim/Services/EstateService/EstateDataService.cs (renamed from OpenSim/Services/Connectors/Simulation/EstateDataService.cs)5
-rw-r--r--OpenSim/Services/SimulationService/SimulationDataService.cs (renamed from OpenSim/Services/Connectors/Simulation/SimulationDataService.cs)3
-rw-r--r--bin/Robust.HG.ini.example4
-rw-r--r--bin/Robust.ini.example5
-rw-r--r--bin/config-include/Grid.ini4
-rw-r--r--bin/config-include/GridCommon.ini.example10
-rw-r--r--bin/config-include/GridHypergrid.ini4
-rw-r--r--bin/config-include/SimianGrid.ini4
-rw-r--r--bin/config-include/Standalone.ini4
-rw-r--r--bin/config-include/StandaloneHypergrid.ini4
-rw-r--r--prebuild.xml63
13 files changed, 779 insertions, 16 deletions
diff --git a/OpenSim/Server/Handlers/Estate/EstateDataRobustConnector.cs b/OpenSim/Server/Handlers/Estate/EstateDataRobustConnector.cs
new file mode 100644
index 0000000..4fe74f9
--- /dev/null
+++ b/OpenSim/Server/Handlers/Estate/EstateDataRobustConnector.cs
@@ -0,0 +1,345 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27using System;
28using System.Collections.Generic;
29using System.IO;
30using System.Reflection;
31using System.Net;
32
33using Nini.Config;
34using log4net;
35using OpenMetaverse;
36
37using OpenSim.Server.Base;
38using OpenSim.Services.Interfaces;
39using OpenSim.Framework;
40using OpenSim.Framework.ServiceAuth;
41using OpenSim.Framework.Servers.HttpServer;
42using OpenSim.Server.Handlers.Base;
43
44namespace OpenSim.Server.Handlers
45{
46 public class EstateDataRobustConnector : ServiceConnector
47 {
48 private string m_ConfigName = "EstateService";
49
50 public EstateDataRobustConnector(IConfigSource config, IHttpServer server, string configName) :
51 base(config, server, configName)
52 {
53 IConfig serverConfig = config.Configs[m_ConfigName];
54 if (serverConfig == null)
55 throw new Exception(String.Format("No section {0} in config file", m_ConfigName));
56
57 string service = serverConfig.GetString("LocalServiceModule",
58 String.Empty);
59
60 if (service == String.Empty)
61 throw new Exception("No LocalServiceModule in config file");
62
63 Object[] args = new Object[] { config };
64 IEstateDataService e_service = ServerUtils.LoadPlugin<IEstateDataService>(service, args);
65
66 IServiceAuth auth = ServiceAuth.Create(config, m_ConfigName); ;
67
68 server.AddStreamHandler(new EstateServerGetHandler(e_service, auth));
69 server.AddStreamHandler(new EstateServerPostHandler(e_service, auth));
70 }
71 }
72
73
74 public class EstateServerGetHandler : BaseStreamHandler
75 {
76 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
77
78 IEstateDataService m_EstateService;
79
80 // Possibilities
81 // /estates/estate/?region=uuid&create=[t|f]
82 // /estates/estate/?eid=int
83 // /estates/?name=string
84 // /estates/?owner=uuid
85 // /estates/ (all)
86 // /estates/regions/?eid=int
87
88 public EstateServerGetHandler(IEstateDataService service, IServiceAuth auth) :
89 base("GET", "/estates", auth)
90 {
91 m_EstateService = service;
92 }
93
94 protected override byte[] ProcessRequest(string path, Stream request,
95 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
96 {
97 byte[] result = new byte[0];
98 Dictionary<string, object> data = null;
99
100 string[] p = SplitParams(path);
101
102 // /estates/ (all)
103 // /estates/?name=string
104 // /estates/?owner=uuid
105 if (p.Length == 0)
106 data = GetEstates(httpRequest, httpResponse);
107 else
108 {
109 string resource = p[0];
110
111 // /estates/estate/?region=uuid&create=[t|f]
112 // /estates/estate/?eid=int
113 if ("estate".Equals(resource))
114 data = GetEstate(httpRequest, httpResponse);
115 // /estates/regions/?eid=int
116 else if ("regions".Equals(resource))
117 data = GetRegions(httpRequest, httpResponse);
118 }
119
120 if (data == null)
121 data = new Dictionary<string, object>();
122
123 string xmlString = ServerUtils.BuildXmlResponse(data);
124 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
125
126 }
127
128 private Dictionary<string, object> GetEstates(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
129 {
130 // /estates/ (all)
131 // /estates/?name=string
132 // /estates/?owner=uuid
133
134 Dictionary<string, object> data = null;
135 string name = (string)httpRequest.Query["name"];
136 string owner = (string)httpRequest.Query["owner"];
137
138 if (!string.IsNullOrEmpty(name) || !string.IsNullOrEmpty(owner))
139 {
140 List<int> estateIDs = null;
141 if (!string.IsNullOrEmpty(name))
142 {
143 estateIDs = m_EstateService.GetEstates(name);
144 }
145 else if (!string.IsNullOrEmpty(owner))
146 {
147 UUID ownerID = UUID.Zero;
148 if (UUID.TryParse(owner, out ownerID))
149 estateIDs = m_EstateService.GetEstatesByOwner(ownerID);
150 }
151
152 if (estateIDs == null || (estateIDs != null && estateIDs.Count == 0))
153 httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
154 else
155 {
156 httpResponse.StatusCode = (int)HttpStatusCode.OK;
157 httpResponse.ContentType = "text/xml";
158 data = new Dictionary<string, object>();
159 int i = 0;
160 foreach (int id in estateIDs)
161 data["estate" + i++] = id;
162 }
163 }
164 else
165 {
166 List<EstateSettings> estates = m_EstateService.LoadEstateSettingsAll();
167 if (estates == null || estates.Count == 0)
168 {
169 httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
170 }
171 else
172 {
173 httpResponse.StatusCode = (int)HttpStatusCode.OK;
174 httpResponse.ContentType = "text/xml";
175 data = new Dictionary<string, object>();
176 int i = 0;
177 foreach (EstateSettings es in estates)
178 data["estate" + i++] = es.ToMap();
179
180 }
181 }
182
183 return data;
184 }
185
186 private Dictionary<string, object> GetEstate(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
187 {
188 // /estates/estate/?region=uuid&create=[t|f]
189 // /estates/estate/?eid=int
190 Dictionary<string, object> data = null;
191 string region = (string)httpRequest.Query["region"];
192 string eid = (string)httpRequest.Query["eid"];
193
194 EstateSettings estate = null;
195
196 if (!string.IsNullOrEmpty(region))
197 {
198 UUID regionID = UUID.Zero;
199 if (UUID.TryParse(region, out regionID))
200 {
201 string create = (string)httpRequest.Query["create"];
202 bool createYN = false;
203 Boolean.TryParse(create, out createYN);
204 estate = m_EstateService.LoadEstateSettings(regionID, createYN);
205 }
206 }
207 else if (!string.IsNullOrEmpty(eid))
208 {
209 int id = 0;
210 if (Int32.TryParse(eid, out id))
211 estate = m_EstateService.LoadEstateSettings(id);
212 }
213
214 if (estate != null)
215 {
216 httpResponse.StatusCode = (int)HttpStatusCode.OK;
217 httpResponse.ContentType = "text/xml";
218 data = estate.ToMap();
219 }
220 else
221 httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
222
223 return data;
224 }
225
226 private Dictionary<string, object> GetRegions(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
227 {
228 // /estates/regions/?eid=int
229 Dictionary<string, object> data = null;
230 string eid = (string)httpRequest.Query["eid"];
231
232 httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
233 if (!string.IsNullOrEmpty(eid))
234 {
235 int id = 0;
236 if (Int32.TryParse(eid, out id))
237 {
238 List<UUID> regions = m_EstateService.GetRegions(id);
239 if (regions != null && regions.Count > 0)
240 {
241 data = new Dictionary<string, object>();
242 int i = 0;
243 foreach (UUID uuid in regions)
244 data["region" + i++] = uuid.ToString();
245 httpResponse.StatusCode = (int)HttpStatusCode.OK;
246 httpResponse.ContentType = "text/xml";
247 }
248 }
249 }
250
251 return data;
252 }
253 }
254
255 public class EstateServerPostHandler : BaseStreamHandler
256 {
257 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
258
259 IEstateDataService m_EstateService;
260
261 // Possibilities
262 // /estates/estate/ (post an estate)
263 // /estates/estate/?eid=int&region=uuid (link a region to an estate)
264
265 public EstateServerPostHandler(IEstateDataService service, IServiceAuth auth) :
266 base("POST", "/estates", auth)
267 {
268 m_EstateService = service;
269 }
270
271 protected override byte[] ProcessRequest(string path, Stream request,
272 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
273 {
274 byte[] result = new byte[0];
275 Dictionary<string, object> data = null;
276
277 string[] p = SplitParams(path);
278
279 if (p.Length > 0)
280 {
281 string resource = p[0];
282
283 // /estates/estate/
284 // /estates/estate/?eid=int&region=uuid
285 if ("estate".Equals(resource))
286 {
287 StreamReader sr = new StreamReader(request);
288 string body = sr.ReadToEnd();
289 sr.Close();
290 body = body.Trim();
291
292 Dictionary<string, object> requestData = ServerUtils.ParseQueryString(body);
293
294 data = UpdateEstate(requestData, httpRequest, httpResponse);
295 }
296 }
297
298 if (data == null)
299 data = new Dictionary<string, object>();
300
301 string xmlString = ServerUtils.BuildXmlResponse(data);
302 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
303
304 }
305
306 private Dictionary<string, object> UpdateEstate(Dictionary<string, object> requestData, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
307 {
308 // /estates/estate/
309 // /estates/estate/?eid=int&region=uuid
310 Dictionary<string, object> result = new Dictionary<string, object>();
311 string eid = (string)httpRequest.Query["eid"];
312 string region = (string)httpRequest.Query["region"];
313
314 httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
315
316 if (string.IsNullOrEmpty(eid) && string.IsNullOrEmpty(region) &&
317 requestData.ContainsKey("OP") && requestData["OP"] != null && "STORE".Equals(requestData["OP"]))
318 {
319 // /estates/estate/
320 EstateSettings es = new EstateSettings(requestData);
321 m_EstateService.StoreEstateSettings(es);
322 //m_log.DebugFormat("[EstateServerPostHandler]: Store estate {0}", es.ToString());
323 httpResponse.StatusCode = (int)HttpStatusCode.OK;
324 result["Result"] = true;
325 }
326 else if (!string.IsNullOrEmpty(region) && !string.IsNullOrEmpty(eid) &&
327 requestData.ContainsKey("OP") && requestData["OP"] != null && "LINK".Equals(requestData["OP"]))
328 {
329 int id = 0;
330 UUID regionID = UUID.Zero;
331 if (UUID.TryParse(region, out regionID) && Int32.TryParse(eid, out id))
332 {
333 m_log.DebugFormat("[EstateServerPostHandler]: Link region {0} to estate {1}", regionID, id);
334 httpResponse.StatusCode = (int)HttpStatusCode.OK;
335 result["Result"] = m_EstateService.LinkRegion(regionID, id);
336 }
337 }
338 else
339 m_log.WarnFormat("[EstateServerPostHandler]: something wrong with POST request {0}", httpRequest.RawUrl);
340
341 return result;
342 }
343
344 }
345}
diff --git a/OpenSim/Services/Connectors/Estate/EstateDataConnector.cs b/OpenSim/Services/Connectors/Estate/EstateDataConnector.cs
new file mode 100644
index 0000000..9d01b47
--- /dev/null
+++ b/OpenSim/Services/Connectors/Estate/EstateDataConnector.cs
@@ -0,0 +1,340 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27using System;
28using System.Collections.Generic;
29using System.Net;
30using System.Reflection;
31
32using log4net;
33
34using OpenMetaverse;
35using Nini.Config;
36
37using OpenSim.Framework;
38using OpenSim.Framework.ServiceAuth;
39using OpenSim.Services.Connectors;
40using OpenSim.Services.Interfaces;
41using OpenSim.Server.Base;
42
43namespace OpenSim.Service.Connectors
44{
45 public class EstateDataRemoteConnector : BaseServiceConnector, IEstateDataService
46 {
47 private static readonly ILog m_log =
48 LogManager.GetLogger(
49 MethodBase.GetCurrentMethod().DeclaringType);
50
51 private string m_ServerURI = String.Empty;
52 private ExpiringCache<string, List<EstateSettings>> m_EstateCache = new ExpiringCache<string, List<EstateSettings>>();
53 private const int EXPIRATION = 5 * 60; // 5 minutes in secs
54
55 public EstateDataRemoteConnector(IConfigSource source)
56 {
57 Initialise(source);
58 }
59
60 public virtual void Initialise(IConfigSource source)
61 {
62 IConfig gridConfig = source.Configs["EstateService"];
63 if (gridConfig == null)
64 {
65 m_log.Error("[ESTATE CONNECTOR]: EstateService missing from OpenSim.ini");
66 throw new Exception("Estate connector init error");
67 }
68
69 string serviceURI = gridConfig.GetString("EstateServerURI",
70 String.Empty);
71
72 if (serviceURI == String.Empty)
73 {
74 m_log.Error("[ESTATE CONNECTOR]: No Server URI named in section EstateService");
75 throw new Exception("Estate connector init error");
76 }
77 m_ServerURI = serviceURI;
78
79 base.Initialise(source, "EstateService");
80 }
81
82 #region IEstateDataService
83
84 public List<EstateSettings> LoadEstateSettingsAll()
85 {
86 string reply = string.Empty;
87 string uri = m_ServerURI + "/estates";
88
89 reply = MakeRequest("GET", uri, string.Empty);
90 if (String.IsNullOrEmpty(reply))
91 return new List<EstateSettings>();
92
93 Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
94
95 List<EstateSettings> estates = new List<EstateSettings>();
96 if (replyData != null && replyData.Count > 0)
97 {
98 m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettingsAll returned {0} elements", replyData.Count);
99 Dictionary<string, object>.ValueCollection estateData = replyData.Values;
100 foreach (object r in estateData)
101 {
102 if (r is Dictionary<string, object>)
103 {
104 EstateSettings es = new EstateSettings((Dictionary<string, object>)r);
105 estates.Add(es);
106 }
107 }
108 m_EstateCache.AddOrUpdate("estates", estates, EXPIRATION);
109 }
110 else
111 m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettingsAll from {0} received null or zero response", uri);
112
113 return estates;
114
115 }
116
117 public List<int> GetEstatesAll()
118 {
119 List<int> eids = new List<int>();
120 // If we don't have them, load them from the server
121 List<EstateSettings> estates = null;
122 if (!m_EstateCache.TryGetValue("estates", out estates))
123 LoadEstateSettingsAll();
124
125 foreach (EstateSettings es in estates)
126 eids.Add((int)es.EstateID);
127
128 return eids;
129 }
130
131 public List<int> GetEstates(string search)
132 {
133 // If we don't have them, load them from the server
134 List<EstateSettings> estates = null;
135 if (!m_EstateCache.TryGetValue("estates", out estates))
136 LoadEstateSettingsAll();
137
138 List<int> eids = new List<int>();
139 foreach (EstateSettings es in estates)
140 if (es.EstateName == search)
141 eids.Add((int)es.EstateID);
142
143 return eids;
144 }
145
146 public List<int> GetEstatesByOwner(UUID ownerID)
147 {
148 // If we don't have them, load them from the server
149 List<EstateSettings> estates = null;
150 if (!m_EstateCache.TryGetValue("estates", out estates))
151 LoadEstateSettingsAll();
152
153 List<int> eids = new List<int>();
154 foreach (EstateSettings es in estates)
155 if (es.EstateOwner == ownerID)
156 eids.Add((int)es.EstateID);
157
158 return eids;
159 }
160
161 public List<UUID> GetRegions(int estateID)
162 {
163 string reply = string.Empty;
164 // /estates/regions/?eid=int
165 string uri = m_ServerURI + "/estates/regions/?eid=" + estateID.ToString();
166
167 reply = MakeRequest("GET", uri, string.Empty);
168 if (String.IsNullOrEmpty(reply))
169 return new List<UUID>();
170
171 Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
172
173 List<UUID> regions = new List<UUID>();
174 if (replyData != null && replyData.Count > 0)
175 {
176 m_log.DebugFormat("[ESTATE CONNECTOR]: GetRegions for estate {0} returned {1} elements", estateID, replyData.Count);
177 Dictionary<string, object>.ValueCollection data = replyData.Values;
178 foreach (object r in data)
179 {
180 UUID uuid = UUID.Zero;
181 if (UUID.TryParse(r.ToString(), out uuid))
182 regions.Add(uuid);
183 }
184 }
185 else
186 m_log.DebugFormat("[ESTATE CONNECTOR]: GetRegions from {0} received null or zero response", uri);
187
188 return regions;
189 }
190
191 public EstateSettings LoadEstateSettings(UUID regionID, bool create)
192 {
193 string reply = string.Empty;
194 // /estates/estate/?region=uuid&create=[t|f]
195 string uri = m_ServerURI + string.Format("/estates/estate/?region={0}&create={1}", regionID, create);
196
197 reply = MakeRequest("GET", uri, string.Empty);
198 if (String.IsNullOrEmpty(reply))
199 return null;
200
201 Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
202
203 if (replyData != null && replyData.Count > 0)
204 {
205 m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettings({0}) returned {1} elements", regionID, replyData.Count);
206 EstateSettings es = new EstateSettings(replyData);
207 return es;
208 }
209 else
210 m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettings(regionID) from {0} received null or zero response", uri);
211
212 return null;
213 }
214
215 public EstateSettings LoadEstateSettings(int estateID)
216 {
217 string reply = string.Empty;
218 // /estates/estate/?eid=int
219 string uri = m_ServerURI + string.Format("/estates/estate/?eid={0}", estateID);
220
221 reply = MakeRequest("GET", uri, string.Empty);
222 if (String.IsNullOrEmpty(reply))
223 return null;
224
225 Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
226
227 if (replyData != null && replyData.Count > 0)
228 {
229 m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettings({0}) returned {1} elements", estateID, replyData.Count);
230 EstateSettings es = new EstateSettings(replyData);
231 return es;
232 }
233 else
234 m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettings(estateID) from {0} received null or zero response", uri);
235
236 return null;
237 }
238
239 /// <summary>
240 /// Forbidden operation
241 /// </summary>
242 /// <returns></returns>
243 public EstateSettings CreateNewEstate()
244 {
245 // No can do
246 return null;
247 }
248
249 public void StoreEstateSettings(EstateSettings es)
250 {
251 string reply = string.Empty;
252 // /estates/estate/
253 string uri = m_ServerURI + ("/estates/estate");
254
255 Dictionary<string, object> formdata = es.ToMap();
256 formdata["OP"] = "STORE";
257
258 PostRequest(uri, formdata);
259 }
260
261 public bool LinkRegion(UUID regionID, int estateID)
262 {
263 string reply = string.Empty;
264 // /estates/estate/?eid=int&region=uuid
265 string uri = m_ServerURI + String.Format("/estates/estate/?eid={0}&region={1}", estateID, regionID);
266
267 Dictionary<string, object> formdata = new Dictionary<string, object>();
268 formdata["OP"] = "LINK";
269 return PostRequest(uri, formdata);
270 }
271
272 private bool PostRequest(string uri, Dictionary<string, object> sendData)
273 {
274 string reqString = ServerUtils.BuildQueryString(sendData);
275
276 string reply = MakeRequest("POST", uri, reqString);
277 if (String.IsNullOrEmpty(reply))
278 return false;
279
280 Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
281
282 bool result = false;
283 if (replyData != null && replyData.Count > 0)
284 {
285 if (replyData.ContainsKey("Result"))
286 {
287 if (Boolean.TryParse(replyData["Result"].ToString(), out result))
288 m_log.DebugFormat("[ESTATE CONNECTOR]: PostRequest {0} returned {1}", uri, result);
289 }
290 }
291 else
292 m_log.DebugFormat("[ESTATE CONNECTOR]: PostRequest {0} received null or zero response", uri);
293
294 return result;
295 }
296
297 /// <summary>
298 /// Forbidden operation
299 /// </summary>
300 /// <returns></returns>
301 public bool DeleteEstate(int estateID)
302 {
303 return false;
304 }
305
306 #endregion
307
308 private string MakeRequest(string verb, string uri, string formdata)
309 {
310 string reply = string.Empty;
311 try
312 {
313 reply = SynchronousRestFormsRequester.MakeRequest(verb, uri, formdata, m_Auth);
314 }
315 catch (WebException e)
316 {
317 using (HttpWebResponse hwr = (HttpWebResponse)e.Response)
318 {
319 if (hwr != null)
320 {
321 if (hwr.StatusCode == HttpStatusCode.NotFound)
322 m_log.Error(string.Format("[ESTATE CONNECTOR]: Resource {0} not found ", uri));
323 if (hwr.StatusCode == HttpStatusCode.Unauthorized)
324 m_log.Error(string.Format("[ESTATE CONNECTOR]: Web request {0} requires authentication ", uri));
325 }
326 else
327 m_log.Error(string.Format(
328 "[ESTATE CONNECTOR]: WebException for {0} {1} {2} ",
329 verb, uri, formdata, e));
330 }
331 }
332 catch (Exception e)
333 {
334 m_log.DebugFormat("[ESTATE CONNECTOR]: Exception when contacting estate server at {0}: {1}", uri, e.Message);
335 }
336
337 return reply;
338 }
339 }
340}
diff --git a/OpenSim/Services/Connectors/Simulation/EstateDataService.cs b/OpenSim/Services/EstateService/EstateDataService.cs
index 5962b99..f6a8654 100644
--- a/OpenSim/Services/Connectors/Simulation/EstateDataService.cs
+++ b/OpenSim/Services/EstateService/EstateDataService.cs
@@ -29,17 +29,14 @@ using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using OpenMetaverse; 30using OpenMetaverse;
31using log4net; 31using log4net;
32using Mono.Addins;
33using Nini.Config; 32using Nini.Config;
34using System.Reflection; 33using System.Reflection;
35using OpenSim.Services.Base; 34using OpenSim.Services.Base;
36using OpenSim.Services.Interfaces; 35using OpenSim.Services.Interfaces;
37using OpenSim.Data; 36using OpenSim.Data;
38using OpenSim.Framework; 37using OpenSim.Framework;
39//using OpenSim.Region.Framework.Interfaces;
40//using OpenSim.Region.Framework.Scenes;
41 38
42namespace OpenSim.Services.Connectors 39namespace OpenSim.Services.EstateService
43{ 40{
44 public class EstateDataService : ServiceBase, IEstateDataService 41 public class EstateDataService : ServiceBase, IEstateDataService
45 { 42 {
diff --git a/OpenSim/Services/Connectors/Simulation/SimulationDataService.cs b/OpenSim/Services/SimulationService/SimulationDataService.cs
index 2cbf967..d9684c4 100644
--- a/OpenSim/Services/Connectors/Simulation/SimulationDataService.cs
+++ b/OpenSim/Services/SimulationService/SimulationDataService.cs
@@ -29,7 +29,6 @@ using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using OpenMetaverse; 30using OpenMetaverse;
31using log4net; 31using log4net;
32using Mono.Addins;
33using Nini.Config; 32using Nini.Config;
34using System.Reflection; 33using System.Reflection;
35using OpenSim.Services.Base; 34using OpenSim.Services.Base;
@@ -39,7 +38,7 @@ using OpenSim.Framework;
39using OpenSim.Region.Framework.Interfaces; 38using OpenSim.Region.Framework.Interfaces;
40using OpenSim.Region.Framework.Scenes; 39using OpenSim.Region.Framework.Scenes;
41 40
42namespace OpenSim.Services.Connectors 41namespace OpenSim.Services.SimulationService
43{ 42{
44 public class SimulationDataService : ServiceBase, ISimulationDataService 43 public class SimulationDataService : ServiceBase, ISimulationDataService
45 { 44 {
diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example
index 71ce6ad..46dbc17 100644
--- a/bin/Robust.HG.ini.example
+++ b/bin/Robust.HG.ini.example
@@ -110,6 +110,8 @@
110 ;; Uncomment for UserProfiles see [UserProfilesService] to configure... 110 ;; Uncomment for UserProfiles see [UserProfilesService] to configure...
111 ; UserProfilesServiceConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:UserProfilesConnector" 111 ; UserProfilesServiceConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:UserProfilesConnector"
112 112
113 ;; Uncomment if you want to have centralized estate data
114 ; EstateDataService = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:EstateDataRobustConnector"
113 115
114; * This is common for all services, it's the network setup for the entire 116; * This is common for all services, it's the network setup for the entire
115; * server instance, if none is specified above 117; * server instance, if none is specified above
@@ -379,6 +381,8 @@
379 ; for the server connector 381 ; for the server connector
380 LocalServiceModule = "OpenSim.Services.FriendsService.dll:FriendsService" 382 LocalServiceModule = "OpenSim.Services.FriendsService.dll:FriendsService"
381 383
384[EstateService]
385 LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
382 386
383[LibraryService] 387[LibraryService]
384 LibraryName = "OpenSim Library" 388 LibraryName = "OpenSim Library"
diff --git a/bin/Robust.ini.example b/bin/Robust.ini.example
index a7b39a3..687bb2e 100644
--- a/bin/Robust.ini.example
+++ b/bin/Robust.ini.example
@@ -89,6 +89,9 @@
89 ;; Uncomment for UserProfiles see [UserProfilesService] to configure... 89 ;; Uncomment for UserProfiles see [UserProfilesService] to configure...
90 ; UserProfilesServiceConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:UserProfilesConnector" 90 ; UserProfilesServiceConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:UserProfilesConnector"
91 91
92 ;; Uncomment if you want to have centralized estate data
93 ; EstateDataService = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:EstateDataRobustConnector"
94
92; * This is common for all services, it's the network setup for the entire 95; * This is common for all services, it's the network setup for the entire
93; * server instance, if none is specified above 96; * server instance, if none is specified above
94; * 97; *
@@ -339,6 +342,8 @@
339 ; for the server connector 342 ; for the server connector
340 LocalServiceModule = "OpenSim.Services.FriendsService.dll:FriendsService" 343 LocalServiceModule = "OpenSim.Services.FriendsService.dll:FriendsService"
341 344
345[EstateService]
346 LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
342 347
343[LibraryService] 348[LibraryService]
344 LibraryName = "OpenSim Library" 349 LibraryName = "OpenSim Library"
diff --git a/bin/config-include/Grid.ini b/bin/config-include/Grid.ini
index e9eaee3..42ecec2 100644
--- a/bin/config-include/Grid.ini
+++ b/bin/config-include/Grid.ini
@@ -46,10 +46,10 @@
46 ConnectorProtocolVersion = "SIMULATION/0.3" 46 ConnectorProtocolVersion = "SIMULATION/0.3"
47 47
48[SimulationDataStore] 48[SimulationDataStore]
49 LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService" 49 LocalServiceModule = "OpenSim.Services.SimulationService.dll:SimulationDataService"
50 50
51[EstateDataStore] 51[EstateDataStore]
52 LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService" 52 LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
53 53
54[GridService] 54[GridService]
55 LocalServiceModule = "OpenSim.Services.GridService.dll:GridService" 55 LocalServiceModule = "OpenSim.Services.GridService.dll:GridService"
diff --git a/bin/config-include/GridCommon.ini.example b/bin/config-include/GridCommon.ini.example
index 903641e..bffc504 100644
--- a/bin/config-include/GridCommon.ini.example
+++ b/bin/config-include/GridCommon.ini.example
@@ -108,6 +108,16 @@
108 ;; Robust server in port ${Const|PublicPort}, but not always) 108 ;; Robust server in port ${Const|PublicPort}, but not always)
109 Gatekeeper="${Const|BaseURL}:${Const|PublicPort}" 109 Gatekeeper="${Const|BaseURL}:${Const|PublicPort}"
110 110
111[EstateDataStore]
112 ;
113 ; Uncomment if you want centralized estate data at robust server,
114 ; in which case the URL in [EstateService] will be used
115 ;
116 ;LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataConnector"
117
118[EstateService]
119 EstateServerURI = "${Const|BaseURL}:${Const|PrivatePort}"
120
111[Messaging] 121[Messaging]
112 ; === HG ONLY === 122 ; === HG ONLY ===
113 ;; Change this to the address of your Gatekeeper service 123 ;; Change this to the address of your Gatekeeper service
diff --git a/bin/config-include/GridHypergrid.ini b/bin/config-include/GridHypergrid.ini
index 8dadd76..8b47ede 100644
--- a/bin/config-include/GridHypergrid.ini
+++ b/bin/config-include/GridHypergrid.ini
@@ -54,10 +54,10 @@
54 Module = "BasicProfileModule" 54 Module = "BasicProfileModule"
55 55
56[SimulationDataStore] 56[SimulationDataStore]
57 LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService" 57 LocalServiceModule = "OpenSim.Services.SimulationService.dll:SimulationDataService"
58 58
59[EstateDataStore] 59[EstateDataStore]
60 LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService" 60 LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
61 61
62[AssetService] 62[AssetService]
63 LocalGridAssetService = "OpenSim.Services.Connectors.dll:AssetServicesConnector" 63 LocalGridAssetService = "OpenSim.Services.Connectors.dll:AssetServicesConnector"
diff --git a/bin/config-include/SimianGrid.ini b/bin/config-include/SimianGrid.ini
index 311a55b..8e42fab 100644
--- a/bin/config-include/SimianGrid.ini
+++ b/bin/config-include/SimianGrid.ini
@@ -42,10 +42,10 @@
42 AssetCaching = "FlotsamAssetCache" 42 AssetCaching = "FlotsamAssetCache"
43 43
44[SimulationDataStore] 44[SimulationDataStore]
45 LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService" 45 LocalServiceModule = "OpenSim.Services.SimulationService.dll:SimulationDataService"
46 46
47[EstateDataStore] 47[EstateDataStore]
48 LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService" 48 LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
49 49
50[Friends] 50[Friends]
51 Connector = "OpenSim.Services.Connectors.dll:SimianFriendsServiceConnector" 51 Connector = "OpenSim.Services.Connectors.dll:SimianFriendsServiceConnector"
diff --git a/bin/config-include/Standalone.ini b/bin/config-include/Standalone.ini
index 887f4d8..398a76c 100644
--- a/bin/config-include/Standalone.ini
+++ b/bin/config-include/Standalone.ini
@@ -43,10 +43,10 @@
43 ConnectorProtocolVersion = "SIMULATION/0.3" 43 ConnectorProtocolVersion = "SIMULATION/0.3"
44 44
45[SimulationDataStore] 45[SimulationDataStore]
46 LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService" 46 LocalServiceModule = "OpenSim.Services.SimulationService.dll:SimulationDataService"
47 47
48[EstateDataStore] 48[EstateDataStore]
49 LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService" 49 LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
50 50
51[AssetService] 51[AssetService]
52 LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService" 52 LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService"
diff --git a/bin/config-include/StandaloneHypergrid.ini b/bin/config-include/StandaloneHypergrid.ini
index a3c7fa6..102947a 100644
--- a/bin/config-include/StandaloneHypergrid.ini
+++ b/bin/config-include/StandaloneHypergrid.ini
@@ -58,10 +58,10 @@
58 LureModule = HGLureModule 58 LureModule = HGLureModule
59 59
60[SimulationDataStore] 60[SimulationDataStore]
61 LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService" 61 LocalServiceModule = "OpenSim.Services.SimulationService.dll:SimulationDataService"
62 62
63[EstateDataStore] 63[EstateDataStore]
64 LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService" 64 LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
65 65
66[AssetService] 66[AssetService]
67 LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService" 67 LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService"
diff --git a/prebuild.xml b/prebuild.xml
index 663d4da..771b7c7 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -839,6 +839,40 @@
839 </Files> 839 </Files>
840 </Project> 840 </Project>
841 841
842 <Project frameworkVersion="v4_0" name="OpenSim.Services.SimulationService" path="OpenSim/Services/SimulationService" type="Library">
843 <Configuration name="Debug">
844 <Options>
845 <OutputPath>../../../bin/</OutputPath>
846 </Options>
847 </Configuration>
848 <Configuration name="Release">
849 <Options>
850 <OutputPath>../../../bin/</OutputPath>
851 </Options>
852 </Configuration>
853
854 <ReferencePath>../../../bin/</ReferencePath>
855 <Reference name="System"/>
856 <Reference name="System.Core"/>
857 <Reference name="System.Web"/>
858 <Reference name="System.Xml"/>
859 <Reference name="System.Drawing"/>
860 <Reference name="OpenMetaverseTypes" path="../../../bin/"/>
861 <Reference name="OpenMetaverse" path="../../../bin/"/>
862 <Reference name="OpenSim.Data"/>
863 <Reference name="OpenSim.Framework"/>
864 <Reference name="OpenSim.Region.Framework"/>
865 <Reference name="OpenSim.Services.Base"/>
866 <Reference name="OpenSim.Services.Interfaces"/>
867 <Reference name="Nini" path="../../../bin/"/>
868 <Reference name="log4net" path="../../../bin/"/>
869 <Reference name="XMLRPC" path="../../../bin/"/>
870
871 <Files>
872 <Match pattern="*.cs" recurse="true"/>
873 </Files>
874 </Project>
875
842 <Project frameworkVersion="v4_0" name="OpenSim.Services.AssetService" path="OpenSim/Services/AssetService" type="Library"> 876 <Project frameworkVersion="v4_0" name="OpenSim.Services.AssetService" path="OpenSim/Services/AssetService" type="Library">
843 <Configuration name="Debug"> 877 <Configuration name="Debug">
844 <Options> 878 <Options>
@@ -1000,6 +1034,35 @@
1000 </Files> 1034 </Files>
1001 </Project> 1035 </Project>
1002 1036
1037 <Project frameworkVersion="v4_0" name="OpenSim.Services.EstateService" path="OpenSim/Services/EstateService" type="Library">
1038 <Configuration name="Debug">
1039 <Options>
1040 <OutputPath>../../../bin/</OutputPath>
1041 </Options>
1042 </Configuration>
1043 <Configuration name="Release">
1044 <Options>
1045 <OutputPath>../../../bin/</OutputPath>
1046 </Options>
1047 </Configuration>
1048
1049 <ReferencePath>../../../bin/</ReferencePath>
1050 <Reference name="System"/>
1051 <Reference name="System.Core"/>
1052 <Reference name="OpenMetaverseTypes" path="../../../bin/"/>
1053 <Reference name="OpenMetaverse" path="../../../bin/"/>
1054 <Reference name="OpenSim.Framework"/>
1055 <Reference name="OpenSim.Services.Interfaces"/>
1056 <Reference name="OpenSim.Services.Base"/>
1057 <Reference name="OpenSim.Data"/>
1058 <Reference name="Nini" path="../../../bin/"/>
1059 <Reference name="log4net" path="../../../bin/"/>
1060
1061 <Files>
1062 <Match pattern="*.cs" recurse="true"/>
1063 </Files>
1064 </Project>
1065
1003 <Project frameworkVersion="v4_0" name="OpenSim.Services.PresenceService" path="OpenSim/Services/PresenceService" type="Library"> 1066 <Project frameworkVersion="v4_0" name="OpenSim.Services.PresenceService" path="OpenSim/Services/PresenceService" type="Library">
1004 <Configuration name="Debug"> 1067 <Configuration name="Debug">
1005 <Options> 1068 <Options>