Продукты ISPsystem на базе COREmanager используют механизм обработки событий, позволяющий:
- добавлять дополнительные проверки (валидация, доступ);
- модифицировать стандартное поведение;
- интегрировать внешние сервисы.
Для реализации нужно:
- Создать скрипт-обработчик события.
- Зарегистрировать его в системе.
Рассмотрим данные действия на задаче — во время создания/удаления пользователя BILLmanager создавать или удалять для него учётную запись в samba.
Пример скрипта
Чтобы реализовать интеграцию Samba с BILLmanager:
-
Если в системе не установлена библиотека CGI, установите её с помощью команды:
Установка на AlmaLinuxdnf install perl-CGI
-
Создайте файл обработчик /usr/local/mgr5/addon/samba.pl со следующим содержимым:
Пример скрипта#!/usr/bin/perl use CGI; my $Q = new CGI; $func = $Q->param("func"); $elid = $Q->param("elid"); if ($func eq "user.add") { if ($Q->param("sok") && $elid eq "") { # происходит создание пользователя $name = $Q->param("name"); $password = $Q->param("passwd"); system("(echo \"$password\"; echo \"$password\") | smbpasswd -a $name"); } } elsif ($func eq "user.delete") { # происходит удаление пользователей @all_users = split(", ", $elid); for (@all_users) { system("smbpasswd -x $_"); } } print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<doc/>\n";
- Настройте права на файл обработчик:
chmod 750 /usr/local/mgr5/addon/samba.pl chown 0:0 /usr/local/mgr5/addon/samba.pl
-
Создайте конфигурационный XML-файл /usr/local/mgr5/etc/xml/billmgr_mod_samba.xml с описанием плагина:
<mgrdata> <handler name="samba.pl" type="cgi"> <event after="yes" name="user.add" postdata="yes"/> <event after="yes" name="user.delete" postdata="yes"/> </handler> </mgrdata>
-
Перезапустите BILLmanager:
/usr/local/mgr5/sbin/mgrctl -m billmgr exit
Если конфигурация выполнена правильно, в логе /usr/local/mgr5/var/billmgr.log появятся записи о регистрации обработчика для указанных событий:
Пример выводаaction EXTINFO Register event 'samba.pl' for action 'user.edit' action EXTINFO Register event 'samba.pl' for action 'user.delete'
Если что-то пошло не так, для отладки внешних скриптов:
-
Включите максимальное логирование. Для этого в файл /usr/local/mgr5/etc/debug.conf добавьте строку:
*.external 9
-
Перезапустите BILLmanager. После перезапуска в логе появятся строки с префиксом
external.
Например:Пример выводаexternal WARNING Addon 'addon/samba.pl' is not executable
Далее более подробно описаны проделанные шаги.
Описание плагина
Пример показывает запуск скрипта при выполнении функций платформы. Рассмотрим конфигурационный блок:
<handler name="samba.pl" type="cgi">
<event after="yes" name="user.edit" postdata="yes"/>
<event after="yes" name="user.delete" postdata="yes"/>
</handler>
Компоненты конфигурации блока:
handler
— тег, описывает обработчик события (скрипт);samba.pl
— имя скрипта. Все скрипты должны быть расположены в директории /usr/local/mgr5/addon;type="cgi"
— метод передачи данных через CGI-интерфейс;event
— тег, регистрирует событие для вызова скрипта обработчика;after="yes"
— атрибут. Запускает скрипт после основной функции. Подробнее о внутренних именах функций см. в статье Список функций и параметров.
Обработчик
Обработчик определяет тип операции по параметру
func
. Чтобы определить, какая функция инициировала запуск обработчика, получите значение параметра:
$func = $Q->param("func");
В зависимости от значения
func
выполните инструкции одного из подразделов:
- Обработка
user.edit
; - Обработка
user.delete
.
Обработка user.edit
Событие user.edit
возникает при:
- получении данных о пользователе;
- сохранении изменений;
- создании пользователя.
Для определения типа операции проверьте параметры:
- параметр
sok
пустой или отсутствует — запрос данных пользователя. Имя пользователя передаётся в параметреelid
; - параметр
sok
не пустой (обычноyes
илиok
) и параметрelid
не пустой — изменение данных пользователя. Имя пользователя передаётся в параметреelid
; - параметр
sok
не пустой, а параметрelid
пустой — создание пользователя.
if ($Q->param("sok") && $elid eq "") {
Описанная логика параметров sok
и elid
справедлива для функций создания или редактирования других объектов.
Обработка user.delete
Событие user.delete
возникает при удалении пользователя. Операция удаления поддерживает групповое выполнение. Чтобы за один вызов удалить несколько пользователей, укажите в параметре elid несколько имён, разделённых символами ", " (запятая и пробел):
- Создайте массив имён:
@all_users = split(", ", $elid);
- Удалите каждого из пользователей из базы паролей Samba с помощью внешней команды.
После выполнения операций обработчик должен вернуть в стандартный вывод XML-документ с результатами своей работы. Если результат не требуется, достаточно вернуть пустой, но валидный XML-документ:
print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<doc/>\n";
Расширенное управление событиями
Чтобы заменить стандартную обработку события, используйте:
- атрибут
before="yes"
— выполнение до основного действия; - тег
— блокировка стандартной функции; - атрибут
after="yes"
— выполнение дополнительных действий после обработки. Не срабатывает, если используется тег.
Чтобы настроить конфигурацию:
- Создайте XML-конфигурацию обработчика: Пример файла
<mgrdata> <handler name="test.py" type="xml"> <event name="register.activationsend" before="yes"/> </handler> </mgrdata>
Подробнее - Создайте исполняемый файл /usr/local/mgr5/addon/test.py:
Пример файла#!/usr/bin/env python3 print("<doc>"); print("<skipaction/>"); print("</doc>");
Подробнее - Настройте права:
chmod 750 /usr/local/mgr5/addon/test.py chown root:root /usr/local/mgr5/addon/test.py
-
Перезапустите BILLmanager:
/usr/local/mgr5/sbin/mgrctl -m billmgr exit
При вызове функции register.activationsend
:
- Стандартное действие платформы выполнено не будет.
- Будет выполнено содержимое скрипта /usr/local/mgr5/addon/test.py, поскольку функция
register.activationsend
в обработчике заменена на этот файл. - В логах появится запись:
[INFO] external: Executing: /usr/local/mgr5/addon/test.py
Пример показывает корректный XML-вывод в stdout в исполняемом файле. Он:
- не содержит конкретных команд;
- показывает, как заменить действие в биллинге на действие в исполняемом файле.
Вы должны самостоятельно обеспечить:
- обработку входных параметров (
func, elid, sok
и др.); - корректный XML-вывод в
stdout
; - выполнение всех необходимых операций вместо системы.
Зависимые функции будут использовать данные, сформированные вашим скриптом.
Обязательно проверяйте целостность данных в БД после замены действий.
Связанные статьи: