diff options
author | Stephen Beaver <sbeaver@netgate.com> | 2015-09-21 13:22:07 -0400 |
---|---|---|
committer | Stephen Beaver <sbeaver@netgate.com> | 2015-09-21 13:22:46 -0400 |
commit | 398814928d98d8d2e7b5d6da31e1228a8cf27dd9 (patch) | |
tree | cbe7d8b6e45964d999692bc4982d38c47b586dd5 /src/usr/local/www | |
parent | 725f987f52d6d770d4d4ee522fa71eeb5790b13c (diff) | |
download | pfsense-398814928d98d8d2e7b5d6da31e1228a8cf27dd9.zip pfsense-398814928d98d8d2e7b5d6da31e1228a8cf27dd9.tar.gz |
Multiple fixes to status_queues.php - NOT YET TESTED
Fixed #5166 - Shows IPv6 addresses
Diffstat (limited to 'src/usr/local/www')
-rw-r--r-- | src/usr/local/www/status_queues.php | 298 | ||||
-rw-r--r-- | src/usr/local/www/widgets/widgets/interfaces.widget.php | 3 |
2 files changed, 172 insertions, 129 deletions
diff --git a/src/usr/local/www/status_queues.php b/src/usr/local/www/status_queues.php index 37537b8..e5e7f2a 100644 --- a/src/usr/local/www/status_queues.php +++ b/src/usr/local/www/status_queues.php @@ -1,38 +1,62 @@ -#!/usr/local/bin/php <?php /* $Id$ */ /* status_queues.php - Part of the pfSense project - Copyright (C) 2004, 2005 Scott Ullrich - Copyright (C) 2009 Ermal Luçi - Copyright (C) 2013-2015 Electric Sheep Fencing, LP - 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. */ +/* ==================================================================== + * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved. + * Copyright (c) 2004, 2005 Scott Ullrich + * Copyright (c) 2009 Ermal Luçi + * 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. + * + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgment: + * "This product includes software developed by the pfSense Project + * for use in the pfSense software distribution. (http://www.pfsense.org/). + * + * 4. The names "pfSense" and "pfSense Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * coreteam@pfsense.org. + * + * 5. Products derived from this software may not be called "pfSense" + * nor may "pfSense" appear in their names without prior written + * permission of the Electric Sheep Fencing, LLC. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * + * "This product includes software developed by the pfSense Project + * for use in the pfSense software distribution (http://www.pfsense.org/). + * + * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 pfSense PROJECT OR + * ITS 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. + * + * ==================================================================== + * + */ /* pfSense_BUILDER_BINARIES: /sbin/pfctl - pfSense_MODULE: shaper + pfSense_MODULE: shaper */ ##|+PRIV @@ -42,12 +66,15 @@ ##|*MATCH=status_queues.php* ##|-PRIV +/* header("Last-Modified: " . gmdate("D, j M Y H:i:s") . " GMT"); header("Expires: " . gmdate("D, j M Y H:i:s", time()) . " GMT"); header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP/1.1 header("Pragma: no-cache"); // HTTP/1.0 +*/ require("guiconfig.inc"); + class QueueStats { public $queuename; public $queuelength; @@ -57,13 +84,16 @@ class QueueStats { public $suspends; public $drops; } + if (!file_exists("{$g['varrun_path']}/qstats.pid") || !isvalidpid("{$g['varrun_path']}/qstats.pid")) { - /* Start in the background so we don't hang up the GUI */ + // Start in the background so we don't hang up the GUI mwexec_bg("/usr/local/sbin/qstats -p {$g['varrun_path']}/qstats.pid"); - /* Give it a moment to start up */ + // Give it a moment to start up sleep(1); } + $fd = @fsockopen("unix://{$g['varrun_path']}/qstats"); + if (!$fd) { $error = "Something wrong happened during communication with stat gathering"; } else { @@ -78,15 +108,16 @@ if (!$fd) { $error = "No queue statistics could be read."; } } + if ($_REQUEST['getactivity']) { $statistics = array(); $bigger_stat = 0; $stat_type = $_REQUEST['stats']; - /* build the queue stats. */ + // build the queue stats. foreach ($altqstats['queue'] as $q) { statsQueues($q); } - /* calculate the bigger amount of packets or bandwidth being moved through all queues. */ + // calculate the bigger amount of packets or bandwidth being moved through all queues. if ($stat_type == "0") { foreach ($statistics as $q) { if ($bigger_stat < $q->pps) { @@ -100,6 +131,7 @@ if ($_REQUEST['getactivity']) { } } } + $finscript = ""; foreach ($statistics as $q) { if ($stat_type == "0") { @@ -110,6 +142,9 @@ if ($_REQUEST['getactivity']) { if ($packet_s < 0) { $packet_s = 0; } + + $finscript .= '<script src="/jquery/jquery-1.11.2.min.js"></script>'; + $finscript .= '<script>'; $finscript .= "jQuery('#queue{$q->queuename}width').css('width','{$packet_s}%');"; $finscript .= "jQuery('#queue{$q->queuename}pps').val('" . number_format($q->pps, 1) . "');"; $finscript .= "jQuery('#queue{$q->queuename}bps').val('" . format_bits($q->bandwidth) . "');"; @@ -117,106 +152,15 @@ if ($_REQUEST['getactivity']) { $finscript .= "jQuery('#queue{$q->queuename}suspends').val('{$q->suspends}');"; $finscript .= "jQuery('#queue{$q->queuename}drops').val('{$q->drops}');"; $finscript .= "jQuery('#queue{$q->queuename}length').val('{$q->queuelength}');"; + $finscript .= '</script>'; } + unset($statistics, $altqstats); - header("Content-type: text/javascript"); +// header("Content-type: text/javascript"); echo $finscript; exit; } -$pgtitle = array(gettext("Status"), gettext("Traffic shaper"), gettext("Queues")); -$shortcut_section = "trafficshaper"; -include("head.inc"); -?> -<body> -<script src="/jquery/jquery-1.11.2.min.js"></script> -<?php -if (!is_array($config['shaper']['queue']) || count($config['shaper']['queue']) < 1) { - print_info_box(gettext("Traffic shaping is not configured.")); - include("fend.inc"); - echo "</body></html>"; - exit; -} -?> -<?php if (!$error): ?> -<form action="status_queues.php" method="post"> -<script type="text/javascript"> -//<![CDATA[ - function getqueueactivity() { - var url = "/status_queues.php"; - var pars = "getactivity=yes&stats=" + jQuery("#selStatistic").val(); - jQuery.ajax( - url, - { - type: 'post', - data: pars, - complete: activitycallback - }); - } - function activitycallback(transport) { - setTimeout('getqueueactivity()', 5100); - } - jQuery(document).ready(function() { - setTimeout('getqueueactivity()', 150); - }); -//]]> -</script> -<?php endif; - -if ($error): - print_info_box($error); -else: ?> - <div class="panel panel-default"> - <div class="panel-heading"><h2 class="panel-title"><?=gettext("Status Queues"); ?></h2></div> - <div class="panel-body table-responsive"> - <table class="table table-striped table-hover"> - <thead> - <tr> - <th><?=gettext("Queue"); ?></th> - <th><?=gettext("Statistics"); ?> - <select id="selStatistic"> - <option value="0">PPS</option> - <option value="1">Bandwidth</option> - </select> - </th> - <th><?=gettext("PPS"); ?></th> - <th><?=gettext("Bandwidth"); ?></th> - <th><?=gettext("Borrows"); ?></th> - <th><?=gettext("Suspends"); ?></th> - <th><?=gettext("Drops"); ?></th> - <th><?=gettext("Length"); ?></th> - </tr> - </thead> -<?php - $if_queue_list = get_configured_interface_list_by_realif(false, true); - processQueues($altqstats, 0, ""); -?> -<?php endif; ?> - </table> -</br> - -<?php - - print_info_box(gettext("Queue graphs take 5 seconds to sample data")); -?> - -<script type="text/javascript"> -//<![CDATA[ - function StatsShowHide(classname) { - var firstrow = jQuery("." + classname).first(); - if (firstrow.is(':visible')) { - jQuery("." + classname).hide(); - } else { - jQuery("." + classname).show(); - } - } -//]]> -</script> -</form> -<?php include("fend.inc"); ?> -</body> -</html> -<?php function processQueues($altqstats, $level, $parent_name) { global $g; global $if_queue_list; @@ -227,6 +171,7 @@ function processQueues($altqstats, $level, $parent_name) { $row_background = str_repeat(dechex($gray_value), 3); $parent_name = $parent_name . " queuerow" . $altqstats['name'] . $altqstats['interface']; $prev_if = $altqstats['interface']; + foreach ($altqstats['queue'] as $q) { $if_name = ""; foreach ($if_queue_list as $oif => $real_name) { @@ -235,6 +180,7 @@ function processQueues($altqstats, $level, $parent_name) { break; } } + if ($prev_if != $q['interface']) { echo "<tr><td><b>Interface ". htmlspecialchars(convert_real_interface_to_friendly_descr($q['interface'])) . "</b></td></tr>"; $prev_if = $q['interface']; @@ -259,7 +205,7 @@ function processQueues($altqstats, $level, $parent_name) { $cpuUsage = 0; echo "<td bgcolor=\"#{$row_background}\">"; echo "<div class='progress' style='height: 7px;width: 170px;'> - <div class='progress-bar' role='progressbar' name='queue{$q['name']}{$q['interface']}width' id='queue{$q['name']}{$q['interface']}width' aria-valuenow='70' aria-valuemin='0' aria-valuemax='100' style='width: ". ($cpuUsage*100) ."%;'></div> + <div class='progress-bar' role='progressbar' name='queue{$q['name']}{$q['interface']}width' id='queue{$q['name']}{$q['interface']}width' aria-valuenow='70' aria-valuemin='0' aria-valuemax='100' style='width: ". ($cpuUsage*100) ."%;'></div> </div>"; echo " </td>"; echo "<td bgcolor=\"#{$row_background}\"><input style='border: 0px solid white; background-color:#{$row_background}; color:#000000;width:70px;text-align:right;' size='10' name='queue{$q['name']}{$q['interface']}pps' id='queue{$q['name']}{$q['interface']}pps' value='(" . gettext("Loading") . ")' align='left' /></td>"; @@ -274,8 +220,9 @@ function processQueues($altqstats, $level, $parent_name) { if (is_array($q['queue'])) { processQueues($q, $level + 1, $parent_name); } - }; + } } + function statsQueues($xml) { global $statistics; @@ -298,10 +245,12 @@ function statsQueues($xml) { $current->drops += $child->drops; } } + unset($child); $statistics[] = $current; return $current; } + function format_bits($bits) { if ($bits >= 1000000000) { return sprintf("%.2f Gbps", $bits/1000000000); @@ -313,4 +262,97 @@ function format_bits($bits) { return sprintf("%d bps", $bits); } } + +$pgtitle = array(gettext("Status"), gettext("Traffic shaper"), gettext("Queues")); +$shortcut_section = "trafficshaper"; +include("head.inc"); + +/* +if (!is_array($config['shaper']['queue']) || count($config['shaper']['queue']) < 1) { + print_info_box(gettext("Traffic shaping is not configured.")); + include("foot.inc"); + exit; +} +*/ +if (!$error): + print_info_box($error, 'danger'); +else: +?> +<form action="status_queues.php" method="post"> + <div class="panel panel-default"> + <div class="panel-heading"><h2 class="panel-title"><?=gettext("Status Queues"); ?></h2></div> + <div class="panel-body table-responsive"> + <table class="table table-striped table-hover"> + <thead> + <tr> + <th><?=gettext("Queue"); ?></th> + <th><?=gettext("Statistics"); ?> + <select id="selStatistic"> + <option value="0">PPS</option> + <option value="1">Bandwidth</option> + </select> + </th> + <th><?=gettext("PPS"); ?></th> + <th><?=gettext("Bandwidth"); ?></th> + <th><?=gettext("Borrows"); ?></th> + <th><?=gettext("Suspends"); ?></th> + <th><?=gettext("Drops"); ?></th> + <th><?=gettext("Length"); ?></th> + </tr> + </thead> + <tbody> +<?php + $if_queue_list = get_configured_interface_list_by_realif(false, true); + processQueues($altqstats, 0, ""); ?> + </tbody> + </table> + </div> + </div> +</form> +<?php + print_info_box(gettext("Queue graphs take 5 seconds to sample data")); +endif; + +?> + +<script type="text/javascript"> +//<![CDATA[ +events.push(function(){ + function StatsShowHide(classname) { + var firstrow = jQuery("." + classname).first(); + if (firstrow.is(':visible')) { + jQuery("." + classname).hide(); + } else { + jQuery("." + classname).show(); + } + } + + function getqueueactivity() { + var url = "/status_queues.php"; + var pars = "getactivity=yes&stats=" + jQuery("#selStatistic").val(); + + jQuery.ajax( + url, + { + type: 'post', + data: pars, + complete: activitycallback + } + ); + } + + function activitycallback(transport) { + setTimeout(function(){getqueueactivity()}, 5100); + } + + setTimeout(function(){getqueueactivity()}, 150); +}); + +//]]> +</script> + +<?php + +include("foot.inc"); + diff --git a/src/usr/local/www/widgets/widgets/interfaces.widget.php b/src/usr/local/www/widgets/widgets/interfaces.widget.php index 436d0bf..65478b2 100644 --- a/src/usr/local/www/widgets/widgets/interfaces.widget.php +++ b/src/usr/local/www/widgets/widgets/interfaces.widget.php @@ -114,7 +114,8 @@ foreach ($ifdescrs as $ifdescr => $ifname): <?php if (empty($ifinfo['ipaddr'])): ?> n/a <?php else: ?> - <?=$ifinfo['ipaddr']?><br /> + <?=htmlspecialchars($ifinfo['ipaddr'])?><br /> + <?=htmlspecialchars($ifinfo['ipaddrv6'])?> <?php endif; ?> </td> </tr> |