Проект учета пользовательских счетов для интернет-провайдеров на базе OS FreeBSD

Страница 4

1. Если файл .refused присутствует в домашнем каталоге пользователя, то текущий размер лицевого счета принимается отрицательным. Переход к пункту 5;

2. Если файл .time присутствует в домашнем каталоге пользователя, то текущий размер лицевого счета принимается положительным. Переход к пункту 5;

3. Если файл .current присутствует в домашнем каталоге пользователя, то из него берется текущий размер лицевого счета (файл .current обновляется каждый раз после завершения работы демона). Переход к пункту 5;

4. Текущий размер лицевого счета вычисляется по формуле : "общая сумма начислений из файла .pay минус общая сумма отчислений из файла .work минус общая сумма отчислений из файла .weekly";

5. Если текущий размер лицевого счета положителен, доступ в систему пользователю разрешатеся, в противном случае - запрещается.

Алгоритм выбора прайс-листа (тарифной схемы) для пользователя при старте демона

  • Если в домашнем каталоге пользователя находится файл .account.conf, то прайс-лист для данного пользователя читается из этого файла;
  • Если в домашнем каталоге пользователя присутсвует файл .account, то из него читается первая строчка, которая добавляется в слову account, к полученной строке добавляется расширение .conf, и, таким образом файл c прайс-листом с полученным именем читается из каталога /var/statserv/etc;
  • Если файлы .account.conf и .account отсутствуют в домашнем каталоге пользователя, то прайс-лист для данного пользователя читается из файла /var/statserv/etc/account.conf (прайс-лист по умолчанию)

Действия, выполняемые демоном при старте
  • Анализирует командную строку. В качестве первого параметра ему передается имя пользователя, в качестве второго - NAS-порт (или устройство, например, /dev/cuaa2), в качестве третьего - адрес NAS-сервера (третий параметр нужен только в том случае когда у провайдера более одного NAS'a);
  • Выбирает прайс-лист (тарифную схему) для пользователя (см. "Алгоритм выбора прайс-листа для пользователя при старте демона");
  • Проверяет присутствие в домашнем каталоге файла .time, если он там есть - взводит соответствующий флажок в переменную us.unoff=1;
  • Проверяет присутствие в домашнем каталоге файла .refused, если он там есть - взводит соответствующий флажок в переменную us.refused=1;
  • Вычисляет значение лицевого счета пользователя (см. пункт 4 "Алгоритма вычисления лицевого счета при входе пользователя в систему"). Даже если размер лицевого счета отрицателен, демон все равно продолжит свою работу, поскольку по истечении первого же кванта времени он, при необходимости, подаст сигнал на отключение этого пользователя;
  • Демонизируется ;-);
  • Записывает свой PID в файл с именем NAS-порта в каталог /var/run (если у провайдера больше одного NAS'a - то необходимо модифицировать демон, чтобы избежать конфликтов в каталоге /var/run между NAS'ами);
  • Программирует собственный таймер на заданный квант времени и входит в бесконечный цикл, вывести из которого может только SIGHUP.

Действия, выполняемые демоном при истечении одного кванта времени

1. Обновить счетчик (в секундах) продолжительности текущего соединения, в соответствии с действующим тарифом вычислить стоимость одного кванта времени, обновить переменную в которой накапливается стоимость текущей сессии;

2. Проверить, присутствует ли пользователь все еще в системе - просмотреть файл /var/run/utmp. Если пользователя в системе нет, то вызвать процедуру, выполняемую при завершении сессии;

3. Если пользователь не исчерпал свой лицевой счет, то ждать истечение следующего кванта времени. В противном случае описанные ниже действия возникают при исчерпывании средств на лицевом счете:

4. Проверить, является ли этот пользовать "привелегированным". Для этого посмотреть на флажок us.unoff. Если us.unoff==1, то ждать истечение следующего кванта времени;

5. Проверить, была ли вызвана программа /var/statserv/bin/killuser, если да - то ждать истечение следующего кванта времени. Дело в том, что из-за особенностей построения некоторых систем аутентификации, при исчерпывании средств на лицевом счете, фактически пользователь отключается не сразу после вызова программы /var/statserv/bin/killuser, а через некоторый интервал времени;

6. Если файл .pay.next отсутствует в домашнем каталоге пользователя, значит, пользователя необходимо принудительно отключить. Переход к пункту 9;

7. Прочитать сумму из файла .pay.next. Переписать ее в файл .pay. Удалить файл .pay.next. Вычислить текущий размер лицевого счета пользователя. Если он отрицателен, то переход к пункту 9;

8. Перечитать новый прайс-лист из файла .account.next. Удалить файл .account.conf, если он присутствует. Переименовать файл .account.next в файл .account и ждать истечение следующего кванта времени.

9. Вызвать программу /var/statserv/bin/killuser с параметрами имя_пользователя и NAS-порт, которая пошлет сигнал на отключение пользователя;

Действия, выполняемые демоном при завершении сессии

При завершении сессии сервер аутентификации TACACS (или pppd) читает PID демона из каталога /var/run/ и посылает ему SIGHUP (возможен, также другой вариант, когда демон постоянно сканирует файл utmp и выполняет ниже описанные действия, если пользователь "изчез" из файла utmp). Демон удаляет файл со своим PID-ом из /var/run/, записывает сведения о только что завершенной сессии в файл .weekly, обновляет файл .current с текущим размером лицевого счета пользователя и вызывает скрипт /var/statserv/bin/close_session. с параметрами имя_пользователя, NAS-port, продолжительность_сессии, стоимость_сессии.

4. Контрольный пример.

Описание использования демона биллинга

Описание использования демона биллинга

Демон billing является ядром предлагаемой системы учета пользователей для ISP. Он может работать в двух режимах - в "основном" режиме (т.е. режиме демона) для контроля лицевого счета пользователя в реальном масштабе времени и в "вспомогательном" режиме выдачи сведений о размере лицевого счета пользователя или контроля правильности задания тарифной схемы. Ниже приведены все возможные ключи запуска и параметры командной строки:

/var/statserv/bin/billing

Usage error: billing [-vdeashtpPrRwW] [username] [port] [nas]

-v show version and exit

-d daemonize billing

-e increase debug level in daemonize mode

-a show current price

-c show current account for sysadmin

-s show current account

-h show current account in HTML format

-t total user account

-p show pay -P show pay history

-n show pay.next -N show pay.next history

-r show work -R show work history

-w show weekly -W show weekly history

Режим демона - запуск с ключом -d. Далее следуют обязательные параметры - имя пользователя, NAS-порт (порт модема) и имя NAS-сервера (если NAS-сервер у ISP один, то этот параметр выбирается произвольно, однако совсем опускать его нельзя). Пример:

/var/statserv/bin/billing -d jackson Async2 access.provider.net

Режим выдачи сведений о размере лицевого счета пользователя - запуск с ключом -s и единственным параметром - именем пользователя. Пример:

/var/statserv/bin/billing -s jackson

В данном варианте на стандартный вывод ничего не выводится, а "знак" лицевого счета отражается в коде возврата. Если размер лицевого счета больше либо равен нулю, т.е. доступ пользователю в систему разрешен, то billing возвращает число 0, если меньше нуля, т.е. доступ пользователю в систему ограничен, то billing возвращает число 1.