Project

General

Profile

Download (12.2 KB) Statistics
| Branch: | Tag: | Revision:
1 b5b351be Scott Ullrich
#!/usr/local/bin/php
2 aa280d10 Bill Marquette
<?php
3 b46bfcf5 Bill Marquette
/* $Id$ */
4 aa280d10 Bill Marquette
/*
5
	status_queues.php
6 ce77a9c4 Phil Davis
	Part of the pfSense project
7 dd447bde Jim Thompson
	Copyright (C) 2004, 2005 Scott Ullrich
8 29aef6c4 Jim Thompson
	Copyright (C) 2009 Ermal Luçi
9 ce77a9c4 Phil Davis
	Copyright (C) 2013-2015 Electric Sheep Fencing, LP
10 aa280d10 Bill Marquette
	All rights reserved.
11
12
	Redistribution and use in source and binary forms, with or without
13
	modification, are permitted provided that the following conditions are met:
14
15
	1. Redistributions of source code must retain the above copyright notice,
16
	   this list of conditions and the following disclaimer.
17
18
	2. Redistributions in binary form must reproduce the above copyright
19
	   notice, this list of conditions and the following disclaimer in the
20
	   documentation and/or other materials provided with the distribution.
21
22
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
23
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
24
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
26
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31
	POSSIBILITY OF SUCH DAMAGE.
32
*/
33 2c5fda82 Jose Luis Duran
/*
34 1d333258 Scott Ullrich
	pfSense_BUILDER_BINARIES:	/sbin/pfctl
35
	pfSense_MODULE:	shaper
36
*/
37 aa280d10 Bill Marquette
38 6b07c15a Matthew Grooms
##|+PRIV
39
##|*IDENT=page-status-trafficshaper-queues
40
##|*NAME=Status: Traffic shaper: Queues page
41
##|*DESCR=Allow access to the 'Status: Traffic shaper: Queues' page.
42
##|*MATCH=status_queues.php*
43
##|-PRIV
44
45 42b0c921 Phil Davis
header("Last-Modified: " . gmdate("D, j M Y H:i:s") . " GMT");
46
header("Expires: " . gmdate("D, j M Y H:i:s", time()) . " GMT");
47
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP/1.1
48 5f471c95 Ermal
header("Pragma: no-cache"); // HTTP/1.0
49
50 aa280d10 Bill Marquette
require("guiconfig.inc");
51 21b94a54 Michele Di Maria
class QueueStats {
52
	public $queuename;
53 2c5fda82 Jose Luis Duran
	public $queuelength;
54 6ba3121b Michele Di Maria
	public $pps;
55
	public $bandwidth;
56 21b94a54 Michele Di Maria
	public $borrows;
57
	public $suspends;
58
	public $drops;
59
}
60 3a1e12cf jim-p
if (!file_exists("{$g['varrun_path']}/qstats.pid") || !isvalidpid("{$g['varrun_path']}/qstats.pid")) {
61 2c5fda82 Jose Luis Duran
	/* Start in the background so we don't hang up the GUI */
62 a3eab908 Michele Di Maria
	mwexec_bg("/usr/local/sbin/qstats -p {$g['varrun_path']}/qstats.pid");
63 3a1e12cf jim-p
	/* Give it a moment to start up */
64
	sleep(1);
65
}
66 5f471c95 Ermal
$fd = @fsockopen("unix://{$g['varrun_path']}/qstats");
67 42b0c921 Phil Davis
if (!$fd) {
68
	$error = "Something wrong happened during communication with stat gathering";
69 3a1e12cf jim-p
} else {
70
	$stats = "";
71 6c07db48 Phil Davis
	while (!feof($fd)) {
72 3a1e12cf jim-p
		$stats .= fread($fd, 4096);
73 42b0c921 Phil Davis
	}
74 3a1e12cf jim-p
	fclose($fd);
75
	@file_put_contents("{$g['tmp_path']}/qstats", $stats);
76
	$altqstats = @parse_xml_config("{$g['tmp_path']}/qstats", array("altqstats"));
77 42b0c921 Phil Davis
	if ($altqstats == -1) {
78 3a1e12cf jim-p
		$error = "No queue statistics could be read.";
79 42b0c921 Phil Davis
	}
80 5f471c95 Ermal
}
81 2c5fda82 Jose Luis Duran
if ($_REQUEST['getactivity']) {
82 21b94a54 Michele Di Maria
	$statistics = array();
83 87428ee8 Michele Di Maria
	$bigger_stat = 0;
84
	$stat_type = $_REQUEST['stats'];
85 21b94a54 Michele Di Maria
	/* build the queue stats. */
86 42b0c921 Phil Davis
	foreach ($altqstats['queue'] as $q) {
87 21b94a54 Michele Di Maria
		statsQueues($q);
88
	}
89 87428ee8 Michele Di Maria
	/* calculate the bigger amount of packets or bandwidth being moved through all queues. */
90 6c07db48 Phil Davis
	if ($stat_type == "0") {
91 42b0c921 Phil Davis
		foreach ($statistics as $q) {
92
			if ($bigger_stat < $q->pps) {
93 87428ee8 Michele Di Maria
				$bigger_stat = $q->pps;
94 42b0c921 Phil Davis
			}
95 87428ee8 Michele Di Maria
		}
96 6c07db48 Phil Davis
	} else {
97 42b0c921 Phil Davis
		foreach ($statistics as $q) {
98
			if ($bigger_stat < $q->bandwidth) {
99 87428ee8 Michele Di Maria
				$bigger_stat = $q->bandwidth;
100 42b0c921 Phil Davis
			}
101 87428ee8 Michele Di Maria
		}
102 2c5fda82 Jose Luis Duran
	}
103 f2b8daad Ermal Lu?i
	$finscript = "";
104 42b0c921 Phil Davis
	foreach ($statistics as $q) {
105
		if ($stat_type == "0") {
106 87428ee8 Michele Di Maria
			$packet_s = round(150 * (1 - $q->pps / $bigger_stat), 0);
107 42b0c921 Phil Davis
		} else {
108 87428ee8 Michele Di Maria
			$packet_s = round(150 * (1 - $q->bandwidth / $bigger_stat), 0);
109 42b0c921 Phil Davis
		}
110
		if ($packet_s < 0) {
111
			$packet_s = 0;
112
		}
113 21b94a54 Michele Di Maria
		$finscript .= "jQuery('#queue{$q->queuename}widthb').width('{$packet_s}');";
114 8e006931 Michele Di Maria
		$finscript .= "jQuery('#queue{$q->queuename}widtha').width('" . (150 - $packet_s) . "');";
115 6c07db48 Phil Davis
		$finscript .= "jQuery('#queue{$q->queuename}pps').val('" . number_format($q->pps, 1) . "');";
116 b06abfe3 Michele Di Maria
		$finscript .= "jQuery('#queue{$q->queuename}bps').val('" . format_bits($q->bandwidth) . "');";
117 21b94a54 Michele Di Maria
		$finscript .= "jQuery('#queue{$q->queuename}borrows').val('{$q->borrows}');";
118
		$finscript .= "jQuery('#queue{$q->queuename}suspends').val('{$q->suspends}');";
119
		$finscript .= "jQuery('#queue{$q->queuename}drops').val('{$q->drops}');";
120 8e006931 Michele Di Maria
		$finscript .= "jQuery('#queue{$q->queuename}length').val('{$q->queuelength}');";
121 21b94a54 Michele Di Maria
	}
122 b06abfe3 Michele Di Maria
	unset($statistics, $altqstats);
123 f2b8daad Ermal Lu?i
	header("Content-type: text/javascript");
124
	echo $finscript;
125 c5d63426 Bill Marquette
	exit;
126
}
127 6c07db48 Phil Davis
$pgtitle = array(gettext("Status"), gettext("Traffic shaper"), gettext("Queues"));
128 d71fc5d3 jim-p
$shortcut_section = "trafficshaper";
129 4df96eff Scott Ullrich
include("head.inc");
130 aa280d10 Bill Marquette
?>
131
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
132
<?php include("fbegin.inc"); ?>
133 d1dd0241 Scott Ullrich
<?php
134 42b0c921 Phil Davis
if (!is_array($config['shaper']['queue']) || count($config['shaper']['queue']) < 1) {
135 6deb0c03 Carlos Eduardo Ramos
	echo gettext("Traffic shaping is not configured.");
136 d1dd0241 Scott Ullrich
	include("fend.inc");
137 580a6561 Colin Fleming
	echo "</body></html>";
138 42b0c921 Phil Davis
	exit;
139
}
140 d1dd0241 Scott Ullrich
?>
141 3a1e12cf jim-p
<?php if (!$error): ?>
142 aa280d10 Bill Marquette
<form action="status_queues.php" method="post">
143 f2b8daad Ermal Lu?i
<script type="text/javascript">
144 d456b043 Colin Fleming
//<![CDATA[
145 21b94a54 Michele Di Maria
	function getqueueactivity() {
146
		var url = "/status_queues.php";
147 87428ee8 Michele Di Maria
		var pars = "getactivity=yes&stats=" + jQuery("#selStatistic").val();
148 21b94a54 Michele Di Maria
		jQuery.ajax(
149
			url,
150
			{
151
				type: 'post',
152
				data: pars,
153
				complete: activitycallback
154
			});
155
	}
