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

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

作成するもの

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

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

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

  2. 基本モジュールのメタデータを含むmanifest.jsonファイルを作成します (サポートされている[パラメーター](../file_ Structure/manifest)の説明を参照)。

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フロントエンドで、管理 → 一般 → モジュールセクションに移動し、ディレクトリのスキャンボタンをクリックします。

  1. リスト内で新しいモジュールMy IP Addressを見つけ、"無効"ハイパーリンクをクリックしてモジュールのステータスを"無効"から"有効"に変更します (モジュールがリストされていない場合、トラブルシューティングセクションを確認してください)。

これで、モジュールがフロントエンドに登録されました。ただし、モジュールの機能を定義する必要があるため、まだ表示されていません。 モジュールディレクトリにコンテンツを追加し、ページを更新すると、Zabbixフロントエンドの変更がすぐに表示されます。

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

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

setAction()メソッドは、メニューセクションをクリックしたときに実行されるアクションを指定します。 まず、事前定義されたアクションuserprofile.editを使用すると、ユーザープロファイルページが開きます。 このチュートリアルのパート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'(データ監視 → 障害を開く)、または 'report.status'(システム情報レポートを開く)に置き換えることができます。

  1. Zabbixフロントエンドを更新します。Zabbixメインメニューの下部に、新しいMy Addressセクションが追加されました。 My Addressをクリックして、User profileページを開きます。

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

このパートでは、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フロントエンドを更新します。 監視データメニューセクションを展開し、My addressセクションがディスカバリセクションの下にあることを確認します。

  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フロントエンドを更新します。My addressメニューセクションに、External IPUser profileの2ページからなる第3レベルのメニューが含まれていることを確認します。

パート III - モジュールアクション

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

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

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

アクションロジックはMyAddressクラスで定義されます。 このアクションクラスは、init()checkInput()checkPermissions()doAction()の4つの関数を実装します。 Zabbixフロントエンドは、アクションが要求されると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フロントエンドを更新します。 My address → External IPをクリックして、コンピュータのIPアドレスを確認します。