Squid logoПосле обновления Squid до версии 3.2 внезапно перестал работать мониторинг пользовательской активности SqStat. Несмотря на то, что в конфигурации прописан корректно доступ к списку manager, sqstat упорно не видел ответа от сервиса Squid, выдавая следующую ошибку:

 

SqStat error
Error (1): Cannot get data. Server answered: HTTP/1.1 200 OK

Изучение вывода tcpdump и исходных кодов SqStat показало, что во-первых Squid стал отзываться HTTP/1.1 вместо HTTP/1.0, а во-вторых формат данных слегка поменялся. Внесем правки в код:

107c107
<               if($raw[0]!="HTTP/1.0 200 OK"){
---
>               if($raw[0]!="HTTP/1.1 200 OK"){
131,132c131,132
<                                       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,7)=="remote:") $parsed["con"][$connection]["remote"]=substr($v,8);
>                                       if(substr($v,0,6)=="local:") $parsed["con"][$connection]["local"]=substr($v,7);
178c178
<                       $ip=substr($v["peer"],0,strpos($v["peer"],":"));
---
>                       $ip=substr($v["remote"],0,strpos($v["remote"],":"));
189c189
<                               $ip=ip2long(substr($v["peer"],0,strpos($v["peer"],":")));
---
>                               $ip=ip2long(substr($v["remote"],0,strpos($v["remote"],":")));

Патч можно скачать отсюда и применить следующим образом:

patch sqstat.class.php sqstat_squid32.patch

Все заработало без проблем.

Добавить комментарий
  • Исправляется заменой строк:

    $ip=substr($v["remote"],0,strpos($v["remote"],":"));
    $ip=ip2long(substr($v["remote"],0,strpos($v["remote"],":")));


    на строки:

    $ip=$v["remote"];
    $ip=ip2long($v["remote"]);


    соответственно.

  • 0.0.0.0 в качестве адреса клиента показывает в том случае, когда в выводе сквида после IP клиента нет двоеточия и номера порта. Это хорошо видно в всплывающей подсказке над uri. Зависит от версии сквида.

  • Pavel

    Жалоба

    Доброго дня. Спасибо за статью, помогла, но к сожалению частично... - не показывает IP адреса клиентов. Показывает 0.0.0.0. Не подскажете - где покопать?
    И почему-то строка Total дублируется вверху...
    Спасибо.

    Вложения :
  • В ответ на: Pavel Жалоба

    Именно такие симптомы и у меня были, но как раз то, что здесь написано и должно устранить проблему с 0.0.0.0. В частности замена параметров peer и me на remote и local. Проверьте внимательнее, может не на тот файл патч наложили.

  • Pavel

    В ответ на: Ruslan Kidun Жалоба

    Проверил, вроде все честно...
    Я патч не накладывал, вручную отредактировал строки...в принципе я так и понял, что нужно заменить peer и me на remote и local.
    но эффекта нет, причем я сохранил обе версиии файла (в обоих только 107я строка одинакова) , и работает с обоими одинаково...

  • В ответ на: Pavel Жалоба

    смотри логи squid, кажется мне что-то с доступом к manager не так (порядок ACL, права доступа и т.д.)

  • Pavel

    В ответ на: Ruslan Kidun Жалоба

    У вас в 131й строке возможно лишний пробел после "remote: ". В оригин. файле его нет, и когда вручную меняешь, соответственно его тоже нету, а функция его считает..., соответственно не может отпарсить правильно вывод.
    Я поменял в 131й строке
    if(substr($v,0,8)=="remote: ") $parsed["con"][$connection]["remote"]=substr($v,8);
    на
    if(substr($v,0,7)=="remote:") $parsed["con"][$connection]["remote"]=substr($v,8);
    IPшники стал показывать.
    Спасибо!

  • В ответ на: Pavel Жалоба

    Спасибо, что подсказали. Подправил статью, хотя у меня и с пробелом работает. Видимо, есть различия либо в версиях Squid, либо в коде Squid для различных ОС. У меня Squid 3.2.11 для FreeBSD в данный момент. У вас какая версия Squid?

  • Pavel

    В ответ на: Ruslan Kidun Жалоба

    У меня версия squid-3.3.4_1, sqstat-1.20,
    FreeBSD 9.1 (i386).