Added Captive Portal RRD graphs, there are two graphs one for the number of logged in users since last rrd poll, and concurrent number of users logged in.

This commit is contained in:
Warren Baker 2011-01-28 17:16:19 +02:00
parent 9b2e42c9fa
commit 20413b72bf
5 changed files with 247 additions and 1 deletions

View File

@ -175,6 +175,8 @@ function enable_rrd_graphing() {
$mem = "-memory.rrd";
$cellular = "-cellular.rrd";
$vpnusers = "-vpnusers.rrd";
$captiveportalconcurrent = "-concurrent.rrd";
$captiveportalloggedin = "-loggedin.rrd";
$rrdtool = "/usr/bin/nice -n20 /usr/local/bin/rrdtool";
$netstat = "/usr/bin/netstat";
@ -186,6 +188,7 @@ function enable_rrd_graphing() {
$top = "/usr/bin/top";
$spamd_gather = "/usr/local/bin/spamd_gather_stats.php";
$ifconfig = "/sbin/ifconfig";
$captiveportal_gather = "/usr/local/bin/captiveportal_gather_stats.php";
$rrdtrafficinterval = 60;
$rrdwirelessinterval = 60;
@ -199,6 +202,7 @@ function enable_rrd_graphing() {
$rrdmeminterval = 60;
$rrdcellularinterval = 60;
$rrdvpninterval = 60;
$rrdcaptiveportalinterval = 60;
$trafficvalid = $rrdtrafficinterval * 2;
$wirelessvalid = $rrdwirelessinterval * 2;
@ -212,6 +216,7 @@ function enable_rrd_graphing() {
$memvalid = $rrdmeminterval * 2;
$cellularvalid = $rrdcellularinterval * 2;
$vpnvalid = $rrdvpninterval * 2;
$captiveportalvalid = $rrdcaptiveportalinterval * 2;
/* Asume GigE for now */
$downstream = 125000000;
@ -660,6 +665,78 @@ function enable_rrd_graphing() {
$rrdupdatesh .= "else $rrdtool update $rrddbpath$ifname$cellular N:U:U; fi\n";
}
/* Captive Portal statistics, set up the rrd file */
if(isset($config['captiveportal']['enable'])) {
$ifname= "captiveportal";
if (!file_exists("$rrddbpath$ifname$captiveportal")) {
$rrdcreate = "$rrdtool create $rrddbpath$ifname$captiveportalconcurrent --step $rrdcaptiveportalinterval ";
$rrdcreate .= "DS:concurrentusers:GAUGE:$captiveportalvalid:0:10000 ";
$rrdcreate .= "RRA:AVERAGE:0.5:1:1000 ";
$rrdcreate .= "RRA:AVERAGE:0.5:5:1000 ";
$rrdcreate .= "RRA:AVERAGE:0.5:60:1000 ";
$rrdcreate .= "RRA:AVERAGE:0.5:720:3000 ";
$rrdcreate .= "RRA:MIN:0.5:1:1000 ";
$rrdcreate .= "RRA:MIN:0.5:5:1000 ";
$rrdcreate .= "RRA:MIN:0.5:60:1000 ";
$rrdcreate .= "RRA:MIN:0.5:720:3000 ";
$rrdcreate .= "RRA:MAX:0.5:1:1000 ";
$rrdcreate .= "RRA:MAX:0.5:5:1000 ";
$rrdcreate .= "RRA:MAX:0.5:60:1000 ";
$rrdcreate .= "RRA:MAX:0.5:720:3000 ";
$rrdcreate .= "RRA:LAST:0.5:1:1000 ";
$rrdcreate .= "RRA:LAST:0.5:5:1000 ";
$rrdcreate .= "RRA:LAST:0.5:60:1000 ";
$rrdcreate .= "RRA:LAST:0.5:720:3000 ";
create_new_rrd($rrdcreate);
}
/* enter UNKNOWN values in the RRD so it knows we rebooted. */
if($g['booting']) {
mwexec("$rrdtool update $rrddbpath$ifname$captiveportalconcurrent N:U");
}
/* the Captive Portal stats gathering function. */
$rrdupdatesh .= "\n";
$rrdupdatesh .= "# polling Captive Portal for number of concurrent users\n";
$rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$captiveportalconcurrent \\\n";
$rrdupdatesh .= "`$php -q $captiveportal_gather concurrent`\n";
$ifname= "captiveportal";
if (!file_exists("$rrddbpath$ifname$captiveportal")) {
$rrdcreate = "$rrdtool create $rrddbpath$ifname$captiveportalloggedin --step $rrdcaptiveportalinterval ";
$rrdcreate .= "DS:loggedinusers:GAUGE:$captiveportalvalid:0:10000 ";
$rrdcreate .= "RRA:AVERAGE:0.5:1:1000 ";
$rrdcreate .= "RRA:AVERAGE:0.5:5:1000 ";
$rrdcreate .= "RRA:AVERAGE:0.5:60:1000 ";
$rrdcreate .= "RRA:AVERAGE:0.5:720:3000 ";
$rrdcreate .= "RRA:MIN:0.5:1:1000 ";
$rrdcreate .= "RRA:MIN:0.5:5:1000 ";
$rrdcreate .= "RRA:MIN:0.5:60:1000 ";
$rrdcreate .= "RRA:MIN:0.5:720:3000 ";
$rrdcreate .= "RRA:MAX:0.5:1:1000 ";
$rrdcreate .= "RRA:MAX:0.5:5:1000 ";
$rrdcreate .= "RRA:MAX:0.5:60:1000 ";
$rrdcreate .= "RRA:MAX:0.5:720:3000 ";
$rrdcreate .= "RRA:LAST:0.5:1:1000 ";
$rrdcreate .= "RRA:LAST:0.5:5:1000 ";
$rrdcreate .= "RRA:LAST:0.5:60:1000 ";
$rrdcreate .= "RRA:LAST:0.5:720:3000 ";
create_new_rrd($rrdcreate);
}
/* enter UNKNOWN values in the RRD so it knows we rebooted. */
if($g['booting']) {
mwexec("$rrdtool update $rrddbpath$ifname$captiveportalloggedin N:U");
}
/* the Captive Portal stats gathering function. */
$rrdupdatesh .= "\n";
$rrdupdatesh .= "# polling Captive Portal for number of logged in users and concurrent users\n";
$rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$captiveportalloggedin \\\n";
$rrdupdatesh .= "`$php -q $captiveportal_gather loggedin`\n";
}
$rrdupdatesh .= "sleep 60\n";
$rrdupdatesh .= "done\n";

View File

@ -0,0 +1,106 @@
#!/usr/local/bin/php -q
<?php
/* $Id$ */
/*
captiveportal_gather_stats.php
Copyright (C) 2011 Warren Baker
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. 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.
THIS SOFTWARE IS PROVIDED ``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
AUTHOR 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.
*/
require_once("functions.inc");
require_once("captiveportal.inc");
require_once("util.inc");
/* read in captive portal db */
$cpdb = captiveportal_read_db();
/* determine number of logged in users */
$no_users = count($cpdb);
$concurrent_users = $no_users;
/* set initial user count to zero */
$current_user_count = 0;
/* tmp file to use to store old data (per interface)*/
$tmpfile = "{$g['tmp_path']}/captiveportal_online_users";
$type = $argv[1];
if(empty($type))
exit;
/* echo the rrd required syntax */
echo "N:";
if ($type == "loggedin") {
/* Find out the previous user timestamp
* so we can determine the difference between the current
* and previous user count. If the file is empty return a 0.
*/
$fd = @fopen($tmpfile, "r");
if ($fd) {
while (!feof($fd)) {
$line = trim(fgets($fd));
if($line)
$previous_user_timestamp = $line;
else
$previous_user_timestamp = 0;
}
} else {
$previous_user_timestamp = 0;
}
@fclose($fd);
foreach($cpdb as $user) {
$user_ip = $user[2];
// Record the timestamp
$timestamp = $user[0];
if ($timestamp > $previous_user_timestamp)
$current_user_count = $current_user_count + 1;
}
// Write out the latest timestamp
$fd = @fopen($tmpfile, "w");
if ($fd) {
fwrite($fd, $timestamp);
}
@fclose($fd);
/* If $timestamp is less than or equal to previous_user_timestamp return 0,
* as we only want the 'X' number of users logged in since last RRD poll.
*/
if($timestamp <= $previous_user_timestamp)
$result = 0;
else {
$result = $current_user_count;
}
} else
$result = $no_users;
echo "$result";
?>

View File

@ -122,6 +122,9 @@ if ($_GET['option']) {
continue 2;
}
}
case "captiveportal":
$curoption = "allgraphs";
break;
default:
$curoption = "wan";
break;
@ -173,6 +176,7 @@ $dbheader = array("allgraphs-traffic.rrd",
"allgraphs-wireless.rrd",
"allgraphs-cellular.rrd",
"allgraphs-vpnusers.rrd",
"captiveportal-allgraphs.rrd",
"allgraphs-packets.rrd",
"system-allgraphs.rrd",
"system-throughput.rrd",
@ -196,6 +200,9 @@ foreach($databases as $database) {
if(stristr($database, "-vpnusers")) {
$vpnusers = true;
}
if(stristr($database, "captiveportal-") && isset($config['captiveportal']['enable'])) {
$captiveportal = true;
}
}
/* append the existing array to the header */
$ui_databases = array_merge($dbheader, $databases);
@ -344,6 +351,10 @@ function get_dates($curperiod, $graph) {
if($curcat == "vpnusers") { $tabactive = True; } else { $tabactive = False; }
$tab_array[] = array("VPN", $tabactive, "status_rrd_graph.php?cat=vpnusers");
}
if($captiveportal) {
if($curcat == "captiveportal") { $tabactive = True; } else { $tabactive = False; }
$tab_array[] = array("Captive Portal", $tabactive, "status_rrd_graph.php?cat=captiveportal");
}
if($curcat == "custom") { $tabactive = True; } else { $tabactive = False; }
$tab_array[] = array(gettext("Custom"), $tabactive, "status_rrd_graph.php?cat=custom");
if($curcat == "settings") { $tabactive = True; } else { $tabactive = False; }
@ -387,6 +398,11 @@ function get_dates($curperiod, $graph) {
$replace = array(" :: ", "", $friendly);
switch($curcat) {
case "captiveportal":
$optionc = str_replace($search, $replace, $optionc[1]);
echo "<option value=\"$optionc\"";
$prettyprint = ucwords(str_replace($search, $replace, $optionc));
break;
case "system":
$optionc = str_replace($search, $replace, $optionc[1]);
echo "<option value=\"$optionc\"";

View File

@ -209,6 +209,7 @@ if(file_exists($rrdcolors)) {
$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
$colorspamdconn = array('00AA00BB', 'FFFFFFFF', '00660088', 'FFFFFF88', '006600');
$colorvpnusers = array('990000');
$colorcaptiveportalusers = array('990000');
}
switch ($curstyle) {
@ -910,6 +911,44 @@ elseif((strstr($curdatabase, "-cellular.rrd")) && (file_exists("$rrddbpath$curda
$graphcmd .= "COMMENT:\"\\n\" ";
$graphcmd .= "COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t`date +\"%b %d %H\:%M\:%S %Y\"`\" ";
}
elseif((strstr($curdatabase, "-loggedin.rrd")) && (file_exists("$rrddbpath$curdatabase"))) {
/* define graphcmd for online Captive Portal users stats */
$graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png ";
$graphcmd .= "--start $start --end $end ";
$graphcmd .= "--vertical-label \"Captive Portal Users\" ";
$graphcmd .= "--color SHADEA#eeeeee --color SHADEB#eeeeee ";
$graphcmd .= "--title \"`hostname` - {$prettydb} - {$hperiod} - {$havg} average\" ";
$graphcmd .= "--height 200 --width 620 ";
$graphcmd .= "DEF:\"$curif-loggedinusers=$rrddbpath$curdatabase:loggedinusers:AVERAGE\" ";
$graphcmd .= "LINE2:\"$curif-loggedinusers#{$colorcaptiveportalusers[0]}:$curif-loggedinusers\" ";
$graphcmd .= "COMMENT:\"\\n\" ";
$graphcmd .= "COMMENT:\"\t\t\t current\t\t average\t maximum\\n\" ";
$graphcmd .= "COMMENT:\"Users Online\t\" ";
$graphcmd .= "GPRINT:\"$curif-loggedinusers:LAST:%7.2lf \" ";
$graphcmd .= "GPRINT:\"$curif-loggedinusers:AVERAGE:%7.2lf \" ";
$graphcmd .= "GPRINT:\"$curif-loggedinusers:MAX:%7.2lf \" ";
$graphcmd .= "COMMENT:\"\\n\" ";
$graphcmd .= "COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t`date +\"%b %d %H\:%M\:%S %Y\"`\" ";
}
elseif((strstr($curdatabase, "-concurrent.rrd")) && (file_exists("$rrddbpath$curdatabase"))) {
/* define graphcmd for online Captive Portal users stats */
$graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png ";
$graphcmd .= "--start $start --end $end ";
$graphcmd .= "--vertical-label \"Captive Portal Users\" ";
$graphcmd .= "--color SHADEA#eeeeee --color SHADEB#eeeeee ";
$graphcmd .= "--title \"`hostname` - {$prettydb} - {$hperiod} - {$havg} average\" ";
$graphcmd .= "--height 200 --width 620 ";
$graphcmd .= "DEF:\"$curif-concurrentusers=$rrddbpath$curdatabase:concurrentusers:AVERAGE\" ";
$graphcmd .= "LINE2:\"$curif-concurrentusers#{$colorcaptiveportalusers[0]}:$curif-concurrentusers\" ";
$graphcmd .= "COMMENT:\"\\n\" ";
$graphcmd .= "COMMENT:\"\t\t\t current\t\t average\t maximum\\n\" ";
$graphcmd .= "COMMENT:\"Users Online\t\" ";
$graphcmd .= "GPRINT:\"$curif-concurrentusers:LAST:%7.2lf \" ";
$graphcmd .= "GPRINT:\"$curif-concurrentusers:AVERAGE:%7.2lf \" ";
$graphcmd .= "GPRINT:\"$curif-concurrentusers:MAX:%7.2lf \" ";
$graphcmd .= "COMMENT:\"\\n\" ";
$graphcmd .= "COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t`date +\"%b %d %H\:%M\:%S %Y\"`\" ";
}
else {
$data = false;
log_error(sprintf(gettext("Sorry we do not have data to graph for %s"),$curdatabase));

View File

@ -54,7 +54,8 @@ $categories = array('system' => gettext("System"),
'traffic' => gettext("Traffic"),
'packets' => gettext("Packets"),
'quality' => gettext("Quality"),
'queues' => gettext("Queues"));
'queues' => gettext("Queues"),
'captiveportal' => gettext("Captive Portal"));
$styles = array('inverse' => gettext("Inverse"),
'absolute' => gettext("Absolute"));
$periods = array("absolute" => gettext("Absolute Timespans"),
@ -101,6 +102,9 @@ foreach($databases as $database) {
if(stristr($database, "-vpnusers")) {
$vpnusers = true;
}
if(stristr($database, "captiveportal-") && isset($config['captiveportal']['enable'])) {
$captiveportal = true;
}
}
$pgtitle = array(gettext("Status"),gettext("RRD Graphs"));
@ -143,6 +147,10 @@ include("head.inc");
if($curcat == "vpnusers") { $tabactive = True; } else { $tabactive = False; }
$tab_array[] = array(gettext("VPN"), $tabactive, "status_rrd_graph.php?cat=vpnusers");
}
if($captiveportal) {
if($curcat == "captiveportal") { $tabactive = True; } else { $tabactive = False; }
$tab_array[] = array(gettext("Captive Portal"), $tabactive, "status_rrd_graph.php?cat=captiveportal");
}
if($curcat == "custom") { $tabactive = True; } else { $tabactive = False; }
$tab_array[] = array(gettext("Custom"), $tabactive, "status_rrd_graph.php?cat=custom");
if($curcat == "settings") { $tabactive = True; } else { $tabactive = False; }