mirror of
https://github.com/pfsense/pfsense.git
synced 2025-10-26 11:38:35 +00:00
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:
parent
9b2e42c9fa
commit
20413b72bf
@ -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";
|
||||
|
||||
106
usr/local/bin/captiveportal_gather_stats.php
Normal file
106
usr/local/bin/captiveportal_gather_stats.php
Normal 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";
|
||||
|
||||
?>
|
||||
@ -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\"";
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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; }
|
||||
|
||||
Loading…
Reference in New Issue
Block a user