Можно улучшить функциональность веб-интерфейса Zabbix, добавив сторонние модули или разработав собственные модули без необходимости изменения исходного кода Zabbix.
Обратите внимание, что код модуля будет работать с теми же привилегиями, что и исходный код Zabbix. Это означает, что:
Пожалуйста, всегда читайте руководство по установке для конкретного модуля. Рекомендуется устанавливать новые модули один за другим, чтобы легко обнаруживать сбои.
Непосредственно перед установкой модуля:
Шаги по установке модуля:
modules
веб-интерфейса Zabbix.Разрешение проблем:
Проблема | Решение |
---|---|
Модуль не появился в списке. | Убедитесь, что файл manifest.json присутствует в папке modules/your-module/ веб-интерфейса Zabbix. Если это так, значит, модуль не соответствует текущей версии Zabbix. Если файл manifest.json не существует, возможно, вы распаковали его не в ту папку. |
Веб-интерфейс не запускается. | Код модуля не совместим с текущей версией Zabbix или конфигурацией сервера. Пожалуйста, удалите файлы модуля и перезагрузите интерфейс. Вы увидите уведомление, что некоторые модули отсутствуют. Перейдите в Администрирование модулей и нажмите Сканировать директорию еще раз, чтобы удалить несуществующие модули из базы данных. |
Появляются сообщения об идентичном пространстве имен, ID или действии. | Новый модуль попытался зарегистрировать пространство имен, ID или действия, которые уже зарегистрированы другим включенным модулем. Отключите конфликтующий модуль (упомянутый в сообщении об ошибке) перед включением нового. |
Появляются сообщения о технической ошибке. | Сообщите об ошибках разработчику модуля. |
Модули написаны на языке PHP. Предпочтительнее использовать шаблон проектрования Model-View-Controller (MVC, «Модель-Вид-Контроллер»), так как он также используется в веб-интерфейсе Zabbix и облегчит разработку. Строгая типизация PHP также приветствуется, но не обязательна.
Обратите внимание, что с модулями вы можете легко добавлять новые пункты меню и соответствующие виды и действия в веб-интерфейс Zabbix. В настоящее время невозможно зарегистрировать новый API или создать новые таблицы базы данных с помощью модулей.
Каждый модуль представляет собой папку (помещенную в папку modules
) с вложенными папками, содержащими контроллеры, виды и любой другой код:
example_module_directory/ (required)
manifest.json (required) Metadata and action definition.
Module.php Module initialization and event handling.
actions/ Action controller files.
SomethingView.php
SomethingCreate.php
SomethingDelete.php
data_export/
ExportAsXml.php
ExportAsExcel.php
views/ View files.
example.something.view.php
example.something.delete.php
js/ JavaScript files used in views.
example.something.view.js.php
partials/ View partial files.
example.something.reusable.php
js/ JavaScript files used in partials.
example.something.reusable.js.php
Как видите, единственным обязательным файлом в директории пользовательских модулей является 'manifest.json'. Модуль не будет регистрироваться без этого файла. «Module.php» отвечает за регистрацию пунктов меню и обработку событий, таких как «onBeforeAction» и «onTerminate». Директории actions (действия), views (виды) и partials (составляющие) содержат код PHP и JavaScript, необходимый для действий модуля.
Прежде чем создавать модуль, важно придти к соглашению об именах для различных элементов модуля, таких как папки и файлы, чтобы придерживаться одной системы организации. Вы также можете найти примеры выше, в разделе Структура модуля.
Элемент | правила именования | Пример |
---|---|---|
Папка модуля | Строчные буквы [a-z], нижнее подчеркивание и десятичные цифры | example_v2 |
Папки действий | Строчные буквы [a-z], нижнее подчеркивание | data_export |
Файлы действий | CamelCase, заканчивающийся типом действия | SomethingView.php |
Файлы видов и составляющих | Строчные буквы [a-z] Слова, разделенные точкой с префиксом '' module. '', за которым следует имя модуля и заканчивающиеся типом действия и расширением .php |
module.example.something.view.php |
Файлы Javascript | Те же правила, что и для файлов видов и составляющих, за исключением расширения: .js.php . | module.example.something.view.js.php |
Обратите внимание, что префикс и включение имени модуля является обязательным для файлов видов и составляющих, за исключением случаев, когда нужно заменить базовые отображаемые элементы или составляющие Zabbix. Однако это правило не распространяется на имена файлов действий.
Каждый модуль должен иметь файл manifest.json со следующими полями в формате JSON:
Параметр | Обязательный | Тип | По умолчанию | Описание |
---|---|---|---|---|
manifest_version | Да | Дробное число | - | Манифестная версия модуля. В настоящее время поддерживается версия 1. |
id | Да | Строка | - | ID модуля. Только один модуль с данным ID может быть включен одновременно. |
name | Да | Строка | - | Название модуля как отображено в разделе «Администрирование». |
version | Да | Строка | - | Версия модуля как отображено в разделе «Администрирование». |
namespace | Да | Строка | - | Пространство имен PHP для Module.php и классов действий. |
author | Нет | Строка | "" | Автор модуля как отображено в разделе «Администрирование». |
url | Нет | Строка | "" | URL модуля как отображено в разделе «Администрирование». |
description | Нет | Строка | "" | Описание модуля как отображено в разделе «Администрирование». |
actions | Нет | Объект | {} | Действия для регистрирования с этим модулем. Смотрите «Действия». |
config | Нет | Объект | {} | Конфигурация модуля |
Для справки см. Пример файла manifest.json в разделе Справочные материалы.
Модуль будет контролировать действия внешнего интерфейса, определенные в объекте actions в файле manifest.json. Таким образом определяются новые действия. Таким же образом вы можете переопределить существующие действия. Каждый ключ действий должен представлять имя действия, а соответствующее значение должно содержать ключи «class» и, по желанию, «layout» и «view».
Одно действие определяется четырьмя составляющими: name, controller, view и layout. Проверка и подготовка данных обычно выполняются в controller, форматирование вывода выполняется в view или в partials, а layout отвечает за оформление страницы такими элементами, как меню, верхний колонтитул, нижний колонтитул и другие. Действия модуля должны быть определены в файле manifest.json как объект actions:
Параметр | Обязательный | Тип | По умолчанию | Описание |
---|---|---|---|---|
*key* | Да | Строка | - | Название действия, строчные буквы [a-z], разделяя слова точкой. |
class | Да | Строка | - | Имя класса действия, включая путь к вложенной папке (если используется) в папке 'actions'. |
layout | Нет | Строка | "layout.htmlpage" | Макет действия. |
view | Нет | Строка | null | Отображение действия. |
Существует несколько готовых макетов, таких как «layout.json» или «layout.xml». Они предназначены для действий, которые дают результат, отличный от HTML. Вы можете изучить готовые макеты в директории app/views/ или создать свой собственный.
В некоторых случаях необходимо изменить только виды действия, не изменяя контроллер. В таком случае просто поместите необходимые элементы отображения и/или составляющие в папку views
модуля.
Для справки см. пример файла Action controller в разделе Справочные материалы. Также вы можете взять за основу текущие действия исходного кода Zabbix, расположенного в папке app/.
Module.php
Этот необязательный файл PHP отвечает за инициализацию модуля, а также за обработку событий. Предполагается, что в этом файле будет определен класс «Модуль», расширяющий базовый класс «\Core\CModule». Класс Module должен быть определен в пространстве имен, указанном в файле manifest.json.
<?php
namespace Modules\Example;
use Core\CModule as BaseModule;
class Module extends BaseModule {
...
}
Для справки см. пример файла Module.php в разделе Справочные материалы.
Этот раздел содержит базовые версии различных элементов модуля, представленных в предыдущих разделах.
manifest.json
{
"manifest_version": 1.0,
"id": "example_module",
"name": "Example module",
"version": "1.0",
"namespace": "Example",
"author": "John Smith",
"url": "http://module.example.com",
"description": "Short description of the module.",
"actions": {
"example.something.view": {
"class": "SomethingView",
"view": "module.example.something.view"
},
"example.something.create": {
"class": "SomethingCreate",
"layout": null
},
"example.something.delete": {
"class": "SomethingDelete",
"layout": null
},
"example.something.export.xml": {
"class": "data_export/ExportAsXml",
"layout": null
},
"example.something.export.excel": {
"class": "data_export/ExportAsExcel",
"layout": null
}
},
"config": {
"username": "john_smith"
}
}
Module.php
<?php declare(strict_types = 1);
namespace Modules\Example;
use APP;
use CController as CAction;
/**
* Please see Core\CModule class for additional reference.
*/
class Module extends \Core\CModule {
/**
* Initialize module.
*/
public function init(): void {
// Initialize main menu (CMenu class instance).
APP::Component()→get('menu.main')
→findOrAdd(_('Reports'))
→getSubmenu()
→add((new \CMenuItem(_('Example wide report')))
→setAction('example.report.wide.php')
)
→add((new \CMenuItem(_('Example narrow report')))
→setAction('example.report.narrow.php')
);
}
/**
* Event handler, triggered before executing the action.
*
* @param CAction $action Action instance responsible for current request.
*/
public function onBeforeAction(CAction $action): void {
}
/**
* Event handler, triggered on application exit.
*
* @param CAction $action Action instance responsible for current request.
*/
public function onTerminate(CAction $action): void {
}
}
Action controller
<?php declare(strict_types = 1);
namespace Modules\Example\Actions;
use CControllerResponseData;
use CControllerResponseFatal;
use CController as CAction;
/**
* Example module action.
*/
class SomethingView extends CAction {
/**
* Initialize action. Method called by Zabbix core.
*
* @return void
*/
public function init(): void {
/**
* Disable SID (Sessoin ID) validation. Session ID validation should only be used for actions which involde data
* modification, such as update or delete actions. In such case Session ID must be presented in the URL, so that
* the URL would expire as soon as the session expired.
*/
$this→disableSIDvalidation();
}
/**
* Check and sanitize user input parameters. Method called by Zabbix core. Execution stops if false is returned.
*
* @return bool true on success, false on error.
*/
protected function checkInput(): bool {
$fields = [
'name' => 'required|string',
'email' => 'required|string',
'phone' => 'string'
];
// Only validated data will further be available using $this→hasInput() and $this→getInput().
$ret = $this→validateInput($fields);
if (!$ret) {
$this→setResponse(new CControllerResponseFatal());
}
return $ret;
}
/**
* Check if the user has permission to execute this action. Method called by Zabbix core.
* Execution stops if false is returned.
*
* @return bool
*/
protected function checkPermissions(): bool {
$permit_user_types = [USER_TYPE_ZABBIX_ADMIN, USER_TYPE_SUPER_ADMIN];
return in_array($this→getUserType(), $permit_user_types);
}
/**
* Prepare the response object for the view. Method called by Zabbix core.
*
* @return void
*/
protected function doAction(): void {
$contacts = $this→getInput('email');
if ($this→hasInput('phone')) {
$contacts .= ', '.$this→getInput('phone');
}
$data = [
'name' => $this→getInput('name'),
'contacts' => $contacts
];
$response = new CControllerResponseData($data);
$this→setResponse($response);
}
}
Action view