2011-09-08 02:57:02 +00:00
< ? php
/*
2011-09-08 03:31:21 +00:00
Originally part of m0n0wall ( http :// m0n0 . ch / wall )
2011-09-20 09:55:11 +00:00
2011-09-08 02:57:02 +00:00
Copyright ( C ) 2004 - 2006 T . Lechat < dev @ lechat . org > , Manuel Kasper < mk @ neon1 . net >
and Jonathan Watt < jwatt @ jwatt . org >.
All rights reserved .
2011-09-20 09:55:11 +00:00
2011-09-08 02:57:02 +00:00
*/
2011-09-08 03:31:21 +00:00
include_once ( " ../includes/defaults.inc.php " );
include_once ( " ../config.php " );
include_once ( " ../includes/common.php " );
include_once ( " ../includes/dbFacile.php " );
include_once ( " ../includes/rewrites.php " );
include_once ( " includes/functions.inc.php " );
include_once ( " includes/authenticate.inc.php " );
include_once ( " ../includes/snmp.inc.php " );
if ( is_numeric ( $_GET [ 'id' ]) && ( $config [ 'allow_unauth_graphs' ] || port_permitted ( $_GET [ 'id' ])))
{
$port = get_port_by_id ( $_GET [ 'id' ]);
$device = device_by_id_cache ( $port [ 'device_id' ]);
$title = generate_device_link ( $device );
$title .= " :: Port " . generate_port_link ( $port );
$auth = TRUE ;
} else {
echo ( " Unauthenticad " );
die ;
}
2011-09-08 02:57:02 +00:00
header ( " Content-type: image/svg+xml " );
/********** HTTP GET Based Conf ***********/
2011-09-08 03:31:21 +00:00
$ifnum =@ $port [ 'ifIndex' ]; // BSD / SNMP interface name / number
$ifname = $device [ 'hostname' ] . " " . @ $port [ 'ifDescr' ]; //Interface name that will be showed on top right of graph
2011-09-08 02:57:02 +00:00
/********* Other conf *******/
$scale_type = " follow " ; //Autoscale default setup : "up" = only increase scale; "follow" = increase and decrease scale according to current graphed datas
$nb_plot = 240 ; //NB plot in graph
2011-09-08 03:52:37 +00:00
2011-09-08 02:57:02 +00:00
if ( is_numeric ( $_GET [ 'interval' ])) {
$time_interval = $_GET [ 'interval' ];
} else {
$time_interval = 1 ; //Refresh time Interval
}
2011-09-08 03:52:37 +00:00
2011-09-08 02:57:02 +00:00
$fetch_link = " data.php?id= " . $_GET [ id ];
//SVG attributes
$attribs [ 'axis' ] = 'fill="black" stroke="black"' ;
2011-09-08 03:52:37 +00:00
$attribs [ 'in' ] = 'fill="green" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="7"' ;
$attribs [ 'out' ] = 'fill="blue" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="7"' ;
2011-09-08 02:57:02 +00:00
$attribs [ 'graph_in' ] = 'fill="none" stroke="green" stroke-opacity="0.8"' ;
$attribs [ 'graph_out' ] = 'fill="none" stroke="blue" stroke-opacity="0.8"' ;
$attribs [ 'legend' ] = 'fill="black" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="4"' ;
$attribs [ 'graphname' ] = 'fill="#435370" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="8"' ;
$attribs [ 'grid_txt' ] = 'fill="gray" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="6"' ;
$attribs [ 'grid' ] = 'stroke="gray" stroke-opacity="0.5"' ;
$attribs [ 'switch_unit' ] = 'fill="#435370" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="4" text-decoration="underline"' ;
$attribs [ 'switch_scale' ] = 'fill="#435370" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="4" text-decoration="underline"' ;
$attribs [ 'error' ] = 'fill="blue" font-family="Arial" font-size="4"' ;
$attribs [ 'collect_initial' ] = 'fill="gray" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="4"' ;
//Error text if we cannot fetch data : depends on which method is used
$error_text = " Cannot get data about interface $ifnum " ;
2011-09-08 03:31:21 +00:00
$height = 125 ; //SVG internal height : do not modify
$width = 300 ; //SVG internal width : do not modify
2011-09-08 02:57:02 +00:00
/********* Graph DATA **************/
print ( '<?xml version="1.0" encoding="iso-8859-1"?>' . " \n " ); ?>
< svg width = " 100% " height = " 100% " viewBox = " 0 0 <?= $width ?> <?= $height ?> " preserveAspectRatio = " none " xml : space = " preserve " xmlns = " http://www.w3.org/2000/svg " xmlns : xlink = " http://www.w3.org/1999/xlink " onload = " init(evt) " >
< g id = " graph " >
< rect id = " bg " x1 = " 0 " y1 = " 0 " width = " 100% " height = " 100% " fill = " white " />
< line id = " axis_x " x1 = " 0 " y1 = " 0 " x2 = " 0 " y2 = " 100% " < ? = $attribs [ 'axis' ] ?> />
< line id = " axis_y " x1 = " 0 " y1 = " 100% " x2 = " 100% " y2 = " 100% " < ? = $attribs [ 'axis' ] ?> />
< path id = " graph_out " d = " M0 <?= $height ?> L 0 <?= $height ?> " < ? = $attribs [ 'graph_out' ] ?> />
< path id = " graph_in " d = " M0 <?= $height ?> L 0 <?= $height ?> " < ? = $attribs [ 'graph_in' ] ?> />
< path id = " grid " d = " M0 <?= $height /4*1?> L <?= $width ?> <?= $height /4*1?> M0 <?= $height /4*2?> L <?= $width ?> <?= $height /4*2?> M0 <?= $height /4*3?> L <?= $width ?> <?= $height /4*3?> " < ? = $attribs [ 'grid' ] ?> />
< text id = " grid_txt1 " x = " <?= $width ?> " y = " <?= $height /4*1?> " < ? = $attribs [ 'grid_txt' ] ?> text-anchor="end"> </text>
< text id = " grid_txt2 " x = " <?= $width ?> " y = " <?= $height /4*2?> " < ? = $attribs [ 'grid_txt' ] ?> text-anchor="end"> </text>
< text id = " grid_txt3 " x = " <?= $width ?> " y = " <?= $height /4*3?> " < ? = $attribs [ 'grid_txt' ] ?> text-anchor="end"> </text>
< text id = " graph_in_lbl " x = " 5 " y = " 8 " < ? = $attribs [ 'in' ] ?> >In</text>
< text id = " graph_out_lbl " x = " 5 " y = " 16 " < ? = $attribs [ 'out' ] ?> >Out</text>
< text id = " graph_in_txt " x = " 20 " y = " 8 " < ? = $attribs [ 'in' ] ?> > </text>
< text id = " graph_out_txt " x = " 20 " y = " 16 " < ? = $attribs [ 'out' ] ?> > </text>
< text id = " ifname " x = " <?= $width ?> " y = " 8 " < ? = $attribs [ 'graphname' ] ?> text-anchor="end"><?=$ifname?></text>
< text id = " switch_unit " x = " <?= $width *0.55?> " y = " 5 " < ? = $attribs [ 'switch_unit' ] ?> >Switch to bytes/s</text>
< text id = " switch_scale " x = " <?= $width *0.55?> " y = " 11 " < ? = $attribs [ 'switch_scale' ] ?> >AutoScale (<?=$scale_type?>)</text>
< text id = " datetime " x = " <?= $width *0.33?> " y = " 5 " < ? = $attribs [ 'legend' ] ?> > </text>
< text id = " graphlast " x = " <?= $width *0.55?> " y = " 17 " < ? = $attribs [ 'legend' ] ?> >Graph shows last <?=$time_interval*$nb_plot?> seconds</text>
< polygon id = " axis_arrow_x " < ? = $attribs [ 'axis' ] ?> points="<?=($width) . "," . ($height)?> <?=($width-2) . "," . ($height-2)?> <?=($width-2) . "," . $height?>"/>
< text id = " error " x = " <?= $width *0.5?> " y = " <?= $height *0.5?> " visibility = " hidden " < ? = $attribs [ 'error' ] ?> text-anchor="middle"><?=$error_text?></text>
< text id = " collect_initial " x = " <?= $width *0.5?> " y = " <?= $height *0.5?> " visibility = " hidden " < ? = $attribs [ 'collect_initial' ] ?> text-anchor="middle">Collecting initial data, please wait...</text>
</ g >
< script type = " text/ecmascript " >
<! [ CDATA [
/**
* getURL is a proprietary Adobe function , but it ' s simplicity has made it very
* popular . If getURL is undefined we spin our own by wrapping XMLHttpRequest .
*/
if ( typeof getURL == 'undefined' ) {
getURL = function ( url , callback ) {
if ( ! url )
throw 'No URL for getURL' ;
try {
if ( typeof callback . operationComplete == 'function' )
callback = callback . operationComplete ;
} catch ( e ) {}
if ( typeof callback != 'function' )
throw 'No callback function for getURL' ;
var http_request = null ;
if ( typeof XMLHttpRequest != 'undefined' ) {
http_request = new XMLHttpRequest ();
}
else if ( typeof ActiveXObject != 'undefined' ){
try {
http_request = new ActiveXObject ( 'Msxml2.XMLHTTP' );
} catch ( e ) {
try {
http_request = new ActiveXObject ( 'Microsoft.XMLHTTP' );
} catch ( e ) {}
}
}
if ( ! http_request )
throw 'Both getURL and XMLHttpRequest are undefined' ;
http_request . onreadystatechange = function () {
if ( http_request . readyState == 4 ) {
callback ( { success : true ,
content : http_request . responseText ,
contentType : http_request . getResponseHeader ( " Content-Type " ) } );
}
}
http_request . open ( 'GET' , url , true );
http_request . send ( null );
}
}
var SVGDoc = null ;
var last_ifin = 0 ;
var last_ifout = 0 ;
var last_ugmt = 0 ;
var max = 0 ;
var plot_in = new Array ();
var plot_out = new Array ();
var max_num_points = < ? = $nb_plot ?> ; // maximum number of plot data points
var step = < ? = $width ?> / max_num_points ;
var unit = 'bits' ;
var scale_type = '<?=$scale_type?>' ;
function init ( evt ) {
SVGDoc = evt . target . ownerDocument ;
SVGDoc . getElementById ( " switch_unit " ) . addEventListener ( " mousedown " , switch_unit , false );
SVGDoc . getElementById ( " switch_scale " ) . addEventListener ( " mousedown " , switch_scale , false );
fetch_data ();
}
function switch_unit ( event )
{
SVGDoc . getElementById ( 'switch_unit' ) . firstChild . data = 'Switch to ' + unit + '/s' ;
unit = ( unit == 'bits' ) ? 'bytes' : 'bits' ;
}
function switch_scale ( event )
{
scale_type = ( scale_type == 'up' ) ? 'follow' : 'up' ;
SVGDoc . getElementById ( 'switch_scale' ) . firstChild . data = 'AutoScale (' + scale_type + ')' ;
}
function fetch_data () {
getURL ( '<?=$fetch_link?>' , plot_data );
}
function plot_data ( obj ) {
// Show datetimelegend
var now = new Date ();
2011-09-20 09:55:11 +00:00
var datetime = ( now . getMonth () + 1 ) + " / " + now . getDate () + " / " + now . getFullYear () + ' ' +
2011-09-08 02:57:02 +00:00
LZ ( now . getHours ()) + " : " + LZ ( now . getMinutes ()) + " : " + LZ ( now . getSeconds ());
SVGDoc . getElementById ( 'datetime' ) . firstChild . data = datetime ;
if ( ! obj . success )
return handle_error (); // getURL failed to get data
var t = obj . content . split ( " | " );
var ugmt = parseFloat ( t [ 0 ]); // ugmt is an unixtimestamp style
var ifin = parseInt ( t [ 1 ]); // number of bytes received by the interface
var ifout = parseInt ( t [ 2 ]); // number of bytes sent by the interface
var scale ;
if ( ! isNumber ( ifin ) || ! isNumber ( ifout ))
return handle_error ();
var diff_ugmt = ugmt - last_ugmt ;
var diff_ifin = ifin - last_ifin ;
var diff_ifout = ifout - last_ifout ;
if ( diff_ugmt == 0 )
diff_ugmt = 1 ; /* avoid division by zero */
last_ugmt = ugmt ;
last_ifin = ifin ;
last_ifout = ifout ;
2011-09-20 09:55:11 +00:00
2011-09-08 02:57:02 +00:00
switch ( plot_in . length ) {
case 0 :
SVGDoc . getElementById ( " collect_initial " ) . setAttributeNS ( null , 'visibility' , 'visible' );
plot_in [ 0 ] = diff_ifin / diff_ugmt ;
plot_out [ 0 ] = diff_ifout / diff_ugmt ;
setTimeout ( 'fetch_data()' , < ? = 1000 * $time_interval ?> );
return ;
case 1 :
SVGDoc . getElementById ( " collect_initial " ) . setAttributeNS ( null , 'visibility' , 'hidden' );
break ;
case max_num_points :
// shift plot to left if the maximum number of plot points has been reached
var i = 0 ;
while ( i < max_num_points ) {
plot_in [ i ] = plot_in [ i + 1 ];
plot_out [ i ] = plot_out [ ++ i ];
}
plot_in . length -- ;
plot_out . length -- ;
}
plot_in [ plot_in . length ] = diff_ifin / diff_ugmt ;
plot_out [ plot_out . length ] = diff_ifout / diff_ugmt ;
var index_plot = plot_in . length - 1 ;
SVGDoc . getElementById ( 'graph_in_txt' ) . firstChild . data = formatSpeed ( plot_in [ index_plot ], unit );
SVGDoc . getElementById ( 'graph_out_txt' ) . firstChild . data = formatSpeed ( plot_out [ index_plot ], unit );
/* determine peak for sensible scaling */
if ( scale_type == 'up' ) {
if ( plot_in [ index_plot ] > max )
max = plot_in [ index_plot ];
if ( plot_out [ index_plot ] > max )
max = plot_out [ index_plot ];
}
else if ( scale_type == 'follow' ) {
i = 0 ;
max = 0 ;
while ( i < plot_in . length ) {
if ( plot_in [ i ] > max )
max = plot_in [ i ];
if ( plot_out [ i ] > max )
max = plot_out [ i ];
i ++ ;
}
}
var rmax ; // max, rounded up
if ( unit == 'bits' ) {
/* round up max , such that
100 kbps -> 200 kbps -> 400 kbps -> 800 kbps -> 1 Mbps -> 2 Mbps -> ... */
rmax = 12500 ;
i = 0 ;
while ( max > rmax ) {
i ++ ;
if ( i && ( i % 4 == 0 ))
rmax *= 1.25 ;
else
rmax *= 2 ;
}
} else {
/* round up max , such that
10 KB / s -> 20 KB / s -> 40 KB / s -> 80 KB / s -> 100 KB / s -> 200 KB / s -> 400 KB / s -> 800 KB / s -> 1 MB / s ... */
rmax = 10240 ;
i = 0 ;
while ( max > rmax ) {
i ++ ;
if ( i && ( i % 4 == 0 ))
rmax *= 1.25 ;
else
rmax *= 2 ;
2011-09-20 09:55:11 +00:00
2011-09-08 02:57:02 +00:00
if ( i == 8 )
rmax *= 1.024 ;
}
}
scale = < ? = $height ?> / rmax;
/* change labels accordingly */
SVGDoc . getElementById ( 'grid_txt1' ) . firstChild . data = formatSpeed ( 3 * rmax / 4 , unit );
SVGDoc . getElementById ( 'grid_txt2' ) . firstChild . data = formatSpeed ( 2 * rmax / 4 , unit );
SVGDoc . getElementById ( 'grid_txt3' ) . firstChild . data = formatSpeed ( rmax / 4 , unit );
var path_in = " M 0 " + ( < ? = $height ?> - (plot_in[0] * scale));
var path_out = " M 0 " + ( < ? = $height ?> - (plot_out[0] * scale));
for ( i = 1 ; i < plot_in . length ; i ++ )
{
var x = step * i ;
var y_in = < ? = $height ?> - (plot_in[i] * scale);
var y_out = < ? = $height ?> - (plot_out[i] * scale);
path_in += " L " + x + " " + y_in ;
path_out += " L " + x + " " + y_out ;
}
SVGDoc . getElementById ( 'error' ) . setAttributeNS ( null , 'visibility' , 'hidden' );
SVGDoc . getElementById ( 'graph_in' ) . setAttributeNS ( null , 'd' , path_in );
SVGDoc . getElementById ( 'graph_out' ) . setAttributeNS ( null , 'd' , path_out );
setTimeout ( 'fetch_data()' , < ? = 1000 * $time_interval ?> );
}
function handle_error () {
SVGDoc . getElementById ( " error " ) . setAttributeNS ( null , 'visibility' , 'visible' );
setTimeout ( 'fetch_data()' , < ? = 1000 * $time_interval ?> );
}
function isNumber ( a ) {
return typeof a == 'number' && isFinite ( a );
}
function formatSpeed ( speed , unit ) {
if ( unit == 'bits' )
return formatSpeedBits ( speed );
if ( unit == 'bytes' )
return formatSpeedBytes ( speed );
}
function formatSpeedBits ( speed ) {
// format speed in bits/sec, input: bytes/sec
if ( speed < 125000 )
return Math . round ( speed / 125 ) + " Kbps " ;
if ( speed < 125000000 )
return Math . round ( speed / 1250 ) / 100 + " Mbps " ;
// else
return Math . round ( speed / 1250000 ) / 100 + " Gbps " ; /* wow! */
}
function formatSpeedBytes ( speed ) {
// format speed in bytes/sec, input: bytes/sec
if ( speed < 1048576 )
return Math . round ( speed / 10.24 ) / 100 + " KB/s " ;
if ( speed < 1073741824 )
return Math . round ( speed / 10485.76 ) / 100 + " MB/s " ;
// else
return Math . round ( speed / 10737418.24 ) / 100 + " GB/s " ; /* wow! */
}
function LZ ( x ) {
return ( x < 0 || x > 9 ? " " : " 0 " ) + x ;
}
]] >
</ script >
</ svg >