156
	function activitycallback(transport) {
157
		setTimeout('getqueueactivity()', 5100);
158
	}
159 42b0c921 Phil Davis
	jQuery(document).ready(function() {
160 21b94a54 Michele Di Maria
		setTimeout('getqueueactivity()', 150);
161
	});
162 d456b043 Colin Fleming
//]]>
163 f2b8daad Ermal Lu?i
</script>
164 3a1e12cf jim-p
<?php endif; ?>
165 d456b043 Colin Fleming
<table width="100%" border="1" cellpadding="0" cellspacing="0" summary="status queues">
166 3a1e12cf jim-p
<?php if ($error): ?>
167 21b94a54 Michele Di Maria
	<tr><td><?php echo $error; ?></td></tr>
168 3a1e12cf jim-p
<?php else: ?>
169 21b94a54 Michele Di Maria
	<tr>
170
		<td class="listhdr"><?=gettext("Queue"); ?></td>
171 87428ee8 Michele Di Maria
		<td class="listhdr">
172
			<?=gettext("Statistics"); ?>
173
			<select id="selStatistic">
174
				<option value="0">PPS</option>
175
				<option value="1">Bandwidth</option>
176
			</select>
177
		</td>
178 21b94a54 Michele Di Maria
		<td class="listhdr" width="1%"><?=gettext("PPS"); ?></td>
