Ковыряясь с хотспотом, столкнулся с тем, что иногда в таблице radacct остаются строки, в которых отсутствует время окончания сессии (acctstoptime). То есть, речь идет не о записях текущих сеансов, в которых время окончания естественно отсутствует — по той причине, что сеанс еще не закончен. Речь о записях предыдущих сеансов. В биллинге Easyhotspot, который я использую, наличие таких строк мешает нормальной работе функции принудительного отключения.
Проблема была решена следующим способом:
- Был создан набор команд (скрипт) MySQL, удаляющий такие строки.
- Был настроен запуск данного скрипта.
Теперь подробнее.
Сам скрипт я создал в папке пользователя root, назвал его clear.sql, и содержимое его выглядит следующим образом:
USE easyhotspot;
DELETE FROM `radacct` WHERE `acctstoptime` IS NULL;
Ничего конгениального в скрипте нет. Первая команда скрипта выбирает базу в сервере MySQL. В используемом мной биллинге Easyhotspot база, с которой работает RADIUS, называется именно easyhotspot. В случае же другого названия базы, нужно всего лишь в первой строке скрипта изменить имя базы, выделенное синим цветом. Вторая команда удаляет из указанной в ней таблицы (radacct), строки, удовлетворяющие условию, а именно те, в которых поле acctstoptime — пустое (шаблон — ‘ ‘).
Теперь пару слов про запуск. Собственно, чтобы запустить выполнение команд из указанного скрипта, нужно в консоли запустить следующую команду:
mysql -uroot -pпароль_рута < /root/clear.sql
В данной команде, на мой взгляд, все предельно просто и ясно — входим в консоль сервера MySQL и запускаем выполнение скрипта. В приведенной команде нужно лишь указать свой собственный пароль пользователя root для сервера MySQL (выделен синим цветом).
И про автоматизацию запуска. Данную команду имеет смысл выполнять в тот момент, когда у RADIUS-а нет подключенных пользователей. Первый приходящий на ум вариант — при запуске компьютера. То есть, команду нужно добавить в файл rc.local. Но ведь компьютер может и сутками не выключаться (а как следствие — и не включаться). Тогда можно задействовать другой вариант — добавить ее в расписание (cron). При этом нужно указать время, в которое наименьшая вероятность наличия подключенных пользователей.
Ну и еще про один «вредный» файлик. RADIUS в своей работе создает файл ${logdir}/radutmp в котором хранит информацию о текущих сессиях. Файл этот «мешать» начинает лишь при выполнении ряда условий. А именно; клиенту разрешен лишь один логин на его пару «имя/пароль», клиент был подключен (авторизован), и в этот момент сервер с RADIUS-ом аварийно выключился. В таком случае RADIUS не удаляет из файла radutmp информацию о сессии клиента, и в итоге клиент после того, как работа системы возобновилась, при попытке авторизоваться получает сообщение, что он уже вошел в систему.
Лечение простое — при загрузке компьютера просто стереть файл radutmp. Для этого в файл rc.local достаточно добавить команду:
rm -f /var/log/radius/radutmp
В данном случае команда приведена с учетом расположения файла в дистрибутиве Mandriva. Для других дистрибутивов оно может быть иным. Например, в дистрибутиве Ubuntu файл располагается по адресу /var/log/freeradius/radutmp. При необходимости, откорректируйте путь (выделен синим цветом) в соответствии с расположением файла radutmp в вашем дистрибутиве.
Ну и напоследок, для самых ленивых. Я написал скрипт, который в интерактивном режиме (вопрос-ответ) проделывает установку и настройку всего этого на компьютере. Скрипт запрашивает и пароль root для MySQL и имя базы для RADIUS и время, в которое, если что, запускать чистку базы…