diff --git a/OpenSim/ApplicationPlugins/CreateCommsManager/CreateCommsManagerPlugin.cs b/OpenSim/ApplicationPlugins/CreateCommsManager/CreateCommsManagerPlugin.cs
index 2bf51330d6..37f2c0b2c8 100644
--- a/OpenSim/ApplicationPlugins/CreateCommsManager/CreateCommsManagerPlugin.cs
+++ b/OpenSim/ApplicationPlugins/CreateCommsManager/CreateCommsManagerPlugin.cs
@@ -186,6 +186,8 @@ namespace OpenSim.ApplicationPlugins.CreateCommsManager
m_httpServer.AddStreamHandler(new OpenSim.SimStatusHandler());
m_httpServer.AddStreamHandler(new OpenSim.XSimStatusHandler(m_openSim));
+ if(m_openSim.userStatsURI != String.Empty )
+ m_httpServer.AddStreamHandler(new OpenSim.UXSimStatusHandler(m_openSim));
}
protected virtual void InitialiseHGStandaloneServices(LibraryRootFolder libraryRootFolder)
diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs
index a0f536a7a0..4c107c9de3 100644
--- a/OpenSim/Framework/RegionInfo.cs
+++ b/OpenSim/Framework/RegionInfo.cs
@@ -211,6 +211,8 @@ namespace OpenSim.Framework
public int ProxyOffset = 0;
public string RegionName = String.Empty;
public string regionSecret = UUID.Random().ToString();
+
+ public string osSecret;
public UUID lastMapUUID = UUID.Zero;
public string lastMapRefresh = "0";
diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
index 483f8b6c30..e03713ec67 100644
--- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs
+++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
@@ -79,6 +79,11 @@ namespace OpenSim.Framework.Servers
protected string m_version;
protected string m_pidFile = String.Empty;
+
+ ///
+ /// Random uuid for private data
+ ///
+ protected string m_osSecret = String.Empty;
protected BaseHttpServer m_httpServer;
public BaseHttpServer HttpServer
@@ -95,6 +100,9 @@ namespace OpenSim.Framework.Servers
{
m_startuptime = DateTime.Now;
m_version = VersionInfo.Version;
+
+ // Random uuid for private data
+ m_osSecret = UUID.Random().ToString();
m_periodicDiagnosticsTimer.Elapsed += new ElapsedEventHandler(LogDiagnostics);
m_periodicDiagnosticsTimer.Enabled = true;
@@ -458,12 +466,18 @@ namespace OpenSim.Framework.Servers
{
}
}
+
+ public string osSecret {
+ // Secret uuid for the simulator
+ get { return m_osSecret; }
+
+ }
public string StatReport(OSHttpRequest httpRequest)
{
return m_stats.XReport((DateTime.Now - m_startuptime).ToString() , m_version );
}
-
+
protected void RemovePIDFile()
{
if (m_pidFile != String.Empty)
diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs
index 2203e454cb..af7b707d07 100644
--- a/OpenSim/Region/Application/OpenSimBase.cs
+++ b/OpenSim/Region/Application/OpenSimBase.cs
@@ -65,6 +65,8 @@ namespace OpenSim
protected string proxyUrl;
protected int proxyOffset = 0;
+
+ public string userStatsURI = String.Empty;
protected bool m_autoCreateClientStack = true;
@@ -189,6 +191,9 @@ namespace OpenSim
string pidFile = startupConfig.GetString("PIDFile", String.Empty);
if (pidFile != String.Empty)
CreatePIDFile(pidFile);
+
+ userStatsURI = startupConfig.GetString("Stats_URI", String.Empty);
+
}
base.StartupSpecific();
@@ -508,7 +513,9 @@ namespace OpenSim
// set initial ServerURI
regionInfo.ServerURI = "http://" + regionInfo.ExternalHostName + ":" + regionInfo.InternalEndPoint.Port;
regionInfo.HttpPort = m_httpServerPort;
-
+
+ regionInfo.osSecret = m_osSecret;
+
if ((proxyUrl.Length > 0) && (portadd_flag))
{
// set proxy url to RegionInfo
@@ -543,7 +550,10 @@ namespace OpenSim
scene.LoadPrimsFromStorage(regionInfo.originRegionID);
scene.StartTimer();
-
+
+ // TODO : Try setting resource for region xstats here on scene
+ scene.CommsManager.HttpServer.AddStreamHandler( new Region.Framework.Scenes.RegionStatsHandler(regionInfo));
+
// moved these here as the terrain texture has to be created after the modules are initialized
// and has to happen before the region is registered with the grid.
scene.CreateTerrainTexture(false);
@@ -813,16 +823,18 @@ namespace OpenSim
}
///
- /// Handler to supply the current extended status of this sim
+ /// Handler to supply the current extended status of this sim
+ /// Sends the statistical data in a json serialization
///
- /// Sends the statistical data in a json serialization
public class XSimStatusHandler : IStreamedRequestHandler
{
OpenSimBase m_opensim;
+ string osXStatsURI = String.Empty;
public XSimStatusHandler(OpenSimBase sim)
{
m_opensim = sim;
+ osXStatsURI = Util.SHA1Hash(sim.osSecret);
}
public byte[] Handle(string path, Stream request,
@@ -842,11 +854,50 @@ namespace OpenSim
}
public string Path
- {
- get { return "/simstatusx/"; }
+ {
+ // This is for the OpenSim instance and is the osSecret hashed
+ get { return "/" + osXStatsURI + "/"; }
}
}
+ ///
+ /// Handler to supply the current extended status of this sim
+ /// Sends the statistical data in a json serialization
+ ///
+ public class UXSimStatusHandler : IStreamedRequestHandler
+ {
+ OpenSimBase m_opensim;
+ string osUXStatsURI = String.Empty;
+
+ public UXSimStatusHandler(OpenSimBase sim)
+ {
+ m_opensim = sim;
+ osUXStatsURI = sim.userStatsURI;
+
+ }
+
+ public byte[] Handle(string path, Stream request,
+ OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+ {
+ return Encoding.UTF8.GetBytes(m_opensim.StatReport(httpRequest));
+ }
+
+ public string ContentType
+ {
+ get { return "text/plain"; }
+ }
+
+ public string HttpMethod
+ {
+ get { return "GET"; }
+ }
+
+ public string Path
+ {
+ // This is for the OpenSim instance and is the osSecret hashed
+ get { return "/" + osUXStatsURI + "/"; }
+ }
+ }
#endregion
@@ -906,6 +957,7 @@ namespace OpenSim
}
}
+
public class OpenSimConfigSource
{
public IConfigSource Source;
diff --git a/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs b/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs
new file mode 100644
index 0000000000..f5214903ff
--- /dev/null
+++ b/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs
@@ -0,0 +1,115 @@
+/*
+ * 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.IO;
+using System.Net;
+using System.Reflection;
+using System.Text;
+using log4net;
+using Nini.Config;
+using OpenMetaverse;
+using OpenMetaverse.StructuredData;
+using OpenSim.Framework;
+using OpenSim.Framework.Communications;
+using OpenSim.Framework.Communications.Services;
+using OpenSim.Framework.Communications.Cache;
+using OpenSim.Framework.Console;
+using OpenSim.Framework.Servers;
+using OpenSim.Framework.Servers.Interfaces;
+using OpenSim.Framework.Statistics;
+using OpenSim.Region.Framework;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+
+
+
+namespace OpenSim.Region.Framework.Scenes
+{
+
+
+ public class RegionStatsHandler : IStreamedRequestHandler
+ {
+
+ private string osRXStatsURI = String.Empty;
+ private string osXStatsURI = String.Empty;
+ private string osSecret = String.Empty;
+ private OpenSim.Framework.RegionInfo regionInfo;
+ public string localZone = TimeZone.CurrentTimeZone.StandardName;
+ public TimeSpan utcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now);
+
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ public RegionStatsHandler(OpenSim.Framework.RegionInfo region_info )
+ {
+ regionInfo = region_info;
+ osRXStatsURI = Util.SHA1Hash(regionInfo.regionSecret);
+ osXStatsURI = Util.SHA1Hash(regionInfo.osSecret);
+
+ }
+
+ public byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+ {
+ return Encoding.UTF8.GetBytes(Report());
+ }
+
+ public string ContentType
+ {
+ get { return "text/plain"; }
+ }
+
+ public string HttpMethod
+ {
+ get { return "GET"; }
+ }
+
+ public string Path
+ {
+ // This is for the region and is the regionSecret hashed
+ get { return "/" + osRXStatsURI + "/"; }
+ }
+
+ private string Report()
+ {
+
+ OSDMap args = new OSDMap(30);
+ int time = Util.ToUnixTime( DateTime.Now );
+ args["OSStatsURI"] = OSD.FromString("http://" + regionInfo.ExternalHostName + ":" + regionInfo.HttpPort + "/" + osXStatsURI + "/");
+ args["TimeZoneName"] = OSD.FromString(localZone);
+ args["TimeZoneOffs"] = OSD.FromReal(utcOffset.TotalHours);
+ args["UxTime"] = OSD.FromInteger(Util.ToUnixTime(DateTime.Now));
+ args["Memory"] = OSD.FromReal(Math.Round(GC.GetTotalMemory(false) / 1024.0 / 1024.0));
+ args["Version"] = OSD.FromString(VersionInfo.Version);
+
+ string strBuffer = "";
+ strBuffer = OSDParser.SerializeJsonString(args);
+
+ return strBuffer;
+
+ }
+ }
+}
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example
index 3130bf0307..c210a9b9c2 100644
--- a/bin/OpenSim.ini.example
+++ b/bin/OpenSim.ini.example
@@ -255,6 +255,10 @@
; enableprejump = true
+ ; Simulator Stats URI
+ ; Enable JSON simulator data by setting a URI name (case sensitive)
+ ; Stats_URI = "jsonSimStats"
+
[SMTP]
enabled=false