モジュールの作成 (チュートリアル)

これは、シンプルなZabbixフロントエンドモジュールを作成する方法を示すステップバイステップのチュートリアルです。 このモジュールのすべてのファイルをZIPアーカイブとしてダウンロードできます: MyAddress.zip

作成するもの

このチュートリアルでは、まず新しい My Address メニューセクションを追加するWebインターフェースモジュールを作成し、 次にそれを https://api.seeip.org にHTTPリクエストを送信して、その応答、つまりあなたのコンピュータのIPアドレスを、 新しく作成した My Address メニューセクション内の新しいページに表示する、より高度なWebインターフェースモジュールへと変換します。 完成したモジュールは次のようになります。

パート I - 新しいメニューセクション

Zabbix Webインターフェースに空のモジュールを追加する
  1. Zabbix Webインターフェースのインストール先の modules ディレクトリに、MyAddress ディレクトリを作成します(例: zabbix/ui/modules)。

  2. 基本的なモジュールメタデータを含む manifest.json ファイルを作成します(サポートされている parameters の説明を参照してください)。

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. Zabbix Webインターフェースで、Administration > General > Modules セクションに移動し、Scan directory ボタンをクリックします。

  1. 一覧から新しいモジュール My IP Address を見つけ、"Disabled" ハイパーリンクをクリックして、モジュールの状態を "Disabled" から "Enabled" に変更します(モジュールが一覧に表示されない場合は、troubleshooting セクションを参照してください)。

これでモジュールは Webインターフェースに登録されました。ただし、まだモジュールの機能を定義していないため、表示はされません。 モジュールディレクトリにコンテンツを追加すると、ページを更新した際に Zabbix Webインターフェースで変更がすぐに反映されます。

メニューセクションを作成する
  1. MyAddress ディレクトリに Module.php ファイルを作成します。

このファイルは、デフォルトの CModule クラスを拡張する新しい Module クラスを実装します。 Module クラスは、メインメニューに新しい My Address メニューセクションを追加します。

setAction() メソッドは、メニューセクションをクリックしたときに実行するアクションを指定します。 まずは、あらかじめ定義されている userprofile.edit アクションを使用できます。これにより、User profile ページが開きます。 このチュートリアルの part III では、カスタムアクションの作成方法を学びます。

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

'userprofile.edit' は他のアクションに置き換えられます。たとえば、'charts.view'(カスタムグラフを開く)、'problems.view'Monitoring > 障害 を開く)、または 'report.status'System information レポートを開く)などです。

  1. Zabbix Webインターフェースを更新します。これで、Zabbix のメインメニューの下部に新しい My Address セクションが表示されます。 My Address をクリックすると、User profile ページが開きます。

パート II - メニューセクションの配置変更

このパートでは、My Address メニューセクションを Monitoring セクションへ移動し、さらにその中にネストされたメニューを追加します。
その結果、ユーザーは Monitoring > My Address メニューセクションから 2 つのサブメニューページにアクセスできるようになります。

  1. 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. Zabbix Webインターフェースを更新します。Monitoring メニューセクションを展開し、My address セクションが Discovery セクションの下に配置されていることを確認します。

  1. My Address メニューセクションにネストされたページを追加するには、再度 Module.php ファイルを開いて編集します。

この手順では、2 つのサブセクションを作成します。

  • 次の手順で定義する新しい 'my.address' アクションを実行する External IP;
  • User profile ページを開くために、あらかじめ定義されている 'userprofile.edit' アクションを実行する User profile

ネストされたメニューでは、前の手順で使用したクラスに加えて CMenu クラスを使用する必要があることに注意してください。

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. Zabbix Webインターフェースを更新します。My address メニューセクションに、External IPUser profile の 2 つのページを持つ 3 階層目のメニューが追加されていることを確認します。

第III部 - モジュールアクション

アクションは 2 つのファイルで実装されます - actions/MyAddress.phpviews/my.address.php です。
actions/MyAddress.php ファイルはビジネスロジックの実装を担当し、views/my.address.php ファイルはビューを担当します。

  1. MyAddress ディレクトリ内に actions ディレクトリを作成します。

  2. actions ディレクトリ内に MyAddress.php ファイルを作成します。

アクションロジックは MyAddress クラスで定義されます。
このアクションクラスは、init(), checkInput(), checkPermissions(), doAction() の 4 つの関数を実装します。
Zabbix Webインターフェースは、アクションが要求されたときに doAction() 関数を呼び出します。
この関数は、モジュールのビジネスロジックを担当します。

データは連想配列として整理する必要があります。
配列は多次元にすることができ、ビューが期待する任意のデータを含めることができます。

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. MyAddress ディレクトリ内に新しい views ディレクトリを作成します。

  2. views ディレクトリ内に my.address.php ファイルを作成し、モジュールビューを定義します。

変数 $data は、特に定義しなくてもビュー内で利用できることに注意してください。
フレームワークが連想配列を自動的にビューへ渡します。

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. モジュールアクションは manifest.json ファイルに登録する必要があります。manifest.json を開き、次の内容を含む新しい actions オブジェクトを追加します。
  • アクションキーは、アクション名を小文字 (a-z) で、単語をドットで区切って記述します(例: my.address)。
  • my.address オブジェクトの class キーの値として、アクションクラス名 (MyAddress) を指定します。
  • my.address オブジェクトの view キーの値として、アクションビュー名 (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. Zabbix Webインターフェースを更新します。My address > External IP をクリックすると、コンピューターの IP アドレスを確認できます。