Основным конфигурационным файлом сервера является `amstat.conf'
.
Этот файл
читается всеми компонентами сервера, поэтому каждая из них должна знать,
где он находится. В связи с тем, что сервер доступен только в двоичной
форме и, в то-же время, может быть установлен Вами в произвольный каталог,
компоненты сервера ищут `amstat.conf'
в каталоге `/etc'
.
Для удобства перехода от предыдущих версий сервера, компоненты сервера
сначала пытаются читать файл `/etc/amstat-1.0.conf/'
и
только если он не найден - `/etc/amstat.conf'
(это
позволяет иметь на одном компьютере две версии сервера).
Если Ваша система поддерживает символьные ссылки, то я рекомендую не
копировать файл в каталог `/etc'
, а сделать символьную
ссылку командой:
ln -s ~stat/amstat.conf /etc/amstat.conf
Рассмотрим все параметры конфигурации, которые Вы можете использовать в этом файле:
Название базы данных SQL, используемой сервером. По умолчанию - statserv.
Тип SQL-сервера. В настоящий момент поддерживается только shareware реализация SQL - mSQL (исходные тексты доступны с ftp://bond.edu.au/pub/Minerva/msql/, версии использованные для построения amstat - ftp://ftp.f1.ru/pub/msql/).
Доменное имя компьютера, на котором установлен SQL сервер. По умолчанию подразумевается, что сервер установлен на локальном компьютере и доступ к нему осуществляется через unix-socket.
TCP-порт, на котором ожидает запросов SQL сервер. Значение по умолчанию зависит от типа используемого сервера (для mSQL - 1112).
Для более быстрого обращения к серверу (в тех серверах, которые поддерживают это) может использоваться UNIX socket. Значение по умолчанию зависит от типа используемого сервера (для mSQL - /dev/msql).
Домашний каталог сервера. Здесь производится поиск большинства
конфигурационных файлов, отсюда "растет" иерархия подкаталогов сервера.
По умолчанию - `/var/local/stat'
. Типичной настройкой
является указание только этого параметра и никаких других из группы
"каталоги".
Каталог, в котором будут создаваться временные файлы - "замки". Сервер
использует их для блокировки в те моменты, когда одновременный доступ к
какому-либо ресурсу нескольких модулей нежелателен. Допустимо указать
здесь системный каталог для блокировок (в BSD это обычно
`/var/spool/locks'
). По умолчанию - {home-dir}/locks
Каталог, в котором лежат исполняемые модули. Не рекомендуется указывать этот параметр. По умолчанию - {home-dir}/bin
Каталог, в котором хранятся необработанные запросы пользователй к серверу, и прочая информация, относящаяся к запросам пользователей. По умолчанию - {home-dir}/server
Каталог, в котором хранятся персональные каталоги пользователей. Внимание! В текущей версии список пользователей определяется считыванием списка подкаталогов в нем! В связи с этим в нем не должно быть "лишних" каталогов. Значение по умолчанию - {home-dir}/userbase
Домен по умолчанию для остальных параметров этой группы. На все остальные параметры группы распространяется следующее правило умолчания: если в адресе не найден символ '@', то к нему справа приписывается @{domain}.
Адрес постмастера. По умолчанию - postmaster@{domain}.
Адрес, который будет подставляться в поле "From: "
ответов сервера. По умолчанию - statserv@{domain}.
Адрес администратора сервера. Используется в сообщениях в контексте
"пишите администратору сервера по адресу ..", а также подставляется в
исходящие от сервера письма в поле "Reply-To: "
. По умолчанию -
stat-adm@{domain}.
Адрес, для подстановки в поле "Sender: "
. Обычно именно этот
адрес попадает в статистику - по нему выделить в статистике почту от
сервера и, например, сделать ее бесплатной. Кроме того на этот адрес
сыпятся различные сообщения об ошибках от почтовой службы - поэтому адрес
должен быть реальным (обычно alias на postmaster или в /dev/null). По
умолчанию поле "Sender: "
не формируется.
Адрес, на который будут дублироваться все почтовые сообщения, отсылаемые сервером. Удобно для отладки. Значения по умолчанию для этого параметра нет.
Название Вашей организации по английски. Вписывается в поле Organization: писем всех исходящих от сервера статистики писем. Кроме того, к этому полю привязан ключ.
Имя администратора по английски. Вписывается вместе с адресом
(параметр конфигурации admin) в поле "Reply-To: "
всех
исходящих от сервера статистики писем.
Почтовый агент. Должен воспринимать на входе письмо со всеми
заголовками и доставлять его по указаным в аргументах через пробел
адресам. Если в определение входит комбинация "%s", то
она заменяется на {sender}. Значение по умолчанию -
"/usr/lib/sendmail -f%s "
.
Напоминание: параметры можно заключать в кавычки - это
единственный способ передать в качестве параметра настройки строку,
оканчивающуюся на пробел.
Этот параметр необходимо добавить после
оплаты, регистрации и получения ключа
для указания на его местоположение.
Значения по умолчанию у этого параметра нет, однако рекомендуется
разместить ключ с именем `.Key'
> в домашнем каталоге сервера.
Если задан этот параметр, то модулем listener проверяется соответствие real user id с указанным значением. Полезно для предотвращения подсовывания писем в listener "гостями".
Если задан этот параметр, то модулем listener проверяется соответствие real group id с указанным значением.
Если задан этот параметр (значение может быть 'yes' или 'true'), то сразу после помещения запроса пользователя в очередь запускается разборщик очереди (фоновым процессом). Полезно на замену запуску модуля runqueue через cron.
Для использования этой опции не забудьте добавить listener флажки setuid/setgid. Это можно сделать такими командами:
chown 0 listener
chgrp 0 listener
chmod ug+s listener
Если задан этот параметр (значение может быть 'yes' или 'true'), то обработанные сервером почтовые задания не удаляются, а переименовываются. Это позволяет накапливать архив запросов клиентов к серверу.
Ставка НДС в виде дробного числа меньшего единицы. По умолчанию - 0.2 (20%).
Разделитель тысяч в денежных единицах. По умолчанию значение берется из locale.
"Точность" валюты, ее минимальное значение. По умолчанию значение берется из locale.
Точность промежуточных величин. В настоящий момент используется только для цен прайс-листов. По умолчанию - одна сотая {currency-precision}.
Задает двухбуквенный код системного языка. Значение по умолчанию зависит от Вашего домена - для доменов .ru или .su значением будет `ru'. Во всех остальных случаях - `en'. Рекомендуется всегда задавать этот параметр в некоторое осмысленное значение (ua, by, uz, it и т.п.), даже если все Ваши пользователи пользуются одним и тем-же языком - никогда нельзя гарантировать, что завтра у Вас не появится пользователь из, скажем, Новой Гвинеи.
Задает цифровой идентификатор пользователя, от имени которого будут выполнять все действия модули сервера. Может быть опущен - в этом случае изменения uid сервер делать не будет.
Задает цифровой идентификатор группы пользователя, от имени которого будут выполнять все действия модули сервера. Может быть опущен - в этом случае изменения gid сервер делать не будет.
Параметр позволяет задать валюту "по умолчанию" для всех прайс-листов. Полезно для случаев "долларовых" цен. Подробнее смотрите в описании модуля convertstat. По умолчанию цены прайс-листов считаются выраженными в единицах основной валюты.
Параметр позволяет задать символы, которыми ограничиваются команды в текстах форм генератора отчетов. Должно быть указано не менее двух символов. Подробнее смотрите в описании модуля mkreport>. По умолчанию - "<>"
Список допустимых символов в доменах и именах пользователей
(используется при преобразовании адресов из доменной формы в банговую);
не должен включать в себя символы из набора `!@%<>,:
' -
в Internet адресах они имеют специальное значение. По умолчанию
допустимыми считаются все буквы, все цифры и символы из набора
`-_.[]/=
'.
Уровень выдачи отладочной информации. Чем больше значение, тем более подробная информацию будет выводена. Смысл имеют значения от 0 до 10. По умолчанию - 0.
Если этот параметр установлен в `yes' или `true', то вся генерируемая сервером почта будет отсылаться администратору сервера и только ему. Полезно после внесения изменений в формы отчетов для провеки (чтобы не беспокоить пользователей).
Проверить созданную Вами конфигурацию можно модулем ckconfig, запущенным без параметров.
Кроме того, проверить правильность интерпретации сервером параметров конфигурации можно запустив ckconfig с параметром `-n' .
Внимание! Для нормальной работы сервера модуль
ckconfig должен быть доступен всем модулям сервера (с его
помощью читают конфигурацию небинарные модули - shell и perl)!
Наиболее удобно сделать символьную ссылку из каталога, в котором
производится поиск программ общего назначения
(например `/usr/local/bin'
) в ее местоположене в структуре
сервера. Например, если сервер установлен в `/var/local/stat'
,
то команда может выглядеть так:
ln -s /var/local/stat/bin/ckconfig /usr/local/bin
Сервер хранит практически все данные за исключением конфигурационных файлов в SQL базе данных. Если иного не указано параметром конфигурации sql-database, то используется база данных statserv. Перед эксплуатацией сервера базу данных необходимо создать средствами используемого SQL сервера, например для mSQL соответствующая команда будет выглядеть так:
msqladmin create statserv
Кроме того бывает полезно ограничить доступ к базе данных - в mSQL для
этого используется файл `msql.acl'
. Подробнее о его формате смотрите
в документации к mSQL.
Также имеет смысл время от времени
сохранять backup версии базы данных, в "серьезных" базах для этого обычно
существуют штатные средства, а в mSQL можно воспользоваться командой
`msqldump'
.
Для проверки структуры таблиц и создания отсутсвующих таблиц (например при первоначальной установке сервера) можно (и рекомендуется) использовать модуль ckconfig.
Общим правилом является следующее - до тех пор, пока Вы не планируете делать что-то специфичное с таблицами или пытаться писать свои дополнения к серверу, не делайте действий по созданию, изменению или удалению данных из таблиц вручную. Таким образом, остаток этого раздела следует считать скорее справочным пособием для интересующихся структурой данных.
Все таблицы, описанные ниже, могут включать в себя дополнительные поля, если они Вам необходимы; указанные поля могут следовать в другом порядке; текстовые записи могут состоять из большего числа символов (не не из меньшего!). При включении новых полей необходимо помнить, что им нельзя присваивать опцию `NOT NULL', т.к. в этом случае сервер не сможет создать новую запись в такой таблице.
Для удобства однозначной идентификации записей в таблицах сервера (что особенно удобно для разработки разного рода дополнительных модулей к серверу) каждая запись всех таблиц сервера имеет уникальный идентификатор ряда. Ввиду отсутствия штатных средств генерации идентификаторов в mSQL для их ведения используется отдельная таблица - ids.
Для создания таблицы ids Вы можете запустить модуль ckconfig без параметров или выполнить такую операцию SQL:
CREATE TABLE ids
( tabname CHAR(16) NOT NULL PRIMARY KEY,
tabid INT NOT NULL,
cmt CHAR(200),
)
Рассмотрим назначение полей:
Название таблицы (accounts, statistic, rates и т.д.).
Идентификатор следующего ряда таблицы. Сервер использует собственный механизм блокировок для предотвращения одновременного изменения идентификатор несколькими параллельно запущенными модулями. Пользовательского интерфейса для этого пока не предусмотрено - если Вам необходим такой интерфейс, то напишите автору.
Комметарий, название таблицы.
Лицевые счета пользователей хранятся в таблице accounts -
необходимо создать ее создать. Для этого можно запустить модуль
ckconfig без параметров или
создать ее вручную, выполнив в базе данных сервера статистики
такую команду (в mSQL это можно сделать запустив
`msql statserv'
):
CREATE TABLE accounts
( id INT NOT NULL PRIMARY KEY,
user CHAR(16) NOT NULL,
date INT NOT NULL,
sum REAL NOT NULL,
cmt CHAR(200),
flag INT
)
Рассмотрим назначение полей:
Уникальный идентификатор ряда. Удобен для последующих операций с таблицей.
Внутреннее имя пользователя (будет объяснено при описании пользовательской конфигурации).
Здесь и в иных таблицах - дата, целое число, цифры которого представляют собой дату в формате YYYYMMDD.
Сумма средств, добавленная или списанная с лицевого счета пользователя.
Дробная величина, при внесении операции сервером округляется до
точности основной денежной единицы (параметр
currency-precision `amstat.conf'
).
Комментарий. Может быть довольно длинным - при выводе переносится на несколько строк.
Поле сбрасываемое сервером в 0 для всех вносимых им записей. Никак не используется, предусмотрено для целей расширения и оставлено из старых версий скорее по традиции.
Не забудьте, что в mSQL для реального выполнения команды необходимо
набрать `\g'
!
Допустимо вводить в эту таблицу какие-то иные, дополнительные поля, но перечисленные выше должны присутствовать обязательно!
Для хранения статистики сервер использует SQL таблицу statistic. Для ее создания Вам необходимо выполнить SQL-команду (или запустить модуль ckconfig без параметров):
CREATE TABLE statistic
( id INT NOT NULL PRIMARY KEY,
user CHAR(16) NOT NULL,
date INT NOT NULL,
name CHAR(16) NOT NULL,
group CHAR(16) NOT NULL,
amount REAL NOT NULL,
sname CHAR(16),
sum REAL NOT NULL
)
Назначение полей:
Уникальный идентификатор записи.
Внутреннее имя пользователя.
Дата (формат смотрите в описании accounts). Все операции проводимые сервером в этой таблице имеют отношение к всему месяцу сразу - для индикации этого факта поле `день месяца' устанавливается равным нулю. Например для записей за июнь 1996 года дата будет установлена в 19960600.
Имя сервиса. Если формируется сервером, то совпадает с названием сервиса в прайс-листе. Более подробно об этом написано в описании модуля convertstat.
Название группы сервиса. Генерируется автоматически на основании данных прайс листов модулем convertstat.
Количество потребленной пользователем услуги. Дробная величина. Обычно имеет смысл подбирать формулы пересчета и единицы измерений таки образом, чтобы значение этого параметра было не меньше 0.01 по абсолютному значению. Это связано с тем, что при выводе генератором отчетов значение выводится с точностью до тысячных.
Единица измерения услуги ("мин", "кб", "стр." и т.п.). Используется только генератором отчетов - mkreport.
Стоимость потребленной услуги для пользователя. Цена услуги при генерации отчета получается делением стоимости на объем услуги.
Если в прайс-листах Вы используете иные валюты, кроме основной или в конфигурации задан параметр price-currency, то серверу необходимо знать курс указанной валюты по отношению к основной.
Для хранения курсов валют служит таблица rates (смотрите также описание модуля setrate). Для ее создания Вам необходимо выполнить SQL-команду (или запустить модуль ckconfig без параметров):
CREATE TABLE rates
( id INT NOT NULL PRIMARY KEY,
name CHAR(16) NOT NULL,
date INT NOT NULL,
rate REAL NOT NULL
)
Назначение полей:
Уникальный идентификатор записи.
Название валюты, по нему на валюту ссылаются прайс-листы.
Дата, формат ее описан ранее.
Число единиц основной валюты в единице указанной, дробная величина.
Комментарии к сервисам сервер хранит в таблице snames. Именно эта таблица используется генератором отчетов при поиске комментария к указанному в таблице statistic сервису. Таблица генерируется и обновляется автоматически при чтении прайс-листов модулем convertstat (кроме этого модуля прайс-листы не анализируются ничем).
Для создания таблицы snames можно запустить модуль ckconfig без параметров или выполнить операцию SQL:
CREATE TABLE snames
( id INT NOT NULL PRIMARY KEY,
name CHAR(16) NOT NULL,
descr CHAR(200) NOT NULL,
)
Назначение полей:
Уникальный идентификатор записи.
Наименование сервиса (соответствует полю name таблицы statistic).
Описание сервиса. При выводе переносится на несколько строк по словам, что позволяет делать его довольно длинным.
Для хранения названий групп сервиса сервер использует таблицу sgroups. Таблица генерируется и обновляется автоматически при чтении прайс-листов модулем convertstat.
Для создания таблицы sgroups можно запустить модуль ckconfig без параметров или выполнить операцию SQL:
CREATE TABLE sgroups
( id INT NOT NULL PRIMARY KEY,
name CHAR(16) NOT NULL,
descr CHAR(200) NOT NULL,
)
Назначение полей:
Уникальный идентификатор записи.
Наименование сервиса (соответствует полю name таблицы statistic).
Описание сервиса. При выводе переносится на несколько строк по словам, что позволяет делать его довольно длинным.
Для каждого пользователя, обслуживаемого сервером статистики, необходимо выполнить следующие действия:
`amstat.conf'
параметром
userbase-dir.
Название каталога должно совпадать с внутренним именем пользователя!
В случае, если у вас более 100 пользователей, то обычно имеет смысл
разбить пользователей по первой букве имени (а иногда и по второй). Для
этого в каталоге, который Вы указали директивой конфигурации
userbase-dir необходимо сделать следующие действия:
`.alpha'
. Содержимое его не важно, он вполне
может быть и пустым.Поясним примером. Следующие два способа расположения пользовательских каталог совершенно идентичны:
{userbase-dir}
|- alina - пользовательский каталог
|- impulse
|- intusm
|- informex
|- itv
\- julia
и
{userbase-dir}
|- .alpha - файл-признак разбивки по алфавиту
|- a
| \- alina - пользовательский каталог
|
|- i
| |- .alpha - файл-признак разбивки второго уровня
| |- im
| | \- impulse - пользовательский каталог
| |
| |- in
| | |- intusm
| | \- informex
| |
| \- it
| \- itv
|
\- j
\- julia
`
user.cf'
и отредактировать его (пример можно взять из поставляемого
с сервером каталога `.example'
).
Для проверки созданного можно запустить модуль
ulist или
mkreport с параметрами `-a =public.fm'
.
Помните, что в демонстрационной версии пользователей может быть только 10!
В персональном каталоге каждого пользователя должен находиться файл
`user.cf'
, в нем описываются настройки сервера по отношению
к пользователю. Обычно бывает удобно не писать этот файл "руками",
а доверить это модулю
adduuser (обязательно прочитайте
его описание, прежде, чем запускать!) или скопировать его из
`.example'
и подредактировать, где необходимо.
Как и в остальных конфигурационных файлах сервера, строки, начинающиеся с символа `#', считаются комментариями; параметр(ы) от директивы отделяются произвольным количеством пробелов и/или табуляций. В файле user.cf могут быть указаны следующие директивы:
Внутреннее имя пользователя.
Должно совпадать с названием
каталога, в котором помещен `user.cf'
. Начиная с версии 1.2 эта
директива стала необязательной и более того, ее применение не
рекомендуется.
Имя, которое будет использоваться при обращении к лицевому счету клиента. По умолчанию совпадает с именем самого клиента. Удобно использовать в случае, когда нескольким разным с точки зрения статистики клиентам необходимо сопоставить один лицевой счет.
Двухбуквенный код языка, установленного для данного пользователя. Если этот параметр не задан, то общение с пользователем происходит на системном языке.
Набор ценовых конфигураций через пробел. Используется модулем
convertstat для преобразования
`*.st'
файлов в "денежную" статистику. Если первым символом названия
является `~' (тильда), то соответствующее описание цены ищется в
пользовательском каталоге, иначе - в подкаталоге `prices' домашнего
каталога сервера.
Набор regex (см. re_format (7)) масок, выделяющий допустимые адреса. Только с адресов,
которые подойдут к указанным здесь маскам могут приходить команды серверу
статистики. Используется "Return-Path: "
или
"From: "
писем (приведенный к uucp нотации).
Примечание: на regex навешиваются спереди `^' и сзади `$' - таким образом сравнение происходит со всей строкой. Если это не нужно - добавьте в начале или конце строки `.*'.
Адрес пользователя для переписки - на этот адрес отсылаются все документы генератором отчетов.
Начиная с версии 1.3 сервер все дополнительные данные для генератора отчетов хранит и использует единообразно (смотрите команду print в описании mkreport). Используется следующий формат:
[ext] имя[/native|/english] значение
Т.е. строка определения дополнительного параметра может начинаться с ключевого слова ext, затем, через пробел, следует имя параметра и через пробел - значение параметра. После имени через наклонную черту может быть задан язык - родной (native) или международный (english). Допустимо указывать признак языка одной буквой (e или n). Если язык не указан, то подразумевается, что он `родной'. Пример:
# Имя директора по русски и по английски # ext manager/e Ivan I. Ivanov ext manager/native Иван Иванович Иванов # # Здесь без префикса ext и без указания языка # fax +7 555 444 7777 # # А можно было записать так: # # ext fax/native +7 555 444 7777 |
Пробелы перед значением поля и в конце строки отсекаются, все остальное остается без изменений.
Для совместимости с предыдущими версиями сервера при чтении конфигурации распознаются некоторые дополнительные поля (в скобках указано эквивалентное название в новой системе):
Почтовый адрес пользователя на русском языке.
Почтовый адрес пользователя на английском языке.
Номер или название договора.
Страна заключения договора (по традиции, из карточек).
Основной домен пользователя
Название организации на русском языке.
Название организации на английском языке.
Телефоны, по которым можно связаться с пользователем.
Имя ответственного представителя пользователя на русском языке. В связи с исторически сложившейся ошибкой в документации, этот параметр может так-же называться и namer.
Имя ответственного представителя пользователя на английском языке (может так-же называться namee).
Операционная система, в которой работает пользователь.
Кто и когда завел указанного пользователя. При выводе отчетов за прошлые периоды генератор отчетов, руководствуясь данными этой директивы, исключает не существовавших в тот момент пользователей. Поэтому ее заполнение рекомендуется.
Сервер может быть настроен на прием команд от пользователей по электронной почте (существует также и WWW-интерфейс - htreport).
В связи со сравнительно небольшой почтовой нагрузкой на сервер
статистики используется возможность sendmail (или другого MTA, например
uumail) передавать письма во входной поток программам. Для этого Вы
должны добавить в Ваш системный файл псевдонимов (обычно
`/etc/aliases'
или `/usr/lib/aliases'
)
строки, подобные нижеследующим:
statserv: "|/var/local/stat/bin/listener"
stat-adm: root
Обычно sendmail запускает программы от имени малопривелегированного пользователя, поэтому проверьте возможность sendmail ``добраться'' до модуля listener. Для этого можно воспользоваться двумя способами:
`/var'
, `/var/local'
,
`/var/local/stat'
и `/var/local/stat/bin'
)
должны иметь разрешение на поиск. Для этого выполните каждого из
каталогов команды, подобные следующим:
bash# chmod a+x /var bash# chmod a+x /var/local bash# chmod a+x /var/local/stat bash# chmod a+x /var/local/stat/bin |
`/usr/libexec'
или
`/usr/local/libexec'
.Кроме того, при работе модуль listener должен располагать правами доступа к конфигурационным файлам, каталогам и базам данных сервера статистики. Команды могуть быть такими:
bash# chown root.wheel listener bash# chmod ug+s listener |
Обязательно прочитайте также описания модулей listener и runqueue.
Сервер должен выполнять некоторые действия регулярно:
`amstat.conf'
,
то один или два раза в час (выбор конкретного интервала за Вами)
должен запускаться модуль
runqueue.
Он выполняет команды к серверу, присланные пользователями и накопленные в
очереди модулем
listener. Однако рекомендуемым способом запуска
runqueue остается все-таки указание параметра `server-run
yes', ведущее к автоматическому его запуску при поступлении
письма-задания от пользователя.
Для того, чтобы запускать сервер периодически необходимо воспользоваться
вписать строки, подобные следующим, в конфигурационный файл cron для
пользователя root (обычно для этого лучше всего использовать
команду `crontab -e -u root'
):
17,47 * * * * /var/local/stat/bin/runqueue
Никакой магии в числах 17,47 нет - просто обычно я смещаю задания для
cron
вразнобой для плавного распределения нагрузки.
Запуск модуля
daily не рекомендуется производить из cron
. Лучше
задействовать для этой цели системный ежедневно выполняемый скрипт (обычно
он называется `/etc/daily.local'
или просто
`/etc/daily'
).
Внесите в его конец строки, подобные этим:
# Daily statistic processing
#
/var/local/stat/bin/daily
Такая рекомендация связана с тем, что частично обработкой log-файлов и
статистики обычно занимается `/etc/daily'
, что потенциально
может привести к одновременной его работе с модулем
daily сервера
статистики в случае запуска последнего из cron
. В большинстве
ситуаций это нежелательно.
Кроме того, обычно имеет смысл вставить в модуль daily или системный скрипт для ежедневных действий создание архивной копии SQL базы данных. В состав сервера статистики такой утилиты пока не входит.
Других требований к регулярно выполняемым действиям в текущей версии сервера нет.
`.month'
В домашнем каталоге сервера поместите файл `.month'
, внутри которого
должна содержаться одна строка из одного слова - год и месяц в форме
`YYYYMM' (например - `199606'). По этому файлу модуль
monthly
ориентируется в принятии решения - пора-ли рассылать месячную статистику
и списывать суммы за прошедший месяц со счетов пользователей.
Часто бывает так, что некоторые пользователи (свои сотрудники, просто
"интересные" люди) не имеют договоров и итоговых актов им отсылать не надо.
Для индикации этого факта создайте в домашнем каталоге такого пользователя
текстовый файл `status'
и поместите в него строку `Nonofficial
'.
Фактически, в этой строке важно лишь наличие большой буквы `N' -
можно ей и ограничиться.
О том, как использовать такой статус пользователя смотрите в описании модуля mkreport.