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