Предварительная подготовка
Необходимо создать пользователя в mongodb (при установке из deb пакета это делается автоматически)
root@server:~# mongo --eval "db.addUser({ user: \"hard\", pwd: \"hard\", roles: [ \"userAdminAnyDatabase\" ] })" hard_cache || exit 0
Особенности работы
1. При старте все конфигурационные файлы объединяются в один, пользовательский конфиг переопределяет системный.
2. Пакеты обрабатываются по URL вида /plugin/name, где plugin - один из плагинов hard, name - произвольное название объекта плагина. Одновременно может использоваться несколько объектов одного плагина. Каждый объект плагин имеет собственные настройки (определенные в plugins.plugin.name). Активные объекты плагинов определяются в конфигурационном файле default.yml в ключе enabled_plugins. Например:
enabled_plugins: [base/main, base/test, dhcp/main]
3. Перед обработкой запроса непосредственно объектом плагина, выполняется последовательность фильтров определенных в plugins.plugin.name.call_stack в прямом порядке. После завершения действий объекта плагина, выполняются те же фильтры из call_stack, но в обратном порядке. Таким образом, с помощью добавления пользовательского фильтра можно изменять данные как запроса, так и ответа приложения.
4. При обработке аккаунтинг-update пакетов, данные помещаются в кэш mongo db в коллекцию accounting_data. Загрузка данных аккаунтинга (cdr и трафика) в биллинг выполняется отдельным скриптом, который запускается коммандой ./init/hard.sh batch (в опции -f можно указать дирректорию с пользовательскими настройками). Данный скрипт должен периодически запускаться через cron.
Принцип обработки запроса
- Поступает запрос на url вида plugin/name
- Проверяется наличие существования плагина в приложении и объекта плагина в enabled_plugins
- Поиск цепочки вызова в plugins.plugin.name.call_stack, если такая цепочка не найдена, используется plugins.plugin.default.call_stack
- Последовательно выполняются фильтры цепочки вызова в прямом порядке
- Выполняются обработка запроса (возможно предварительно измененного фильтрами) объектом плагина
- Последовательно выполняются фильтры цепочки вызова в обратном порядке
- Возвращается результат обработки
Некоторые фильтры выполняют обработку только при пямом или только при обратном вызове (например, before и after фильтры)