aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/lightsquid/sqstat.class.php811
1 files changed, 421 insertions, 390 deletions
diff --git a/config/lightsquid/sqstat.class.php b/config/lightsquid/sqstat.class.php
index 88a5cfce..dda0f501 100644
--- a/config/lightsquid/sqstat.class.php
+++ b/config/lightsquid/sqstat.class.php
@@ -1,131 +1,127 @@
<?php
-/* $Id$ */
/*
- sqstat.class.php
- Squid Proxy Server realtime stat
-
- (c) Alex Samorukov, samm@os2.kiev.ua
- modification by 2011 Serg Dvoriancev, dv_serg@mail.ru
- Squid Proxy Server realtime stat
-
- part of pfSense (www.pfSense.com)
-
- 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.
+ sqstat.class.php
+ part of pfSense (https://www.pfSense.org/)
+ Copyright (C) 2006 Alex Samorukov <samm@os2.kiev.ua>
+ Copyright (C) 2011 Sergey Dvoriancev <dv_serg@mail.ru>
+ Copyright (C) 2015 ESF, LLC
+ 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.
*/
-
-// sqstat class
+/* Squid Proxy Server realtime stats */
DEFINE('SQSTAT_VERSION', '1.20');
DEFINE('SQSTAT_SHOWLEN', 60);
-class squidstat{
- var $fp;
+class squidstat {
+ var $fp;
- # conection
- var $squidhost;
- var $squidport;
+ // conection
+ var $squidhost;
+ var $squidport;
- # hosts
- var $hosts_file;
+ // hosts
+ var $hosts_file;
var $hosts;
- # versions
+ // versions
var $server_version;
var $sqstat_version;
- # other
- var $group_by;
+ // other
+ var $group_by;
var $resolveip;
var $autorefresh;
var $use_sessions = false;
- # cache manager
+ // cache manager
var $cachemgr_passwd;
- # errors
+ // errors
var $errno;
var $errstr;
- function squidstat(){
- $this->sqstat_version = SQSTAT_VERSION;
+ function squidstat() {
+ $this->sqstat_version = SQSTAT_VERSION;
- $this->squidhost = '127.0.0.1';
- $this->squidport = '3128';
+ $this->squidhost = '127.0.0.1';
+ $this->squidport = '3128';
- $this->group_by = 'host';
- $this->resolveip = true;
- $this->hosts_file = '';
- $this->autorefresh = 0;
- $this->cachemgr_passwd = '';
+ $this->group_by = 'host';
+ $this->resolveip = true;
+ $this->hosts_file = '';
+ $this->autorefresh = 0;
+ $this->cachemgr_passwd = '';
- $errno = 0;
- $errstr = '';
+ $errno = 0;
+ $errstr = '';
- if (!function_exists("preg_match")) { $this->errorMsg(5, 'You need to install <a href="http://www.php.net/pcre/" target="_blank">PHP pcre extension</a> to run this script');
+ if (!function_exists("preg_match")) {
+ $this->errorMsg(5, 'You need to install <a href="http://www.php.net/pcre/" target="_blank">PHP pcre extension</a> to run this script');
$this->showError();
exit(5);
}
// we need session support to gather avg. speed
- if (function_exists("session_start")){
- $this->use_sessions=true;
+ if (function_exists("session_start")) {
+ $this->use_sessions = true;
}
-
}
- function formatXHTML($body, $refresh, $use_js = false){
- $text='<?xml version="1.0" encoding="UTF-8"?>'."\n".
- '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'."\n"
- .'<html>'
- .'<head>'
- .'<link href="sqstat.css" rel="stylesheet" type="text/css"/>';
- if($refresh) $text.='<META HTTP-EQUIV=Refresh CONTENT="'.$refresh.'; URL='.$_SERVER["PHP_SELF"].'?refresh='.$refresh.'&config='.$GLOBALS["config"].'"/>';
- $text.='<title>SqStat '.SQSTAT_VERSION.'</title>'
- .($use_js?'<script src="zhabascript.js" type="text/javascript"></script>':'').'</head>'
- .($use_js?'<body onload="jsInit();"><div id="dhtmltooltip"></div><img id="dhtmlpointer" src="arrow.gif">':'<body>')
- .$body.'</body></html>';
+ function formatXHTML($body, $refresh, $use_js = false) {
+ $text = '<?xml version="1.0" encoding="UTF-8"?>' . "\n"
+ .'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' . "\n"
+ . '<html>'
+ . '<head>'
+ . '<link href="sqstat.css" rel="stylesheet" type="text/css"/>';
+ if ($refresh) {
+ $text .= '<META HTTP-EQUIV=Refresh CONTENT="' . $refresh . '; URL=' . $_SERVER["PHP_SELF"] . '?refresh=' . $refresh . '&config=' . $GLOBALS["config"] . '"/>';
+ }
+ $text .= '<title>SqStat ' . SQSTAT_VERSION . '</title>' . ($use_js ? '<script src="zhabascript.js" type="text/javascript"></script>' : '') . '</head>'
+ . ($use_js ? '<body onload="jsInit();"><div id="dhtmltooltip"></div><img id="dhtmlpointer" src="arrow.gif">' : '<body>')
+ . $body . '</body></html>';
return $text;
}
function showError(){
- $text='<h1>SqStat error</h1>'.
- '<h2 style="color:red">Error ('.$this->errno.'): '.$this->errstr.'</span>';
- echo $this->formatXHTML($text,0);
+ $text = '<h1>SqStat error</h1>' . '<h2 style="color:red">Error (' . $this->errno . ') : ' . $this->errstr . '</h2>';
+ echo $this->formatXHTML($text, 0);
}
- function connect($squidhost, $squidport){
+ function connect($squidhost, $squidport) {
$this->fp = false;
- # connecting to the squidhost
+ // connecting to the squidhost
$this->fp = @fsockopen($squidhost, $squidport, $this->errno, $this->errstr, 10);
if (!$this->fp) {
- # failed to connect
+ // failed to connect
return false;
}
return true;
}
- # based @ (c) moritz at barafranca dot com
+ // based @ (c) moritz at barafranca dot com
function duration ($seconds) {
- $takes_time = array(604800,86400,3600,60,0);
- $suffixes = array("w","d","h","m","s");
+ $takes_time = array(604800, 86400, 3600, 60, 0);
+ $suffixes = array("w", "d", "h", "m", "s");
$output = "";
foreach ($takes_time as $key=>$val) {
${$suffixes[$key]} = ($val == 0) ? $seconds : floor(($seconds/$val));
@@ -145,31 +141,34 @@ class squidstat{
* @param int $bytes The number of bytes to format. Must be positive
* @param string $format Optional. The output format for the string
* @param string $force Optional. Force a certain unit. B|KB|MB|GB|TB
- * @return string The formatted file size
+ * @return string The formatted file size
*/
- function filesize_format($bytes, $format = '', $force = '')
- {
+ function filesize_format($bytes, $format = '', $force = '') {
$force = strtoupper($force);
$defaultFormat = '%01d %s';
- if (strlen($format) == 0)
- $format = $defaultFormat;
+ if (strlen($format) == 0) {
+ $format = $defaultFormat;
+ }
$bytes = max(0, (int) $bytes);
$units = array('b', 'Kb', 'Mb', 'Gb', 'Tb', 'Pb');
$power = array_search($force, $units);
- if ($power === false)
- $power = $bytes > 0 ? floor(log($bytes)/log(1024)) : 0;
+ if ($power === false) {
+ $power = $bytes > 0 ? floor(log($bytes)/log(1024)) : 0;
+ }
return sprintf($format, $bytes / pow(1024, $power), $units[$power]);
}
- function makeQuery($pass = ""){
+ function makeQuery($pass = "") {
$raw = array();
- # sending request
- if(!$this->fp)
- die("Please connect to server");
+ // sending request
+ if (!$this->fp) {
+ die("Please connect to server");
+ }
$out = "GET cache_object://localhost/active_requests HTTP/1.0\r\n";
- if ($pass != "")
- $out .= "Authorization: Basic ".base64_encode("cachemgr:$pass")."\r\n";
+ if ($pass != "") {
+ $out .= "Authorization: Basic ". base64_encode("cachemgr:$pass") . "\r\n";
+ }
$out .= "\r\n";
fwrite($this->fp, $out);
@@ -184,33 +183,51 @@ class squidstat{
return false;
}
- # parsing output;
+ // parsing output;
$header = 1;
$connection = 0;
$parsed["server_version"] = "Unknown";
- foreach($raw as $key=>$v){
- # cutoff http header
- if ($header==1 && $v=="") $header=0;
+ foreach ($raw as $key=>$v) {
+ // cutoff http header
+ if ($header == 1 && $v == "") {
+ $header = 0;
+ }
if ($header) {
- if(substr(strtolower($v),0,7) == "server:") { # parsing server version
- $parsed["server_version"] = substr($v,8);
+ if (substr(strtolower($v), 0, 7) == "server:") {
+ // parsing server version
+ $parsed["server_version"] = substr($v, 8);
}
- }
- else {
- if(substr($v,0,11) == "Connection:") { # parsing connection
- $connection = substr($v,12);
+ } else {
+ if (substr($v, 0, 11) == "Connection:") {
+ // parsing connection
+ $connection = substr($v, 12);
}
if ($connection) {
- # username field is avaible in Squid 2.6 stable
- # peer changed to remote in Squid 3.2 or later
- # me changed to local in Squid 3.2 or later
- if(substr($v,0,9) == "username ") $parsed["con"][$connection]["username"] = substr($v, 9);
- if(substr($v,0,7) == "remote:") $parsed["con"][$connection]["peer"] = substr($v, 8);
- if(substr($v,0,5) == "peer:") $parsed["con"][$connection]["peer"] = substr($v, 6);
- if(substr($v,0,6) == "local:") $parsed["con"][$connection]["me"] = substr($v, 7);
- if(substr($v,0,3) == "me:") $parsed["con"][$connection]["me"] = substr($v, 4);
- if(substr($v,0,4) == "uri ") $parsed["con"][$connection]["uri"] = substr($v, 4);
- if(substr($v,0,10) == "delay_pool") $parsed["con"][$connection]["delay_pool"] = substr($v, 11);
+ /* username field is avaible in Squid 2.6+
+ * peer changed to remote in Squid 3.2+
+ * me changed to local in Squid 3.2+
+ */
+ if (substr($v, 0, 9) == "username ") {
+ $parsed["con"][$connection]["username"] = substr($v, 9);
+ }
+ if (substr($v, 0, 7) == "remote:") {
+ $parsed["con"][$connection]["peer"] = substr($v, 8);
+ }
+ if (substr($v, 0, 5) == "peer:") {
+ $parsed["con"][$connection]["peer"] = substr($v, 6);
+ }
+ if (substr($v, 0, 6) == "local:") {
+ $parsed["con"][$connection]["me"] = substr($v, 7);
+ }
+ if (substr($v, 0, 3) == "me:") {
+ $parsed["con"][$connection]["me"] = substr($v, 4);
+ }
+ if (substr($v, 0, 4) == "uri ") {
+ $parsed["con"][$connection]["uri"] = substr($v, 4);
+ }
+ if (substr($v, 0, 10) == "delay_pool") {
+ $parsed["con"][$connection]["delay_pool"] = substr($v, 11);
+ }
if (preg_match('/out.offset \d+, out.size (\d+)/', $v, $matches)) {
$parsed["con"][$connection]["bytes"] = $matches[1];
@@ -225,7 +242,7 @@ class squidstat{
}
function implode_with_keys($array, $glue) {
- foreach ($array as $key => $v){
+ foreach ($array as $key => $v) {
$ret[] = $key . '=' . htmlspecialchars($v);
}
return implode($glue, $ret);
@@ -233,96 +250,107 @@ class squidstat{
function makeHtmlReport($data, $resolveip = false, $hosts_array = array(), $use_js = true) {
global $group_by;
- if($this->use_sessions){
+ if ($this->use_sessions) {
session_name('SQDATA');
session_start();
}
$total_avg = $total_curr = 0;
// resort data array
- $users=array();
- switch($group_by){
+ $users = array();
+ switch ($group_by) {
case "host":
- $group_by_name="Host";
- $group_by_key='return $ip;';
- break;
+ $group_by_name="Host";
+ $group_by_key='return $ip;';
+ break;
case "username":
- $group_by_name="User";
- $group_by_key='return $v["username"];';
- break;
+ $group_by_name="User";
+ $group_by_key='return $v["username"];';
+ break;
default:
- die("wrong group_by!");
+ die("wrong group_by!");
}
- foreach($data["con"] as $key => $v){
- if(substr($v["uri"],0,13)=="cache_object:") continue; // skip myself
- $ip=substr($v["peer"],0,strpos($v["peer"],":"));
- if(isset($hosts_array[$ip])){
- $ip=$hosts_array[$ip];
- }
- // i use ip2long() to make ip sorting work correctly
- elseif($resolveip){
- $hostname=gethostbyaddr($ip);
- if($hostname==$ip) $ip=ip2long($ip);// resolve failed
- else $ip=$hostname;
+ foreach ($data["con"] as $key => $v) {
+ if (substr($v["uri"], 0, 13) == "cache_object:") {
+ continue; // skip myself
}
- else{
- $ip=ip2long(substr($v["peer"],0,strpos($v["peer"],":")));
+ $ip = substr($v["peer"], 0, strpos($v["peer"], ":"));
+ if (isset($hosts_array[$ip])) {
+ $ip = $hosts_array[$ip];
+ // use ip2long() to make ip sorting work correctly
+ } elseif ($resolveip) {
+ $hostname = gethostbyaddr($ip);
+ if ($hostname == $ip) {
+ $ip = ip2long($ip); // resolve failed
+ } else {
+ $ip = $hostname;
+ }
+ } else {
+ $ip = ip2long(substr($v["peer"], 0, strpos($v["peer"],":")));
}
$v['connection'] = $key;
- if(!isset($v["username"])) $v["username"]="N/A";
- $users[eval($group_by_key)][]=$v;
+ if (!isset($v["username"])) {
+ $v["username"] = "N/A";
+ }
+ $users[eval($group_by_key)][] = $v;
}
ksort($users);
- $refresh=0;
- if(isset($_GET["refresh"]) && !isset($_GET["stop"])) $refresh=(int)$_GET["refresh"];
- $text='';
- if(count($GLOBALS["configs"])==1) $servers=$GLOBALS["squidhost"].':'.$GLOBALS["squidport"];
- else{
- $servers='<select onchange="this.form.submit();" name="config">';
- foreach ($GLOBALS["configs"] as $key=>$v){
- $servers.='<option '.($GLOBALS["config"]==$key?' selected="selected" ':'').' value="'.$key.'">'.htmlspecialchars($v).'</option>';
+ $refresh = 0;
+ if (isset($_GET["refresh"]) && !isset($_GET["stop"])) {
+ $refresh = (int)$_GET["refresh"];
+ }
+ $text = '';
+ if (count($GLOBALS["configs"]) == 1) {
+ $servers = $GLOBALS["squidhost"] . ':' . $GLOBALS["squidport"];
+ } else {
+ $servers = '<select onchange="this.form.submit();" name="config">';
+ foreach ($GLOBALS["configs"] as $key => $v) {
+ $servers .= '<option ' . ($GLOBALS["config"] == $key ? ' selected="selected" ' : '') . ' value="' . $key . '">' . htmlspecialchars($v) . '</option>';
}
- $servers.='</select>';
+ $servers .= '</select>';
}
- $text.='<div class="header"><form method="get" action="'.$_SERVER["PHP_SELF"].'">'.
- 'Squid RealTime stat for the '.$servers.' proxy server ('.$data["server_version"].').<br/>'.
- 'Auto refresh: <input name="refresh" type="text" size="4" value="'.$refresh.'"/> sec. <input type="submit" value="Update"/> <input name="stop" type="submit" value="Stop"/> Created at: <tt>'.date("h:i:s d/m/Y").'</tt><br/>'.
- '</div>'.
- '<table class="result" align="center" width="100%" border="0">'.
- '<tr>'.
- '<th>'.$group_by_name.'</th><th>URI</th>'.
- ($this->use_sessions?'<th>Curr. Speed</th><th>Avg. Speed</th>':'').
- '<th>Size</th><th>Time</th>'.
- '</tr>';
- $ausers=$acon=0;
+ $text .= '<div class="header"><form method="get" action="' . $_SERVER["PHP_SELF"] . '">'
+ . 'Squid RealTime stat for the ' . $servers . ' proxy server (' . $data["server_version"] . ').<br/>'
+ . 'Auto refresh: <input name="refresh" type="text" size="4" value="' . $refresh . '"/> sec. <input type="submit" value="Update"/> <input name="stop" type="submit" value="Stop"/> Created at: <tt>' . date("h:i:s d/m/Y") . '</tt><br/>'
+ . '</div>'
+ . '<table class="result" align="center" width="100%" border="0">'
+ . '<tr>'
+ . '<th>' . $group_by_name . '</th><th>URI</th>'
+ . ($this->use_sessions ? '<th>Curr. Speed</th><th>Avg. Speed</th>' : '')
+ . '<th>Size</th><th>Time</th>'
+ . '</tr>';
+ $ausers = $acon = 0;
unset($session_data);
if (isset($_SESSION['time']) && ((time() - $_SESSION['time']) < 3*60) && isset($_SESSION['sqdata']) && is_array($_SESSION['sqdata'])) {
- //only if the latest data was less than 3 minutes ago
+ // only if the latest data was less than 3 minutes ago
$session_data = $_SESSION['sqdata'];
}
- $table='';
- foreach($users as $key=>$v){
+ $table = '';
+ foreach ($users as $key=>$v) {
$ausers++;
- $table.='<tr><td style="border-right:0;" colspan="2"><b>'.(is_int($key)?long2ip($key):$key).'</b></td>'.
- '<td style="border-left:0;" colspan="5">&nbsp;</td></tr>';
- $user_avg = $user_curr = $con_color = 0;
- foreach ($v as $con){
- if(substr($con["uri"],0,7)=="http://" || substr($con["uri"],0,6)=="ftp://"){
- if(strlen($con["uri"])>SQSTAT_SHOWLEN) $uritext=htmlspecialchars(substr($con["uri"],0,SQSTAT_SHOWLEN)).'</a> ....';
- else $uritext=htmlspecialchars($con["uri"]).'</a>';
- $uri='<a target="_blank" href="'.htmlspecialchars($con["uri"]).'">'.$uritext;
+ $table .= '<tr><td style="border-right:0;" colspan="2"><b>' . (is_int($key) ? long2ip($key) : $key) . '</b></td>'
+ . '<td style="border-left:0;" colspan="5">&nbsp;</td></tr>';
+ $user_avg = $user_curr = $con_color = 0;
+ foreach ($v as $con) {
+ if (substr($con["uri"], 0, 7) == "http://" || substr($con["uri"], 0, 6) == "ftp://") {
+ if (strlen($con["uri"]) > SQSTAT_SHOWLEN) {
+ $uritext = htmlspecialchars(substr($con["uri"], 0, SQSTAT_SHOWLEN)) . '</a> ....';
+ } else {
+ $uritext = htmlspecialchars($con["uri"]) . '</a>';
+ }
+ $uri = '<a target="_blank" href="' . htmlspecialchars($con["uri"]) . '">' . $uritext;
+ } else {
+ $uri = htmlspecialchars($con["uri"]);
}
- else $uri=htmlspecialchars($con["uri"]);
$acon++;
- //speed stuff
+ // speed stuff
$con_id = $con['connection'];
$is_time = time();
- $curr_speed=0;
- $avg_speed=0;
- if (isset($session_data[$con_id]) && $con_data = $session_data[$con_id] ) {
- // if we have info about current connection, we do analyze its data
- // current speed
+ $curr_speed = 0;
+ $avg_speed = 0;
+ if (isset($session_data[$con_id]) && $con_data == $session_data[$con_id]) {
+ // if we have info about current connection, we do analyze its data current speed
$was_time = $con_data['time'];
$was_size = $con_data['size'];
if ($was_time && $was_size) {
@@ -337,7 +365,7 @@ class squidstat{
$curr_speed = $con['bytes'] / 1024;
}
- //avg speed
+ // avg speed
$avg_speed = $con['bytes'] / 1024;
if ($con['seconds'] > 0) {
$avg_speed /= $con['seconds'];
@@ -353,235 +381,238 @@ class squidstat{
$total_curr += $curr_speed;
$user_curr += $curr_speed;
- if($use_js) $js='onMouseout="hideddrivetip()" onMouseover="ddrivetip(\''.$this->implode_with_keys($con,'<br/>').'\')"';
- else $js='';
- $table.='<tr'.( (++$con_color % 2 == 0) ? ' class="odd"' : '' ).'><td id="white"></td>'.
- '<td nowrap '.$js.' width="80%" >'.$uri.'</td>';
- if($this->use_sessions){
- $table .= '<td nowrap align="right">'.( (round($curr_speed, 2) > 0) ? sprintf("%01.2f KB/s", $curr_speed) : '' ).'</td>'.
- '<td nowrap align="right">'.( (round($avg_speed, 2) > 0) ? sprintf("%01.2f KB/s", $avg_speed) : '' ). '</td>';
+ if ($use_js) {
+ $js = 'onMouseout="hideddrivetip()" onMouseover="ddrivetip(\'' . $this->implode_with_keys($con, '<br/>') . '\')"';
+ } else {
+ $js = '';
+ }
+ $table .= '<tr' . ( (++$con_color % 2 == 0) ? ' class="odd"' : '' ) . '><td id="white"></td>'
+ . '<td nowrap ' . $js . ' width="80%" >' . $uri . '</td>';
+ if ($this->use_sessions) {
+ $table .= '<td nowrap align="right">' . ( (round($curr_speed, 2) > 0) ? sprintf("%01.2f KB/s", $curr_speed) : '' ) . '</td>'
+ . '<td nowrap align="right">' . ( (round($avg_speed, 2) > 0) ? sprintf("%01.2f KB/s", $avg_speed) : '' ) . '</td>';
}
- $table .= '<td nowrap align="right">'.$this->filesize_format($con["bytes"]).'</td>'.
- '<td nowrap align="right">'.$this->duration($con["seconds"],"short").'</td>'.
- '</tr>';
+ $table .= '<td nowrap align="right">' . $this->filesize_format($con["bytes"]) . '</td>'
+ . '<td nowrap align="right">' . $this->duration($con["seconds"], "short") . '</td>'
+ . '</tr>';
}
- if($this->use_sessions){
- $table.=sprintf("<tr><td colspan=\"2\"></td><td align=\"right\" id=\"highlight\">%01.2f KB/s</td><td align=\"right\" id=\"highlight\">%01.2f KB/s</td><td colspan=\"2\"></td>",
- $user_curr, $user_avg);
+ if ($this->use_sessions) {
+ $table .= sprintf("<tr><td colspan=\"2\"></td><td align=\"right\" id=\"highlight\">%01.2f KB/s</td><td align=\"right\" id=\"highlight\">%01.2f KB/s</td><td colspan=\"2\"></td>", $user_curr, $user_avg);
}
}
$_SESSION['time'] = time();
- if(isset($new_data)) $_SESSION['sqdata'] = $new_data;
- $stat_row='';
- if($this->use_sessions){
- $stat_row.=sprintf("<tr class=\"total\"><td><b>Total:</b></td><td align=\"right\" colspan=\"5\"><b>%d</b> users and <b>%d</b> connections @ <b>%01.2f/%01.2f</b> KB/s (CURR/AVG)</td></tr>",
- $ausers, $acon, $total_curr, $total_avg);
+ if (isset($new_data)) {
+ $_SESSION['sqdata'] = $new_data;
}
- else {
- $stat_row.=sprintf("<tr class=\"total\"><td><b>Total:</b></td><td align=\"right\" colspan=\"5\"><b>%d</b> users and <b>%d</b> connections</td></tr>",
- $ausers, $acon);
+ $stat_row = '';
+ if ($this->use_sessions) {
+ $stat_row .= sprintf("<tr class=\"total\"><td><b>Total:</b></td><td align=\"right\" colspan=\"5\"><b>%d</b> users and <b>%d</b> connections @ <b>%01.2f/%01.2f</b> KB/s (CURR/AVG)</td></tr>", $ausers, $acon, $total_curr, $total_avg);
+ } else {
+ $stat_row .= sprintf("<tr class=\"total\"><td><b>Total:</b></td><td align=\"right\" colspan=\"5\"><b>%d</b> users and <b>%d</b> connections</td></tr>", $ausers, $acon);
}
- if($ausers==0){
- $text.='<tr><td colspan=6><b>No active connections</b></td></tr>';
+ if ($ausers == 0) {
+ $text .= '<tr><td colspan=6><b>No active connections</b></td></tr>';
+ } else {
+ $text .= $stat_row . $table . $stat_row;
+ }
+ $text .= '</table>' . '<p class="copyleft">&copy; <a href="mailto:samm@os2.kiev.ua?subject=SqStat ' . SQSTAT_VERSION . '">Alex Samorukov</a>, 2006</p>';
+ return $this->formatXHTML($text, $refresh, $use_js);
+ }
+
+ function parseRequest($data, $group_by = 'host', $resolveip = false) {
+ $parsed = array();
+ if ($this->use_sessions) {
+ session_name('SQDATA');
+ session_start();
+ }
+
+ // resort data array
+ $users = array();
+ switch ($group_by) {
+ case "username":
+ $group_by_name = "User";
+ $group_by_key = "username";
+ break;
+ case "host":
+ default:
+ $group_by_name = "Host";
+ $group_by_key = "peer";
+ break;
+ }
+
+ // resolve IP & group
+ foreach ($data["con"] as $key => $v) {
+ // skip myself
+ if (substr($v["uri"], 0, 13) == "cache_object:") {
+ continue;
+ }
+
+ $ip = substr($v["peer"], 0, strpos($v["peer"], ":"));
+ $v["peer"] = $ip;
+
+ // name from hosts
+ if (isset($this->hosts[$ip])) {
+ $ip = $this->hosts[$ip];
+ } elseif ($resolveip) {
+ // use ip2long() to make ip sorting work correctly
+ $hostname = gethostbyaddr($ip);
+ if ($hostname == $ip) {
+ $ip = ip2long($ip); // resolve failed. use (ip2long) key
+ } else {
+ $ip = $hostname;
+ }
+ } else {
+ $ip = ip2long(substr($v["peer"], 0, strpos($v["peer"], ":")));
+ }
+ $v['con_id'] = $key;
+ $v["username"] = isset($v["username"]) ? $v["username"] : "N/A";
+
+ // users [key => conn_array]
+ $users[$v[$group_by_key]][] = $v;
+ }
+ ksort($users);
+
+ unset($session_data);
+ if (isset($_SESSION['time']) && ((time() - $_SESSION['time']) < 3*60) && isset($_SESSION['sqdata']) && is_array($_SESSION['sqdata'])) {
+ // only if the latest data was less than 3 minutes ago
+ $session_data = $_SESSION['sqdata'];
+ }
+
+ // users count & con cont
+ $ausers = $acon = 0;
+ $total_avg = $total_curr = 0;
+ foreach ($users as $key => $v) {
+ $ausers++;
+
+ $user_avg = $user_curr = $con_color = 0;
+ foreach ($v as $con_key => $con) {
+ $cres = array();
+ $acon++;
+
+ $uritext = $con["uri"];
+ if (substr($con["uri"], 0, 7) == "http://" || substr($con["uri"], 0, 6) == "ftp://") {
+ if (strlen($uritext) > SQSTAT_SHOWLEN) {
+ $uritext = htmlspecialchars(substr($uritext, 0, SQSTAT_SHOWLEN)) . ' ....';
+ }
+ } else {
+ $uritext = htmlspecialchars($uritext);
+ }
+ $cres['uritext'] = $uritext;
+ $cres['uri'] = $con["uri"];
+
+ // speed stuff
+ $con_id = $con['connection'];
+ $is_time = time();
+ $curr_speed = $avg_speed = 0;
+ if (isset($session_data[$con_id]) && $con_data == $session_data[$con_id]) {
+ // if we have info about current connection, we do analyze its data current speed
+ $was_time = $con_data['time'];
+ $was_size = $con_data['size'];
+ if ($was_time && $was_size) {
+ $delta = $is_time - $was_time;
+ if ($delta == 0) {
+ $delta = 1;
+ }
+ if ($con['bytes'] >= $was_size) {
+ $curr_speed = ($con['bytes'] - $was_size) / 1024 / $delta;
+ }
+ } else {
+ $curr_speed = $con['bytes'] / 1024;
+ }
+
+ // avg speed
+ $avg_speed = $con['bytes'] / 1024;
+ if ($con['seconds'] > 0) {
+ $avg_speed /= $con['seconds'];
+ }
+ }
+ $cres['cur_speed'] = $curr_speed;
+ $cres['avg_speed'] = $avg_speed;
+ $cres['seconds'] = $con["seconds"];
+ $cres['bytes'] = $con["bytes"];
+
+ // grouped parsed[key => conn_key]
+ $parsed['users'][$key]['con'][$con_key] = $cres;
+
+ // for sessions
+ $new_data[$con_id]['time'] = $is_time;
+ $new_data[$con_id]['size'] = $con['bytes'];
+
+ // sum speeds
+ $total_avg += $avg_speed;
+ $user_avg += $avg_speed;
+ $total_curr += $curr_speed;
+ $user_curr += $curr_speed;
+ }
+
+ // total per user
+ $parsed['users'][$key]['user_curr'] = $user_curr;
+ $parsed['users'][$key]['user_avg'] = $user_avg;
}
- else {
- $text.=$stat_row.$table.$stat_row;
+
+ // total info
+ $parsed['ausers'] = $ausers;
+ $parsed['acon'] = $acon;
+ $parsed['total_avg'] = $total_avg;
+ $parsed['total_curr'] = $total_curr;
+
+ // update session info
+ $_SESSION['time'] = time();
+ if (isset($new_data)) {
+ $_SESSION['sqdata'] = $new_data;
}
- $text .= '</table>'.
- '<p class="copyleft">&copy; <a href="mailto:samm@os2.kiev.ua?subject=SqStat '.SQSTAT_VERSION.'">Alex Samorukov</a>, 2006</p>';
- return $this->formatXHTML($text,$refresh,$use_js);
+
+ return $parsed;
}
- function parseRequest($data, $group_by = 'host', $resolveip = false) { $parsed = array();
- if ($this->use_sessions) {
- session_name('SQDATA');
- session_start();
- }
-
- # resort data array
- $users = array();
- switch ($group_by) {
- case "username":
- $group_by_name = "User";
- $group_by_key = "username";
- break;
- case "host":
- default:
- $group_by_name = "Host";
- $group_by_key = "peer";
- break;
- }
-
- # resolve IP & group
- foreach ($data["con"] as $key => $v) { # skip myself
- if (substr($v["uri"], 0, 13) == "cache_object:") continue;
-
- $ip = substr($v["peer"], 0, strpos($v["peer"], ":"));
- $v["peer"] = $ip;
-
- # name from hosts
- if (isset($this->hosts[$ip])) {
- $ip = $this->hosts[$ip];
- }
- else
- # i use ip2long() to make ip sorting work correctly
- if ($resolveip) {
- $hostname = gethostbyaddr($ip);
- if ($hostname == $ip)
- $ip = ip2long($ip); # resolve failed. use (ip2long) key
- else $ip = $hostname;
- }
- else {
- $ip = ip2long(substr($v["peer"], 0, strpos($v["peer"], ":")));
- }
- $v['con_id'] = $key;
- $v["username"] = isset($v["username"]) ? $v["username"] : "N/A";
-
- # users [key => conn_array]
- $users[$v[$group_by_key]][] = $v;
- }
- ksort($users);
-
- unset($session_data);
- if (isset($_SESSION['time']) && ((time() - $_SESSION['time']) < 3*60) &&
- isset($_SESSION['sqdata']) && is_array($_SESSION['sqdata'])) {
- # only if the latest data was less than 3 minutes ago
- $session_data = $_SESSION['sqdata'];
- }
-
- # users count & con cont
- $ausers = $acon = 0;
- $total_avg = $total_curr = 0;
- foreach ($users as $key => $v) { $ausers++;
-
- $user_avg = $user_curr = $con_color = 0;
- foreach ($v as $con_key => $con){ $cres = array();
- $acon++;
-
- $uritext = $con["uri"];
- if (substr($con["uri"], 0, 7) == "http://" || substr($con["uri"], 0, 6) == "ftp://") {
- if (strlen($uritext) > SQSTAT_SHOWLEN)
- $uritext = htmlspecialchars(substr($uritext, 0, SQSTAT_SHOWLEN)) . ' ....';
- }
- else $uritext = htmlspecialchars($uritext);
- $cres['uritext'] = $uritext;
- $cres['uri'] = $con["uri"];
-
- # speed stuff
- $con_id = $con['connection'];
- $is_time = time();
- $curr_speed = $avg_speed = 0;
- if (isset($session_data[$con_id]) && $con_data = $session_data[$con_id] ) {
- # if we have info about current connection, we do analyze its data
- # current speed
- $was_time = $con_data['time'];
- $was_size = $con_data['size'];
- if ($was_time && $was_size) {
- $delta = $is_time - $was_time;
- if ($delta == 0) {
- $delta = 1;
- }
- if ($con['bytes'] >= $was_size) {
- $curr_speed = ($con['bytes'] - $was_size) / 1024 / $delta;
- }
- } else {
- $curr_speed = $con['bytes'] / 1024;
- }
-
- # avg speed
- $avg_speed = $con['bytes'] / 1024;
- if ($con['seconds'] > 0) {
- $avg_speed /= $con['seconds'];
- }
- }
- $cres['cur_speed'] = $curr_speed;
- $cres['avg_speed'] = $avg_speed;
- $cres['seconds'] = $con["seconds"];
- $cres['bytes'] = $con["bytes"];
-
- # groupped parsed[key => conn_key]
- $parsed['users'][$key]['con'][$con_key] = $cres;
-
- # for sessions
- $new_data[$con_id]['time'] = $is_time;
- $new_data[$con_id]['size'] = $con['bytes'];
-
- # sum speeds
- $total_avg += $avg_speed;
- $user_avg += $avg_speed;
- $total_curr += $curr_speed;
- $user_curr += $curr_speed;
- }
-
- # total per user
- $parsed['users'][$key]['user_curr'] = $user_curr;
- $parsed['users'][$key]['user_avg'] = $user_avg;
- }
-
- # total info
- $parsed['ausers'] = $ausers;
- $parsed['acon'] = $acon;
- $parsed['total_avg'] = $total_avg;
- $parsed['total_curr'] = $total_curr;
-
- # update session info
- $_SESSION['time'] = time();
- if (isset($new_data)) $_SESSION['sqdata'] = $new_data;
-
- return $parsed;
+ function errorMsg($errno, $errstr) {
+ $this->errno = $errno;
+ $this->errstr = $errstr;
}
- function errorMsg($errno, $errstr)
- { $this->errno = $errno;
- $this->errstr = $errstr;
+ function load_hosts() {
+ // loading hosts file
+ $hosts_array = array();
+
+ if (!empty($this->hosts_file)) {
+ if (is_file($this->hosts_file)) {
+ $handle = @fopen($this->hosts_file, "r");
+ if ($handle) {
+ while (!feof($handle)) {
+ $buffer = fgets($handle, 4096);
+ unset($matches);
+ if (preg_match('/^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})[ \t]+(.+)$/i', $buffer, $matches)) {
+ $hosts_array[$matches[1]]=$matches[2];
+ }
+ }
+ fclose($handle);
+ }
+ $this->hosts = $hosts_array;
+ } else {
+ // error
+ $this->errorMsg(4, "Hosts file not found. Cant read <tt>'{$this->hosts_file}'</tt>.");
+ return $this->errno;
+ }
+ }
+
+ return 0;
}
- function load_hosts()
- {
- # loading hosts file
- $hosts_array = array();
-
- if (!empty($this->hosts_file)) {
- if (is_file($this->hosts_file)) {
- $handle = @fopen($this->hosts_file, "r");
- if ($handle) {
- while (!feof($handle)) {
- $buffer = fgets($handle, 4096);
- unset($matches);
- if (preg_match('/^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})[ \t]+(.+)$/i', $buffer, $matches)) {
- $hosts_array[$matches[1]]=$matches[2];
- }
- }
- fclose($handle);
- }
- $this->hosts = $hosts_array;
- }
- else {
- #error
- $this->errorMsg(4, "Hosts file not found. Cant read <tt>'{$this->hosts_file}'</tt>.");
- return $this->errno;
- }
- }
-
- return 0;
- }
-
- function query_exec()
- {
- $data = "";
-
- $this->server_version = '(unknown)';
- if ($this->connect($this->squidhost, $this->squidport)) {
- $data = $this->makeQuery($this->cachemgr_passwd);
- if ($this->errno == 0) {
- $this->server_version = $data['server_version'];
- $data = $this->parseRequest($data, 'host', true);
- }
- }
-
- return $data;
- }
+ function query_exec() {
+ $data = "";
+
+ $this->server_version = '(unknown)';
+ if ($this->connect($this->squidhost, $this->squidport)) {
+ $data = $this->makeQuery($this->cachemgr_passwd);
+ if ($this->errno == 0) {
+ $this->server_version = $data['server_version'];
+ $data = $this->parseRequest($data, 'host', true);
+ }
+ }
+
+ return $data;
+ }
}
?>