Criar um módulo (tutorial)

Este é um tutorial passo a passo que mostra como criar um módulo simples de front-end do Zabbix. Você pode fazer o download de todos os arquivos desse módulo como um arquivo ZIP: MyAddress.zip.

O que você vai construir

Durante este tutorial, você primeiro criará um módulo de frontend que adiciona uma nova seção de menu My Address e, em seguida, o converterá em um módulo de frontend mais avançado que faz uma solicitaçã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 finalizado ficará:

Parte I - Nova seção do menu

Adicionar um módulo em branco ao frontend do Zabbix
  1. Crie um diretório MyAddress no diretório modules da sua 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 suportados).

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, vá para a seção 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 troubleshooting).

O módulo agora está registrado no frontend. No entanto, ele ainda não está visível, porque você ainda precisa definir a funcionalidade do módulo. Depois de adicionar conteúdo ao diretório do módulo, você verá imediatamente as alterações no frontend do Zabbix ao 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 Meu Endereço para a seção Monitoramento e adicionar um submenu a ela. Como resultado, os usuários poderão acessar duas páginas de submenu na seção de menu Monitoramento → Meu Endereço.

  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(_('Monitoramento'))
                ->getSubmenu()
                    ->insertAfter(_('Descoberta'),
                        (new CMenuItem(_('Meu Endereço')))->setAction('userprofile.edit')
                    );
    }
}
  1. Atualize o frontend do Zabbix. Expanda a seção do menu Monitoramento e observe que a seção Meu Endereço agora está localizada abaixo da seção Descoberta.

  1. Para adicionar paginas abaixo da seção do menu Meu Endereço, abra e edite o arquivo Module.php novamente.

Esse passo cria duas subseções:

-IP Externo que executa uma nova ação 'my.address', que será definida nos próximos passos; -Perfil de Usuário que executa a ação prédefinida 'userprofile.edit' para abrir a pagina Perfil de usuário.

Note que para submenus, voce precisa usar a classe CMenu além das classes utilizadas em passos 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(_('Monitoramento'))
->getSubmenu()
->insertAfter(_('Descoberta'),
(new CMenuItem(_('Meu Endereço')))->setSubMenu(
new CMenu([
(new CMenuItem(_('IP Externo')))->setAction('my.address'),
(new CMenuItem(_('Perfil de Usuário')))->setAction('userprofile.edit')
])
)
);
}
}
  1. Atualize o frontend do Zabbix. Observe que a seção do menu Meu Endereço agora contem um menu de terceiro nível, com duas páginas - IP Externo and Perfil de Usuário.

Parte III - Ação do módulo

Uma action é implementada em dois arquivos - actions/MyAddress.php e views/my.address.php. O arquivo actions/MyAddress.php cuida da implementação da lógica de negócio, enquanto o arquivo views/my.address.php é responsável pela view.

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

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

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

Os dados devem ser organizados como um array associativo. O array pode ser multidimensional e pode conter quaisquer dados esperados pela view.

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 view do módulo.

Observe que a variável $data está disponível na view sem precisar ser definida especificamente. O framework passa automaticamente o array associativo para a view.

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 action do módulo precisa ser registrada no arquivo manifest.json. Abra manifest.json e adicione um novo objeto actions que contenha:
  • a chave da action com o nome da action escrito em minúsculas (a-z) e com as palavras separadas por pontos (por exemplo, my.address);
  • o nome da classe da action (MyAddress) como valor da chave class do objeto my.address;
  • o nome da view da action (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.