Идеология и архитектура системы

Назначение системы

Автоматизированная система расчетов Pyzzle.ISP™ основана на фреймворке Pyzzle™и предназначена для:
  • регистрации и учета абонентов сетей электросвязи
  • учета объема и номенклатуры предоставленных услуг электросвязи и расчета их стоимости
  • учета сумм платежей за оказанные услуги
  • контроля за оплатой оказанных услуг
  • справочно-информационного обслуживания абонентов и пользователей системы по вопросам объема и номенклатуры оказанных услуг и их оплаты
  • формирования информации, используемой для выставления счетов на оплату оказанных услуг
  • формирования статистической отчетности и аналитической информации по оказанным услугам электросвязи, произведенной по ним оплате, финансовому состоянию лицевых счетов абонентов для оперативного и обоснованного принятия решений в части, касающейся управления организацией связи.
Помимо обязательных функций Автоматизированной системы расчетов, в систему можно интегрировать дополнительные модули которые позволяют:
  • Осуществлять мониторинг и управления сетевым оборудованием оператора связи
  • Автоматизировать учет подключений абонентов и обращений в службу технической поддержки
  • Интегрировать систему с внутренней АТС оператора связи

Системное окружение

Информационная система написана на языке Python™ и предназначена для использования с ОС Linux или *BSD™.

Для хранения данных система использует SQL базу данных, архитектурно вся логика работы реализована в коде системы, а база данных используется исключительно как хранилище информации, поэтому текущая версия информационной системы рассчитана на работу с базой данных MySQL™ версии 5.0 или 5.1.

Информационная система использует web-интерфейс, для работы которого используется web-сервер Apache™ версии 2.0+ или другой с поддержкой FastCGI или WSGI.

Для работы системы должны быть установлены следующие компоненты:

  • Интерпретатор языка Python™ версии 2.6 или 2.5
  • База данных MySQL™ версии 5.0 или выше.
  • Библиотека для работы с базой данных python-mysql.
  • Web-сервер Apache™ версии 2.0+ или другой.
  • Программа RRDtool™ с библиотекой для Python (необязательно, нужна для графического отображения данных о потребленных услугах и т.п.)
  • Программа ntp для синхронизации системного времени сервера
  • Программа flow-tools для работы с потоком информации о потребленном трафике в формате Netflow™ (если требуется обработка данных в этом формате)
  • Система контроля версии subversion™ (для резервного копирования программных кодов и конфигурационных файлов установленной информационной системы, а так же для упрощения обслуживания системы)

Архитектура системы

Информационная система написана на языке Python с активным использованием Объектно Ориентированного Программирования. С точки зрения системы каждая сущность информационной системы является объектом определенного класса (например абонент, услуга, тарифный план и т.п.). В основном конфигурационном файле enviroment.py системы описываются все классы используемые системой. При описании классов используется технология множественного наследования, которая позволяет собирать итоговый объект из “кусочков” подобно пазлу.

Note

Информационная система устанавливается в отдельный каталог на сервере. Рекомендуется ставить систему в каталог /opt/billing/

Таблица 1.1. Структура и назначение файлов и каталогов установленной системы

