Проект учета пользовательских счетов для интернет-провайдеров на базе OS FreeBSD
Страница: 7/9
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. Если пользователя в системе нет, то вызвать процедуру, выполняемую при завершении сессии;