Added a "Traffic Info" page to webadmin. 99% of the patch have been done

by BrianC, so thanks again.


git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@1958 726aef4b-f618-498e-8847-2d620e286838
This commit is contained in:
cflakes
2010-05-01 12:04:44 +00:00
parent 8698349134
commit 895f077084
2 changed files with 152 additions and 5 deletions
+58 -5
View File
@@ -29,6 +29,7 @@ public:
vParams.push_back(make_pair("user", ""));
AddSubPage(new CWebSubPage("settings", "Global Settings", CWebSubPage::F_ADMIN));
AddSubPage(new CWebSubPage("edituser", "Your Settings", vParams));
AddSubPage(new CWebSubPage("traffic", "Traffic Info", CWebSubPage::F_ADMIN));
AddSubPage(new CWebSubPage("listusers", "List Users", CWebSubPage::F_ADMIN));
AddSubPage(new CWebSubPage("adduser", "Add User", CWebSubPage::F_ADMIN));
}
@@ -363,12 +364,10 @@ public:
WebSock.PrintErrorPage("No such username");
return true;
} else if (sPageName == "listusers") {
if (!spSession->IsAdmin()) {
return false;
}
} else if (sPageName == "listusers" && spSession->IsAdmin()) {
return ListUsersPage(WebSock, Tmpl);
} else if (sPageName == "traffic" && spSession->IsAdmin()) {
return TrafficPage(WebSock, Tmpl);
} else if (sPageName.empty() || sPageName == "index") {
return true;
}
@@ -747,6 +746,60 @@ public:
return true;
}
bool TrafficPage(CWebSock& WebSock, CTemplate& Tmpl) {
CSmartPtr<CWebSession> spSession = WebSock.GetSession();
Tmpl["Uptime"] = CZNC::Get().GetUptime();
if (spSession->IsAdmin()) {
const map<CString,CUser*>& msUsers = CZNC::Get().GetUserMap();
Tmpl["TotalUsers"] = CString(msUsers.size());
unsigned int uiAttached = 0, uiClients = 0, uiServers = 0;
for (map<CString,CUser*>::const_iterator it = msUsers.begin(); it != msUsers.end(); ++it) {
CUser& User = *it->second;
if (User.IsUserAttached()) {
uiAttached++;
}
if (User.IsIRCConnected()) {
uiServers++;
}
uiClients += User.GetClients().size();
}
Tmpl["AttachedUsers"] = CString(uiAttached);
Tmpl["TotalCConnections"] = CString(uiClients);
Tmpl["TotalIRCConnections"] = CString(uiServers);
CZNC::TrafficStatsPair Users, ZNC, Total;
CZNC::TrafficStatsMap traffic = CZNC::Get().GetTrafficStats(Users, ZNC, Total);
CZNC::TrafficStatsMap::const_iterator it;
for (it = traffic.begin(); it != traffic.end(); ++it) {
CTemplate& l = Tmpl.AddRow("TrafficLoop");
l["Username"] = it->first;
l["In"] = CString::ToByteStr(it->second.first);
l["Out"] = CString::ToByteStr(it->second.second);
l["Total"] = CString::ToByteStr(it->second.first + it->second.second);
}
Tmpl["UserIn"] = CString::ToByteStr(Users.first);
Tmpl["UserOut"] = CString::ToByteStr(Users.second);
Tmpl["UserTotal"] = CString::ToByteStr(Users.first + Users.second);
Tmpl["ZNCIn"] = CString::ToByteStr(ZNC.first);
Tmpl["ZNCOut"] = CString::ToByteStr(ZNC.second);
Tmpl["ZNCTotal"] = CString::ToByteStr(ZNC.first + ZNC.second);
Tmpl["AllIn"] = CString::ToByteStr(Total.first);
Tmpl["AllOut"] = CString::ToByteStr(Total.second);
Tmpl["AllTotal"] = CString::ToByteStr(Total.first + Total.second);
}
return true;
}
bool SettingsPage(CWebSock& WebSock, CTemplate& Tmpl) {
if (!WebSock.GetParam("submitted").ToUInt()) {
CString sVHosts, sMotd;
+94
View File
@@ -0,0 +1,94 @@
<? INC Header.tmpl ?>
<div class="textsection">
<div class="section">
<h3>Information</h3>
<div class="sectionbg">
<div class="sectionbody">
<table>
<tbody>
<tr class="oddrow">
<td>Uptime</td>
<td><? VAR Uptime ?></td>
</tr>
<? IF IsAdmin ?>
<tr class="evenrow">
<td>Total Users</td>
<td><? VAR TotalUsers ?></td>
</tr>
<tr class="oddrow">
<td>Attached Users</td>
<td><? VAR AttachedUsers ?></td>
</tr>
<tr class="evenrow">
<td>Total Client Connections</td>
<td><? VAR TotalCConnections ?></td>
</tr>
<tr class="oddrow">
<td>Total IRC Connections</td>
<td><? VAR TotalIRCConnections ?></td>
</tr>
<? ENDIF ?>
</tbody>
</table>
</div>
</div>
</div>
<? IF IsAdmin && TrafficLoop ?>
<div class="section">
<h3>Traffic</h3>
<div class="sectionbg">
<div class="sectionbody">
<table>
<thead>
<tr>
<td>Username</td>
<td>In</td>
<td>Out</td>
<td>Total</td>
</tr>
</thead>
<tbody>
<? LOOP TrafficLoop SORTASC=Username ?>
<tr class="<? IF __EVEN__ ?>evenrow<? ELSE ?>oddrow<? ENDIF ?>">
<td><? VAR Username ?></td>
<td><? VAR In ?></td>
<td><? VAR Out ?></td>
<td><? VAR Total ?></td>
</tr>
<? REM ?>Add the totals separately so that if sort is ever used they stay at the bottom
By keeping them inside the loop we can figure out even/odd classes though.
<? ENDREM ?>
<? IF __LAST__ ?>
<tr class="<? IF __EVEN__ ?>oddrow<? ELSE ?>evenrow<? ENDIF ?>">
<td>User Total</td>
<td><? VAR UserIn TOP ?></td>
<td><? VAR UserOut TOP ?></td>
<td><? VAR UserTotal TOP ?></td>
</tr>
<tr class="<? IF __EVEN__ ?>evenrow<? ELSE ?>oddrow<? ENDIF ?>">
<td>ZNC Total</td>
<td><? VAR ZNCIn TOP ?></td>
<td><? VAR ZNCOut TOP ?></td>
<td><? VAR ZNCTotal TOP ?></td>
</tr>
<tr class="<? IF __EVEN__ ?>oddrow<? ELSE ?>evenrow<? ENDIF ?>">
<td>Grand Total</td>
<td><? VAR AllIn TOP ?></td>
<td><? VAR AllOut TOP ?></td>
<td><? VAR AllTotal TOP ?></td>
</tr>
<? ENDIF ?>
<? ENDLOOP ?>
</tbody>
</table>
</div>
</div>
</div>
<? ENDIF ?>
</div>
<? INC Footer.tmpl ?>