Criar um módulo (tutorial)

Este é um tutorial passo a passo que mostra como criar um módulo simples de frontend do Zabbix. Você pode baixar todos os arquivos deste módulo como um arquivo ZIP: MyAddress.zip.

O que você vai criar

Durante este tutorial, você primeiro criará um módulo de frontend que adiciona uma nova seção de menu My Address e depois o converterá em um módulo de frontend mais avançado que faz uma requisição HTTP para https://api.seeip.org e exibe a resposta — o endereço IP do seu computador — em uma nova página na seção de menu My Address recém-criada. Veja como o módulo final ficará:

Parte I - Nova seção de menu

Adicionar um módulo vazio ao frontend do Zabbix
  1. Crie um diretório MyAddress no diretório modules da instalação do frontend do Zabbix (por exemplo, zabbix/ui/modules).

  2. Crie um arquivo manifest.json com os metadados básicos do módulo (consulte a descrição dos parâmetros compatíveis).

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. No frontend do Zabbix, acesse Administration > General > Modules e clique no botão Scan directory.

  1. Localize o novo módulo My IP Address na lista e clique no hiperlink "Disabled" para alterar o status do módulo de "Disabled" para "Enabled" (se o módulo não estiver listado, consulte a seção de solução de problemas).

O módulo agora está registrado no frontend. No entanto, ele ainda não está visível, pois você ainda precisa definir a funcionalidade do módulo. Depois de adicionar conteúdo ao diretório do módulo, as alterações serão exibidas imediatamente no frontend do Zabbix quando você atualizar a página.

Criar uma seção de menu
  1. Crie um arquivo Module.php no diretório MyAddress.

Esse arquivo implementa uma nova classe Module que estende a classe padrão CModule. A classe Module inserirá uma nova seção de menu My Address no menu principal.

O método setAction() especifica uma ação a ser executada ao clicar na seção de menu. Para começar, você pode usar a ação predefinida userprofile.edit, que abrirá a página User profile. Na parte III deste tutorial, você aprenderá a criar uma ação personalizada.

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'));
    }
}

Você pode substituir 'userprofile.edit' por outras ações, por exemplo, 'charts.view' (abre gráficos personalizados), 'problems.view' (abre Monitoring > Problems) ou 'report.status' (abre o relatório System information).

  1. Atualize o frontend do Zabbix. Agora há uma nova seção My Address na parte inferior do menu principal do Zabbix. Clique em My Address para abrir a página User profile.

Parte II - Alteração do local da seção do menu

Nesta parte, você moverá a seção de menu My Address para a seção Monitoring e, em seguida, adicionará um menu aninhado a ela. Como resultado, os usuários poderão acessar duas páginas de submenu a partir da seção de menu Monitoring > My Address.

  1. Abra e edite o arquivo 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. Atualize o frontend do Zabbix. Expanda a seção de menu Monitoring e observe que a seção My address agora está localizada abaixo da seção Discovery.

  1. Para adicionar páginas aninhadas à seção de menu My Address, abra e edite o arquivo Module.php novamente.

Esta etapa cria duas subseções:

  • External IP, que executa uma nova ação 'my.address', que será definida nas próximas etapas;
  • User profile, que executa a ação predefinida 'userprofile.edit' para abrir a página User profile.

Observe que, para o menu aninhado, é necessário usar a classe CMenu, além das classes usadas nas etapas anteriores.

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. Atualize o frontend do Zabbix. Observe que a seção de menu My address agora contém um menu de terceiro nível com duas páginas - External IP e User profile.

Parte III - Ação do módulo

Uma ação é implementada em dois arquivos: actions/MyAddress.php e views/my.address.php. O arquivo actions/MyAddress.php é responsável pela implementação da lógica de negócios, enquanto o arquivo views/my.address.php é responsável pela visualização.

  1. Crie um diretório actions no diretório MyAddress.

  2. Crie um arquivo MyAddress.php no diretório actions.

A lógica da ação será definida na classe MyAddress. Essa classe de ação implementará quatro funções: init(), checkInput(), checkPermissions() e doAction(). O frontend do Zabbix chama a função doAction() quando a ação é solicitada. Essa função é responsável pela lógica de negócios do módulo.

Os dados devem ser organizados como um array associativo. O array pode ser multidimensional e conter quaisquer dados esperados pela visualização.

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. Crie um novo diretório views no diretório MyAddress.

  2. Crie um arquivo my.address.php no diretório views e defina a visualização do módulo.

Observe que a variável $data está disponível na visualização sem que seja necessário defini-la especificamente. O framework passa automaticamente o array associativo para a visualização.

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. A ação do módulo deve ser registrada no arquivo manifest.json. Abra o arquivo manifest.json e adicione um novo objeto actions que contenha:
  • a chave da ação com o nome da ação escrito em letras minúsculas (a-z) e com as palavras separadas por pontos (por exemplo, my.address);
  • o nome da classe da ação (MyAddress) como valor da chave class do objeto my.address;
  • o nome da visualização da ação (my.address) como valor da chave view do objeto 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. Atualize o frontend do Zabbix. Clique em My address > External IP para ver o endereço IP do seu computador.