Система Ubuntu server 10.04 на которой имеется хотспот (контроллер доступа chillispot+freeradius+msql БД) Все отлично работает. Кроме счетчика лимитов для клиентов. Клиентам выделено 10ГБ трафика, но при достижении 4ГБ трафика клиенты получают сообщение" активация не удалась. вы израсходовали лимит времени и/или объема данных"
Фрирадиус выдает в логах: Auth: Invalid user (rlm_sqlcounter: Maximum never usage time reached): [xuctoc7/<CHAP-Password>] (from client hotspot port 1 cli 00-13-D3-3A-7C-50)
Как сделать так, чтоб фрирадиус отключал клиентов при достижении указанного трафика, а не ограничивался 4ГБ. Почему упорно только 4ГБ? Где можно снять эти ограничения. В мускуле не силен. Если можете подскажите!!!
Проблема sql-счетчика
Как сделать так, чтоб фрирадиус отключал клиентов при достижении указанного трафика, а не ограничивался 4ГБ. Почему упорно только 4ГБ? Где можно снять эти ограничения. В мускуле не силен. Если можете подскажите!!!
А в каких попугаях этот трафик хранится? Может просто тривиальное переполнение разрядности? Цифра 4Гб навевает именно эти мысли...
в байтах :-)А в каких попугаях этот трафик хранится?
у вопрос не совсем про попугаев. А про тип поля в котором это значение хранится. А может и в коде где то режется. Ключевой момент: на каком то этапе идет работа как с четырехбайтовым значением
да в байтах
mysql> select sum(acctinputoctets)+sum(acctoutputoctets) from radacct where username='xuctoc7';
+--------------------------------------------+
| sum(acctinputoctets)+sum(acctoutputoctets) |
+--------------------------------------------+
| 4295594010 |
+--------------------------------------------+
1 row in set (0.00 sec)
как разрешить проблему переполнения разрядности????
возможно в counter.conf хранятся данные
Проверьте поля acctinputoctets, acctoutputoctet должны быть bigint. Еще надо доку глянуть - sum умеет ли работать с bigint.
Тип поля в котором хранится значение установленного трафика - varchar254
80
Это вот эти вот два поля имеют тип varchar ?
Жесть.
1. Если чар зачем 254... Это вообще супер анлим?
2. Как к этому типу применима sum? (я так ни когда не делал, попробую, но имхо бред какой то)
попробовал на тесте.. .ЭТО работает...... Я в шоке.
А вот как работает хз. На док копать. Могу только предположить. Происходит ошибка при автоматическом приведении типов. Например первый клиент скачал всего 10кб и залил 10кб. Преобразование считает что типа 8байтов вполне хватает и чешет все остальное под одну гребенку. Попробуйте сделать насильное приведение типов
select sum(cast(acctinputoctets as bigint))+sum(cast(acctoutputoctets as bigint)) from radacct where username='xuctoc7';
4295594010 |
В прочем здесь уже за 4 байта вылезло.....
Логин Пароль Тарифный пакет Времени прошло: Времени осталось: Трафика израсходовано: Трафика осталось: Инкассирован? Еще годен? Действия
veclic12 nipgucod student 2930 --- 4096 6143 Нет Годен
rikvok6 nitdupak student 3888 --- 4096 6143 Нет Годен
wesxag6 pitkesun student 2151 --- 4096 6143 Нет Годен
Это данные из веб интерфейса у всех трафика израсходовано как на подбор 4096
4096 * 1024 * 1024 = 4 294 967 296 храниться в байтах. Т.е. операция идет обратная - деление с округлением. т.е. до округления 4 294 967 295 т.е. 0xFFFFFFFF. Переполнение типа однозначно. Судя по тому, что вы выше приводили пример результата 4295594010. Который не вписывается в 4 байта. Значит ошибка на стадии вычисления значения "Трафика израсходовано" при переводе из байтов в мегабайты. Там идет приведение к четырехбайтовому int.
вы правы voral! Для наглядности установил phpmyadmin. Тип поля трафика
был amount int(255). Изменил тип поля на bigint- проблема так и осталась. Что еще надо поменять??? Может длину значения, у меня она была 255.
ALTER TABLE `yourtable` CHANGE `amount` `amount` BIGINTесли нужны дефолтное значение как всегда
ALTER TABLE `yourtable` CHANGE `amount` `amount` BIGINT NOT NULL DEFAULT 0Изменил тип поля на bigint- проблема так и осталась. Что еще надо поменять??? Может длину значения, у меня она была 255.
упс.. не дочитал :) ЩАс проверю
После замены на bigint. В SQL консоли руками сами попробовали запросом сложить? Там тоже обрезается?
PS Версий мускуля какая?
После замены на bigint. В SQL консоли руками сами попробовали запросом сложить? Там тоже обрезается?
А может стоит хранить траффик не в байтах а в килобайтах? Или в сотнях килобайт? И манипулировать в расчетах-сравнениях именно этим попугаем?
В SQL консоли руками сами попробовали запросом сложить? Там тоже обрезается? Я не совсем знаю как это сделать! Если подскажите буду вам благодарен. Версия мускула
| 5.1.63-0ubuntu0.10.04.1
[console]
$mysql -D <database_name> -u <username> -p -e "select sum(acount) from <table_name>"
Enter password:
[/console]