Изменение поведения системы при определенных действиях пользователей, события
В ISPmanager существует возможность выполнить свой, определённый набор действий во время определённых событий и даже повлиять на ход выполнения обработки запросов. Например, с целью дополнительной валидации данных или дополнительной проверки доступа.
Для вмешательства в работу панелей управления вам необходимо:
- Написать скрипт, обработчик события.
- Зарегистрировать свой скрипт-обработчик.
Рассмотрим данные действия на простой задаче — во время создания/удаления пользователя ISPmanager создавать/удалять для него учётную запись в samba.
Пример скрипта
- Создайте файл обработчик /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.
- Создайте файл описания вашего плагина /usr/local/mgr5/etc/xml/ispmgr_mod_samba.xml со следующим содержимым:
<?xml version="1.0" encoding="UTF-8"?> <mgrdata> <handler name="samba.pl" type="cgi"> <event after="yes" name="user.add"/> <event after="yes" name="user.delete"/> </handler> </mgrdata>
- Перезапустите ISPmanager:
/usr/local/mgr5/sbin/mgrctl -m ispmgr exit
- Если вы все сделали правильно, то в логе /usr/local/mgr5/var/ispmgr.log вы увидите примерно такие строки:
action EXTINFO Register event 'samba.pl' for action 'user.edit' action EXTINFO Register event 'samba.pl' for action 'user.delete'
- Часто в системе может не оказаться библиотеки CGI. Можно установить её так:Установка на CentOS
yum install perl-CGI
- Если что-то пошло не так, для отладки взаимодействия с внешними скриптами необходимо увеличить уровень информации в логе. Для этого в файл /usr/local/mgr5/etc/debug.conf добавьте строку:
*.external 9
- Перезапустите ISPmanager, после чего в логе появятся строки с префиксом external. Например:
external WARNING Addon 'addon/samba.pl' is not executable
Далее более подробно описаны проделанные шаги.
Описание плагина
В данном примере мы воспользовались возможностью запустить свой скрипт во время выполнения тех или иных функций панели управления. Начнем разбор с блока:
<handler name="samba.pl" type="cgi">
<event after="yes" name="user.edit"/>
<event after="yes" name="user.delete"/>
</handler>
- тег handler описывает обработчик события (скрипт);
- samba.pl — имя скрипта.Все скрипты должны быть расположены в директории /usr/local/mgr5/addon;
- type="cgi" — для передачи данных скрипту нужно использовать метод, применяемый для обычных CGI-скриптов;
- теги event — указывают, при выполнении каких функций следует запускать скрипт обработчик;
- атрибут after="yes" — скрипт будет запущен после выполнения основной функции. Внутренние имена необходимых вам функций можно посмотреть способами описанными в статье Список функций и параметров.
Обработчик
Теперь более подробно остановимся на обработчике. Поскольку мы используем один и тот же обработчик для нескольких функций, нам нужно знать, какая именно функция инициировала его запуск, для этого берём параметр func:
$func = $Q->param("func");
и в зависимости от его значения выполняем разные блоки.
Обработка user.edit — создание пользователя. На самом деле функция с таким именем вызывается для получения данных о пользователе, для сохранения измененных данных (при редактировании) и при создании пользователя. В описанном скрипте происходит:
- параметр sok пустой или отсутствует, значит запрашиваются данные о пользователе, имя пользователя указано в параметре elid;
- параметр sok не пустой (обычно yes или ok, но панель не проверяет его значение, важно чтобы он был не пустым) и параметр elid не пустой, значит вызвана функция изменения параметров пользователя, имя редактируемого пользователя содержится в параметре elid;
- параметр sok не пустой, а параметр elid пустой — вызвана функция создания нового пользователя. Именно это и проверяется в строке:
if ($Q->param("sok") && $elid eq "") {
Описанная схема с параметрами sok и elid справедлива и для функций создания/редактирования других объектов.
Далее получаем значения параметров и выполняем внешнюю команду, которая произведёт необходимые действия.
Обработка user.delete — удаление пользователя. Поскольку операция удаления является групповой, то есть за один вызов можно удалить несколько пользователей, то параметр elid может содержать несколько имен, разделенных символами ", " (запятая и пробел). Формируем массив удаляемых пользователей:
@all_users = split(", ", $elid);
и потом для каждого пользователя выполняем внешнюю команду удаления его из базы паролей Samba.
В конце работы наш обработчик должен вернуть в стандартный вывод XML документ с результатами своей работы. Если результат не требуется (как в нашем примере), то достаточно вернуть пустой, но валидный XML.
print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<doc/>\n";