Créer un module (tutoriel)

Il s'agit d'un tutoriel étape par étape qui montre comment créer un module frontal Zabbix simple. Vous pouvez télécharger tous les fichiers de ce module sous forme d'archive ZIP : MyAddress.zip.

Ce que vous allez créer

Au cours de ce tutoriel, vous allez d'abord créer un module d'interface qui ajoute une nouvelle section de menu Mon adresse, puis le convertir en un module d'interface plus avancé qui effectue une requête HTTP vers https://api.seeip.org et affiche la réponse - l'adresse IP de votre ordinateur - sur une nouvelle page de la section de menu Mon adresse nouvellement créée. Voici à quoi ressemblera le module terminé :

Partie I - Nouvelle section de menu

Ajouter un module vide à l'interface Zabbix
  1. Créez un répertoire MyAddress dans le répertoire modules de votre installation de l'interface Zabbix (par exemple, zabbix/ui/modules).

  2. Créez un fichier manifest.json contenant les métadonnées de base du module (consultez la description des paramètres pris en charge).

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. Dans l'interface Zabbix, accédez à la section Administration > Général > Modules et cliquez sur le bouton Analyser le répertoire.

  1. Repérez le nouveau module My IP Address dans la liste et cliquez sur le lien hypertexte « Désactivé » pour faire passer l'état du module de « Désactivé » à « Activé » (si le module n'est pas répertorié, consultez la section dépannage).

Le module est maintenant enregistré dans l'interface. Cependant, il n'est pas encore visible, car vous devez encore définir les fonctionnalités du module. Dès que vous ajoutez du contenu au répertoire du module, vous verrez immédiatement les modifications dans l'interface Zabbix après avoir actualisé la page.

Créer une section de menu
  1. Créez un fichier Module.php dans le répertoire MyAddress.

Ce fichier implémente une nouvelle classe Module qui étend la classe CModule par défaut. La classe Module insère une nouvelle section de menu Mon adresse dans le menu principal.

La méthode setAction() spécifie une action à exécuter lorsque vous cliquez sur la section de menu. Pour commencer, vous pouvez utiliser l’action prédéfinie userprofile.edit, qui ouvre la page Profil utilisateur. Dans la partie III de ce tutoriel, vous apprendrez à créer une action personnalisée.

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(_('Mon adresse')))
            ->setAction('userprofile.edit'));
    }
}

Vous pouvez remplacer 'userprofile.edit' par d’autres actions, par exemple 'charts.view' (ouvre les graphiques personnalisés), 'problems.view' (ouvre Supervision > Problèmes) ou 'report.status' (ouvre le rapport Informations système).

  1. Actualisez l’interface Zabbix. Une nouvelle section Mon adresse apparaît désormais en bas du menu principal de Zabbix. Cliquez sur Mon adresse pour ouvrir la page Profil utilisateur.

Partie II - Modification de l'emplacement d'une section du menu

Dans cette partie, vous allez déplacer la section de menu My Address vers la section Monitoring, puis lui ajouter un menu imbriqué. Ainsi, les utilisateurs pourront accéder à deux pages de sous-menu depuis la section de menu Monitoring > My Address.

  1. Ouvrez et modifiez le fichier 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. Actualisez l'interface Zabbix. Développez la section de menu Monitoring et vérifiez que la section My address se trouve maintenant sous la section Discovery.

  1. Pour ajouter des pages imbriquées à la section de menu My Address, ouvrez et modifiez à nouveau le fichier Module.php.

Cette étape crée deux sous-sections :

  • External IP, qui exécute une nouvelle action « my.address » qui sera définie dans les étapes suivantes ;
  • User profile, qui exécute l'action prédéfinie « userprofile.edit » pour ouvrir la page User profile.

Notez que pour le menu imbriqué, vous devez utiliser la classe CMenu en plus des classes utilisées lors des étapes précédentes.

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. Actualisez l'interface Zabbix. Vérifiez que la section de menu My address contient maintenant un menu de troisième niveau avec deux pages : External IP et User profile.

Partie III - Action du module

Une action est implémentée dans deux fichiers : actions/MyAddress.php et views/my.address.php. Le fichier actions/MyAddress.php prend en charge l'implémentation de la logique métier, tandis que le fichier views/my.address.php est responsable de la vue.

  1. Créez un répertoire actions dans le répertoire MyAddress.

  2. Créez un fichier MyAddress.php dans le répertoire actions.

La logique de l'action sera définie dans la classe MyAddress. Cette classe d'action implémentera quatre fonctions : init(), checkInput(), checkPermissions() et doAction(). L'interface Zabbix appelle la fonction doAction() lorsque l'action est demandée. Cette fonction est responsable de la logique métier du module.

Les données doivent être organisées sous forme de tableau associatif. Le tableau peut être multidimensionnel et contenir toutes les données attendues par la vue.

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. Créez un nouveau répertoire views dans le répertoire MyAddress.

  2. Créez un fichier my.address.php dans le répertoire views et définissez la vue du module.

Notez que la variable $data est disponible dans la vue sans qu'il soit nécessaire de la définir explicitement. Le framework transmet automatiquement le tableau associatif à la vue.

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'action du module doit être enregistrée dans le fichier manifest.json. Ouvrez manifest.json et ajoutez un nouvel objet actions contenant :
  • la clé d'action avec le nom de l'action écrit en minuscules (a-z) et avec les mots séparés par des points (par exemple, my.address) ;
  • le nom de la classe d'action (MyAddress) comme valeur de la clé class de l'objet my.address ;
  • le nom de la vue de l'action (my.address) comme valeur de la clé view de l'objet 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. Actualisez l'interface Zabbix. Cliquez sur My address > External IP pour afficher l'adresse IP de votre ordinateur.