From 25661b611d241534e5e8d7ce1731de8506481a7d Mon Sep 17 00:00:00 2001
From: MW
Date: Sat, 21 Feb 2009 13:44:03 +0000
Subject: Refactored the GridServer into a GridDBService and a set of
"modules". Currently they aren't plugin modules as the support for
dynamically loading them isn't complete.
---
OpenSim/Grid/GridServer/GridRestModule.cs | 269 ++++++++++++++++++++++++++++++
1 file changed, 269 insertions(+)
create mode 100644 OpenSim/Grid/GridServer/GridRestModule.cs
(limited to 'OpenSim/Grid/GridServer/GridRestModule.cs')
diff --git a/OpenSim/Grid/GridServer/GridRestModule.cs b/OpenSim/Grid/GridServer/GridRestModule.cs
new file mode 100644
index 0000000..1ed0ac1
--- /dev/null
+++ b/OpenSim/Grid/GridServer/GridRestModule.cs
@@ -0,0 +1,269 @@
+/*
+ * 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 OpenSim 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.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Xml;
+using log4net;
+using OpenMetaverse;
+using OpenSim.Data;
+using OpenSim.Framework;
+using OpenSim.Framework.Communications;
+using OpenSim.Framework.Servers;
+
+namespace OpenSim.Grid.GridServer
+{
+ public class GridRestModule
+ {
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ private GridDBService m_gridDBService;
+ private IGridCore m_gridCore;
+
+ protected GridConfig m_config;
+
+ ///
+ /// Used to notify old regions as to which OpenSim version to upgrade to
+ ///
+ private string m_opensimVersion;
+
+ protected BaseHttpServer m_httpServer;
+
+ ///
+ /// Constructor
+ ///
+ ///
+ /// Used to notify old regions as to which OpenSim version to upgrade to
+ ///
+ public GridRestModule(string opensimVersion, GridDBService gridDBService, IGridCore gridCore, GridConfig config)
+ {
+ m_opensimVersion = opensimVersion;
+ m_gridDBService = gridDBService;
+ m_gridCore = gridCore;
+ m_config = config;
+ m_httpServer = m_gridCore.GetHttpServer();
+ }
+
+ public void Initialise()
+ {
+ m_httpServer.AddStreamHandler(new RestStreamHandler("GET", "/sims/", RestGetSimMethod));
+ m_httpServer.AddStreamHandler(new RestStreamHandler("POST", "/sims/", RestSetSimMethod));
+
+ m_httpServer.AddStreamHandler(new RestStreamHandler("GET", "/regions/", RestGetRegionMethod));
+ m_httpServer.AddStreamHandler(new RestStreamHandler("POST", "/regions/", RestSetRegionMethod));
+ }
+
+ ///
+ /// Performs a REST Get Operation
+ ///
+ ///
+ ///
+ ///
+ /// HTTP request header object
+ /// HTTP response header object
+ ///
+ public string RestGetRegionMethod(string request, string path, string param,
+ OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+ {
+ return RestGetSimMethod(String.Empty, "/sims/", param, httpRequest, httpResponse);
+ }
+
+ ///
+ /// Performs a REST Set Operation
+ ///
+ ///
+ ///
+ ///
+ /// HTTP request header object
+ /// HTTP response header object
+ ///
+ public string RestSetRegionMethod(string request, string path, string param,
+ OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+ {
+ return RestSetSimMethod(String.Empty, "/sims/", param, httpRequest, httpResponse);
+ }
+
+ ///
+ /// Returns information about a sim via a REST Request
+ ///
+ ///
+ ///
+ /// A string representing the sim's UUID
+ /// HTTP request header object
+ /// HTTP response header object
+ /// Information about the sim in XML
+ public string RestGetSimMethod(string request, string path, string param,
+ OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+ {
+ string respstring = String.Empty;
+
+ RegionProfileData TheSim;
+
+ UUID UUID;
+ if (UUID.TryParse(param, out UUID))
+ {
+ TheSim = m_gridDBService.GetRegion(UUID);
+
+ if (!(TheSim == null))
+ {
+ respstring = "";
+ respstring += "" + TheSim.regionSendKey + "";
+ respstring += "";
+ respstring += "" + TheSim.UUID.ToString() + "";
+ respstring += "" + TheSim.regionName + "";
+ respstring += "" + TheSim.serverIP + "";
+ respstring += "" + TheSim.serverPort.ToString() + "";
+ respstring += "" + TheSim.regionLocX.ToString() + "";
+ respstring += "" + TheSim.regionLocY.ToString() + "";
+ respstring += "1";
+ respstring += "";
+ respstring += "";
+ }
+ }
+ else
+ {
+ respstring = "";
+ respstring += "Param must be a UUID";
+ respstring += "";
+ }
+
+ return respstring;
+ }
+
+ ///
+ /// Creates or updates a sim via a REST Method Request
+ /// BROKEN with SQL Update
+ ///
+ ///
+ ///
+ ///
+ /// HTTP request header object
+ /// HTTP response header object
+ /// "OK" or an error
+ public string RestSetSimMethod(string request, string path, string param,
+ OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+ {
+ Console.WriteLine("Processing region update via REST method");
+ RegionProfileData theSim;
+ theSim = m_gridDBService.GetRegion(new UUID(param));
+ if (theSim == null)
+ {
+ theSim = new RegionProfileData();
+ UUID UUID = new UUID(param);
+ theSim.UUID = UUID;
+ theSim.regionRecvKey = m_config.SimRecvKey;
+ }
+
+ XmlDocument doc = new XmlDocument();
+ doc.LoadXml(request);
+ XmlNode rootnode = doc.FirstChild;
+ XmlNode authkeynode = rootnode.ChildNodes[0];
+ if (authkeynode.Name != "authkey")
+ {
+ return "ERROR! bad XML - expected authkey tag";
+ }
+
+ XmlNode simnode = rootnode.ChildNodes[1];
+ if (simnode.Name != "sim")
+ {
+ return "ERROR! bad XML - expected sim tag";
+ }
+
+ //theSim.regionSendKey = Cfg;
+ theSim.regionRecvKey = m_config.SimRecvKey;
+ theSim.regionSendKey = m_config.SimSendKey;
+ theSim.regionSecret = m_config.SimRecvKey;
+ theSim.regionDataURI = String.Empty;
+ theSim.regionAssetURI = m_config.DefaultAssetServer;
+ theSim.regionAssetRecvKey = m_config.AssetRecvKey;
+ theSim.regionAssetSendKey = m_config.AssetSendKey;
+ theSim.regionUserURI = m_config.DefaultUserServer;
+ theSim.regionUserSendKey = m_config.UserSendKey;
+ theSim.regionUserRecvKey = m_config.UserRecvKey;
+
+ for (int i = 0; i < simnode.ChildNodes.Count; i++)
+ {
+ switch (simnode.ChildNodes[i].Name)
+ {
+ case "regionname":
+ theSim.regionName = simnode.ChildNodes[i].InnerText;
+ break;
+
+ case "sim_ip":
+ theSim.serverIP = simnode.ChildNodes[i].InnerText;
+ break;
+
+ case "sim_port":
+ theSim.serverPort = Convert.ToUInt32(simnode.ChildNodes[i].InnerText);
+ break;
+
+ case "region_locx":
+ theSim.regionLocX = Convert.ToUInt32((string)simnode.ChildNodes[i].InnerText);
+ theSim.regionHandle = Utils.UIntsToLong((theSim.regionLocX * Constants.RegionSize), (theSim.regionLocY * Constants.RegionSize));
+ break;
+
+ case "region_locy":
+ theSim.regionLocY = Convert.ToUInt32((string)simnode.ChildNodes[i].InnerText);
+ theSim.regionHandle = Utils.UIntsToLong((theSim.regionLocX * Constants.RegionSize), (theSim.regionLocY * Constants.RegionSize));
+ break;
+ }
+ }
+
+ theSim.serverURI = "http://" + theSim.serverIP + ":" + theSim.serverPort + "/";
+ bool requirePublic = false;
+ bool requireValid = true;
+
+ if (requirePublic &&
+ (theSim.serverIP.StartsWith("172.16") || theSim.serverIP.StartsWith("192.168") ||
+ theSim.serverIP.StartsWith("10.") || theSim.serverIP.StartsWith("0.") ||
+ theSim.serverIP.StartsWith("255.")))
+ {
+ return "ERROR! Servers must register with public addresses.";
+ }
+
+ if (requireValid && (theSim.serverIP.StartsWith("0.") || theSim.serverIP.StartsWith("255.")))
+ {
+ return "ERROR! 0.*.*.* / 255.*.*.* Addresses are invalid, please check your server config and try again";
+ }
+
+ try
+ {
+ m_log.Info("[DATA]: " +
+ "Updating / adding via " + m_gridDBService.GetNumberOfPlugins() + " storage provider(s) registered.");
+
+ return m_gridDBService.CheckReservations(theSim, authkeynode);
+ }
+ catch (Exception e)
+ {
+ return "ERROR! Could not save to database! (" + e.ToString() + ")";
+ }
+ }
+ }
+}
--
cgit v1.1