Файл или каталог Описание файла или каталога
local/ Каталог в котором находятся настройки и реализация специфичного функционала для конкретной системы. Также там находится переопределение функционала.
local/billing.cfg Конфигурационный файл, в котором определяются различные параметры функционирования системы. Файл состоит из общего блока и блоков отвечающих за параметры специфические для каждого физического сервера в составе информационной системы.
local/local.cfg Дополнительный конфигурационный файл с самым высоким приоритетом для переопределения специфичных настроек.
enviroment.py Конфигурационный файл, в котором определяются классы описывающие свойства и поведение объектов системы
cli Исполняемый файл, предоставляющий интерфейс командной строки (CLI) для администрирования системы
*_daemon Исполняемые файлы, демоны нужные для работы системы.
accounting_daemon процесс который должен быть запущен на работающей системе, он осуществляет обработку текущего состояния лицевых счетов абонентов и при необходимости выполняет определенные действия над лицевым счетом.
devicerules_daemon процесс который должен быть запущен на работающей системе, он осуществляет применение правил доступа к услугам связи. (Этот процесс запускается на серверах используемых для оказания услуг связи, например на сервере выполняющем роль маршрутизатора)
sendmail_daemon процесс который осуществляет отправку абонентом информационных сообщений об изменения состояния лицевого счета
class/ Каталог в котором хранятся файлы с программным кодом различных компонентов системы - реализация классов.
pages/ Каталог и в его подкаталоги содержат код используемый для создания различных страниц web-интерфейса системы.
cli_commands/ Каталог, в котором хранятся файлы с программным кодом различных команд для интерфейса командной строки (CLI)
log/ В этот каталог система пишет о своих действиях, и отладочные данные. Эти лог-файлы могут быть использованы для анализа неполадок в работе системы. Обычно изучать эти файлы при нормальной работе системы не требуется, т.к. история действий, информация о которых должна быть доступна операторы системы, так же дублируется в SQL базе данных.
bin/ Каталог в котором размещаются символические ссылки на различные исполняемые файлы используемые системой, используется для разрешения возможных неоднозначностей в различных дистрибутивах ОС. Так же в этом каталоге хранятся служебные исполняемые файлы и скрипты.
lib/ Программный код различных библиотек используемых системой
features/ Каталог в котором содержатся файлы с описанием установленных компонентов информационных системы.
www/ Каталог являющийся корневым для web-интерфейса системы, содержит необходимые файлы для работы web-интерфейса (CGI скрипты, графические изображения, CSS-файлы и т.п.)
templates/ Каталог содержащий шаблоны различных страниц web-интерфейса управления, шаблоны документов создаваемых информационной системой и т.п.
Схематичное изображение основных составляющий информационной системы:
_images/component_arch.png
Конфигурационный файл enviroment.py представляет собой код на языке Python™ в котором определяются все базовые классы, методы и константы. Этот конфигурационный файл вызывается всеми исполняемыми программами информационной системы. Основным объектом, который определяет в этом файле, является bill_obj. В объекте bill_obj определены глобально используемые методы, такие как протоколирование действий, чтение параметров из конфигурационного файла billing.cfg, методы создания различных типов страниц web-интерфейса. Так же в объект bill_obj добавляются описания методов инициализации всех других объектов системы. В enviroment.py устанавливается класс работы с базой данных (текущая версия системы поддерживает только один такой класс - для работы с базой данных MySQL™), и описываются глобальные функции связанные с локализацией текстовых сообщений.
Для локализации текстовых сообщений использует стандартный механизм gettext. Файлы переводов поставляются вместе с компонентами системы.
Конфигурационный файл billing.cfg - это текстовый файл разделенный на блоки, в каждом блоке параметры описаны парами ключ=значение. Название блока соответствует имени сервера участвующего в работе системы, параметры для этого блока действую только в рамках этого сервера. Параметры указанные в блоке __global__ действуют на всех серверах системы. Такое разделение позволяет иметь один общий конфигурационный файл на все сервера (каждый сервер использует свой блок), а также использовать один и тот-же конфигурационный файл для промышленной и для тестовой инсталляции системы. Если параметр определен и в глобальном блоке и в блоке сервера, то используется значение из серверного блока. В конфигурационном файле указываются параметры ведения журнала операций, параметры соединения с базами данных, процессы которые должны быть запущены на сервере и их параметры, а так же другие параметры относящиеся к настройке отдельных компонентов системы - пути к различным файлам, шаблоны системных команд и т.п. Пример фрагмента файла конфигурации:
[testserver]
db_role_1=master
db_database_1=billing
db_user_1=root
db_password_1=testpass
db_hostname_1=localhost
db_default=1


log_level_default=3
log_level_backoffice=3

[billing]
db_role_1=master
db_database_1=billing
db_user_1=billing
db_password_1=SomeSecretPassword
db_hostname_1=localhost
db_default=1

log_level_default=1
log_level_backoffice=1

[__global__]

db_backupdir_1=/opt/billing/db_backup/%A.%Hh
db_backup_low_priority_tables=iptraff_history,user_log,device_log

log_file_default=billing.log
log_file_backoffice=backoffice.log
В этом примере показаны блоки для двух серверов testserver и billing (боевой сервер). На боевом сервере уровень логирования 1 (протоколировать только сообщения об ошибках), а на тестовом 3 (протоколировать отладочную информацию). Для каждого сервера указаны свои параметры работы с базой данных, а параметры относящиеся к название лог-файлов и процедуре резервного копирования базы общие и указаны в блоке __global__. Назначение различных параметров этого конфигурационного файла описано в разделах документации относящихся с описанию работы компонентов системы, а в приложении перечислены все возможные параметры.

CLI интерфейс

CLI интерфейс предназначен для управления компонентами системы, автоматизированного выполнения определенных действий по расписанию, взаимодействия с другими информационными системами. Через CLI интерфейс выполняются следующие действия:

  • Запуск и остановка процессов (демонов) системы
  • Постановка абонентов в очередь на запуск процедуры расчета.
  • Различные административные задачи: обновление компонентов системы, обновление переводов сообщений, обновление списка страниц
  • Загрузка в систему информации о потребленных услугах
  • Резервное копирование и восстановление базы данных
  • Восстановление доступа к web-интерфейсу, в случае если сделать это через web-интерфейс невозможно. (Например, после снятия с “администраторов” прав доступа к страницам)