179
		<td class="listhdr" width="1%"><?=gettext("Bandwidth"); ?></td>
180
		<td class="listhdr" width="1%"><?=gettext("Borrows"); ?></td>
181
		<td class="listhdr" width="1%"><?=gettext("Suspends"); ?></td>
182
		<td class="listhdr" width="1%"><?=gettext("Drops"); ?></td>
183 2c5fda82 Jose Luis Duran
		<td class="listhdr" width="1%"><?=gettext("Length"); ?></td>
184 21b94a54 Michele Di Maria
	</tr>
185 42b0c921 Phil Davis
<?php
186 6ba3121b Michele Di Maria
	$if_queue_list = get_configured_interface_list_by_realif(false, true);
187 6bb817b4 Phil Davis
	processQueues($altqstats, 0, "");
188 42b0c921 Phil Davis
?>
189 3a1e12cf jim-p
<?php endif; ?>
190 21b94a54 Michele Di Maria
</table>
191
<p>
192 8cd558b6 ayvis
	<strong><span class="red"><?=gettext("Note"); ?>:</span></strong><br />
193
	<?=gettext("Queue graphs take 5 seconds to sample data"); ?>.<br />
194 21b94a54 Michele Di Maria
	<?=gettext("You can configure the Traffic Shaper"); ?> <a href="/firewall_shaper_wizards.php"><?=gettext("here"); ?></a>.
