Crea un modulo (tutorial)

Questo è un tutorial passo-passo che mostra come creare un semplice modulo frontend Zabbix. Puoi scaricare tutti i file di questo modulo come archivio ZIP: MyAddress.zip.

Cosa realizzerai

Durante questo tutorial, prima creerai un modulo frontend che aggiunge una nuova sezione di menu Il mio indirizzo e poi lo convertirai in un modulo frontend più avanzato che effettua una richiesta HTTP a https://api.seeip.org e visualizza la risposta - l'indirizzo IP del tuo computer - su una nuova pagina nella sezione di menu Il mio indirizzo appena creata. Ecco come apparirà il modulo finito:

Parte I - Nuova sezione del menu

Aggiungere un modulo vuoto al frontend di Zabbix
  1. Creare una directory MyAddress nella directory modules dell'installazione del frontend di Zabbix (ad esempio, zabbix/ui/modules).

  2. Creare un file manifest.json con i metadati di base del modulo (vedere la descrizione dei parametri supportati).

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. Nel frontend di Zabbix, andare alla sezione Administration → General → Modules e fare clic sul pulsante Scan directory.

  1. Individuare il nuovo modulo My IP Address nell'elenco e fare clic sul collegamento ipertestuale "Disabled" per cambiare lo stato del modulo da "Disabled" a "Enabled" (se il modulo non è elencato, vedere la sezione troubleshooting).

Il modulo è ora registrato nel frontend. Tuttavia, non è ancora visibile, perché è ancora necessario definire la funzionalità del modulo. Una volta aggiunto il contenuto alla directory del modulo, le modifiche saranno immediatamente visibili nel frontend di Zabbix aggiornando la pagina.

Creare una sezione di menu
  1. Creare un file Module.php nella directory MyAddress.

Questo file implementa una nuova classe Module che estende la classe predefinita CModule. La classe Module inserirà una nuova sezione di menu My Address nel menu principale.

Il metodo setAction() specifica un'azione da eseguire quando si fa clic sulla sezione di menu. Per iniziare, è possibile usare l'azione predefinita userprofile.edit, che aprirà la pagina Profilo utente. Nella parte III di questa esercitazione, imparerai a creare un'azione personalizzata.

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

È possibile sostituire 'userprofile.edit' con altre azioni, ad esempio 'charts.view' (apre i grafici personalizzati), 'problems.view' (apre Monitoraggio → Problemi) oppure 'report.status' (apre il report Informazioni di sistema).

  1. Aggiornare il frontend di Zabbix. Ora è presente una nuova sezione My Address nella parte inferiore del menu principale di Zabbix. Fare clic su My Address per aprire la pagina Profilo utente.

Parte II - Modifica della posizione della sezione di menu

In questa parte, sposterai la sezione di menu My Address nella sezione Monitoring e poi vi aggiungerai un menu nidificato. Di conseguenza, gli utenti potranno accedere a due pagine di sottomenu dalla sezione di menu Monitoring → My Address.

  1. Apri e modifica il file 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. Aggiorna il frontend di Zabbix. Espandi la sezione di menu Monitoring e osserva che la sezione My address ora si trova sotto la sezione Discovery.

  1. Per aggiungere pagine nidificate alla sezione di menu My Address, apri e modifica di nuovo il file Module.php.

Questo passaggio crea due sottosezioni:

  • External IP che esegue una nuova azione 'my.address' che verrà definita nei passaggi successivi;
  • User profile che esegue l'azione predefinita 'userprofile.edit' per aprire la pagina User profile.

Nota che per il menu nidificato è necessario utilizzare la classe CMenu oltre alle classi usate nei passaggi precedenti.

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. Aggiorna il frontend di Zabbix. Osserva che la sezione di menu My address ora contiene un menu di terzo livello con due pagine: External IP e User profile.

Parte III - Azione del modulo

Un'azione è implementata in due file: actions/MyAddress.php e views/my.address.php. Il file actions/MyAddress.php si occupa dell'implementazione della logica di business, mentre il file views/my.address.php è responsabile della vista.

  1. Creare una directory actions nella directory MyAddress.

  2. Creare un file MyAddress.php nella directory actions.

La logica dell'azione sarà definita nella classe MyAddress. Questa classe di azione implementerà quattro funzioni: init(), checkInput(), checkPermissions() e doAction(). Zabbix frontend richiama la funzione doAction() quando l'azione viene richiesta. Questa funzione è responsabile della logica di business del modulo.

I dati devono essere organizzati come un array associativo. L'array può essere multidimensionale e può contenere qualsiasi dato previsto dalla vista.

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. Creare una nuova directory views nella directory MyAddress.

  2. Creare un file my.address.php nella directory views e definire la vista del modulo.

Si noti che la variabile $data è disponibile nella vista senza doverla definire esplicitamente. Il framework passa automaticamente l'array associativo alla vista.

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. L'azione del modulo deve essere registrata nel file manifest.json. Aprire manifest.json e aggiungere un nuovo oggetto actions che contenga:
  • la chiave dell'azione con il nome dell'azione scritto in minuscolo (a-z) e con le parole separate da punti (ad esempio, my.address);
  • il nome della classe dell'azione (MyAddress) come valore della chiave class dell'oggetto my.address;
  • il nome della vista dell'azione (my.address) come valore della chiave view dell'oggetto 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. Aggiornare Zabbix frontend. Fare clic su My address → External IP per visualizzare l'indirizzo IP del proprio computer.