* Added session report.
** Full or two criteria. UserID, or VersionString * Added link to session report from client report.0.6.2-post-fixes
parent
b97a51d7d0
commit
95984e0587
|
@ -71,6 +71,8 @@ namespace OpenSim.Region.UserStatistics
|
||||||
totalregions = Convert.ToInt32(sdr["regcnt"]);
|
totalregions = Convert.ToInt32(sdr["regcnt"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sdr.Close();
|
||||||
|
sdr.Dispose();
|
||||||
|
|
||||||
sql =
|
sql =
|
||||||
"select client_version, count(*) as cnt, avg(avg_sim_fps) as simfps from stats_session_data group by client_version order by count(*) desc LIMIT 10;";
|
"select client_version, count(*) as cnt, avg(avg_sim_fps) as simfps from stats_session_data group by client_version order by count(*) desc LIMIT 10;";
|
||||||
|
@ -197,7 +199,8 @@ TD.align_top { vertical-align: top; }
|
||||||
{
|
{
|
||||||
HTMLUtil.TR_O(ref output, "");
|
HTMLUtil.TR_O(ref output, "");
|
||||||
HTMLUtil.TD_O(ref output, "content");
|
HTMLUtil.TD_O(ref output, "content");
|
||||||
output.Append(cvd.version);
|
string linkhref = "sessions.report?VersionString=" + cvd.version;
|
||||||
|
HTMLUtil.A(ref output, cvd.version, linkhref, "");
|
||||||
HTMLUtil.TD_C(ref output);
|
HTMLUtil.TD_C(ref output);
|
||||||
HTMLUtil.TD_O(ref output, "content");
|
HTMLUtil.TD_O(ref output, "content");
|
||||||
output.Append(cvd.count);
|
output.Append(cvd.count);
|
||||||
|
|
|
@ -49,12 +49,28 @@ namespace OpenSim.Region.UserStatistics
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void TD_O(ref StringBuilder o, string pclass)
|
public static void TD_O(ref StringBuilder o, string pclass)
|
||||||
|
{
|
||||||
|
TD_O(ref o, pclass, 0, 0);
|
||||||
|
}
|
||||||
|
public static void TD_O(ref StringBuilder o, string pclass, int rowspan, int colspan)
|
||||||
{
|
{
|
||||||
o.Append("<td");
|
o.Append("<td");
|
||||||
if (pclass.Length > 0)
|
if (pclass.Length > 0)
|
||||||
{
|
{
|
||||||
GenericClass(ref o, pclass);
|
GenericClass(ref o, pclass);
|
||||||
}
|
}
|
||||||
|
if (rowspan > 1)
|
||||||
|
{
|
||||||
|
o.Append(" rowspan=\"");
|
||||||
|
o.Append(rowspan);
|
||||||
|
o.Append("\"");
|
||||||
|
}
|
||||||
|
if (colspan > 1)
|
||||||
|
{
|
||||||
|
o.Append(" colspan=\"");
|
||||||
|
o.Append(colspan);
|
||||||
|
o.Append("\"");
|
||||||
|
}
|
||||||
o.Append(">");
|
o.Append(">");
|
||||||
}
|
}
|
||||||
public static void TD_C(ref StringBuilder o)
|
public static void TD_C(ref StringBuilder o)
|
||||||
|
@ -220,21 +236,25 @@ namespace OpenSim.Region.UserStatistics
|
||||||
{
|
{
|
||||||
o.Append("| ");
|
o.Append("| ");
|
||||||
}
|
}
|
||||||
|
A(ref o, reports[str].ReportName, str, pClass);
|
||||||
o.Append("<A");
|
o.Append(" ");
|
||||||
if (pClass.Length > 0)
|
|
||||||
{
|
|
||||||
GenericClass(ref o, pClass);
|
|
||||||
|
|
||||||
}
|
|
||||||
o.Append(" href=\"");
|
|
||||||
o.Append(str);
|
|
||||||
o.Append("\">");
|
|
||||||
o.Append(reports[str].ReportName);
|
|
||||||
o.Append("</A> ");
|
|
||||||
repcount++;
|
repcount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public static void A( ref StringBuilder o, string linktext, string linkhref, string pClass)
|
||||||
|
{
|
||||||
|
o.Append("<A");
|
||||||
|
if (pClass.Length > 0)
|
||||||
|
{
|
||||||
|
GenericClass(ref o, pClass);
|
||||||
|
}
|
||||||
|
o.Append(" href=\"");
|
||||||
|
o.Append(linkhref);
|
||||||
|
o.Append("\">");
|
||||||
|
o.Append(linktext);
|
||||||
|
o.Append("</A>");
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,260 @@
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using Mono.Data.SqliteClient;
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.UserStatistics
|
||||||
|
{
|
||||||
|
public class Sessions_Report : IStatsController
|
||||||
|
{
|
||||||
|
#region IStatsController Members
|
||||||
|
|
||||||
|
public string ReportName
|
||||||
|
{
|
||||||
|
get { return "Sessions"; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public Hashtable ProcessModel(Hashtable pParams)
|
||||||
|
{
|
||||||
|
Hashtable modeldata = new Hashtable();
|
||||||
|
modeldata.Add("Scenes", pParams["Scenes"]);
|
||||||
|
modeldata.Add("Reports", pParams["Reports"]);
|
||||||
|
SqliteConnection dbConn = (SqliteConnection)pParams["DatabaseConnection"];
|
||||||
|
List<SessionList> lstSessions = new List<SessionList>();
|
||||||
|
Hashtable requestvars = (Hashtable) pParams["RequestVars"];
|
||||||
|
|
||||||
|
string puserUUID = string.Empty;
|
||||||
|
string clientVersionString = string.Empty;
|
||||||
|
int queryparams = 0;
|
||||||
|
|
||||||
|
if (requestvars.ContainsKey("UserID"))
|
||||||
|
{
|
||||||
|
UUID testUUID = UUID.Zero;
|
||||||
|
if (UUID.TryParse(requestvars["UserID"].ToString(), out testUUID))
|
||||||
|
{
|
||||||
|
puserUUID = requestvars["UserID"].ToString();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (requestvars.ContainsKey("VersionString"))
|
||||||
|
{
|
||||||
|
UUID testUUID = UUID.Zero;
|
||||||
|
|
||||||
|
clientVersionString = requestvars["VersionString"].ToString();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (dbConn)
|
||||||
|
{
|
||||||
|
string sql =
|
||||||
|
"SELECT distinct a.name_f, a.name_l, a.Agent_ID, b.Session_ID, b.client_version, b.last_updated FROM stats_session_data a LEFT OUTER JOIN stats_session_data b ON a.Agent_ID = b.Agent_ID";
|
||||||
|
|
||||||
|
if (puserUUID.Length > 0)
|
||||||
|
{
|
||||||
|
if (queryparams == 0)
|
||||||
|
sql += " WHERE";
|
||||||
|
else
|
||||||
|
sql += " AND";
|
||||||
|
|
||||||
|
sql += " b.agent_id=:agent_id";
|
||||||
|
queryparams++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (clientVersionString.Length > 0)
|
||||||
|
{
|
||||||
|
if (queryparams == 0)
|
||||||
|
sql += " WHERE";
|
||||||
|
else
|
||||||
|
sql += " AND";
|
||||||
|
|
||||||
|
sql += " b.client_version=:client_version";
|
||||||
|
queryparams++;
|
||||||
|
}
|
||||||
|
|
||||||
|
sql += " ORDER BY a.name_f, a.name_l, b.last_updated;";
|
||||||
|
|
||||||
|
SqliteCommand cmd = new SqliteCommand(sql, dbConn);
|
||||||
|
|
||||||
|
if (puserUUID.Length > 0)
|
||||||
|
cmd.Parameters.Add(new SqliteParameter(":agent_id", puserUUID));
|
||||||
|
if (clientVersionString.Length > 0)
|
||||||
|
cmd.Parameters.Add(new SqliteParameter(":client_version", clientVersionString));
|
||||||
|
|
||||||
|
SqliteDataReader sdr = cmd.ExecuteReader();
|
||||||
|
|
||||||
|
if (sdr.HasRows)
|
||||||
|
{
|
||||||
|
UUID userUUID = UUID.Zero;
|
||||||
|
|
||||||
|
SessionList activeSessionList = new SessionList();
|
||||||
|
activeSessionList.user_id=UUID.Random();
|
||||||
|
while(sdr.Read())
|
||||||
|
{
|
||||||
|
UUID readUUID = UUID.Parse(sdr["agent_id"].ToString());
|
||||||
|
if (readUUID != userUUID)
|
||||||
|
{
|
||||||
|
activeSessionList = new SessionList();
|
||||||
|
activeSessionList.user_id = readUUID;
|
||||||
|
activeSessionList.firstname = sdr["name_f"].ToString();
|
||||||
|
activeSessionList.lastname = sdr["name_l"].ToString();
|
||||||
|
activeSessionList.sessions = new List<ShortSessionData>();
|
||||||
|
lstSessions.Add(activeSessionList);
|
||||||
|
}
|
||||||
|
|
||||||
|
ShortSessionData ssd = new ShortSessionData();
|
||||||
|
|
||||||
|
ssd.last_update = Utils.UnixTimeToDateTime((uint)Convert.ToInt32(sdr["last_updated"]));
|
||||||
|
ssd.session_id = UUID.Parse(sdr["session_id"].ToString());
|
||||||
|
ssd.client_version = sdr["client_version"].ToString();
|
||||||
|
activeSessionList.sessions.Add(ssd);
|
||||||
|
|
||||||
|
userUUID = activeSessionList.user_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sdr.Close();
|
||||||
|
sdr.Dispose();
|
||||||
|
|
||||||
|
}
|
||||||
|
modeldata["SessionData"] = lstSessions;
|
||||||
|
return modeldata;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string RenderView(Hashtable pModelResult)
|
||||||
|
{
|
||||||
|
List<SessionList> lstSession = (List<SessionList>) pModelResult["SessionData"];
|
||||||
|
Dictionary<string, IStatsController> reports = (Dictionary<string, IStatsController>)pModelResult["Reports"];
|
||||||
|
|
||||||
|
const string STYLESHEET =
|
||||||
|
@"
|
||||||
|
<STYLE>
|
||||||
|
body
|
||||||
|
{
|
||||||
|
font-size:15px; font-family:Helvetica, Verdana; color:Black;
|
||||||
|
}
|
||||||
|
TABLE.defaultr { }
|
||||||
|
TR.defaultr { padding: 5px; }
|
||||||
|
TD.header { font-weight:bold; padding:5px; }
|
||||||
|
TD.content {}
|
||||||
|
TD.contentright { text-align: right; }
|
||||||
|
TD.contentcenter { text-align: center; }
|
||||||
|
TD.align_top { vertical-align: top; }
|
||||||
|
</STYLE>
|
||||||
|
";
|
||||||
|
|
||||||
|
StringBuilder output = new StringBuilder();
|
||||||
|
HTMLUtil.HtmlHeaders_O(ref output);
|
||||||
|
output.Append(STYLESHEET);
|
||||||
|
HTMLUtil.HtmlHeaders_C(ref output);
|
||||||
|
|
||||||
|
HTMLUtil.AddReportLinks(ref output, reports, "");
|
||||||
|
|
||||||
|
HTMLUtil.TABLE_O(ref output, "defaultr");
|
||||||
|
HTMLUtil.TR_O(ref output, "defaultr");
|
||||||
|
HTMLUtil.TD_O(ref output, "header");
|
||||||
|
output.Append("FirstName");
|
||||||
|
HTMLUtil.TD_C(ref output);
|
||||||
|
HTMLUtil.TD_O(ref output, "header");
|
||||||
|
output.Append("LastName");
|
||||||
|
HTMLUtil.TD_C(ref output);
|
||||||
|
HTMLUtil.TD_O(ref output, "header");
|
||||||
|
output.Append("SessionEnd");
|
||||||
|
HTMLUtil.TD_C(ref output);
|
||||||
|
HTMLUtil.TD_O(ref output, "header");
|
||||||
|
output.Append("Client");
|
||||||
|
HTMLUtil.TD_C(ref output);
|
||||||
|
HTMLUtil.TR_C(ref output);
|
||||||
|
if (lstSession.Count == 0)
|
||||||
|
{
|
||||||
|
HTMLUtil.TR_O(ref output, "");
|
||||||
|
HTMLUtil.TD_O(ref output, "align_top", 1, 4);
|
||||||
|
output.Append("No results for that query");
|
||||||
|
HTMLUtil.TD_C(ref output);
|
||||||
|
HTMLUtil.TR_C(ref output);
|
||||||
|
}
|
||||||
|
foreach (SessionList ssnlst in lstSession)
|
||||||
|
{
|
||||||
|
int cnt = 0;
|
||||||
|
foreach (ShortSessionData sesdata in ssnlst.sessions)
|
||||||
|
{
|
||||||
|
HTMLUtil.TR_O(ref output, "");
|
||||||
|
if (cnt++ == 0)
|
||||||
|
{
|
||||||
|
HTMLUtil.TD_O(ref output, "align_top", ssnlst.sessions.Count, 1);
|
||||||
|
output.Append(ssnlst.firstname);
|
||||||
|
HTMLUtil.TD_C(ref output);
|
||||||
|
HTMLUtil.TD_O(ref output, "align_top", ssnlst.sessions.Count, 1);
|
||||||
|
output.Append(ssnlst.lastname);
|
||||||
|
HTMLUtil.TD_C(ref output);
|
||||||
|
}
|
||||||
|
HTMLUtil.TD_O(ref output, "content");
|
||||||
|
output.Append(sesdata.last_update.ToShortDateString());
|
||||||
|
output.Append(" - ");
|
||||||
|
output.Append(sesdata.last_update.ToShortTimeString());
|
||||||
|
HTMLUtil.TD_C(ref output);
|
||||||
|
HTMLUtil.TD_O(ref output, "content");
|
||||||
|
output.Append(sesdata.client_version);
|
||||||
|
HTMLUtil.TD_C(ref output);
|
||||||
|
HTMLUtil.TR_C(ref output);
|
||||||
|
|
||||||
|
}
|
||||||
|
HTMLUtil.TR_O(ref output, "");
|
||||||
|
HTMLUtil.TD_O(ref output, "align_top", 1, 4);
|
||||||
|
HTMLUtil.HR(ref output, "");
|
||||||
|
HTMLUtil.TD_C(ref output);
|
||||||
|
HTMLUtil.TR_C(ref output);
|
||||||
|
}
|
||||||
|
HTMLUtil.TABLE_C(ref output);
|
||||||
|
output.Append("</BODY>\n</HTML>");
|
||||||
|
return output.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SessionList
|
||||||
|
{
|
||||||
|
public string firstname;
|
||||||
|
public string lastname;
|
||||||
|
public UUID user_id;
|
||||||
|
public List<ShortSessionData> sessions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct ShortSessionData
|
||||||
|
{
|
||||||
|
public UUID session_id;
|
||||||
|
public string client_version;
|
||||||
|
public DateTime last_update;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
|
@ -106,6 +106,7 @@ namespace OpenSim.Region.UserStatistics
|
||||||
SimStatsAJAX ajSimStats = new SimStatsAJAX();
|
SimStatsAJAX ajSimStats = new SimStatsAJAX();
|
||||||
LogLinesAJAX ajLogLines = new LogLinesAJAX();
|
LogLinesAJAX ajLogLines = new LogLinesAJAX();
|
||||||
Clients_report clientReport = new Clients_report();
|
Clients_report clientReport = new Clients_report();
|
||||||
|
Sessions_Report sessionsReport = new Sessions_Report();
|
||||||
|
|
||||||
reports.Add("", rep);
|
reports.Add("", rep);
|
||||||
reports.Add("prototype.js", protodep);
|
reports.Add("prototype.js", protodep);
|
||||||
|
@ -114,6 +115,18 @@ namespace OpenSim.Region.UserStatistics
|
||||||
reports.Add("simstatsajax.ajax", ajSimStats);
|
reports.Add("simstatsajax.ajax", ajSimStats);
|
||||||
reports.Add("activelogajax.ajax", ajLogLines);
|
reports.Add("activelogajax.ajax", ajLogLines);
|
||||||
reports.Add("clients.report", clientReport);
|
reports.Add("clients.report", clientReport);
|
||||||
|
reports.Add("sessions.report", sessionsReport);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
////
|
||||||
|
// Add Your own Reports here (Do Not Modify Lines here Devs!)
|
||||||
|
////
|
||||||
|
|
||||||
|
////
|
||||||
|
// End Own reports section
|
||||||
|
////
|
||||||
|
|
||||||
|
|
||||||
scene.CommsManager.HttpServer.AddHTTPHandler("/SStats/", HandleStatsRequest);
|
scene.CommsManager.HttpServer.AddHTTPHandler("/SStats/", HandleStatsRequest);
|
||||||
scene.CommsManager.HttpServer.AddHTTPHandler("/CAPS/VS/", HandleUnknownCAPSRequest);
|
scene.CommsManager.HttpServer.AddHTTPHandler("/CAPS/VS/", HandleUnknownCAPSRequest);
|
||||||
|
@ -190,6 +203,9 @@ namespace OpenSim.Region.UserStatistics
|
||||||
IStatsController rep = reports[regpath];
|
IStatsController rep = reports[regpath];
|
||||||
Hashtable repParams = new Hashtable();
|
Hashtable repParams = new Hashtable();
|
||||||
|
|
||||||
|
repParams["RequestVars"] = request["requestvars"];
|
||||||
|
repParams["QueryStringKeys"] = request["querystringkeys"];
|
||||||
|
|
||||||
repParams["DatabaseConnection"] = dbConn;
|
repParams["DatabaseConnection"] = dbConn;
|
||||||
repParams["Scenes"] = m_scene;
|
repParams["Scenes"] = m_scene;
|
||||||
repParams["SimStats"] = m_simstatsCounters;
|
repParams["SimStats"] = m_simstatsCounters;
|
||||||
|
|
Loading…
Reference in New Issue