195
</p>
196 ff3003df Michele Di Maria
<script type="text/javascript">
197 d456b043 Colin Fleming
//<![CDATA[
198 ff3003df Michele Di Maria
	function StatsShowHide(classname) {
199 42b0c921 Phil Davis
		var firstrow = jQuery("." + classname).first();
200
		if (firstrow.is(':visible')) {
201
			jQuery("." + classname).hide();
202
		} else {
203
			jQuery("." + classname).show();
204
		}
205 ff3003df Michele Di Maria
	}
206 d456b043 Colin Fleming
//]]>
207 ff3003df Michele Di Maria
</script>
208 84903059 Michele Di Maria
</form>
209 aa280d10 Bill Marquette
<?php include("fend.inc"); ?>
210
</body>
211
</html>
212 2c5fda82 Jose Luis Duran
<?php
213 42b0c921 Phil Davis
function processQueues($altqstats, $level, $parent_name) {
214 21b94a54 Michele Di Maria
	global $g;
215 6ba3121b Michele Di Maria
	global $if_queue_list;
216 ff3003df Michele Di Maria
	$gray_value = 190 + $level * 10;
217 42b0c921 Phil Davis
	if ($gray_value > 250) {
218
		$gray_value = 255;
219
	}
220 ff3003df Michele Di Maria
	$row_background = str_repeat(dechex($gray_value), 3);
221
	$parent_name = $parent_name . " queuerow" . $altqstats['name'] . $altqstats['interface'];
222 1679b68c Michele Di Maria
	$prev_if = $altqstats['interface'];
223 6ba3121b Michele Di Maria
	foreach ($altqstats['queue'] as $q) {
224
		$if_name = "";
225 1679b68c Michele Di Maria
		foreach ($if_queue_list as $oif => $real_name) {
226
			if ($oif == $q['interface']) {
227 6ba3121b Michele Di Maria
				$if_name = $real_name;
228
				break;
229
			}
230
		}
231 1679b68c Michele Di Maria
		if ($prev_if != $q['interface']) {
232
			echo "<tr><td colspan=\"8\" style=\"padding: 2px;\"><b>Interface ". htmlspecialchars(convert_real_interface_to_friendly_descr($q['interface'])) . "</b></td></tr>";
233
			$prev_if = $q['interface'];
234
		}
235 42b0c921 Phil Davis
?>
236 ff3003df Michele Di Maria
		<tr class="<?php echo $parent_name?>">
237
			<td bgcolor="#<?php echo $row_background?>" style="padding-left: <?php echo $level * 20?>px;">
238 21b94a54 Michele Di Maria
				<font color="#000000">
239
					<?
240 42b0c921 Phil Davis
					if (strstr($q['name'], "root_")) {
241 84903059 Michele Di Maria
						echo "<a href=\"firewall_shaper.php?interface={$if_name}&amp;queue={$if_name}&amp;action=show\">Root queue</a>";
242 42b0c921 Phil Davis
					} else {
243 84903059 Michele Di Maria
						echo "<a href=\"firewall_shaper.php?interface={$if_name}&amp;queue={$q['name']}&amp;action=show\">" . htmlspecialchars($q['name']) . "</a>";
244 42b0c921 Phil Davis
					}
245 21b94a54 Michele Di Maria
					?>
246
				</font>
247 ff3003df Michele Di Maria
			</td>
248 42b0c921 Phil Davis
<?php
249
		$cpuUsage = 0;
250
		echo "<td class=\"nowrap\" width=\"1%\" bgcolor=\"#{$row_background}\">";
251
		echo "<img src='./themes/".$g['theme']."/images/misc/bar_left.gif' height='10' width='4' border='0' align='middle' alt='' />";
252
		echo "<img src='./themes/".$g['theme']."/images/misc/bar_blue.gif' height='10' name='queue{$q['name']}{$q['interface']}widtha' id='queue{$q['name']}{$q['interface']}widtha' width='" . $cpuUsage . "' border='0' align='middle' alt='" . htmlspecialchars($q['name']) . "' />";
253
		echo "<img src='./themes/".$g['theme']."/images/misc/bar_gray.gif' height='10' name='queue{$q['name']}{$q['interface']}widthb' id='queue{$q['name']}{$q['interface']}widthb' width='" . (150 - $cpuUsage) . "' border='0' align='middle' alt='" . htmlspecialchars($q['name']) . "' />";
254
		echo "<img src='./themes/".$g['theme']."/images/misc/bar_right.gif' height='10' width='5' border='0' align='middle' alt='' /> ";
255
		if (is_array($q['queue'])) {
256
			echo "<a href=\"#\" onclick=\"StatsShowHide('queuerow{$q['name']}{$q['interface']}');return false\">+/-</a> ";
257
		}
258
		echo " </td>";
259
		echo "<td width=\"1%\" 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>";
260
		echo "<td width=\"1%\" bgcolor=\"#{$row_background}\"><input style='border: 0px solid white; background-color:#{$row_background}; color:#000000;width:80px;text-align:right;' size='10' name='queue{$q['name']}{$q['interface']}bps' id='queue{$q['name']}{$q['interface']}bps' value='' align='right' /></td>";
261
		echo "<td width=\"1%\" 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']}borrows' id='queue{$q['name']}{$q['interface']}borrows' value='' align='right' /></td>";
262
		echo "<td width=\"1%\" 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']}suspends' id='queue{$q['name']}{$q['interface']}suspends' value='' align='right' /></td>";
263
		echo "<td width=\"1%\" 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']}drops' id='queue{$q['name']}{$q['interface']}drops' value='' align='right' /></td>";
264
		echo "<td width=\"1%\" 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']}length' id='queue{$q['name']}{$q['interface']}length' value='' align='right' /></td>";
265
?>
266 21b94a54 Michele Di Maria
		</tr>
267 42b0c921 Phil Davis
<?php
268
		if (is_array($q['queue'])) {
269 ff3003df Michele Di Maria
			processQueues($q, $level + 1, $parent_name);
270 42b0c921 Phil Davis
		}
271 21b94a54 Michele Di Maria
	};
272
}
273 42b0c921 Phil Davis
function statsQueues($xml) {
274 21b94a54 Michele Di Maria
	global $statistics;
275 b06abfe3 Michele Di Maria
276 21b94a54 Michele Di Maria
	$current = new QueueStats();
277
	$child = new QueueStats();
278
	$current->queuename = $xml['name'] . $xml['interface'];
279 2c5fda82 Jose Luis Duran
	$current->queuelength = $xml['qlength'];
280 ff3003df Michele Di Maria
	$current->pps = $xml['measured'];
281
	$current->bandwidth = $xml['measuredspeedint'];
282 21b94a54 Michele Di Maria
	$current->borrows = intval($xml['borrows']);
283
	$current->suspends = intval($xml['suspends']);
284 8e006931 Michele Di Maria
	$current->drops = intval($xml['droppedpkts']);
285 1679b68c Michele Di Maria
	if (is_array($xml['queue'])) {
286 42b0c921 Phil Davis
		foreach ($xml['queue'] as $q) {
287 21b94a54 Michele Di Maria
			$child = statsQueues($q);
288
			$current->pps += $child->pps;
289
			$current->bandwidth += $child->bandwidth;
290
			$current->borrows += $child->borrows;
291
			$current->suspends += $child->suspends;
292
			$current->drops += $child->drops;
293
		}
294
	}
295 a3eab908 Michele Di Maria
	unset($child);
296 21b94a54 Michele Di Maria
	$statistics[] = $current;
297
	return $current;
298
}
299 b06abfe3 Michele Di Maria
function format_bits($bits) {
300
	if ($bits >= 1000000000) {
301
		return sprintf("%.2f Gbps", $bits/1000000000);
302
	} else if ($bits >= 1000000) {
303
		return sprintf("%.2f Mbps", $bits/1000000);
304
	} else if ($bits >= 1000) {
305 31e41cf4 Michele Di Maria
		return sprintf("%.2f Kbps", $bits/1000);
306 b06abfe3 Michele Di Maria
	} else {
307 31e41cf4 Michele Di Maria
		return sprintf("%d bps", $bits);
308 b06abfe3 Michele Di Maria
	}
309
}
310 73eeee93 Michele Di Maria
?>