Изменение поведения системы при определенных действиях пользователей, события
Во всех программных продуктах ISPsystem существует возможность выполнить свой, определённый набор действий во время определённых событий и даже повлиять на ход выполнения обработки запросов. Например, с целью дополнительной валидации данных или дополнительной проверки доступа.
Для вмешательства в работу панелей управления вам необходимо:
- Написать скрипт, обработчик события.
- Зарегистрировать свой скрипт-обработчик.
Рассмотрим данные действия на простой задаче — во время создания/удаления пользователя ISPmanager создавать/удалять для него учётную запись в samba.
Пример скрипта
Создайте файл обработчик /usr/local/mgr5/addon/samba.pl со следующим содержимым:
CODE- Установите права на файл обработчик chmod 750 /usr/local/mgr5/addon/samba.pl chown 0:0 /usr/local/mgr5/addon/samba.pl.
Создайте файл описания вашего плагина /usr/local/mgr5/etc/xml/ispmgr_mod_samba.xml со следующим содержимым:
CODEПерезапустите ISPmanager:
CODEЕсли вы все сделали правильно, то в логе /usr/local/mgr5/var/ispmgr.log вы увидите примерно такие строки:
CODEЧасто в системе может не оказаться библиотеки CGI. Можно установить её так:
Установка на CentOS
CODEЕсли что-то пошло не так, для отладки взаимодействия с внешними скриптами необходимо увеличить уровень информации в логе. Для этого в файл /usr/local/mgr5/etc/debug.conf добавьте строку:
CODEПерезапустите ISPmanager, после чего в логе появятся строки с префиксом external. Например:
CODE
Далее более подробно описаны проделанные шаги.
Описание плагина
В данном примере мы воспользовались возможностью запустить свой скрипт во время выполнения тех или иных функций панели управления. Начнем разбор с блока:
- тег handler описывает обработчик события (скрипт);
- samba.pl — имя скрипта.Все скрипты должны быть расположены в директории /usr/local/mgr5/addon;
- type="cgi" — для передачи данных скрипту нужно использовать метод, применяемый для обычных CGI-скриптов;
- теги event — указывают, при выполнении каких функций следует запускать скрипт обработчик;
- атрибут after="yes" — скрипт будет запущен после выполнения основной функции. Внутренние имена необходимых вам функций можно посмотреть способами описанными в статье Список функций и параметров.
Обработчик
Теперь более подробно остановимся на обработчике. Поскольку мы используем один и тот же обработчик для нескольких функций, нам нужно знать, какая именно функция инициировала его запуск, для этого берём параметр func:
и в зависимости от его значения выполняем разные блоки.
Обработка user.edit — создание пользователя. На самом деле функция с таким именем вызывается для получения данных о пользователе, для сохранения измененных данных (при редактировании) и при создании пользователя. В описанном скрипте происходит:
- параметр sok пустой или отсутствует, значит запрашиваются данные о пользователе, имя пользователя указано в параметре elid;
- параметр sok не пустой (обычно yes или ok, но панель не проверяет его значение, важно чтобы он был не пустым) и параметр elid не пустой, значит вызвана функция изменения параметров пользователя, имя редактируемого пользователя содержится в параметре elid;
параметр sok не пустой, а параметр elid пустой — вызвана функция создания нового пользователя. Именно это и проверяется в строке:
CODE
Описанная схема с параметрами sok и elid справедлива и для функций создания/редактирования других объектов.
Далее получаем значения параметров и выполняем внешнюю команду, которая произведёт необходимые действия.
Обработка user.delete — удаление пользователя. Поскольку операция удаления является групповой, то есть за один вызов можно удалить несколько пользователей, то параметр elid может содержать несколько имен, разделенных символами ", " (запятая и пробел). Формируем массив удаляемых пользователей:
и потом для каждого пользователя выполняем внешнюю команду удаления его из базы паролей Samba.
В конце работы наш обработчик должен вернуть в стандартный вывод XML документ с результатами своей работы. Если результат не требуется (как в нашем примере), то достаточно вернуть пустой, но валидный XML.