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