Разработка программного комплекса для управления интернет-клубом, работающем под GNU/Linux
Введение
В настоящее время подавляющее большинство интернет/игровых-клубов работают под управлением ОС семейства windows®. В качестве программного комплекса для управления клубом, как правило, используются коммерческие программные продукты «astalaViSta Money Saver», «astalaViSta SuperViSor»(http://www.astalavista.ru), либо «ClubControl»(http://www.clubcontrol.ru).
До миграции в клубе использовался комплекс «astalaViSta SuperViSor».
Этот продукт позволяет практически полностью автоматизировать деятельность интернет-клуба, но разработан для работы в среде windows®. Кроме того это коммерческий продукт с закрытым кодом.
В связи с решением о миграции интернет-кафе на GNU/Linux возникла необходимость в аналогичной по функционалу системе для *nix-like ОС.
После того, как поиск в интернете не дал результатов, руководство клуба поставило задачу разработать подобную систему.
В настоящее время разработанная система прошла внедрение и успешно эксплуатируется в трёх интернет-клубах. Интернет-клуб Linux
Постановка задачи
Программный комплекс должен выполнять следующие функции:
- блокирование доступа к компьютеру, до факта «посадки» клиента
- блокирование доступа к компьютеру по истечении оплаченного клиентом времени
- возможность «посадки» клиента «по завершению»
- включение/блокировка доступа к интернет
- детальный отчёт по трафику клиента с разбивкой по посещённым им сайтам(на случай возникновения конфликтных ситуаций)
- итоговый отчёт по сессии работы с клиентом
- возможность динамически добавлять/уменьшать время сессии
- поддержка сеансов работы операторов
- протоколирование всех действий оператора
- ведение финансовой отчётности
- поддержка тарифным планов
- управление биллингом(добавление новых машин, управление тарифными планами) без участия программиста
Кроме того консоль оператора должна работать не только под unix, но и под windows® Т.е. по сути, должна быть кроссплатформенной.
Структура
Интернет-клуб на Linux
Реализация
Система реализована на языках perl и php4.
Серверная часть написана под FreeBSD.
Используемая СУБД - mysql.
Интернет-клуб Linux
Управления клиентскими хостами.
Задача - открытие/блокировка клиентских хостов ядром биллинга, либо с консоли оператора.
Клиентская часть как таковая отсутствует. Согласно принципам unix-way управление осуществляется комбинацией штатных приложений.
I. Для управления авторизации было принято решение использовать pam-mysql(http://pam-mysql.sourceforge.net/)
прим. Библиотека Pluggable Authentication Modules (PAM) является обобщённым API для служб, связанных с аутентификацией, которые позволяют системному администратору добавлять новые методы аутентификации простой установкой новых модулей PAM, и изменять политику аутентификации посредством редактирования конфигурационных файлов.
Таким образом, можно заставить менеджер входа в систему принимать решение об авторизации пользователя по значению поля в таблице на сервере, что в свою очередь даёт возможность скриптам биллинга управлять исходом авторизации хостов меняя значение в поле таблицы СУБД.
настройка:
- устанавливаем пакет pam-mysql
- создаём /etc/pam.d/kdm(в случае использования KDM) следующего содержания:
auth optional pam_mysql.so user=pam passwd=secret db=bill host=192.168.1.101 table=pam usercolumn=login passwdcolumn=passwd where=active=1&&host_id=2 plain
account required pam_mysql.so user=pam passwd=secret db=bill host=192.168.1.101 table=pam usercolumn=login passwdcolumn=passwd where=active=1&&host_id=2 plain
password required pam_stack.so service=system-auth
session required pam_stack.so service=system-auth
session optional pam_console.so
Таким образом, display manager не пустит пользователя в систему, пока значение поля active таблицы pam на сервере не будет установлено в '1'
Авторизация проходит с пустым паролем, дабы у пользователя не возникало вопросов "как мне войти в систему?".
II. Завершение сессии осуществляется через rsh(remote shell)
настройка:
- устанавливаем пакеты rsh и rsh-server
- активируем rsh-server в /etc/xinetd.d/rsh
- добавляем в /etc/hosts ip и hostname сервера:
192.168.1.101 www.local
- создаём /etc/hosts.equiv следующего содержания:
www.local
localhost host-02.local
- создаём пользователя www и через sudo даём ему права без пароля вызывать killall:
www ALL=(root) NOPASSWD:/usr/bin/killall
Таким образом, для того чтобы заблокировать хост достаточно вызвать на сервере rsh -l www ip sudo -u root /usr/bin/killall -u user
назначение скриптов
core.pl - ядро биллинга.
функции:
- согласно выбранному тарифному плану вычисляет текущий баланс клиента
- автоматически завершает сеанс, при истечении времени
запускается каждые 10 секунд.
counter.pl - учёт трафика.
функции:
- снимает показания счётчиков с правил ipfw для хостов, при посадке на которые был выбран тарифный план с интернетом.
- проверяет доступность хостов(через icmp)
запускается каждые 10 секунд.
index.php - интерфейс консоли оператора.
func.php - реализация часто используемых функций.
report.php - скрипт, формирующий детальные отчёты по трафику.
last.php - скрипт, формирующий итоговый отчёт.
prolong.php - скрипт, позволяющий увеличить время сессии.
decrease.php - скрипт, позволяющий уменьшить время сессии.
calc.php - реализация программы-калькулятора, позволяющей оператору расчитать исходя из суммы время сессии с учётом разных тарифных планов.
calendar.php - скрипт, формирующий календарь. вызывается при бронировании хоста.
bron.php - скрипт, управляющий бронированием хостов на ночь.
Учёт трафика
Каждые 10 секунд данные по трафику снимаются скриптом counter.pl со счётчиков правил ipfw типа count и заносяться в таблицу sessions.
Для этого для каждого хоста заводиться три правила:
-
/sbin/ipfw add N*100 deny ip from 192.168.1.N to any
- в случае если клиент садиться на тарифный план с интернетом, правило удаляется.
-
/sbin/ipfw add N*100+1 count tcp from any to 192.168.1.N via vr0
- входящий трафик
-
/sbin/ipfw add N*100+2 count tcp from any to 192.168.1.N via vr0
- исходящий трафик
где N - идентификатор хоста.
При посадке клиента скрипт index.php, вызывая /usr/local/bin/sudo /sbin/ipfw zero NUM, обнуляет счётчики этих правил.
Для получения детальной статистики используется transparet proxy.
Скрипт report.php вынимает из таблиц sessions и hosts поля tm0, tm1, hid и ip для сессии клиента,
затем анализирует логи squid и выбирает лишь те значения, которые совпадают со временем сессии.
Консоль оператора
С целью избежания перехвата пароля оператора по сети, доступ к консоли осуществляется по https протоколу.
Внешний вид главного окна консоли оператора
Консоль имеет интуитивно понятный интерфейс и позволяет оператору производить следующие операции:
- начало/завершение сессии
- оперативный контроль времени/трафика сессии
- возможность добавлять/уменьшать время сессии
- формирование детальных отчётов по трафику
- формирование итогового отчёта по сессии
(доступно только после завершения сессии)
- контроль состояния хоста
Linux FreeBSD Интернет-клуб
В случае неисправности хоста, все элементы управления им блокируются автоматически.
детальный отчёт по трафику |
итоговый отчёт |
|
|
календарь |
управление бронированием |
|
|
Интернет-клуб на ОС Linux и FreeBSD.
|