summaryrefslogtreecommitdiffstats
path: root/src/etc/inc/rrd.inc
diff options
context:
space:
mode:
authorRenato Botelho <renato@netgate.com>2015-08-25 08:08:24 -0300
committerRenato Botelho <renato@netgate.com>2015-08-25 14:49:54 -0300
commit46bc6e545a17e77202aaf01ec0cd8d5a46567525 (patch)
tree32d18dda436ec739c67c489ceb771e8629cd926f /src/etc/inc/rrd.inc
parent4d9801c2dbd2b3e54a39578ee62b93af66607227 (diff)
downloadpfsense-46bc6e545a17e77202aaf01ec0cd8d5a46567525.zip
pfsense-46bc6e545a17e77202aaf01ec0cd8d5a46567525.tar.gz
Move main pfSense content to src/
Diffstat (limited to 'src/etc/inc/rrd.inc')
-rw-r--r--src/etc/inc/rrd.inc989
1 files changed, 989 insertions, 0 deletions
diff --git a/src/etc/inc/rrd.inc b/src/etc/inc/rrd.inc
new file mode 100644
index 0000000..86148d6
--- /dev/null
+++ b/src/etc/inc/rrd.inc
@@ -0,0 +1,989 @@
+<?php
+/* $Id$ */
+/*
+ rrd.inc
+ Copyright (C) 2010 Seth Mos <seth.mos@dds.nl>
+ 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.
+
+ */
+
+/*
+ pfSense_BUILDER_BINARIES: /bin/rm /usr/bin/nice /usr/local/bin/rrdtool /bin/cd
+ pfSense_MODULE: rrd
+*/
+
+/* include all configuration functions */
+
+function dump_rrd_to_xml($rrddatabase, $xmldumpfile) {
+ $rrdtool = "/usr/bin/nice -n20 /usr/local/bin/rrdtool";
+ unlink_if_exists($xmldumpfile);
+
+ exec("$rrdtool dump " . escapeshellarg($rrddatabase) . " {$xmldumpfile} 2>&1", $dumpout, $dumpret);
+ if ($dumpret <> 0) {
+ $dumpout = implode(" ", $dumpout);
+ log_error(sprintf(gettext('RRD dump failed exited with %1$s, the error is: %2$s'), $dumpret, $dumpout));
+ }
+ return($dumpret);
+}
+
+function restore_rrd() {
+ global $g, $config;
+
+ $rrddbpath = "/var/db/rrd/";
+ $rrdtool = "/usr/bin/nice -n20 /usr/local/bin/rrdtool";
+
+ $rrdrestore = "";
+ $rrdreturn = "";
+ if (file_exists("{$g['cf_conf_path']}/rrd.tgz") && (isset($config['system']['use_mfs_tmpvar']) || $g['platform'] != "pfSense")) {
+ foreach (glob("{$rrddbpath}/*.xml") as $xml_file) {
+ @unlink($xml_file);
+ }
+ unset($rrdrestore);
+ $_gb = exec("cd /;LANG=C /usr/bin/tar -tf {$g['cf_conf_path']}/rrd.tgz", $rrdrestore, $rrdreturn);
+ if ($rrdreturn != 0) {
+ log_error("RRD restore failed exited with $rrdreturn, the error is: $rrdrestore\n");
+ return;
+ }
+ foreach ($rrdrestore as $xml_file) {
+ $rrd_file = '/' . substr($xml_file, 0, -4) . '.rrd';
+ if (file_exists("{$rrd_file}")) {
+ @unlink($rrd_file);
+ }
+ file_put_contents("{$g['tmp_path']}/rrd_restore", $xml_file);
+ $_gb = exec("cd /;LANG=C /usr/bin/tar -xf {$g['cf_conf_path']}/rrd.tgz -T {$g['tmp_path']}/rrd_restore");
+ if (!file_exists("/{$xml_file}")) {
+ log_error("Could not extract {$xml_file} RRD xml file from archive!");
+ continue;
+ }
+ $_gb = exec("$rrdtool restore -f '/{$xml_file}' '{$rrd_file}'", $output, $status);
+ if ($status) {
+ log_error("rrdtool restore -f '{$xml_file}' '{$rrd_file}' failed returning {$status}.");
+ continue;
+ }
+ unset($output);
+ @unlink("/{$xml_file}");
+ }
+ unset($rrdrestore);
+ @unlink("{$g['tmp_path']}/rrd_restore");
+ /* If this backup is still there on a full install, but we aren't going to use ram disks, remove the archive since this is a transition. */
+ if (($g['platform'] == "pfSense") && !isset($config['system']['use_mfs_tmpvar'])) {
+ unlink_if_exists("{$g['cf_conf_path']}/rrd.tgz");
+ }
+ return true;
+ }
+ return false;
+}
+
+function create_new_rrd($rrdcreatecmd) {
+ $rrdcreateoutput = array();
+ $rrdcreatereturn = 0;
+ $_gb = exec("$rrdcreatecmd 2>&1", $rrdcreateoutput, $rrdcreatereturn);
+ if ($rrdcreatereturn <> 0) {
+ $rrdcreateoutput = implode(" ", $rrdcreateoutput);
+ log_error(sprintf(gettext('RRD create failed exited with %1$s, the error is: %2$s'), $rrdcreatereturn, $rrdcreateoutput));
+ }
+ unset($rrdcreateoutput);
+ return $rrdcreatereturn;
+}
+
+function migrate_rrd_format($rrdoldxml, $rrdnewxml) {
+ if (!file_exists("/tmp/rrd_notice_sent.txt")) {
+ $_gb = exec("echo 'Converting RRD configuration to new format. This might take a bit...' | wall");
+ @touch("/tmp/rrd_notice_sent.txt");
+ }
+ $numrraold = count($rrdoldxml['rra']);
+ $numrranew = count($rrdnewxml['rra']);
+ $numdsold = count($rrdoldxml['ds']);
+ $numdsnew = count($rrdnewxml['ds']);
+ log_error(sprintf(gettext('Import RRD has %1$s DS values and %2$s RRA databases, new format RRD has %3$s DS values and %4$s RRA databases'), $numdsold, $numrraold, $numdsnew , $numrranew));
+
+ /* add data sources not found in the old array from the new array */
+ $i = 0;
+ foreach ($rrdnewxml['ds'] as $ds) {
+ if (!is_array($rrdoldxml['ds'][$i])) {
+ $rrdoldxml['ds'][$i] = $rrdnewxml['ds'][$i];
+ /* set unknown values to 0 */
+ $rrdoldxml['ds'][$i]['last_ds'] = " 0.0000000000e+00 ";
+ $rrdoldxml['ds'][$i]['value'] = " 0.0000000000e+00 ";
+ $rrdoldxml['ds'][$i]['unknown_sec'] = "0";
+ }
+ $i++;
+ }
+
+ $i = 0;
+ $rracountold = count($rrdoldxml['rra']);
+ $rracountnew = count($rrdnewxml['rra']);
+ /* process each RRA, which contain a database */
+ foreach ($rrdnewxml['rra'] as $rra) {
+ if (!is_array($rrdoldxml['rra'][$i])) {
+ $rrdoldxml['rra'][$i] = $rrdnewxml['rra'][$i];
+ }
+
+ $d = 0;
+ /* process cdp_prep */
+ $cdp_prep = $rra['cdp_prep'];
+ foreach ($cdp_prep['ds'] as $ds) {
+ if (!is_array($rrdoldxml['rra'][$i]['cdp_prep']['ds'][$d])) {
+ $rrdoldxml['rra'][$i]['cdp_prep']['ds'][$d] = $rrdnewxml['rra'][$i]['cdp_prep']['ds'][$d];
+ $rrdoldxml['rra'][$i]['cdp_prep']['ds'][$d]['primary_value'] = " 0.0000000000e+00 ";
+ $rrdoldxml['rra'][$i]['cdp_prep']['ds'][$d]['secondary_value'] = " 0.0000000000e+00 ";
+ $rrdoldxml['rra'][$i]['cdp_prep']['ds'][$d]['value'] = " 0.0000000000e+00 ";
+ $rrdoldxml['rra'][$i]['cdp_prep']['ds'][$d]['unknown_datapoints'] = "0";
+ }
+ $d++;
+ }
+
+ /* process database */
+ $rows = $rra['database'];
+ $k = 0;
+ $rowcountold = count($rrdoldxml['rra'][$i]['database']['row']);
+ $rowcountnew = count($rrdnewxml['rra'][$i]['database']['row']);
+ $rowcountdiff = $rowcountnew - $rowcountold;
+ /* save old rows for a bit before we put the required empty rows before it */
+ $rowsdata = $rows;
+ $rowsempty = array();
+ $r = 0;
+ while ($r < $rowcountdiff) {
+ $rowsempty[] = $rrdnewxml['rra'][$i]['database']['row'][$r];
+ $r++;
+ }
+ $rows = $rowsempty + $rowsdata;
+ /* now foreach the rows in the database */
+ foreach ($rows['row'] as $row) {
+ if (!is_array($rrdoldxml['rra'][$i]['database']['row'][$k])) {
+ $rrdoldxml['rra'][$i]['database']['row'][$k] = $rrdnewxml['rra'][$i]['database']['row'][$k];
+ }
+ $m = 0;
+ $vcountold = count($rrdoldxml['rra'][$i]['database']['row'][$k]['v']);
+ $vcountnew = count($rrdnewxml['rra'][$i]['database']['row'][$k]['v']);
+ foreach ($row['v'] as $value) {
+ if (empty($rrdoldxml['rra'][$i]['database']['row'][$k]['v'][$m])) {
+ if (isset($valid)) {
+ $rrdoldxml['rra'][$i]['database']['row'][$k]['v'][$m] = "0.0000000000e+00 ";
+ } else {
+ $rrdoldxml['rra'][$i]['database']['row'][$k]['v'][$m] = $rrdnewxml['rra'][$i]['database']['row'][$k]['v'][$m];
+ }
+ } else {
+ if ($value <> " NaN ") {
+ $valid = true;
+ } else {
+ $valid = false;
+ }
+ }
+ $m++;
+ }
+ $k++;
+ }
+ $i++;
+ }
+
+ $numrranew = count($rrdoldxml['rra']);
+ $numdsnew = count($rrdoldxml['ds']);
+ log_error(sprintf(gettext('The new RRD now has %1$s DS values and %2$s RRA databases'), $numdsnew, $numrranew));
+ return $rrdoldxml;
+}
+
+function enable_rrd_graphing() {
+ global $config, $g, $altq_list_queues;
+
+ if (platform_booting()) {
+ echo gettext("Generating RRD graphs...");
+ }
+
+ $rrddbpath = "/var/db/rrd/";
+ $rrdgraphpath = "/usr/local/www/rrd";
+
+ $traffic = "-traffic.rrd";
+ $packets = "-packets.rrd";
+ $states = "-states.rrd";
+ $wireless = "-wireless.rrd";
+ $queues = "-queues.rrd";
+ $queuesdrop = "-queuedrops.rrd";
+ $spamd = "-spamd.rrd";
+ $proc = "-processor.rrd";
+ $mem = "-memory.rrd";
+ $mbuf = "-mbuf.rrd";
+ $cellular = "-cellular.rrd";
+ $vpnusers = "-vpnusers.rrd";
+ $captiveportalconcurrent = "-concurrent.rrd";
+ $captiveportalloggedin = "-loggedin.rrd";
+ $ntpd = "ntpd.rrd";
+
+ $rrdtool = "/usr/bin/nice -n20 /usr/local/bin/rrdtool";
+ $netstat = "/usr/bin/netstat";
+ $awk = "/usr/bin/awk";
+ $tar = "/usr/bin/tar";
+ $pfctl = "/sbin/pfctl";
+ $sysctl = "/sbin/sysctl";
+ $php = "/usr/local/bin/php-cgi";
+ $cpustats = "/usr/local/sbin/cpustats";
+ $spamd_gather = "/usr/local/bin/spamd_gather_stats.php";
+ $ifconfig = "/sbin/ifconfig";
+ $captiveportal_gather = "/usr/local/bin/captiveportal_gather_stats.php";
+ $ntpq = "/usr/local/sbin/ntpq";
+
+ $rrdtrafficinterval = 60;
+ $rrdwirelessinterval = 60;
+ $rrdqueuesinterval = 60;
+ $rrdqueuesdropinterval = 60;
+ $rrdpacketsinterval = 60;
+ $rrdstatesinterval = 60;
+ $rrdspamdinterval = 60;
+ $rrdlbpoolinterval = 60;
+ $rrdprocinterval = 60;
+ $rrdmeminterval = 60;
+ $rrdmbufinterval = 60;
+ $rrdcellularinterval = 60;
+ $rrdvpninterval = 60;
+ $rrdcaptiveportalinterval = 60;
+ $rrdntpdinterval = 60;
+
+ $trafficvalid = $rrdtrafficinterval * 2;
+ $wirelessvalid = $rrdwirelessinterval * 2;
+ $queuesvalid = $rrdqueuesinterval * 2;
+ $queuesdropvalid = $rrdqueuesdropinterval * 2;
+ $packetsvalid = $rrdpacketsinterval * 2;
+ $statesvalid = $rrdstatesinterval*2;
+ $spamdvalid = $rrdspamdinterval * 2;
+ $lbpoolvalid = $rrdlbpoolinterval * 2;
+ $procvalid = $rrdlbpoolinterval * 2;
+ $memvalid = $rrdmeminterval * 2;
+ $mbufvalid = $rrdmbufinterval * 2;
+ $cellularvalid = $rrdcellularinterval * 2;
+ $vpnvalid = $rrdvpninterval * 2;
+ $captiveportalvalid = $rrdcaptiveportalinterval * 2;
+ $ntpdvalid = $rrdntpdinterval * 2;
+
+ /* Assume 2*10GigE for now */
+ $downstream = 2500000000;
+ $upstream = 2500000000;
+
+ /* read the shaper config */
+ read_altq_config();
+
+ if (isset ($config['rrd']['enable'])) {
+
+ /* create directory if needed */
+ if (!is_dir($rrddbpath)) {
+ mkdir($rrddbpath, 0775);
+ }
+ chown($rrddbpath, "nobody");
+
+ if (platform_booting()) {
+ restore_rrd();
+ }
+
+ /* db update script */
+ $rrdupdatesh = "#!/bin/sh\n";
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "export TERM=dumb\n";
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= 'echo $$ > ' . $g['varrun_path'] . '/updaterrd.sh.pid';
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "counter=1\n";
+ $rrdupdatesh .= "while [ \"\$counter\" -ne 0 ]\n";
+ $rrdupdatesh .= "do\n";
+ $rrdupdatesh .= "";
+
+ $i = 0;
+ $ifdescrs = get_configured_interface_with_descr();
+ /* IPsec counters */
+ $ifdescrs['ipsec'] = "IPsec";
+ /* OpenVPN server counters */
+ if (is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as $server) {
+ $serverid = "ovpns" . $server['vpnid'];
+ $ifdescrs[$serverid] = "{$server['description']}";
+ }
+ }
+
+ if (platform_booting()) {
+ if (!is_dir("{$g['vardb_path']}/rrd")) {
+ mkdir("{$g['vardb_path']}/rrd", 0775);
+ }
+
+ @chown("{$g['vardb_path']}/rrd", "nobody");
+ }
+
+ /* process all real and pseudo interfaces */
+ foreach ($ifdescrs as $ifname => $ifdescr) {
+ $temp = get_real_interface($ifname);
+ if ($temp <> "") {
+ $realif = $temp;
+ }
+
+ /* TRAFFIC, set up the rrd file */
+ if (!file_exists("$rrddbpath$ifname$traffic")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$traffic --step $rrdtrafficinterval ";
+ $rrdcreate .= "DS:inpass:COUNTER:$trafficvalid:0:$downstream ";
+ $rrdcreate .= "DS:outpass:COUNTER:$trafficvalid:0:$upstream ";
+ $rrdcreate .= "DS:inblock:COUNTER:$trafficvalid:0:$downstream ";
+ $rrdcreate .= "DS:outblock:COUNTER:$trafficvalid:0:$upstream ";
+ $rrdcreate .= "DS:inpass6:COUNTER:$trafficvalid:0:$downstream ";
+ $rrdcreate .= "DS:outpass6:COUNTER:$trafficvalid:0:$upstream ";
+ $rrdcreate .= "DS:inblock6:COUNTER:$trafficvalid:0:$downstream ";
+ $rrdcreate .= "DS:outblock6:COUNTER:$trafficvalid:0:$upstream ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ifname$traffic N:U:U:U:U:U:U:U:U");
+ }
+
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "# polling traffic for interface $ifname $realif IPv4/IPv6 counters \n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$traffic N:";
+ $rrdupdatesh .= "`$pfctl -vvsI -i {$realif} | awk '\\\n";
+ $rrdupdatesh .= "/In4\/Pass/ { b4pi = \$6 };/Out4\/Pass/ { b4po = \$6 };/In4\/Block/ { b4bi = \$6 };/Out4\/Block/ { b4bo = \$6 };\\\n";
+ $rrdupdatesh .= "/In6\/Pass/ { b6pi = \$6 };/Out6\/Pass/ { b6po = \$6 };/In6\/Block/ { b6bi = \$6 };/Out6\/Block/ { b6bo = \$6 };\\\n";
+ $rrdupdatesh .= "END {print b4pi \":\" b4po \":\" b4bi \":\" b4bo \":\" b6pi \":\" b6po \":\" b6bi \":\" b6bo};'`\n";
+
+ /* PACKETS, set up the rrd file */
+ if (!file_exists("$rrddbpath$ifname$packets")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$packets --step $rrdpacketsinterval ";
+ $rrdcreate .= "DS:inpass:COUNTER:$packetsvalid:0:$downstream ";
+ $rrdcreate .= "DS:outpass:COUNTER:$packetsvalid:0:$upstream ";
+ $rrdcreate .= "DS:inblock:COUNTER:$packetsvalid:0:$downstream ";
+ $rrdcreate .= "DS:outblock:COUNTER:$packetsvalid:0:$upstream ";
+ $rrdcreate .= "DS:inpass6:COUNTER:$packetsvalid:0:$downstream ";
+ $rrdcreate .= "DS:outpass6:COUNTER:$packetsvalid:0:$upstream ";
+ $rrdcreate .= "DS:inblock6:COUNTER:$packetsvalid:0:$downstream ";
+ $rrdcreate .= "DS:outblock6:COUNTER:$packetsvalid:0:$upstream ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ifname$packets N:U:U:U:U:U:U:U:U");
+ }
+
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "# polling packets for interface $ifname $realif \n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$packets N:";
+ $rrdupdatesh .= "`$pfctl -vvsI -i {$realif} | awk '\\\n";
+ $rrdupdatesh .= "/In4\/Pass/ { b4pi = \$4 };/Out4\/Pass/ { b4po = \$4 };/In4\/Block/ { b4bi = \$4 };/Out4\/Block/ { b4bo = \$4 };\\\n";
+ $rrdupdatesh .= "/In6\/Pass/ { b6pi = \$4 };/Out6\/Pass/ { b6po = \$4 };/In6\/Block/ { b6bi = \$4 };/Out6\/Block/ { b6bo = \$4 };\\\n";
+ $rrdupdatesh .= "END {print b4pi \":\" b4po \":\" b4bi \":\" b4bo \":\" b6pi \":\" b6po \":\" b6bi \":\" b6bo};'`\n";
+
+ /* WIRELESS, set up the rrd file */
+ if ($config['interfaces'][$ifname]['wireless']['mode'] == "bss") {
+ if (!file_exists("$rrddbpath$ifname$wireless")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$wireless --step $rrdwirelessinterval ";
+ $rrdcreate .= "DS:snr:GAUGE:$wirelessvalid:0:1000 ";
+ $rrdcreate .= "DS:rate:GAUGE:$wirelessvalid:0:1000 ";
+ $rrdcreate .= "DS:channel:GAUGE:$wirelessvalid:0:1000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ifname$wireless N:U:U:U");
+ }
+
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "# polling wireless for interface $ifname $realif \n";
+ $rrdupdatesh .= "WIFI=`$ifconfig {$realif} list sta| $awk 'gsub(\"M\", \"\") {getline 2;print substr(\$5, 0, length(\$5)-2) \":\" $4 \":\" $3}'`\n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$wireless N:\${WIFI}\n";
+ }
+
+ /* OpenVPN, set up the rrd file */
+ if (stristr($ifname, "ovpns")) {
+ if (!file_exists("$rrddbpath$ifname$vpnusers")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$vpnusers --step $rrdvpninterval ";
+ $rrdcreate .= "DS:users:GAUGE:$vpnvalid:0:10000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ifname$vpnusers N:U");
+ }
+
+ if (is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as $server) {
+ if ("ovpns{$server['vpnid']}" == $ifname) {
+ $port = $server['local_port'];
+ $vpnid = $server['vpnid'];
+ }
+ }
+ }
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "# polling vpn users for interface $ifname $realif port $port\n";
+ $rrdupdatesh .= "list_current_users() {\n";
+ $rrdupdatesh .= " sleep 0.2\n";
+ $rrdupdatesh .= " echo \"status 2\"\n";
+ $rrdupdatesh .= " sleep 0.2\n";
+ $rrdupdatesh .= " echo \"quit\"\n";
+ $rrdupdatesh .= "}\n";
+ $rrdupdatesh .= "OVPN=`list_current_users | nc -U {$g['varetc_path']}/openvpn/server{$vpnid}.sock | awk -F\",\" '/^CLIENT_LIST/ {print \$2}' | wc -l | awk '{print $1}'`\n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$vpnusers N:\${OVPN}\n";
+ }
+
+ /* QUEUES, set up the queues databases */
+ if ($altq_list_queues[$ifname]) {
+ $altq =& $altq_list_queues[$ifname];
+ /* NOTE: Is it worth as its own function?! */
+ switch ($altq->GetBwscale()) {
+ case "Gb":
+ $factor = 1024 * 1024 * 1024;
+ break;
+ case "Mb":
+ $factor = 1024 * 1024;
+ break;
+ case "Kb":
+ $factor = 1024;
+ break;
+ case "b":
+ default:
+ $factor = 1;
+ break;
+ }
+ $qbandwidth = $altq->GetBandwidth() * $factor;
+ if ($qbandwidth <= 0) {
+ $qbandwidth = 100 * 1000 * 1000; /* 100Mbit */
+ }
+ $qlist =& $altq->get_queue_list($notused);
+ if (!file_exists("$rrddbpath$ifname$queues")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$queues --step $rrdqueuesinterval ";
+ /* loop list of shaper queues */
+ $q = 0;
+ foreach ($qlist as $qname => $q) {
+ $rrdcreate .= "DS:$qname:COUNTER:$queuesvalid:0:$qbandwidth ";
+ }
+
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ if (!file_exists("$rrddbpath$ifname$queuesdrop")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$queuesdrop --step $rrdqueuesdropinterval ";
+ /* loop list of shaper queues */
+ $q = 0;
+ foreach ($qlist as $qname => $q) {
+ $rrdcreate .= "DS:$qname:COUNTER:$queuesdropvalid:0:$qbandwidth ";
+ }
+
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ if (platform_booting()) {
+ $rrdqcommand = "-t ";
+ $rrducommand = "N";
+ $qi = 0;
+ foreach ($qlist as $qname => $q) {
+ if ($qi == 0) {
+ $rrdqcommand .= "{$qname}";
+ } else {
+ $rrdqcommand .= ":{$qname}";
+ }
+ $qi++;
+ $rrducommand .= ":U";
+ }
+ mwexec("$rrdtool update $rrddbpath$ifname$queues $rrdqcommand $rrducommand");
+ mwexec("$rrdtool update $rrddbpath$ifname$queuesdrop $rrdqcommand $rrducommand");
+ }
+
+ /* awk function to gather shaper data */
+ /* yes, it's special */
+ $rrdupdatesh .= "` pfctl -vsq -i {$realif} | awk 'BEGIN {printf \"$rrdtool update $rrddbpath$ifname$queues \" } ";
+ $rrdupdatesh .= "{ ";
+ $rrdupdatesh .= "if ((\$1 == \"queue\") && ( \$2 ~ /^q/ )) { ";
+ $rrdupdatesh .= " dsname = dsname \":\" \$2 ; ";
+ $rrdupdatesh .= " q=1; ";
+ $rrdupdatesh .= "} ";
+ $rrdupdatesh .= " else if ((\$4 == \"bytes:\") && ( q == 1 ) ) { ";
+ $rrdupdatesh .= " dsdata = dsdata \":\" \$5 ; ";
+ $rrdupdatesh .= " q=0; ";
+ $rrdupdatesh .= "} ";
+ $rrdupdatesh .= "} END { ";
+ $rrdupdatesh .= " dsname = substr(dsname,2); ";
+ $rrdupdatesh .= " dsdata = substr(dsdata,2); ";
+ $rrdupdatesh .= " printf \"-t \" dsname \" N:\" dsdata }' ";
+ $rrdupdatesh .= " dsname=\"\" dsdata=\"\"`\n\n";
+
+ $rrdupdatesh .= "` pfctl -vsq -i {$realif} | awk 'BEGIN {printf \"$rrdtool update $rrddbpath$ifname$queuesdrop \" } ";
+ $rrdupdatesh .= "{ ";
+ $rrdupdatesh .= "if ((\$1 == \"queue\") && ( \$2 ~ /^q/ )) { ";
+ $rrdupdatesh .= " dsname = dsname \":\" \$2 ; ";
+ $rrdupdatesh .= " q=1; ";
+ $rrdupdatesh .= "} ";
+ $rrdupdatesh .= " else if ((\$4 == \"bytes:\") && ( q == 1 ) ) { ";
+ $rrdupdatesh .= " dsdata = dsdata \":\" \$8 ; ";
+ $rrdupdatesh .= " q=0; ";
+ $rrdupdatesh .= "} ";
+ $rrdupdatesh .= "} END { ";
+ $rrdupdatesh .= " dsname = substr(dsname,2); ";
+ $rrdupdatesh .= " dsdata = substr(dsdata,2); ";
+ $rrdupdatesh .= " printf \"-t \" dsname \" N:\" dsdata }' ";
+ $rrdupdatesh .= " dsname=\"\" dsdata=\"\"`\n\n";
+ }
+
+ /* 3G interfaces */
+ if (preg_match("/ppp[0-9]+/i", $realif)) {
+ if (!file_exists("$rrddbpath$ifname$cellular")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$cellular --step $rrdcellularinterval ";
+ $rrdcreate .= "DS:rssi:GAUGE:$cellularvalid:0:100 ";
+ $rrdcreate .= "DS:upstream:GAUGE:$cellularvalid:0:100000000 ";
+ $rrdcreate .= "DS:downstream:GAUGE:$cellularvalid:0:100000000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ifname$cellular N:U:U:U");
+ }
+
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "# polling 3G\n";
+ $rrdupdatesh .= "GSTATS=`awk -F, 'getline 2 {print \$2 \":\" \$8 \":\" \$9}' < /tmp/3gstats.$ifname`\n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$cellular N:\"\$GSTATS\"";
+ }
+
+ }
+ $i++;
+
+ /* System only statistics */
+ $ifname = "system";
+
+ /* STATES, create pf states database */
+ if (!file_exists("$rrddbpath$ifname$states")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$states --step $rrdstatesinterval ";
+ $rrdcreate .= "DS:pfrate:GAUGE:$statesvalid:0:10000000 ";
+ $rrdcreate .= "DS:pfstates:GAUGE:$statesvalid:0:10000000 ";
+ $rrdcreate .= "DS:pfnat:GAUGE:$statesvalid:0:10000000 ";
+ $rrdcreate .= "DS:srcip:GAUGE:$statesvalid:0:10000000 ";
+ $rrdcreate .= "DS:dstip:GAUGE:$statesvalid:0:10000000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ifname$states N:U:U:U:U:U");
+ }
+
+ /* the pf states gathering function. */
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "pfctl_si_out=\"` $pfctl -si > /tmp/pfctl_si_out `\"\n";
+ $rrdupdatesh .= "pfctl_ss_out=\"` $pfctl -ss > /tmp/pfctl_ss_out`\"\n";
+ $rrdupdatesh .= "pfrate=\"` cat /tmp/pfctl_si_out | egrep \"inserts|removals\" | awk '{ pfrate = \$3 + pfrate } {print pfrate}'|tail -1 `\"\n";
+ $rrdupdatesh .= "pfstates=\"` cat /tmp/pfctl_ss_out | egrep -v \"<\\-.*?<\\-|\\->.*?\\->\" | wc -l|sed 's/ //g'`\"\n";
+ $rrdupdatesh .= "pfnat=\"` cat /tmp/pfctl_ss_out | egrep '<\\-.*?<\\-|\\->.*?\\->' | wc -l|sed 's/ //g' `\"\n";
+ $rrdupdatesh .= "srcip=\"` cat /tmp/pfctl_ss_out | egrep -v '<\\-.*?<\\-|\\->.*?\\->' | grep '\\->' | awk '{print \$3}' | awk -F: '{print \$1}' | sort -u|wc -l|sed 's/ //g' `\"\n";
+ $rrdupdatesh .= "dstip=\"` cat /tmp/pfctl_ss_out | egrep -v '<\\-.*?<\\-|\\->.*?\\->' | grep '<\\-' | awk '{print \$3}' | awk -F: '{print \$1}' | sort -u|wc -l|sed 's/ //g' `\"\n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$states N:\$pfrate:\$pfstates:\$pfnat:\$srcip:\$dstip\n\n";
+
+ /* End pf states statistics */
+
+ /* CPU, create CPU statistics database */
+ if (!file_exists("$rrddbpath$ifname$proc")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$proc --step $rrdprocinterval ";
+ $rrdcreate .= "DS:user:GAUGE:$procvalid:0:10000000 ";
+ $rrdcreate .= "DS:nice:GAUGE:$procvalid:0:10000000 ";
+ $rrdcreate .= "DS:system:GAUGE:$procvalid:0:10000000 ";
+ $rrdcreate .= "DS:interrupt:GAUGE:$procvalid:0:10000000 ";
+ $rrdcreate .= "DS:processes:GAUGE:$procvalid:0:10000000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ifname$proc N:U:U:U:U:U");
+ }
+
+ /* the CPU stats gathering function. */
+ $rrdupdatesh .= "CPU=`$cpustats | cut -f1-4 -d':'`\n";
+ /* Using ps uxaH will count all processes including system threads. Top was undercounting. */
+ $rrdupdatesh .= "PROCS=`ps uxaH | wc -l | awk '{print \$1;}'`\n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$proc N:\${CPU}:\${PROCS}\n";
+
+ /* End CPU statistics */
+
+ /* Memory, create Memory statistics database */
+ if (!file_exists("$rrddbpath$ifname$mem")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$mem --step $rrdmeminterval ";
+ $rrdcreate .= "DS:active:GAUGE:$memvalid:0:10000000 ";
+ $rrdcreate .= "DS:inactive:GAUGE:$memvalid:0:10000000 ";
+ $rrdcreate .= "DS:free:GAUGE:$memvalid:0:10000000 ";
+ $rrdcreate .= "DS:cache:GAUGE:$memvalid:0:10000000 ";
+ $rrdcreate .= "DS:wire:GAUGE:$memvalid:0:10000000 ";
+ $rrdcreate .= "RRA:MIN:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MIN:0.5:5:720 ";
+ $rrdcreate .= "RRA:MIN:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MIN:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:MAX:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MAX:0.5:5:720 ";
+ $rrdcreate .= "RRA:MAX:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MAX:0.5:1440:2284";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ifname$mem N:U:U:U:U:U");
+ }
+
+ /* the Memory stats gathering function. */
+ $rrdupdatesh .= "MEM=`$sysctl -n vm.stats.vm.v_page_count vm.stats.vm.v_active_count vm.stats.vm.v_inactive_count vm.stats.vm.v_free_count vm.stats.vm.v_cache_count vm.stats.vm.v_wire_count | ";
+ $rrdupdatesh .= " $awk '{getline active;getline inactive;getline free;getline cache;getline wire;printf ";
+ $rrdupdatesh .= "((active/$0) * 100)\":\"((inactive/$0) * 100)\":\"((free/$0) * 100)\":\"((cache/$0) * 100)\":\"(wire/$0 * 100)}'`\n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$mem N:\${MEM}\n";
+
+ /* End Memory statistics */
+
+ /* mbuf, create mbuf statistics database */
+ if (!file_exists("$rrddbpath$ifname$mbuf")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$mbuf --step $rrdmbufinterval ";
+ $rrdcreate .= "DS:current:GAUGE:$mbufvalid:0:10000000 ";
+ $rrdcreate .= "DS:cache:GAUGE:$mbufvalid:0:10000000 ";
+ $rrdcreate .= "DS:total:GAUGE:$mbufvalid:0:10000000 ";
+ $rrdcreate .= "DS:max:GAUGE:$mbufvalid:0:10000000 ";
+ $rrdcreate .= "RRA:MIN:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MIN:0.5:5:720 ";
+ $rrdcreate .= "RRA:MIN:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MIN:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:MAX:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MAX:0.5:5:720 ";
+ $rrdcreate .= "RRA:MAX:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MAX:0.5:1440:2284";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ifname$mbuf N:U:U:U:U");
+ }
+
+ /* the mbuf stats gathering function. */
+ $rrdupdatesh .= "MBUF=`$netstat -m | ";
+ $rrdupdatesh .= " $awk '/mbuf clusters in use/ { gsub(/\//, \":\", $1); print $1; }'`\n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$mbuf N:\${MBUF}\n";
+
+ /* End mbuf statistics */
+
+ /* SPAMD, set up the spamd rrd file */
+ if (isset($config['installedpackages']['spamdsettings']) &&
+ $config['installedpackages']['spamdsettings']['config'][0]['enablerrd']) {
+ /* set up the spamd rrd file */
+ if (!file_exists("$rrddbpath$ifname$spamd")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$spamd --step $rrdspamdinterval ";
+ $rrdcreate .= "DS:conn:GAUGE:$spamdvalid:0:10000 ";
+ $rrdcreate .= "DS:time:GAUGE:$spamdvalid:0:86400 ";
+ $rrdcreate .= "RRA:MIN:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MIN:0.5:5:720 ";
+ $rrdcreate .= "RRA:MIN:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MIN:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:MAX:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MAX:0.5:5:720 ";
+ $rrdcreate .= "RRA:MAX:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MAX:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "# polling spamd for connections and tarpitness \n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$spamd \\\n";
+ $rrdupdatesh .= "`$php -q $spamd_gather`\n";
+
+ }
+ /* End System statistics */
+
+ /* Captive Portal statistics, set up the rrd file */
+ if (is_array($config['captiveportal'])) {
+ foreach ($config['captiveportal'] as $cpkey => $cp) {
+ if (!isset($cp['enable'])) {
+ continue;
+ }
+
+ $ifname= "captiveportal";
+ $concurrent_filename = $rrddbpath . $ifname . '-' . $cpkey . $captiveportalconcurrent;
+ if (!file_exists("$concurrent_filename")) {
+ $rrdcreate = "$rrdtool create $concurrent_filename --step $rrdcaptiveportalinterval ";
+ $rrdcreate .= "DS:concurrentusers:GAUGE:$captiveportalvalid:0:10000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:MIN:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MIN:0.5:5:720 ";
+ $rrdcreate .= "RRA:MIN:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MIN:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:MAX:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MAX:0.5:5:720 ";
+ $rrdcreate .= "RRA:MAX:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MAX:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:LAST:0.5:1:1200 ";
+ $rrdcreate .= "RRA:LAST:0.5:5:720 ";
+ $rrdcreate .= "RRA:LAST:0.5:60:1860 ";
+ $rrdcreate .= "RRA:LAST:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $concurrent_filename N:U");
+ }
+
+ /* the Captive Portal stats gathering function. */
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "# polling Captive Portal for number of concurrent users\n";
+ $rrdupdatesh .= "CP=`${php} -q ${captiveportal_gather} '${cpkey}' 'concurrent'`\n";
+ $rrdupdatesh .= "$rrdtool update $concurrent_filename \${CP}\n";
+
+ $loggedin_filename = $rrddbpath . $ifname . '-' . $cpkey . $captiveportalloggedin;
+ if (!file_exists("$loggedin_filename")) {
+ $rrdcreate = "$rrdtool create $loggedin_filename --step $rrdcaptiveportalinterval ";
+ $rrdcreate .= "DS:loggedinusers:GAUGE:$captiveportalvalid:0:10000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:MIN:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MIN:0.5:5:720 ";
+ $rrdcreate .= "RRA:MIN:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MIN:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:MAX:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MAX:0.5:5:720 ";
+ $rrdcreate .= "RRA:MAX:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MAX:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:LAST:0.5:1:1200 ";
+ $rrdcreate .= "RRA:LAST:0.5:5:720 ";
+ $rrdcreate .= "RRA:LAST:0.5:60:1860 ";
+ $rrdcreate .= "RRA:LAST:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $loggedin_filename N:U");
+ }
+
+ /* the Captive Portal stats gathering function. */
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "# polling Captive Portal for number of logged in users\n";
+ $rrdupdatesh .= "CP=`${php} -q ${captiveportal_gather} '${cpkey}' 'loggedin'`\n";
+ $rrdupdatesh .= "$rrdtool update $loggedin_filename \${CP}\n";
+
+ }
+ }
+ /* End Captive Portal statistics */
+
+ /* NTP, set up the ntpd rrd file */
+ if (isset($config['ntpd']['statsgraph'])) {
+ /* set up the ntpd rrd file */
+ if (!file_exists("$rrddbpath$ntpd")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ntpd --step $rrdntpdinterval ";
+ $rrdcreate .= "DS:offset:GAUGE:$ntpdvalid:0:1000 ";
+ $rrdcreate .= "DS:sjit:GAUGE:$ntpdvalid:0:1000 ";
+ $rrdcreate .= "DS:cjit:GAUGE:$ntpdvalid:0:1000 ";
+ $rrdcreate .= "DS:wander:GAUGE:$ntpdvalid:0:1000 ";
+ $rrdcreate .= "DS:freq:GAUGE:$ntpdvalid:0:1000 ";
+ $rrdcreate .= "DS:disp:GAUGE:$ntpdvalid:0:1000 ";
+ $rrdcreate .= "RRA:MIN:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MIN:0.5:5:720 ";
+ $rrdcreate .= "RRA:MIN:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MIN:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:MAX:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MAX:0.5:5:720 ";
+ $rrdcreate .= "RRA:MAX:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MAX:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ntpd N:U:U:U:U:U:U");
+ }
+
+ /* the ntp stats gathering function. */
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "$ntpq -c rv | $awk 'BEGIN{ RS=\",\"}{ print }' >> /tmp/ntp-rrdstats.$$\n";
+ $rrdupdatesh .= "NOFFSET=`grep offset /tmp/ntp-rrdstats.$$ | awk 'BEGIN{FS=\"=\"}{print $2}'`\n";
+ $rrdupdatesh .= "NFREQ=`grep frequency /tmp/ntp-rrdstats.$$ | awk 'BEGIN{FS=\"=\"}{print $2}'`\n";
+ $rrdupdatesh .= "NSJIT=`grep sys_jitter /tmp/ntp-rrdstats.$$ | awk 'BEGIN{FS=\"=\"}{print $2}'`\n";
+ $rrdupdatesh .= "NCJIT=`grep clk_jitter /tmp/ntp-rrdstats.$$ | awk 'BEGIN{FS=\"=\"}{print $2}'`\n";
+ $rrdupdatesh .= "NWANDER=`grep clk_wander /tmp/ntp-rrdstats.$$ | awk 'BEGIN{FS=\"=\"}{print $2}'`\n";
+ $rrdupdatesh .= "NDISPER=`grep rootdisp /tmp/ntp-rrdstats.$$ | awk 'BEGIN{FS=\"=\"}{print $2}'`\n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ntpd \N:\${NOFFSET}:\${NSJIT}:\${NCJIT}:\${NWANDER}:\${NFREQ}:\${NDISPER}\n";
+ $rrdupdatesh .= "rm /tmp/ntp-rrdstats.$$\n";
+ $rrdupdatesh .= "\n";
+
+ }
+ /* End NTP statistics */
+
+ $rrdupdatesh .= "sleep 60\n";
+ $rrdupdatesh .= "done\n";
+ log_error(gettext("Creating rrd update script"));
+ /* write the rrd update script */
+ $updaterrdscript = "{$g['vardb_path']}/rrd/updaterrd.sh";
+ $fd = fopen("$updaterrdscript", "w");
+ fwrite($fd, "$rrdupdatesh");
+ fclose($fd);
+
+ unset($rrdupdatesh);
+
+ /* kill off traffic collectors */
+ kill_traffic_collector();
+
+ /* start traffic collector */
+ mwexec_bg("/usr/bin/nice -n20 /bin/sh $updaterrdscript");
+
+ } else {
+ /* kill off traffic collectors */
+ kill_traffic_collector();
+ }
+
+ $databases = glob("{$rrddbpath}/*.rrd");
+ foreach ($databases as $database) {
+ chown($database, "nobody");
+ }
+
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+
+}
+
+# Create gateway quality RRD with settings suitable for pfSense graph set.
+function create_gateway_quality_rrd($rrd_file) {
+ global $g;
+
+ $rrdinterval = 60;
+ $valid = $rrdinterval * 2;
+ $rrdtool = "/usr/bin/nice -n20 /usr/local/bin/rrdtool";
+
+ /* GATEWAY QUALITY, set up the rrd file */
+ if (!file_exists("$rrd_file")) {
+ $rrdcreate = "$rrdtool create $rrd_file --step $rrdinterval ";
+ $rrdcreate .= "DS:loss:GAUGE:$valid:0:100 ";
+ $rrdcreate .= "DS:delay:GAUGE:$valid:0:100000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ if (!is_dir("{$g['vardb_path']}/rrd")) {
+ mkdir("{$g['vardb_path']}/rrd", 0775);
+ }
+
+ @chown("{$g['vardb_path']}/rrd", "nobody");
+
+ mwexec("$rrdtool update $rrd_file N:U:U");
+ }
+ unset($rrdtool, $rrdinterval, $valid, $rrd_file);
+}
+
+function kill_traffic_collector() {
+ global $g;
+
+ killbypid("{$g['varrun_path']}/updaterrd.sh.pid");
+}
+
+?>
OpenPOWER on IntegriCloud