...

понедельник, 7 июля 2014 г.

[Из песочницы] Написание пакета для PFSense

В этой статье я постараюсь на простом примере показать создание собственного GUI пакета для pfSense. Предполагается, что читатель имеет опыт работы с pfSense, имеет некоторые знания в PHP.

image


Маршрутизатор pfSense (на базе FreeBSD) используется многими сисадминами благодаря, в первую очередь, управлению настройками системы через WEB интерфейс. С многими настройками вполне по силам справиться даже начинающему администратору, что позволяет расширить область применения этого маршрутизатора. При этом, опытные коллеги могут в полной мере воспользоваться доступом к консоли для изучения и контроля работы системы.


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




И так, у Вас есть установленный и настроенный тестовый pfSense. Для начала нам понадобятся инструменты доступа к консоли и файлам pfSense по SSH. Так как я winuser, то и инструменты для работы буду использовать WinSCP + Putty.


Подключаемся с помощью WinSCP3 к pfSense и открываем каталог /usr/local/pkg. В этой папке хранятся файлы, относящиеся к GUI пакетам. Обычно это XML и INC файлы, включающие в себя описание конфигурации и PHP обработчики пакетов. Описание конфигурации GUI пакета размещено в XML файлах, и содержит в себе:



  • служебную информацию;

  • шапку страницы WEB интерфейса;

  • форму страницы WEB интерфейса;

  • информацию о PHP функциях-обработчиках событий WEB интерфейса.


Создаем два пустых файла mypkg.xml и mypkg.inc. Название mypkg является именем нашего пакета, и имя XML файла является ключевым для доступа к WEB интерфейсу пакета. Название inc файла может быть произвольным, и далее будет показан способ его подключения.


Формируем наш XML файл.

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



<?xml version="1.0" encoding="utf-8" ?>
<packagegui>
<name>mypkg</name>
<title>My First Package</title>
<category>Test</category>
<version>0.1</version>
<include_file>/usr/local/pkg/mypkg.inc</include_file>


Шапка WEB интерфейса содержит описание GUI страниц в узле tabs, и выводится в области навигации. У нас будет только одна страница. Элемент text содержит имя пункта навигации в GUI. Элемент url содержит относительный путь доступа к странице нашего пакета.



<tabs>
<tab>
<text>My Package</text>
<url>/pkg_edit.php?xml=mypkg.xml</url>
<active/>
</tab>
</tabs>


Форма WEB интерфейса описывает, какие элементы управления параметрами нашего пакета будут доступны пользователю. Для начала создадим одно единственное поле Enable с элементом checkbox



<fields>
<field>
<fielddescr>Enable</fielddescr>
<fieldname>enable</fieldname>
<description>Check this for enable package.</description>
<type>checkbox</type>
</field>
</fields>


Обработчики событий WEB интерфейса является завершающим участком XML файла, и описывает какие функции будут вызваны в тот или иной момент работы формы GUI. Представлено три часто используемых обработчика:



  • custom_php_command_before_form — вызывается перед отображением формы;

  • custom_php_validation_command — вызывается при проверке данных каждого элемента формы перед сохранением ее данных;

  • custom_php_resync_config_command — вызывается при сохранении данных формы



<custom_php_command_before_form/>
<custom_php_validation_command/>
<custom_php_resync_config_command/>
</packagegui>


Пользуясь обработчиками, можно указать имена php функций из файла mypkg.inc, которые будут вызваны при том или ином событии. Выполнение конкретных действий по изменению конфигурации маршрутизатора производится в обработчике custom_php_resync_config_command, вызываемом как при нажатии кнопки Save на формы, так и при загрузке pfSense.


Здесь можно посмотреть полный текст файла:


Файл mypkg.xml


<?xml version="1.0" encoding="utf-8" ?>
<packagegui>
<name>mypkg</name>
<title>My First Package</title>
<category>Test</category>
<version>0.1</version>
<include_file>/usr/local/pkg/mypkg.inc</include_file>
<tabs>
<tab>
<text>My Package</text>
<url>/pkg_edit.php?xml=mypkg.xml</url>
<active/>
</tab>
</tabs>
<fields>
<field>
<fielddescr>Enable</fielddescr>
<fieldname>enable</fieldname>
<description>Check this for enable package.</description>
<type>checkbox</type>
</field>
</fields>
<custom_php_command_before_form/>
<custom_php_validation_command/>
<custom_php_resync_config_command/>
<custom_php_install_command/>
<custom_php_deinstall_command/>
</packagegui>





Файл mypkg.inc создаем пустым, так как наш тестовый пакет ничего не делает.


Файл mypkg.inc


<?php
/*
mypkg.inc
*/

?>





После сохранения созданных файлов mypkg.xml и mypkg.inc в каталоге /usr/local/pkg можно проверить, как наш пакет будет выглядеть. Для этого заходим в WEB интерфейс pfSense и добавляем в адресной строке путь /pkg_edit.php?xml=mypkg.xml. Если все правильно и без ошибок сделано, получим вот такую картинку


image


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


PS: За ранее приношу извинения за возможные недочеты. Эта статья написана для получения инвайта. Если данная тема будет интересна сообществу, то постараюсь рассказать более подробно о том, как создать полноценный GUI пакет для pfSense.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий