Изменение поведения системы, при определенных действиях пользователей, события

Материал из ISPWiki
Перейти к: навигация, поиск

Во всех программных продуктах ISPsystem существует возможность выполнить свой, определенный набор действий во время определенных событий и даже повлиять на ход выполнения обработки запросов (например с целью дополнительной валидации данных или дополнительной проверки доступа)

Для вмешательства в работу панелей управления вам необходимо:

  • Написать скрипт, обработчик события
  • Зарегистрировать свой скрипт-обработчик

Рассмотрим данные действия на простой задаче - во время создания/удаления пользователя ISPmanager создавать/удалять для него учетную запись в samba

1) Создаем файл обработчик /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";

2) Устанавливаем права на файл обработчик chmod 750 /usr/local/mgr5/addon/samba.pl chown 0:0 /usr/local/mgr5/addon/samba.pl

3) Создаем файл описания нашего плагина /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>

4) Перезапускаем ISPmanager

/usr/local/mgr5/sbin/mgrctl -m ispmgr exit

5) Если вы все сделали правильно, то в логе /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'

6) Часто в системе может не оказаться библиотеки 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" говорит о том, что наш скрипт будет запущен после выполнения основной функции. Внутренние имена необходимых вам функций можно посмотреть способами описанными в статье Список функций и параметров

Более подробно о тегах и атрибутах описания событий можно прочитать в статье Категория:XML#Внешние_обработчики_(handler/library).

Обработчик


Теперь более подробно остановимся на обработчике. Поскольку мы используем один и тот же обработчик для нескольких функций, нам нужно знать, какая именно функция инициировала его запуск, для этого берем параметр 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";