[RESOLVIDO]Warning: gethostbyaddr(): Address is not a valid IPv4 or IPv6 address
-
Senário:
pfSense 2.2
Squid3 3.4.10_2 pkg 0.2.6
SquidGuard 1.4_7 pkg v.1.9.10
Lightsquid 1.8.2 pkg v.2.35Quando clico em proxy state no proxy report aparece várias vezes (parece ser um erro para cada conexão) o seguinte erro:
Warning: gethostbyaddr(): Address is not a valid IPv4 or IPv6 address in /usr/local/www/sqstat/sqstat.class.php on line 426Tem um relato de bug na versão 2.1(https://redmine.pfsense.org/issues/3936)
E neste post fala que é só quando tem ipv6. Já desbilitei, mas o erro continua (https://forum.pfsense.org/index.php?topic=81127.0) -
Bom dia!
Continuo com este erro.
Tem um post em inglês https://forum.pfsense.org/index.php?topic=81127.0 que relata o mesmo problema e um Bug checher de 5 meses atrás mas não achei a solução.
Alguém ai com mais experiencia pode me ajudar?
-
Estou tentando descobrir este erro.
Verifiquei que o conteúdo da variável $IP na linha 426 está vazio.
Analisando o código fonte para este conteúdo está vazio tem que ter um erro nesta function:
function makeQuery($pass = ""){ $raw = array(); # 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"; $out .= "\r\n"; fwrite($this->fp, $out); while (!feof($this->fp)) { $raw[] = trim(fgets($this->fp, 2048)); } fclose($this->fp); if (!preg_match("/^HTTP.* 200 OK$/", $raw[0])) { $this->errorMsg(1, "Cannot get data. Server answered: $raw[0]"); return false; } # parsing output; $header = 1; $connection = 0; $parsed["server_version"] = "Unknown"; 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); } } else { if(substr($v,0,11) == "Connection:") { # parsing connection $connection = substr($v,12); } if ($connection) { # username field is avaible in Squid 2.6 stable if(substr($v,0,9) == "username ") $parsed["con"][$connection]["username"] = substr($v, 9); if(substr($v,0,5) == "peer:") $parsed["con"][$connection]["peer"] = substr($v, 6); 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]; } if (preg_match('/start \d+\.\d+ \((\d+).\d+ seconds ago\)/', $v, $matches)){ $parsed["con"][$connection]["seconds"] = $matches[1]; } } } } return $parsed; }
-
Achei o problema!
No squid 3.4.10_2 houve alterações no nome de dois campos conforme abaixo
DE PARA
peer remote
me localSquid versão 3.1.20 (pfsense 2.1.5)
Connection: 0x287c6190 FD 16, read 10546, wrote 24779 FD desc: mail.google.com:443 in: buf 0x2a3fc000, offset 0, size 4096 peer: 192.168.0.196:3592 me: 192.168.0.2:3128 nrequests: 1 uri mail.google.com:443 logType TCP_MISS out.offset 0, out.size 24740 req_sz 208 entry 0x0/N/A start 1426612080.376224 (612.153023 seconds ago) username delay_pool 1
Squid Versão 3.4.10_2 (pfsense 2.2)
Connection: 0x8265326d8 FD 466, read 39330, wrote 256466 FD desc: 0.client-channel.google.com:443 in: buf 0x82ff41000, offset 0, size 4096 remote: 192.168.0.51:49829 local: 192.168.0.1:3128 nrequests: 1 uri 0.client-channel.google.com:443 logType TCP_MISS out.offset 0, out.size 256427 req_sz 232 entry 0x0/N/A start 1426601559.846703 (11113.823216 seconds ago) username delay_pool 0
Fiz as alteraçoes no arquivo /usr/local/www/sqstat/sqstat.class.php e agora está funcionando normalmente.
Arquivo alterado, teste ai./* $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 DEFINE('SQSTAT_VERSION', '1.20'); DEFINE('SQSTAT_SHOWLEN', 60); class squidstat{ var $fp; # conection var $squidhost; var $squidport; # hosts var $hosts_file; var $hosts; # versions var $server_version; var $sqstat_version; # other var $group_by; var $resolveip; var $autorefresh; var $use_sessions = false; # cache manager var $cachemgr_passwd; # errors var $errno; var $errstr; function squidstat(){ $this->sqstat_version = SQSTAT_VERSION; $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 = ''; $errno = 0; $errstr = ''; if (!function_exists("preg_match")) { $this->errorMsg(5, 'You need to install [PHP pcre extension](http://www.php.net/pcre/) 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; } } function formatXHTML($body, $refresh, $use_js = false){ $text=''."\n". ''."\n" .'' .'' .''; if($refresh) $text.=''; $text.='<title>SqStat '.SQSTAT_VERSION.'</title>' .($use_js?'':'').'' .($use_js?'':'') .$body.''; return $text; } function showError(){ $text=' # SqStat error '. ' ## Error ('.$this->errno.'): '.$this->errstr.''; echo $this->formatXHTML($text,0); } function connect($squidhost, $squidport){ $this->fp = false; # connecting to the squidhost $this->fp = @fsockopen($squidhost, $squidport, $this->errno, $this->errstr, 10); if (!$this->fp) { # failed to connect return false; } return true; } # 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"); $output = ""; foreach ($takes_time as $key=>$val) { ${$suffixes[$key]} = ($val == 0) ? $seconds : floor(($seconds/$val)); $seconds -= ${$suffixes[$key]} * $val; if (${$suffixes[$key]} > 0) { $output .= ${$suffixes[$key]}; $output .= $suffixes[$key]." "; } } return trim($output); } /** * Format a number of bytes into a human readable format. * Optionally choose the output format and/or force a particular unit * * @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 */ function filesize_format($bytes, $format = '', $force = '') { $force = strtoupper($force); $defaultFormat = '%01d %s'; 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; return sprintf($format, $bytes / pow(1024, $power), $units[$power]); } function makeQuery($pass = ""){ $raw = array(); # 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"; $out .= "\r\n"; fwrite($this->fp, $out); while (!feof($this->fp)) { $raw[] = trim(fgets($this->fp, 2048)); } fclose($this->fp); if (!preg_match("/^HTTP.* 200 OK$/", $raw[0])) { $this->errorMsg(1, "Cannot get data. Server answered: $raw[0]"); return false; } # parsing output; $header = 1; $connection = 0; $parsed["server_version"] = "Unknown"; 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); } } else { if(substr($v,0,11) == "Connection:") { # parsing connection $connection = substr($v,12); } if ($connection) { # username field is avaible in Squid 2.6 stable if(substr($v,0,9) == "username ") $parsed["con"][$connection]["username"] = substr($v, 9); if(substr($v,0,5) == "peer:") $parsed["con"][$connection]["peer"] = substr($v, 6); if(substr($v,0,7) == "remote:") $parsed["con"][$connection]["peer"] = substr($v, 8); if(substr($v,0,3) == "me:") $parsed["con"][$connection]["me"] = substr($v, 4); if(substr($v,0,6) == "local:") $parsed["con"][$connection]["me"] = substr($v, 7); 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]; } if (preg_match('/start \d+\.\d+ \((\d+).\d+ seconds ago\)/', $v, $matches)){ $parsed["con"][$connection]["seconds"] = $matches[1]; } } } } return $parsed; } function implode_with_keys($array, $glue) { foreach ($array as $key => $v){ $ret[] = $key . '=' . htmlspecialchars($v); } return implode($glue, $ret); } function makeHtmlReport($data, $resolveip = false, $hosts_array = array(), $use_js = true) { global $group_by; if($this->use_sessions){ session_name('SQDATA'); session_start(); } $total_avg = $total_curr = 0; // resort data array $users=array(); switch($group_by){ case "host": $group_by_name="Host"; $group_by_key='return $ip;'; break; case "username": $group_by_name="User"; $group_by_key='return $v["username"];'; break; default: 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; } 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; } 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>'; } $servers.='</select>'; } $text.=' <form method="get" action="'.$_SERVER[" php_self"].'"="">'. 'Squid RealTime stat for the '.$servers.' proxy server ('.$data["server_version"].'). '. 'Auto refresh: sec. Created at: <tt>'.date("h:i:s d/m/Y").'</tt> '. '</form> '. ''. ''. ''. ($this->use_sessions?'':''). ''. ''; $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 $session_data = $_SESSION['sqdata']; } $table=''; foreach($users as $key=>$v){ $ausers++; $table.=''. ''; $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)).' ....'; else $uritext=htmlspecialchars($con["uri"]).''; $uri='['.$uritext; } else $uri=htmlspecialchars($con["uri"]); $acon++; //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 $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']; } } $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; if($use_js) $js='onMouseout="hideddrivetip()" onMouseover="ddrivetip(\''.$this->implode_with_keys($con,' ').'\')"'; else $js=''; $table.=']('.htmlspecialchars($con[)['. ']('.htmlspecialchars($con[)['; if($this->use_sessions){ $table .= ']('.htmlspecialchars($con[)['. ']('.htmlspecialchars($con[)['; } $table .= ']('.htmlspecialchars($con[)['. ']('.htmlspecialchars($con[)['. ']('.htmlspecialchars($con[)['; } if($this->use_sessions){ $table.=sprintf("]('.htmlspecialchars($con[)[", $user_curr, $user_avg); } } $_SESSION['time'] = time(); if(isset($new_data)) $_SESSION['sqdata'] = $new_data; $stat_row=''; if($this->use_sessions){ $stat_row.=sprintf("]('.htmlspecialchars($con[)[", $ausers, $acon, $total_curr, $total_avg); } else { $stat_row.=sprintf("]('.htmlspecialchars($con[)[", $ausers, $acon); } if($ausers==0){ $text.=']('.htmlspecialchars($con[)['; } else { $text.=$stat_row.$table.$stat_row; } $text .= ']('.htmlspecialchars($con[) | '.$group_by_name.' | URI | Curr. Speed | Avg. Speed | Size | Time | | **'.(is_int($key)?long2ip($key):$key).'** | | | | '.$uri.' | '.( (round($curr_speed, 2) > 0) ? sprintf("%01.2f KB/s", $curr_speed) : '' ).' | '.( (round($avg_speed, 2) > 0) ? sprintf("%01.2f KB/s", $avg_speed) : '' ). ' | '.$this->filesize_format($con["bytes"]).' | '.$this->duration($con["seconds"],"short").' | | | %01.2f KB/s | %01.2f KB/s | | | **Total:** | **%d** users and **%d** connections @ **%01.2f/%01.2f** KB/s (CURR/AVG) | | **Total:** | **%d** users and **%d** connections | | **No active connections** | ['. ']('.htmlspecialchars($con[) [©]('.htmlspecialchars($con[) [Alex Samorukov](mailto:samm@os2.kiev.ua?subject=SqStat '.SQSTAT_VERSION.'), 2006 '; 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]; } 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 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; } } ?>  
-
Reinaldo, Obrigado pela contribuição.
Sobe esta alteração como 'pull request' no git hub.
arquivos do squid 3.4
https://github.com/pfsense/pfsense-packages/tree/master/config/squid3/34arquivos do lightsquid
https://github.com/pfsense/pfsense-packages/tree/master/config/lightsquidDessa forma, o pessoal do pfsense pode revisar e aplicar a alteração no código.
-
Reinaldo, Obrigado pela contribuição.
Sobe esta alteração como 'pull request' no git hub.
arquivos do squid 3.4
https://github.com/pfsense/pfsense-packages/tree/master/config/squid3/34arquivos do lightsquid
https://github.com/pfsense/pfsense-packages/tree/master/config/lightsquidDessa forma, o pessoal do pfsense pode revisar e aplicar a alteração no código.
Obrigado Marcelo.
Consegui postar lá, vamos ver se aprovam a alteração. Aqui está funcionando 100% em todos que alterei. -
Marcelo, mas uma vez obrigado. A alteração foi aceita pelo TEAM e o pacote com a correção já está liberada para todos.
Para quem estiver recebendo a mensagem ainda, atualize o pacote lightsquid.