Во всех программных продуктах ISPsystem существует возможность выполнить свой, определённый набор действий во время определённых событий и даже повлиять на ход выполнения обработки запросов. Например, с целью дополнительной валидации данных или дополнительной проверки доступа.
Для вмешательства в работу панелей управления вам необходимо:
- Написать скрипт, обработчик события.
- Зарегистрировать свой скрипт-обработчик.
Рассмотрим данные действия на простой задаче — во время создания/удаления пользователя ISPmanager создавать/удалять для него учётную запись в samba.
Пример скрипта
-
Создайте файл обработчик /opt/ispsystem/dnsmanager6/addon/samba.pl со следующим содержимым:
#!/usr/bin/perl use CGI; my $Q = new CGI; $func = $Q->param("func"); $elid = $Q->param("elid"); if ($func eq "user.edit") { 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 /opt/ispsystem/dnsmanager6/addon/samba.pl chown 0:0 /opt/ispsystem/dnsmanager6/addon/samba.pl.
-
Создайте файл описания вашего плагина /opt/ispsystem/dnsmanager6/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.edit" postdata="yes"/> <event after="yes" name="user.delete" postdata="yes"/> </handler> </mgrdata>
-
Перезапустите ISPmanager:
/opt/ispsystem/dnsmanager6/sbin/mgrctl -m ispmgr exit
-
Если вы все сделали правильно, то следующие команды выведут информацию о зарегистрированных событиях:
/opt/ispsystem/dnsmanager6/sbin/mgrctl -m dnsmgr eventlist action=user.delete event=samba.pl priority=before #100 /opt/ispsystem/dnsmanager6/sbin/mgrctl -m dnsmgr eventlist action=user.edit event=samba.pl priority=before #100
-
Часто в системе может не оказаться библиотеки CGI. Можно установить её так:
Установка на CentOSyum install perl-CGI
-
Если что-то пошло не так, для отладки взаимодействия с внешними скриптами необходимо увеличить уровень информации в логе. Для этого в файл /opt/ispsystem/dnsmanager6/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" postdata="yes"/>
<event after="yes" name="user.delete" postdata="yes"/>
</handler>
- тег handler описывает обработчик события (скрипт);
- samba.pl — имя скрипта. Все скрипты должны быть расположены в директории /opt/ispsystem/dnsmanager6/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";