From 95984e05876136cee464b3ecdc66d3cf36aac353 Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Wed, 7 Jan 2009 23:20:23 +0000 Subject: * Added session report. ** Full or two criteria. UserID, or VersionString * Added link to session report from client report. --- OpenSim/Region/UserStatistics/Clients_report.cs | 5 +- OpenSim/Region/UserStatistics/HTMLUtil.cs | 44 ++-- OpenSim/Region/UserStatistics/Sessions_Report.cs | 260 +++++++++++++++++++++++ OpenSim/Region/UserStatistics/WebStatsModule.cs | 16 ++ 4 files changed, 312 insertions(+), 13 deletions(-) create mode 100644 OpenSim/Region/UserStatistics/Sessions_Report.cs diff --git a/OpenSim/Region/UserStatistics/Clients_report.cs b/OpenSim/Region/UserStatistics/Clients_report.cs index bc43e18..69514fb 100644 --- a/OpenSim/Region/UserStatistics/Clients_report.cs +++ b/OpenSim/Region/UserStatistics/Clients_report.cs @@ -71,6 +71,8 @@ namespace OpenSim.Region.UserStatistics totalregions = Convert.ToInt32(sdr["regcnt"]); } + sdr.Close(); + sdr.Dispose(); 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;"; @@ -197,7 +199,8 @@ TD.align_top { vertical-align: top; } { HTMLUtil.TR_O(ref output, ""); 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_O(ref output, "content"); output.Append(cvd.count); diff --git a/OpenSim/Region/UserStatistics/HTMLUtil.cs b/OpenSim/Region/UserStatistics/HTMLUtil.cs index 173f75e..bd0c74a 100644 --- a/OpenSim/Region/UserStatistics/HTMLUtil.cs +++ b/OpenSim/Region/UserStatistics/HTMLUtil.cs @@ -50,11 +50,27 @@ namespace OpenSim.Region.UserStatistics 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(" 0) { 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(">"); } public static void TD_C(ref StringBuilder o) @@ -220,21 +236,25 @@ namespace OpenSim.Region.UserStatistics { o.Append("|  "); } - - o.Append(" 0) - { - GenericClass(ref o, pClass); - - } - o.Append(" href=\""); - o.Append(str); - o.Append("\">"); - o.Append(reports[str].ReportName); - o.Append("  "); + A(ref o, reports[str].ReportName, str, pClass); + o.Append("  "); repcount++; } } } + public static void A( ref StringBuilder o, string linktext, string linkhref, string pClass) + { + o.Append(" 0) + { + GenericClass(ref o, pClass); + } + o.Append(" href=\""); + o.Append(linkhref); + o.Append("\">"); + o.Append(linktext); + o.Append(""); + + } } } diff --git a/OpenSim/Region/UserStatistics/Sessions_Report.cs b/OpenSim/Region/UserStatistics/Sessions_Report.cs new file mode 100644 index 0000000..2eeb90d --- /dev/null +++ b/OpenSim/Region/UserStatistics/Sessions_Report.cs @@ -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 lstSessions = new List(); + 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(); + 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 lstSession = (List) pModelResult["SessionData"]; + Dictionary reports = (Dictionary)pModelResult["Reports"]; + + const string STYLESHEET = + @" + +"; + + 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("\n"); + return output.ToString(); + } + + public class SessionList + { + public string firstname; + public string lastname; + public UUID user_id; + public List sessions; + } + + public struct ShortSessionData + { + public UUID session_id; + public string client_version; + public DateTime last_update; + } + + #endregion + } +} diff --git a/OpenSim/Region/UserStatistics/WebStatsModule.cs b/OpenSim/Region/UserStatistics/WebStatsModule.cs index 8a640d0..efea515 100644 --- a/OpenSim/Region/UserStatistics/WebStatsModule.cs +++ b/OpenSim/Region/UserStatistics/WebStatsModule.cs @@ -106,6 +106,7 @@ namespace OpenSim.Region.UserStatistics SimStatsAJAX ajSimStats = new SimStatsAJAX(); LogLinesAJAX ajLogLines = new LogLinesAJAX(); Clients_report clientReport = new Clients_report(); + Sessions_Report sessionsReport = new Sessions_Report(); reports.Add("", rep); reports.Add("prototype.js", protodep); @@ -114,6 +115,18 @@ namespace OpenSim.Region.UserStatistics reports.Add("simstatsajax.ajax", ajSimStats); reports.Add("activelogajax.ajax", ajLogLines); 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("/CAPS/VS/", HandleUnknownCAPSRequest); @@ -190,6 +203,9 @@ namespace OpenSim.Region.UserStatistics IStatsController rep = reports[regpath]; Hashtable repParams = new Hashtable(); + repParams["RequestVars"] = request["requestvars"]; + repParams["QueryStringKeys"] = request["querystringkeys"]; + repParams["DatabaseConnection"] = dbConn; repParams["Scenes"] = m_scene; repParams["SimStats"] = m_simstatsCounters; -- cgit v1.1