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