Документация DNSmanager 6

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

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

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

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

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

Пример скрипта

  1. Создайте файл обработчик /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";
  2. Установите права на файл обработчик chmod 750 /opt/ispsystem/dnsmanager6/addon/samba.pl chown 0:0 /opt/ispsystem/dnsmanager6/addon/samba.pl.
  3. Создайте файл описания вашего плагина /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>
  4. Перезапустите ISPmanager:

    /opt/ispsystem/dnsmanager6/sbin/mgrctl -m ispmgr exit
  5. Если вы все сделали правильно, то следующие команды выведут информацию о зарегистрированных событиях:

    /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
  6. Часто в системе может не оказаться библиотеки CGI. Можно установить её так:

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

    *.external 9
  8. Перезапустите 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";