Для доступа в CLI нужно в системном shell сервера, от имени системного пользователя под которым работает информационная система, запустить команду ./cli
CLI-интерфейс имеет средства автодополнения команд по клавише TAB, историю команд, вызываемую стрелками вверх/вниз. Некоторые команды вызывают переход в свой собственный CLI-интерфейс (например переход в контекст работы с определенным абонентом).
$ ./cli
Welcome to Pyzzle CLI
Pyzzle> user
User summary info
-------------------------
Total user count                44
Total need_accounting count     0
Total block_accounting count    0

Pyzzle> user(нажали клавишу TAB)
user       usergroup
Pyzzle> user 44
Pyzzle(user=44)> need_accounting
Pyzzle(user=44)> ballance
       cur_ballance : 2.0
 effective_ballance : 2.0
       service_cost : 0.0
      user_ballance : 2.0
Pyzzle(user=44)> exit
Pyzzle> daemon restart accounting
Starting daemon: accounting Ok
Pyzzle> exit
Good Bay!!!
В приведенном примере, мы запустили CLI-интерфейс, запустили в нем команду user, которая показала нам общее кол-во абонентов зарегистрированных в системе, кол-во абонентов ожидающих расчета, а так-же кол-ва абонентов расчет которых заблокирован из-за каких-либо критических ошибок в системе. После этого мы набрали команду user и нажали клавишу TAB и получили список доступных команд, которые начинаются на “user”. Набрав команду user 44 мы перешли в контекст работы с абонентом внутренний идентификатор в системе которого равен 44. В этом контексте вы выполнили команду need_accounting, которая поставила абонента в очередь для процесса расчета состояния лицевого счета, а также команду ballance которая вывела нам информации о текущем балансе лицевого счета. Выйдя из контекста пользователя вы вернулись в основной CLI-интерфейс и там запустили команду daemon restart accounting, которая перезапустила процесс расчета лицевых счетов абонентов.
Для периодического запуска определенных команд (например запуск расчета лицевых счетов абонентов в 00:00 каждый день) можно использовать стандартный механизм UNIX систем: crontab. Для запуска команд в не интерактивном режиме нужно саму команду указать в качестве аргументов при запуске ./cli в системном shell. Например:
$ ./cli user need_accounting
Эта команда поставит всех абонентов в очередь на расчет состояния лицевых счетов. Пример запуска этой команды каждую ночь в 00:00:
crontab -l
0 0 * * * cd /opt/billing ; ./cli user need_accounting

WEB-интерфейс

Для работы операторов система предоставляет web-интерфейс.
Web-интерфейс состоит из страниц, программный код отвечающий за создание страниц находится в каталоге pages/ и его подкаталогах. Система поддерживает разграничение прав доступа для разных операторов системы для каждой страницы web-интерфейса. В файле с кодом страницы присутствует мета-информация с описанием параметров страницы:
  • Внутренние название страницы
  • Название родительской страницы (таким образом страницы образуют древовидную иерархию)
  • Класс страницы (указывается какой класс использовать при отображении этой страницы, класс определяет то какие дополнительные объекты будут созданы в контексте этой страницы, а также внешний вид страницы - наличие меню различного уровня и т.п.)
  • Дополнительные параметры страницы
