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

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

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

Рассмотрим данные действия на простой задаче — во время создания/удаления пользователя 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";
    CODE
  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" postdata="yes"/>
       <event after="yes" name="user.delete" postdata="yes"/>
     </handler>
    </mgrdata>
    CODE
  4. Перезапустите ISPmanager:

    /usr/local/mgr5/sbin/mgrctl -m ispmgr exit
    CODE
  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'
    CODE
  6. Часто в системе может не оказаться библиотеки CGI. Можно установить её так:

    Установка на CentOS

    yum install perl-CGI
    CODE
  7. Если что-то пошло не так, для отладки взаимодействия с внешними скриптами необходимо увеличить уровень информации в логе. Для этого в файл /usr/local/mgr5/etc/debug.conf добавьте строку:

    *.external 9
    CODE
  8. Перезапустите ISPmanager, после чего в логе появятся строки с префиксом external. Например:

    external WARNING Addon 'addon/samba.pl' is not executable
    CODE

Далее более подробно описаны проделанные шаги.

Описание плагина


В данном примере мы воспользовались возможностью запустить свой скрипт во время выполнения тех или иных функций панели управления. Начнем разбор с блока:

<handler name="samba.pl" type="cgi">
  <event after="yes" name="user.edit" postdata="yes"/>
  <event after="yes" name="user.delete" postdata="yes"/>
</handler>
CODE


  • тег handler описывает обработчик события (скрипт);
  • samba.pl — имя скрипта.Все скрипты должны быть расположены в директории /usr/local/mgr5/addon;
  • type="cgi" — для передачи данных скрипту нужно использовать метод, применяемый для обычных CGI-скриптов;
  • теги event — указывают, при выполнении каких функций следует запускать скрипт обработчик;
  • атрибут after="yes" — скрипт будет запущен после выполнения основной функции. Внутренние имена необходимых вам функций можно посмотреть способами описанными в статье Список функций и параметров.

Обработчик


Теперь более подробно остановимся на обработчике. Поскольку мы используем один и тот же обработчик для нескольких функций, нам нужно знать, какая именно функция инициировала его запуск, для этого берём параметр func:

$func = $Q->param("func");
CODE

и в зависимости от его значения выполняем разные блоки.

Обработка user.edit — создание пользователя. На самом деле функция с таким именем вызывается для получения данных о пользователе, для сохранения измененных данных (при редактировании) и при создании пользователя. В описанном скрипте происходит:

  • параметр sok пустой или отсутствует, значит запрашиваются данные о пользователе, имя пользователя указано в параметре elid;
  • параметр sok не пустой (обычно yes или ok, но панель не проверяет его значение, важно чтобы он был не пустым) и параметр elid не пустой, значит вызвана функция изменения параметров пользователя, имя редактируемого пользователя содержится в параметре elid;
  • параметр sok не пустой, а параметр elid пустой — вызвана функция создания нового пользователя. Именно это и проверяется в строке:

    if ($Q->param("sok") && $elid eq "") {
    CODE

Описанная схема с параметрами sok и elid справедлива и для функций создания/редактирования других объектов.

Далее получаем значения параметров и выполняем внешнюю команду, которая произведёт необходимые действия.

Обработка user.delete — удаление пользователя. Поскольку операция удаления является групповой, то есть за один вызов можно удалить несколько пользователей, то параметр elid может содержать несколько имен, разделенных символами ", " (запятая и пробел). Формируем массив удаляемых пользователей:

@all_users = split(", ", $elid);
CODE

и потом для каждого пользователя выполняем внешнюю команду удаления его из базы паролей Samba.

В конце работы наш обработчик должен вернуть в стандартный вывод XML документ с результатами своей работы. Если результат не требуется (как в нашем примере), то достаточно вернуть пустой, но валидный XML.

print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<doc/>\n";
CODE