convertstat [-uuser|-a] [-ofile] [-ifile] [-Yyear] [-Mmonth]
[-xlevel]
Конвертирует статистику из файлов *.st в SQL таблицу statistic (по умолчанию) или выходной файл, руководствуясь прайс-листами (указываются директивой prices в настройке пользователя - user.cf).
Обсчет может производиться сразу для всех пользователей, если задан ключ `-a' или для конкретного пользователя, заданного ключом `-u user' .
Если входной файл не задан,
то производится чтение всех `.st'
файлов в каталоге
пользователя и суммирование содержимого. В противном случае (файл задан с
помощью
`-i file'
) производится чтение указанного файла.
Как имя входного файла, так и имя выходного может начинаться с символа `~' (тильда). В этом случае соответствующий файл ищется в персональном каталоге пользователя - это удобно для пакетной обработки. Кроме того, в качестве имени файла может быть в использован знак - ( `-i-' или `-o-' ). В этом случае будет использован стандартный входной или выходной поток соответственно.
Период, за который происходит расчет, convertstat определяет по
содержимому файла `.month'
, находящегося в домашнем каталоге
сервера. Этот файл формируется модулем
monthly и
меняется им же один раз в месяц, редактировать его вручную нет
необходимости.
Иногда возникает необходимость пересчитать данные за какой-либо из прошедших месяцев (хотя это и крайне не рекомендуемая операция). Для того, чтобы сделать это корректно необходимо задать текущий месяц (ключ `-M' ), год (ключ `-Y' ) и, чаще всего, имя входного файла. Для проверки можно воспользоваться выводом в стандартный поток (ключ `-o-' ).
При выводе информации в SQL таблицу вся существующая информация за расчитываемый месяц уничтожается и замещается новой. Будьте осторожны с этим!
Флаг `-x' может быть использован для отладки.
Файлы хранят статистику использования произвольных видов сервиса - именно они являются единственным источником статистической информации для сервера. Вся иная статистика должна приводиться к ним - смотрите описание принципа работы сервера и примеры конвертеров - calcmail и calctime.
Файлы текстовые; строки, начинающиеся с символа `#', и пустые строки игнорируются. Каждая значащая строка должна содержать два поля, разделенных пробелами и/или табуляциями - "имя сервиса" (соответствующее прайс-листу) и "количество сервиса". В файле может встречаться несколько строк с одинаковым именем сервиса - итогом будет сумма значений.
Например:
# Комментарий # t_uucp 10 m_nserv 1234 t_uucp 34 |
Итогом чтения такого файла будет значение сервиса "t_uucp=44" и значение "m_nserv=1234". В именах сервисов допустимы английские строчные и прописные буквы, цифры и символ '_' (подчерк). Недопустимы имена, начинающиеся с цифры. Рекомендуемый способ формирования имен таков - первая буква означает тип сервиса (t - время, m - почта и т.п.); далее, через подчерк, название. Большие и маленькие буквы в именах различаются - mail и Mail - разные названия.
"Количество сервиса" может быть целым или десятичной дробью; положительным или отрицательным.
Прайс-листы определяют оплачиваемые виды сервиса, их стоимость, единицу
измерения, названия видов сервиса и групп сервиса, формулы пересчета из
.st-файлов. Прайс-листы хранятся в подкаталоге `prices/'
домашнего
каталога сервера либо в персональном каталоге пользователя. В последнем
случае, ссылка на прайс-лист из персональной конфигурации пользователя
(
user.cfs)
должна начинаться с символа `~' (тильда). Если в конфигурации
пользователя указано несколько прайс-листов, то они читаются в порядке
указания как один большой файл.
Файл прайс-листа текстовый; пустые строки и строки, начинающиеся с символа `#' игнорируются. Длинные строки можно переносить; для этого последним символом строки надо поместить символ `\' (обратная косая черта). Каждая запись прайс-листа состоит из одной или более строк. Первая строка состоит из 4 полей, разделенных пробелами и/или табуляциями:
Задает имя сервиса после пересчета. Именно оно помещается в результирующую сводку за месяц. Ограничения на итоговое имя сервиса такие-же как и для имени сервиса в .st-файлах - оно должно состоять из не не более, чем 12 символов. Допустимы маленькие и большие английские буквы, цифры и символ '_'. Итоговое имя сервиса не должно начинаться с цифры. Кроме того, недопустимо использовать как имя слова `group', `gid' и `setprices' - за ними зарезервирован иной смысл.
Формула задает соответствие между итоговым именем сервиса и сервисами в .st файлах. Сложные формулы, содержащие пробелы можно заключать в кавычки. Формулы вычисляются по обычным правилам арифметических действий, допустимы скобки. Подробнее о способах записи формул смотрите в описании генератора отчетов.
Пример формулы:
"m_ncomm==0 ? (m_nserv+m_nnormal > 50000 ? 1 : 0) : 0"
В этом примере проверяется значение m_ncomm (объем полученных коммерческих новостей); если оно равно нулю (абонент не использовал коммерческие новости), то сумма m_nserv (ответов сервера) и m_nnormal (собственно некоммерческих статей) сравнивается с 50000 (чтобы не карать за получение help'ов и ошибки абонента/сервера); если "больше" - то значением становится '1', иначе '0'. Таким образом, в словесном выражении, значением формулы будет единица только тогда, когда абонент не использовал коммерческих новостей и объем использования некоммерческих превысил 50000 байт.
Стоимость единицы сервиса. Вполне может быть дробной величиной, или отрицательной в случае расчетов с поставщиками информации. После стоимости без пробела может быть указано наименование валюты. В этом случае соответствующая цена умножается на курс этой валюты, полученный из SQL таблицы rates. Подробнее о курсах валют смотрите ниже и в описании модуля setrate.
По умолчанию подразумевается, что цены указаны в единицах основной валюты или в единицах валюты, указанной параметром price-currency основного конфигурационного файла сервера. Допустимо указывать и наименование основной валюты в качестве единицы. При этом преобразование курса не производится, что особенно удобно для задания исключений в случае, если задан параметр price-currency.
Наименование единицы (мин, кбайт, раз) используется генератором отчетов при составлении сводки или акта об оказанных услугах.
Следом за строкой с формулой может идти название сервиса для использования в результирующей таблице (акте о проделанных работах, например). Описание может быть разбито на несколько строк - необходимо лишь не забывать, что каждая строка описания должна начинаться по меньшей мере с одного пробела или табуляции.
Если описание отсутствует, то сервер просматривает описание установленного для пользователя языка ( смотрите ниже) и, если не находит описания там, SQL таблицу snames в поиске описания для соответствующего вида сервиса. Обычно нет нужды вручную формировать эту таблицу - она автоматически поддерживается актуальной на основе данных прайс-листов.
Часто бывает удобно выделить в итоговом акте группы сервиса (почта, on-line, bbs и т.п.). Для указания группы сервиса зарезервировано имя group - просто поместите название на строке после него. Кроме того, для совместимости с предыдущими версиями, вместо group можно просто начать строку с символа : (двоеточие).
Пример:
# Пример прайс-листа # group Почтовые файловые серверы # ms_kiae ms_kiae/1024 0.026 кбайт Работа с файловым сервером KIAE ms_elvis ms_elvis/1024 0.026 кбайт Работа с файловым сервером или системой WaisMail Elvis+ ms_f1 ms_f1/1024 0.004 кбайт Получение файлов от файлового сервера F1 # group Повременно оплачиваемые услуги # t_dip t_dip/100 0.040 мин Dialup TCP/IP (работа в Internet) t_unix t_unix/100 0.030 мин Работа в Unix t_uucp "t_uucp/100/60>5 \ ? t_uucp/100/60-5 \ : 0 \ " 1.0 час Связь по протоколу UUCP (время превышения 5 часов) |
Еще одним зарезервированным именем сервиса является setprices. Эта директива позволяет Вам изменить цены на все виды сервиса, прочитанные к этому времени разом. Обычно это бывает удобно, если для какого-то конкретного пользователя или всех разом в какой-то период Вы хотите временно снизить или увеличить цены. В этом случае, директива setprices должна быть самой последней строкой самого последнего прайс-листа - только в этом случае она будет воздействовать на все цены. Пересчет цен происходит по указанной формуле, где вместо price подставляется исходное значение цены. Пример:
... ms_kiae ms_kiae/1024 0.026 кбайт Работа с файловым сервером KIAE ms_elvis ms_elvis/1024 0.026 кбайт Работа с файловым сервером или системой WaisMail Elvis+ ... # # Понижаем цены на 10% # setprices price*0.9 |
Если в прайс-листе (или следующих друг за другом прайс-листах) встречается повторное описание уже описанного выше сервиса, то описание замещается новым. Это свойство удобно использовать для внесения небольших индивидуальных корректировок некоторым пользователям. Например:
# Общий прайс-лист # m_russia m_russia/1024 0.02 кбайт Российская почта m_foreign m_foreign/1024 0.06 кбайт Зарубежная почта ... |
# Корректирующий файл у пользователя, которому эти сервисы сделаны дешевле # m_russia m_russia/1024 0.01 кбайт m_foreign m_foreign/1024 0.04 кбайт ... |
# Корректирующий файл у пользователя, которому эти сервисы объединены # m_russia 0 0.02 кбайт m_foreign 0 0.06 кбайт m_any (m_russia+m_foreign)/1024 0.03 кбайт Электронная почта ... |
При открытии прайс листа сначала делается попытка открыть файл, перед
последней точкой в имени которого вставлено `.XX', где XX - код языка.
Например, если указан прайс-лист `prices.cf'
и для пользователя
установлен язык `ru', то сначала будет сделана попытка прочитать файл
`prices.ru.cf'
. После этого, сервер пытается открыть файл с тем
именем, как оно указано, и в случае ошибки - со вставленным кодом для
системного языка. Таким образом, если системный язык - `en',
пользовательский - `ru' и требуется открыть файл
`prices.cf'
, то сервер будет пытаться открыть
прайс-лист в следующей последовательности:
`.../prices/prices.ru.cf'
`.../prices/prices.cf'
`.../prices/prices.en.cf'
У такого способа создания многоязычных прайс-листов есть один недостаток - в случае изменения цен, формул расчета или наименований сервисов изменения придется вносить во все прайс-листы синхронно. Для того, чтобы этого избежать, можно воспользоваться другим способом локализации прайс-листов:
Указанные два способа локализации могут быть и совмещены.
Пример настройки с названиями в описании языка:
# Пример прайс-листа без описаний сервисов # gid fbmserv ms_kiae ms_kiae/1024 0.026 kb ms_f1 ms_f1/1024 0.004 kb # gid time t_dip t_dip/100 0.040 min t_unix t_unix/100 0.030 min |
# Пример вставки в описание языка sgrp_fbmserv "Почтовые файловые серверы" serv_ms_kiae "Файловый сервер KIAE - KiArchive" serv_ms_f1 "Файловый сервер F1" sgrp_time "Повременно обплачиваемые услуги" serv_t_dip "Доступ к Internet по коммутируемой линии" serv_t_unix "Доступ к Unix" min "мин." kb "кбайт" |
Сервер может использовать произвольное количество валют, но только в одном месте - при пересчете цен из указанной валюты в основную. Более нигде иные валюты, кроме основной не учитываются.
Курсы валют хранятся в SQL таблице rates и заносятся туда с помощью модуля setrate. При выборке курса из таблицы (например при автоматическом запуске модуля convertstat из daily) происходит поиск ближайшего более раннего курса. При этом, если в текущем месяце курс валюты еще не был задан, то об этом отсылается предупреждение администратору сервера по почте и используется последний известный курс за прошлые месяцы. Таким образом, рекомендуется задавать курс по меньшей мере один раз в месяц (автор использует систему ценообразования, когда прайс-листы задаются в долларах, и пересчитываются в рубли один раз в месяц по результатам первых торгов; Вы можете использовать такую систему, или какую-то иную).
Если Вы не используете привязки цен к иным валютам, то формировать курсы нет необходимости, однако таблица rates (хотя-бы пустая) должна присутствовать.