Написание пакета для PFSense

в 12:23, , рубрики: GUI пакеты, 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.

Автор: dvserg

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js