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

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

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

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

Часть 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. Найдите в списке новый модуль Мой IP-адрес и нажмите гиперссылку «Отключено», чтобы изменить статус модуля с «Отключено» на «Включено».

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

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

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

Метод setAction() определяет действие, которое будет выполнено при нажатии на раздел меню. Для начала вы можете использовать предопределенное действие userprofile.edit, которое откроет страницу Профиль пользователя. В части 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 появился новый раздел Мой адрес. Нажмите Мой адрес, чтобы открыть страницу Профиль пользователя.

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

В этой части вы переместите раздел меню Мой адрес в раздел Мониторинг. В результате пользователи смогут получить доступ к двум страницам подменю из раздела меню Мониторинг → Мой адрес.

  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. Разверните раздел меню Мониторинг и обратите внимание, что раздел Мой адрес теперь расположен под разделом Обнаружение.

Часть 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. Откройте Module.php и измените имя действия в методе setAction() на my.address.

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('my.address')
                           );
           }
       }
  1. Обновите интерфейс Zabbix. Нажмите на раздел меню Мой адрес, чтобы увидеть IP-адрес вашего компьютера.