При работе web-интерфейса мета-информация напрямую не считывается, а используется срез этой информации в базе данных. После обновления системы, или добавления новых страниц в web-интерфейс системы, необходимо перечитать всю мета-информацию, для этого необходимо в CLI интерфейсе системы нужно выполнить команду:
$ cli page reload_info
Scanning completed: 260 pages scanned
Unparsed files: 0
Внешний вид страниц настраивается шаблонами которые находятся в каталоге templates/, и при необходимости могут быть заменены на другие. Для этого нужно создать новый файл шаблона и в конфигурационном файле billing.cfg в соответствующем параметре указать путь к этом файлу.
Очередность страниц при построении меню, или при групповом вызове страниц (когда web-страница формируется на основании кода всех страниц удовлетворяющих определенным условиям) указывается в мета-информации о странице (параметр level). Страницы выводятся в порядке возрастания числового значения level, если они равны то страницы будет отсортированы по имени в алфавитном порядке. При необходимости можно изменить эту очередность переопределив значение. Для этого в конфигурационном файле billing.cfg используется специальный блок __page_order__, в этом блоке указывается значение level для страниц которые мы хотим переместить в виде строк <имя_страницы>=<значение_поля_сортировки>. Указав в качестве значения -1 мы исключим страницу из web-интерфейса. (Например если эта страница не требуется для конкретного внедрения информационной системы, и мы не хотим чтобы в различных меню были лишние пункты).
[__page_order__]
add_user=1           # Добавление абонентов
user_search=2        # Поиск абонентов
house=3              # Дома
stat=100             # Статистика
stat_top_traffic=-1  # Наибольшие потребители трафика
Показанный выше пример означает что страницы, “Добавление абонента”, “Поиск абонентов”, “Дома” (они все относятся к корневому меню системы) будут располагаться в том порядке, в котором мы их перечислили, страница “Статистика” будет последней (у нее самое большое число используемое для сортировки). А страница “stat_top_traffic” вообще не будет доступна из web-интерфейса системы.
Для доступа к веб-интерфейсу оператор системы должен авторизоваться. При этом у него в браузере должна быть включена поддержка cookie, а так же для корректной работы должно быть разрешено использование JavaScript и не было заблокировано открытие всплывающих (popup) окон. Подробней об авторизации и правах доступа читайте главу Операторы системы, права доступа.
Вход в системы начинается со страницы, где необходимо ввести свой логин и пароль.
_images/login_logo.png
При желании можно изменить внешний вид этой страницы. Во-первых, можно вместо имени сервера написать любой текст, для этого в файле billing.cfg нужно задать параметр backoffice_login_prompt, в котором указать текст, который должен отображаться. Тоже самое можно сделать через сам веб-интерфейс в “Настройка” - “Системные параметры” - “Web-интерфейс” - “Приглашение при входе”. Если необходимо более радикальные изменения во внешнем виде страницы, то надо создать HTML шаблон страницы. и указать путь к этому файлу в параметре backoffice_login_page_template.

Note

Необходимо настроить параметр backoffice_url_base указав в нем URL информационной системы, этот параметр используется системой в случаях когда нужно сформировать URL определенной страницы системы.

Дополнительно можно настроить параметр backoffice_session_timeout, он определяет время неактивности оператора, после которого сессия работы завершается и система вновь попросит ввести логин и пароль. Время задается в секундах, значение по умолчанию 1800 (пол часа).

Note

Необходимо настроить параметр backoffice_default_page указав страницу, которую нужно показать оператору сразу после входа в систему. Например указать страницу user_search - “Поиск Абонентов”

Информация о настройке веб сервера Apache для работы с системой описана в разделе: apache.

Словари

В информационной системе у различных объектов существуют различные атрибуты, которые могут принимать только определенные значения, например для оператора связи работающего в ограниченной географической зоне, названия улиц, где осуществляется подключение абонентов является ограниченным, поэтому логично, чтобы система позволяла выбирать это название из списка. Для этого в информационной системе реализована функциональность словарей - список значений которое может принимать поле в информационной системе. Так же примерами словарей является: тип заявки при обращении в тех поддержку и т.п.
Информационная система позволяет либо ограничить варианты выбора значения для словаря, либо разрешить внесение любого значение в поле. Тип поведения настраивается в web-интерфейсе. Типы: select - выбор ограничен заранее определенными значениями, или input - в поле можно вводить любое значение.
_images/dict_all.png
Заполнить допустимые значения для словарей можно через web-интерфейс на странице “Настройка” - “Редактирование словарей”. На этой странице можно редактировать и добавлять значения во все словари которые настроены на тип select. Информационная система осуществляет контроль целостности данных, и при редактировании словаря показывает в какие компонентах системы каждое значение используется (и сколько раз), и не дает удалять значения которые могут нарушить целостность данных.
_images/dict_edit.png
Также у словарей могут быть дополнительные поля, в приведенном выше примере это “Сокращенное значение”. Так выглядит описание нашего словаря street вместе с доп. полями и зависимостями в feature файле:
[dictionary_street]
# description of street dictionary
title=Street name
dependency_table_1=house
dependency_title_1=Binded houses
dependency_table_2=user_properties
dependency_title_2=Binded users
addon_field_1=short
Управлять словарями также можно через CLI интерфейс.
Pyzzle> dictionary list
Выведет полный список словарей поддерживаемый системой, с указанием их типа.

Pyyzle> dictionary show <dict_name>
Выводит список значений для словаря

Pyzzle> dictionary export <dict_name>
Выведет содержимое словаря в формате CSV для редактирования
Pyzzle> dictionary import <dict_name>
Принимает со стандартного ввода строки со значениями для словаря и вносит эти значения в словарь
Pyzzle> dictionary update <dict_name>
Принимает со стандартного ввода строки в CSV формате и обновляет соответствующие записи в словаре,
  эта команда используется для загрузки в систему откорректированных данных полученных командой dictionary export
Pyzzle> dictionary add <dict_name> <value>
Добавить запись в словарь