Создание модуля (руководство)

Эта пошаговая инструкция показывает, как создать простой модуль веб-интерфейса Zabbix. Вы можете скачать все файлы этого модуля в виде ZIP-архива: MyAddress.zip.

Что вы создадите

В ходе этого руководства вы сначала создадите модуль веб-интерфейса, который добавляет новый раздел меню My Address, а затем преобразуете его в более продвинутый модуль веб-интерфейса, который выполняет HTTP-запрос к https://api.seeip.org и отображает ответ — IP-адрес вашего компьютера — на новой странице в новом разделе меню My Address.

Вот как будет выглядеть готовый модуль:

Часть I - Новый раздел меню

Добавление пустого модуля в веб-интерфейс Zabbix
  1. Создайте каталог MyAddress в каталоге modules установленного веб-интерфейса Zabbix (например, zabbix/ui/modules).

  2. Создайте файл manifest.json с основными метаданными модуля (см. описание поддерживаемых параметров).

ui/modules/MyAddress/manifest.json

{
    "manifest_version": 2.0,
    "id": "my-address",
    "name": "My IP Address",
    "version": "1.0",
    "namespace": "MyAddress",
    "description": "My External IP Address."
}
  1. В веб-интерфейсе Zabbix перейдите в раздел Администрирование > Общие > Модули и нажмите кнопку Сканировать каталог.

  1. Найдите новый модуль My IP Address в списке и нажмите ссылку «Отключен», чтобы изменить статус модуля с «Отключен» на «Включен» (если модуль отсутствует в списке, см. раздел устранение неполадок).

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

Создание раздела меню
  1. Создайте файл Module.php в каталоге MyAddress.

Этот файл реализует новый класс Module, расширяющий стандартный класс CModule. Класс Module добавит новый раздел меню My Address в главное меню.

Метод setAction() задаёт действие, которое будет выполняться при нажатии на раздел меню. Для начала можно использовать предопределённое действие userprofile.edit, которое откроет страницу User profile. В части III этого руководства вы узнаете, как создать пользовательское действие.

ui/modules/MyAddress/Module.php

<?php

namespace Modules\MyAddress;

use Zabbix\Core\CModule,
    APP,
    CMenuItem;

class Module extends CModule {

    public function init(): void {
        APP::Component()->get('menu.main')
            ->add((new CMenuItem(_('My Address')))
            ->setAction('userprofile.edit'));
    }
}

Вы можете заменить 'userprofile.edit' другими действиями, например 'charts.view' (открывает пользовательские графики), 'problems.view' (открывает раздел Мониторинг > Проблемы) или 'report.status' (открывает отчёт Сведения о системе).

  1. Обновите веб-интерфейс Zabbix. В нижней части главного меню Zabbix появился новый раздел My Address. Нажмите My Address, чтобы открыть страницу User profile.

Часть II — изменение расположения раздела меню

В этой части вы переместите раздел меню My Address в раздел Monitoring, а затем добавите в него вложенное меню. В результате пользователи смогут открывать две страницы подменю из раздела меню Monitoring > My Address.

  1. Откройте и отредактируйте файл Module.php.

ui/modules/MyAddress/Module.php

<?php

namespace Modules\MyAddress;

use Zabbix\Core\CModule,
    APP,
    CMenuItem;

class Module extends CModule {

    public function init(): void {
        APP::Component()->get('menu.main')
            ->findOrAdd(_('Monitoring'))
            ->getSubmenu()
            ->insertAfter(_('Discovery'),
                (new CMenuItem(_('My Address')))->setAction('userprofile.edit')
            );
    }
}
  1. Обновите веб-интерфейс Zabbix. Разверните раздел меню Monitoring и убедитесь, что раздел My address теперь расположен под разделом Discovery.

  1. Чтобы добавить вложенные страницы в раздел меню My Address, снова откройте и отредактируйте файл Module.php.

