События

Механизм событий ISPmanager служит дополнительным расширением панели управления за счёт добавления пользовательских CGI-программ или скриптов, которые будут автоматически запущены после выполнения соответствующей функции ISPmanager. В качестве примера можно привести ситуацию, когда вам нужно, чтобы после создания WWW домена был произведён определённый набор действий, например, добавление записи в базу данных либо отсылка письма по электронной почте.

Такие скрипты необходимо помещать в директорию /usr/local/ispmgr/event, устанавливать права 700, указывать root в качестве владельца и называть по имени соответствующего события ISPmanager, например, wwwdomain.edit.new. Получить список доступных для конкретной реализации панели управления событий можно с помощью функции панели управления eventlist, например, вызвав следующую команду из shell:

wget -O - -q "http://127.0.0.1/manager/ispmgr?out=text&func=eventlist"

На вход пользовательская CGI-программа получает все то же самое, что и панель управления. Соответствующий набор параметров можно найти в ISPmanager API.

Для того, чтобы выяснить от имени какого пользователя была вызвана функция ISPmanager, которая привела к выполнению вашей CGI-программы, можно использовать переменную окружения REMOTE_USER. При этом вы можете быть уверены, что данный пользователь был авторизован.

Для того, чтобы ошибки в пользовательских CGI-программах не влияли на работу панели управления, эти программы запускаются в отдельном процессе, и ISPmanager не ждёт результатов их выполнения.

Также необходимо отметить, что из подобных CGI-программ нельзя вызывать функции ISPmanager во избежание взаимных блокировок.

Пример

Ниже приведён пример использования механизма событий ISPmanager. Допустим, вы хотите расширить модуль создания WWW доменов таким образом, чтобы при создании нового WWW домена в форме появилось новое поле, в котором вы могли бы указать адрес электронной почты, на который будет автоматически отсылаться некоторое письмо. Для этого, во-первых, вы должны создать XML-документ, описывающий добавляемое поле, следующего вида:

<?xml version="1.0" encoding="UTF-8"?>
<mgrdata>
  <metadata name="wwwdomain.edit">
    <form>
     <field name="email" id="email" hidden="yes">
       <input type="text" name="email"/>
     </field>
    </form>
    <jscript>
      if (document.frm.elid.value == '')
	fr_hs_fields([], ['email']);
    </jscript>
  </metadata>
  <lang name="en">
    <messages name="wwwdomain.edit">
      <msg name="email">E-Mail</msg>
      <msg name="hint_email">Used for sending welcome email</msg>
    </messages>
  </lang>
</mgrdata>
	

Файл должен быть помещён в директорию /usr/local/ispmgr/etc и иметь имя "ispmgr_mod_имя.xml". Выражение "имя" может быть произвольным. Если XML-документ будет содержать ошибки, ISPmanager не запустится, поэтому вы должны быть предельно внимательны. Итак, рассмотрим данный XML-документ.

Выражение <metadata name="wwwdomain.edit"> означает, что мы собираемся модифицировать форму параметров WWW домена (одна форма для создания, просмотра и изменения параметров).

Выражение <field name="email" id="email" hidden="yes"> означает, что мы собираемся добавить скрытое по умолчанию поле с именем "email". <input type="text" name="email"/> означает, что необходимо добавить элемент управления типа "text" с именем "email".

Далее приведён javascript, в котором указано, что нужно выполнять заданное действие, если при вызове формы панель управления не получила параметр elid, что бывает только в случае создания нового элемента. То есть мы будем видеть это поле только при создании нового WWW домена. Встроенная в панель управления javascript-функция fr_hs_fields предназначена для того, чтобы показывать или скрывать поля. В качестве первого параметра необходимо передать массив имён полей, которые необходимо скрыть, второго параметра - показать. Так как наше поле по умолчанию скрыто, то мы добавили код, для того, чтобы оно отображалось, когда мы создаём новый WWW домен.

Выражение <lang name="en"> означает, что мы хотим добавить сообщения (заголовки полей и подсказки) на английском языке (en). Далее идёт <messages name="wwwdomain.edit">, что означает, что бы хотим добавить сообщения для модуля wwwdomain.edit.

После этого идут описания сообщений. Аргумент "name" для сообщения, соответствующего заголовку добавленного в форму текстового поля, должен соответствовать имени соответствующего поля, то есть "email". Аргумент "name" подсказки для этого поля должен начинаться с "hint_".

После этого необходимо написать CGI-программу (скрипт), которая будет обеспечивать отсылку сообщения при создании нового WWW домена. Так как в нашем случае это создание нового элемента, наша функция должна называться wwwdomain.edit.new.

#!/usr/bin/perl

use CGI qw/:standard/;
$Q = new CGI;

$email = $Q->param(email);
$domain = $Q->param(domain);

open(M, "|/usr/sbin/sendmail") or die("unable open sendmail");
print M "From: info\@example.com\n";
print M "To: $email\n";
print M "Subject: New WWW domain\n";
print M "Content-type: text/plain\n\n";
print M "Your WWW domain $domain is ready!\n";
print M "... some welcome text ...\n\n";
close (M);
	

Как вы видите, значения полей заполненной формы (в нашем случае email и domain) передаются в качестве параметров CGI-скрипта. Обратиться к ним можно стандартным способом.

Поместим этот скрипт в директорию /usr/local/ispmgr/event и установим на него права 700. После этого мы должны перезапустить ISPmanager, чтобы он загрузил изменения:

killall ispmgr