Написание пакета для 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.
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 7

    0
    Хей, а для микротика поковырять веб-клиента не было идей? Точнее не вебклиента(он уже есть изначально) а всякие утилиты для решения задач автоматизации и обмена даными между роутерами(например обмен адрес-листами и паролями для вайфая и т.д.). В общем решение задач централизации управления.
      0
      Централизация управления не такая тривиальная задача. Это скорее дело для коллектива специалистов, хорошо знающих и эту проблему, и саму систему. В первую очередь речь о безопасности передачи данных. Вот здесь вроде бы есть анонс CAPsMAN для Mikrotik RouterOS 6.11. И да, к сожалению я с микротиками особо плотно не общался, т.к. не было повода.
      0
      На какой версии этот подход проверялся последний раз? Настораживает скриншот интерфейса.
      Лично мне тема очень интересна и близка — имею в работе несколько pfSens'ов и доволен ими, пожалуйста продолжайте.
        0
        Да, версия pfSense была не самая свежая. Продолжение постараюсь сделать на последнем релизе, хотя применительно к этому посту в более поздних версиях проблем быть не должно.
        +1
        Как себя в виртуальной среде чувствует продукт?
        PC-роутер может больше чем ВМ на ESXi.

        Gigabit прохавает?
          0
          У меня личного опыта не было, но судя по форуму на ESXi запускается и работает. При достаточных ресурсах и хорошей сетевой карте, из поддерживаемых используемой версией FreeBSD, думаю с гигабитом должно все получиться.
            0
            Жду недождусь pf smp в userspace на netmap.

          Only users with full accounts can post comments. Log in, please.