Добавление элементов управления в имеющиеся интерфейсы

Материал из ISPWiki

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

Рассмотрим пример добавления собственного параметра в имеющийся интерфейс.

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

  • Имеем панель управления ISPmanager
  • В настройку пользователя необходимо добавить выбор предпочитаемой программы для веб-почты
  • Список доступных программ веб-почты хранится в файле /usr/local/ispmgr/etc/webmail.list и имеет вид:
squirrelmail /webmail/
roundcube /roundcube/

т.е. содержит названия и URL доступа.

Действия

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

<?xml version="1.0" encoding="UTF-8"?>
<mgrdata>
    <handler name="userwebmail.pl" type="cgi">
      <event after="yes">usrparam</event>
    </handler>
    <metadata name="usrparam">
        <form>
           <field name="webmail">
              <select name="webmail"/>
           </field>
        </form>
    </metadata>
    <lang name="en">
        <messages name="usrparam">
            <msg name="webmail">Favorite webmail</msg>
            <msg name="hint_webmail">Favorite webmail</msg>
            <msg name="squirrelmail">SquirrelMail</msg>
            <msg name="roundcube">RoundCube</msg>
        </messages>
    </lang>
    <lang name="ru">
        <messages name="usrparam">
            <msg name="webmail">Веб-почта</msg>
            <msg name="hint_webmail">Интерфейс предпочитаемой веб-почты.</msg>
        </messages>
    </lang>
</mgrdata>

2) Создаем файл обработчик /usr/local/ispmgr/addon/userwebmail.pl со следующим содержимым

#!/usr/bin/perl
use CGI;
my $Q = new CGI;
open DATA, "<var/user.webmail";
my @rows = <DATA>;
close DATA;
my $user = $ENV{"REMOTE_USER"};
 
if ($Q->param("sok")) {
       open DATA, ">var/user.webmail";
       foreach $row (@rows) {
           my @elems = split / /, $row, 2;
           printf DATA "%s", $row if ($elems[0] ne $user);
       }
       printf DATA "%s %s\n", $user, $Q->param("webmail");
       close DATA;
 
       print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<doc/>\n";
} else {
       print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<doc>\n";
 
       foreach $row (@rows) {
           chomp($row);
           my @elems = split / /, $row, 2;
           if ($elems[0] eq $user) {
               print "<webmail>$elems[1]</webmail>\n";
               last;
           }
       }
 
       # Заполняем список возможных интерфейсов веб-почты
       print "<slist name=\"webmail\">\n";
       open WLIST, "<etc/webmail.list";
       my @wlist = <WLIST>;
       close WLIST;
       foreach $webmail (@wlist) {
           my @elems = split / /, $webmail, 2;
           print "<msg>$elems[0]</msg>\n";
       }
       print "</slist>\n";
 
       print "</doc>\n";
}

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

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

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

Пояснения

Для решения задачи нам необходимо внедрится в функцию настроек панели управления пользователя - "Настройки панели". Из документации по API мы знаем, что эта функция имеет внутренние имя "usrparam". В описание интерфейса данной формы мы добавляем новое поле "webmail", поле ввода будет иметь вид выпадающего списка select

   <metadata name="usrparam">
       <form>
          <field name="webmail">
             <select name="webmail"/>
          </field>
       </form>
   </metadata>

В описание интерфейса добавляем текстовые надписи для языков ru и en

  • Текстовая надпись слева от поля ввода
           <msg name="webmail">Веб-почта</msg>
  • Текстовая надпись с расширенной информацией, появляющейся при наведении мышки на поле
           <msg name="hint_webmail">Интерфейс предпочитаемой веб-почты.</msg>
  • Названия имеющихся интерфейсов веб-почты (добавленный только в en, поскольку не требуют перевода на другие языки)
           <msg name="squirrelmail">SquirrelMail</msg>
           <msg name="roundcube">RoundCube</msg>


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

   <handler name="userwebmail.pl" type="cgi">
     <event after="yes">usrparam</event>
   </handler>

Далее разберем скрипт-обработчик.

Получаем параметры

use CGI;
my $Q = new CGI;

Мы решили, что настройку предпочитаемой веб-почты пользователей мы будем хранить в файле /usr/local/ispmgr/var/user.webmail, открываем его и читаем в массив строк

open DATA, "<var/user.webmail";
my @rows = <DATA>;
close DATA;

Поскольку рабочей директорией всегда является директория, в которую установлена панель управления (в данном примере /usr/local/ispmgr), то используем относительный путь до файла - "var/user.webmail". Мы всегда рекомендуем использовать относительные пути, потому что некоторые панели управления позволяют сделать установку в любую директорию (возможно, в будущем все панели будут это позволять), и использование абсолютных путей может стать проблемой.

Определяем, какой пользователь выполняет запрос

my $user = $ENV{"REMOTE_USER"};

Проверяем, в какой момент вызвана функция для чтения или записи настроек

if ($Q->param("sok")) {

Запись настроек, перезаписываем данные о пользователях, исключая того, кто выполняет запрос

      open DATA, ">var/user.webmail";
      foreach $row (@rows) {
          my @elems = split / /, $row, 2;
          printf DATA "%s", $row if ($elems[0] ne $user);
      }

Записываем в файл настроек выбранную пользователем веб-почту

      printf DATA "%s %s\n", $user, $Q->param("webmail");

Т.к. никакой результат возвращать не нужно, возвращаем пустой XML-документ

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


Чтение настроек пользователя

Ищем настройку пользователя, выполняющего запрос, и добавляем данные о его настройке

      foreach $row (@rows) {
          chomp($row);
          my @elems = split / /, $row, 2;
          if ($elems[0] eq $user) {
              print "<webmail>$elems[1]</webmail>\n";
              last;
          }
      }

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

      print "<slist name=\"webmail\">\n";
      open WLIST, "<etc/webmail.list";
      my @wlist = <WLIST>;
      close WLIST;
      foreach $webmail (@wlist) {
          my @elems = split / /, $webmail, 2;
          print "<msg>$elems[0]</msg>\n";
      }
      print "</slist>\n";

Более подробно о формировании списка значений для выпадающих списков читайте в статье Формирование выпадающих списков

Была ли эта информация полезной? Да | Нет
Личные инструменты