На этом шаге создаются два подраздела:

  • External IP, который выполняет новое действие my.address, определяемое на следующих шагах;
  • User profile, который выполняет предопределенное действие userprofile.edit для открытия страницы User profile.

Обратите внимание, что для вложенного меню необходимо использовать класс CMenu в дополнение к классам, использованным на предыдущих шагах.

ui/modules/MyAddress/Module.php

<?php

namespace Modules\MyAddress;

use Zabbix\Core\CModule,
    APP,
    CMenu,
    CMenuItem;

class Module extends CModule {

    public function init(): void {
        APP::Component()->get('menu.main')
            ->findOrAdd(_('Monitoring'))
            ->getSubmenu()
            ->insertAfter(_('Discovery'),
                (new CMenuItem(_('My Address')))->setSubMenu(
                    new CMenu([
                        (new CMenuItem(_('External IP')))->setAction('my.address'),
                        (new CMenuItem(_('User profile')))->setAction('userprofile.edit')
                    ])
                )
            );
    }
}
  1. Обновите веб-интерфейс Zabbix. Убедитесь, что раздел меню My address теперь содержит меню третьего уровня с двумя страницами — External IP и User profile.

Часть III — Действие модуля

Действие реализуется в двух файлах: actions/MyAddress.php и views/my.address.php. Файл actions/MyAddress.php отвечает за реализацию бизнес-логики, а файл views/my.address.php — за представление.

  1. Создайте каталог actions в каталоге MyAddress.

  2. Создайте файл MyAddress.php в каталоге actions.

Логика действия определяется в классе MyAddress. Этот класс действия реализует четыре функции: init(), checkInput(), checkPermissions() и doAction(). Веб-интерфейс Zabbix вызывает функцию doAction(), когда запрашивается действие. Эта функция отвечает за бизнес-логику модуля.

Данные должны быть организованы в виде ассоциативного массива. Массив может быть многомерным и содержать любые данные, ожидаемые представлением.

ui/modules/MyAddress/actions/MyAddress.php

<?php

namespace Modules\MyAddress\Actions;

use CController,
    CControllerResponseData;

class MyAddress extends CController {

    public function init(): void {
        $this->disableCsrfValidation();
    }

    protected function checkInput(): bool {
        return true;
    }

    protected function checkPermissions(): bool {
        return true;
    }

    protected function doAction(): void {
        $data = ['my-ip' => file_get_contents("https://api.seeip.org")];
        $response = new CControllerResponseData($data);
        $this->setResponse($response);
    }
}
  1. Создайте новый каталог views в каталоге MyAddress.

  2. Создайте файл my.address.php в каталоге views и определите представление модуля.

Обратите внимание, что переменная $data доступна в представлении без ее явного определения. Фреймворк автоматически передает ассоциативный массив в представление.

ui/modules/MyAddress/views/my.address.php

<?php

(new CHtmlPage())
    ->setTitle(_('The HTML Title of My Address Page'))
    ->addItem(new CDiv($data['my-ip']))
    ->show();
  1. Действие модуля необходимо зарегистрировать в файле manifest.json. Откройте manifest.json и добавьте новый объект actions, содержащий:
  • ключ действия с именем действия, записанным строчными буквами (a-z), а слова разделенными точками (например, my.address);
  • имя класса действия (MyAddress) в качестве значения ключа class объекта my.address;
  • имя представления действия (my.address) в качестве значения ключа view объекта my.address.

ui/modules/MyAddress/manifest.json

{
    "manifest_version": 2.0,
    "id": "my-address",
    "name": "My IP Address",
    "version": "1.0",
    "namespace": "MyAddress",
    "description": "My External IP Address.",
    "actions": {
        "my.address": {
            "class": "MyAddress",
            "view": "my.address"
        }
    }
}
  1. Обновите веб-интерфейс Zabbix. Нажмите My address > External IP, чтобы увидеть IP-адрес вашего компьютера.