Выполнение собственных действий во время выполнения функций панели управления

Материал из ISPWiki

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

Рассмотрим пример того, как выполнить какое-либо необходимое вам действия во время определенных событий панели управления.

Постановка задачи

  • Имеем панель управления ISPmanager
  • Нужно во время создания пользователя создавать для него учетную запись в Samba
  • Нужно во время удаления пользователя удалять его учетную запись в Samba

Действия

1) Создаем файл описания плагина /usr/local/ispmgr/etc/ispmgr_mod_samba.xml со следующим содержимым

<?xml version="1.0" encoding="UTF-8"?>
  <mgrdata>
    <handler name="samba.pl" type="cgi">
      <event after="yes">user.edit</event>
      <event after="yes">user.delete</event>
    </handler>
  </mgrdata>

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

3) Устанавливаем права на файл обработчик

chmod 750 /usr/local/ispmgr/addon/samba.pl
chown 0:0 /usr/local/ispmgr/addon/samba.pl

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

Пояснения

Описание


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

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

тэг handler описывает наш обработчик события (скрипт), samba.pl это имя скрипта, все скрипты должны быть расположены в директории /usr/local/ispmgr/addon

type="cgi" говорит о том, что для передачи данных скрипту нужно использовать метод, применяемый для обычных CGI-скриптов.

Далее тэги event указывают, при выполнении каких функций следует запускать наш скрипт обработчик. Атрибут after="yes" говорит о том, что наш скрипт будет запущен после выполнения основной функции. Внутренние имена необходимых вам функций можно посмотреть в документации по API нужной вам панели управления. В данном примере ISPmanager API

Более подробно об описании событий можно прочитать в статье События.


Обработчик


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

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

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

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

  • параметр sok пустой или отсутствует, значит запрашиваются данные о пользователе, имя пользователя указано в параметре elid.
  • параметр sok не пустой (обычно yes или ok, но панель не проверяет его значение, важно чтобы он был не пустым) и параметр elid не пустой, значит вызвана функция изменения параметров пользователя, имя редактируемого пользователя содержится в параметре elid
  • параметр sok не пустой, а параметр elid пустой - вызвана функция создания нового пользователя. Именно это мы и проверяем в строке
 if ($Q->param("sok") && $elid eq "") {

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

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

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

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

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

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

print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<doc/>\n";
Была ли эта информация полезной? Да | Нет
Личные инструменты