From 03efaff60e2c4204bfac33de22e69377ba28be7c Mon Sep 17 00:00:00 2001 From: Dr Scofield Date: Mon, 28 Jul 2008 12:18:48 +0000 Subject: [PATCH] moving GridInfo application plugin into a common standalone/grid service, adding a plain REST GET handler returning XML (no LLSD), adding appropriate add handler calls to OpenSimBase and UserServer. --- .../Common/Communications/GridInfoService.cs | 125 ++++++++++++++++++ OpenSim/Framework/Servers/BaseHttpServer.cs | 4 +- OpenSim/Grid/UserServer/Main.cs | 7 + OpenSim/Region/Application/OpenSimBase.cs | 7 + prebuild.xml | 60 ++++----- 5 files changed, 168 insertions(+), 35 deletions(-) create mode 100644 OpenSim/Common/Communications/GridInfoService.cs diff --git a/OpenSim/Common/Communications/GridInfoService.cs b/OpenSim/Common/Communications/GridInfoService.cs new file mode 100644 index 0000000000..f8208ad5a9 --- /dev/null +++ b/OpenSim/Common/Communications/GridInfoService.cs @@ -0,0 +1,125 @@ +/* + * 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.IO; +using System.Reflection; +using System.Text; +using log4net; +using Nini.Config; +using Nwc.XmlRpc; +using OpenSim.Framework.Servers; +using OpenSim.Framework; + +namespace OpenSim.Common.Communications +{ + public class GridInfoService + { + private static readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private Hashtable _info = new Hashtable(); + + /// + /// Instantiate a GridInfoService object. + /// + /// path to config path containing + /// grid information + /// + /// GridInfoService uses the [GridInfo] section of the + /// standard OpenSim.ini file --- which is not optimal, but + /// anything else requires a general redesign of the config + /// system. + /// + public GridInfoService(string configPath) + { + _info["platform"] = "OpenSim"; + if (File.Exists(configPath)) + { + try + { + IConfigSource _configSource = new IniConfigSource(configPath); + IConfig startupCfg = _configSource.Configs["Startup"]; + IConfig gridCfg = _configSource.Configs["GridInfo"]; + + if (!startupCfg.GetBoolean("gridmode", false)) + _info["mode"] = "standalone"; + else + _info["mode"] = "grid"; + + foreach (string k in gridCfg.GetKeys()) + { + _info[k] = gridCfg.GetString(k); + } + } + catch (Exception) + { + _log.DebugFormat("[GridInfoService] cannot get grid info from {0}, using minimal defaults", configPath); + } + } + _log.InfoFormat("[GridInfoService] Grid info service initialized with {0} keys", _info.Count); + } + + /// + /// Default constructor, uses OpenSim.ini. + /// + public GridInfoService() : this(Path.Combine(Util.configDir(), "OpenSim.ini")) + { + } + + public XmlRpcResponse XmlRpcGridInfoMethod(XmlRpcRequest request) + { + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable responseData = new Hashtable(); + + _log.Info("[GridInfo]: Request for grid info"); + + foreach (string k in _info.Keys) + { + responseData[k] = _info[k]; + } + response.Value = responseData; + + return response; + } + + public string RestGetGridInfoMethod(string request, string path, string param, + OSHttpRequest httpRequest, OSHttpResponse httpResponse) + { + StringBuilder sb = new StringBuilder(); + + sb.Append("\n"); + foreach (string k in _info.Keys) + { + sb.AppendFormat("<{0}>{1}\n", k, _info[k]); + } + sb.Append("\n"); + + return sb.ToString(); + } + } +} diff --git a/OpenSim/Framework/Servers/BaseHttpServer.cs b/OpenSim/Framework/Servers/BaseHttpServer.cs index 4dc59946ae..f8b4ccb6ae 100644 --- a/OpenSim/Framework/Servers/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/BaseHttpServer.cs @@ -88,7 +88,7 @@ namespace OpenSim.Framework.Servers { if (!m_streamHandlers.ContainsKey(handlerKey)) { - //m_log.DebugFormat("[BASE HTTP SERVER]: Adding handler key {0}", handlerKey); + // m_log.DebugFormat("[BASE HTTP SERVER]: Adding handler key {0}", handlerKey); m_streamHandlers.Add(handlerKey, handler); } } @@ -195,7 +195,7 @@ namespace OpenSim.Framework.Servers string path = request.RawUrl; string handlerKey = GetHandlerKey(request.HttpMethod, path); - //m_log.DebugFormat("[BASE HTTP SERVER]: Handling {0} request for {1}", request.HttpMethod, path); + // m_log.DebugFormat("[BASE HTTP SERVER]: Handling {0} request for {1}", request.HttpMethod, path); if (TryGetStreamHandler(handlerKey, out requestHandler)) { diff --git a/OpenSim/Grid/UserServer/Main.cs b/OpenSim/Grid/UserServer/Main.cs index 1338d680fd..a9b4a4fe6f 100644 --- a/OpenSim/Grid/UserServer/Main.cs +++ b/OpenSim/Grid/UserServer/Main.cs @@ -39,6 +39,7 @@ using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Console; using OpenSim.Framework.Servers; using OpenSim.Framework.Statistics; +using OpenSim.Common.Communications; using OpenSim.Grid.Communications.OGS1; namespace OpenSim.Grid.UserServer @@ -53,6 +54,7 @@ namespace OpenSim.Grid.UserServer public UserManager m_userManager; public UserLoginService m_loginService; + public GridInfoService m_gridInfoService; public MessageServersConnector m_messagesService; protected IInterServiceInventoryServices m_interServiceInventoryService; @@ -100,6 +102,8 @@ namespace OpenSim.Grid.UserServer m_userManager._config = Cfg; m_userManager.AddPlugin(Cfg.DatabaseProvider, Cfg.DatabaseConnect); + m_gridInfoService = new GridInfoService(); + m_interServiceInventoryService = new OGS1InterServiceInventoryService(m_userManager._config.InventoryUrl); m_loginService = new UserLoginService( @@ -148,6 +152,9 @@ namespace OpenSim.Grid.UserServer m_httpServer.AddXmlRPCHandler("agent_change_region", m_messagesService.XmlRPCUserMovedtoRegion); m_httpServer.AddXmlRPCHandler("deregister_messageserver", m_messagesService.XmlRPCDeRegisterMessageServer); + m_httpServer.AddStreamHandler(new RestStreamHandler("GET", "/get_grid_info", m_gridInfoService.RestGetGridInfoMethod)); + m_httpServer.AddXmlRPCHandler("get_grid_info", m_gridInfoService.XmlRpcGridInfoMethod); + m_httpServer.AddStreamHandler( new RestStreamHandler("DELETE", "/usersessions/", m_userManager.RestDeleteUserSessionMethod)); diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 6889a61334..c2d30e4db7 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -40,6 +40,7 @@ using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Console; using OpenSim.Framework.Servers; using OpenSim.Framework.Statistics; +using OpenSim.Common.Communications; using OpenSim.Region.ClientStack; using OpenSim.Region.Communications.Local; using OpenSim.Region.Communications.OGS1; @@ -79,6 +80,7 @@ namespace OpenSim public bool m_see_into_region_from_neighbor; protected LocalLoginService m_loginService; + protected GridInfoService m_gridInfoService; protected string m_storageDll; protected string m_clientstackDll; @@ -382,6 +384,11 @@ namespace OpenSim // Provides the LLSD login m_httpServer.SetLLSDHandler(m_loginService.LLSDLoginMethod); + // provide grid info + m_gridInfoService = new GridInfoService(); + m_httpServer.AddXmlRPCHandler("get_grid_info", m_gridInfoService.XmlRpcGridInfoMethod); + m_httpServer.AddStreamHandler(new RestStreamHandler("GET", "/get_grid_info", m_gridInfoService.RestGetGridInfoMethod)); + CreateAccount = localComms.doCreate; } else diff --git a/prebuild.xml b/prebuild.xml index 94412561b3..8e91e01d2e 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -466,6 +466,31 @@ + + + + ../../../bin/ + + + + + ../../../bin/ + + + + ../../../bin/ + + + + + + + + + + + + @@ -1026,6 +1051,7 @@ + @@ -1103,39 +1129,6 @@ - - - - ../../../bin/ - - - - - ../../../bin/ - - - - ../../../bin/ - - - - - - - - - - - - - - - - - - - - @@ -1820,6 +1813,7 @@ +