Utwórz moduł (samouczek)

To jest samouczek krok po kroku, który pokazuje, jak utworzyć prosty moduł front-endu Zabbix. Możesz pobrać wszystkie pliki tego modułu jako archiwum ZIP: MyAddress.zip.

Co zbudujesz

W tym samouczku najpierw zbudujesz moduł frontend, który doda nową sekcję menu My Address, a następnie przekształcisz go w bardziej zaawansowany moduł frontend, który wykona żądanie HTTP do https://api.seeip.org i wyświetli odpowiedź - adres IP twojego komputera - na nowej stronie w nowo utworzonej sekcji menu My Address. Oto jak będzie wyglądał gotowy moduł:

Część I - Podstawowy moduł

Dodawanie pustego modułu do frontend Zabbix
  1. Utwórz katalog MyAddress w katalogu modules instalacji frontend Zabbix (na przykład zabbix/ui/modules).

  2. Utwórz plik manifest.json z podstawowymi metadanymi modułu (zobacz opis obsługiwanych parametrów).

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. W frontend Zabbix przejdź do sekcji Administration → General → Modules i kliknij przycisk Scan directory.

  1. Znajdź nowy moduł My IP Address na liście i kliknij hiperłącze "Disabled", aby zmienić status modułu z "Disabled" na "Enabled" (jeśli moduł nie jest widoczny na liście, zobacz sekcję troubleshooting).

Moduł jest teraz zarejestrowany w frontend. Nie jest jednak jeszcze widoczny, ponieważ nadal trzeba zdefiniować jego funkcjonalność. Po dodaniu zawartości do katalogu modułu zmiany będą natychmiast widoczne w frontend Zabbix po odświeżeniu strony.

Utwórz sekcję menu
  1. Utwórz plik Module.php w katalogu MyAddress.

Ten plik implementuje nową klasę Module, która rozszerza domyślną klasę CModule. Klasa Module wstawi nową sekcję menu My Address do głównego menu.

Metoda setAction() określa akcję, która ma zostać wykonana po kliknięciu sekcji menu. Na początek możesz użyć predefiniowanej akcji userprofile.edit, która otworzy stronę User profile. W części III tego samouczka dowiesz się, jak utworzyć własną akcję.

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

Możesz zastąpić 'userprofile.edit' innymi akcjami, na przykład 'charts.view' (otwiera niestandardowe wykresy), 'problems.view' (otwiera Monitoring → Problems) lub 'report.status' (otwiera raport System information).

  1. Odśwież frontend Zabbixa. Na dole głównego menu Zabbixa pojawi się teraz nowa sekcja My Address. Kliknij My Address, aby otworzyć stronę User profile.

Część II - Zmiana lokalizacji sekcji menu

W tej części przeniesiesz sekcję menu My address do sekcji Monitorowanie, a następnie dodasz do niej zagnieżdżone menu. W rezultacie użytkownicy będą mogli uzyskać dostęp do dwóch stron podmenu z sekcji menu Monitorowanie → My address.

  1. Otwórz i edytuj plik 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. Odśwież interfejs użytkownika Zabbix. Rozwiń sekcję menu Monitoring i zauważ, że sekcja My address znajduje się teraz poniżej sekcji Odkrywanie.

  1. Aby dodać zagnieżdżone strony do sekcji menu Mój adres, otwórz i edytuj ponownie plik Module.php.

Ten krok tworzy dwie podsekcje:

  • Zewnętrzny adres IP, który wykonuje nową akcję 'my.address', która zostanie zdefiniowana w kolejnych krokach;
  • Profil użytkownika, który wykonuje wstępnie zdefiniowaną akcję 'userprofile.edit', aby otworzyć stronę Profil użytkownika.

Należy pamiętać, że w przypadku zagnieżdżonego menu należy użyć klasy CMenu oprócz klas użytych w poprzednich krokach.

ui/modules/MyAddress/Module.php

<?php

namespace Modules\MyAddress;

użyj 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(_('Mój adres')))->setSubMenu(
new CMenu([
(new CMenuItem(_('Zewnętrzny adres IP')))->setAction('my.address'),
(new CMenuItem(_('Profil użytkownika')))->setAction('userprofile.edit')
])
)
);
}
}
  1. Odśwież frontend Zabbix. Zauważ, że sekcja menu Mój adres zawiera teraz menu trzeciego poziomu z dwiema stronami - Zewnętrzny adres IP i Profil użytkownika.

Część III - Akcja modułu

Akcja jest implementowana w dwóch plikach - actions/MyAddress.php i views/my.address.php. Plik actions/MyAddress.php odpowiada za implementację logiki biznesowej, natomiast plik views/my.address.php odpowiada za widok.

  1. Utwórz katalog actions w katalogu MyAddress.

  2. Utwórz plik MyAddress.php w katalogu actions.

Logika akcji będzie zdefiniowana w klasie MyAddress. Ta klasa akcji zaimplementuje cztery funkcje: init(), checkInput(), checkPermissions() oraz doAction(). frontend Zabbixa wywołuje funkcję doAction() wtedy, gdy akcja zostanie zażądana. Ta funkcja odpowiada za logikę biznesową modułu.

Dane muszą być zorganizowane jako tablica asocjacyjna. Tablica może być wielowymiarowa i może zawierać dowolne dane oczekiwane przez widok.

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. Utwórz nowy katalog views w katalogu MyAddress.

  2. Utwórz plik my.address.php w katalogu views i zdefiniuj widok modułu.

Zwróć uwagę, że zmienna $data jest dostępna w widoku bez konieczności jej jawnego definiowania. Framework automatycznie przekazuje tablicę asocjacyjną do widoku.

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. Akcja modułu musi zostać zarejestrowana w pliku manifest.json. Otwórz manifest.json i dodaj nowy obiekt actions, który zawiera:
  • klucz akcji z nazwą akcji zapisaną małymi literami (a-z) i ze słowami oddzielonymi kropkami (na przykład my.address);
  • nazwę klasy akcji (MyAddress) jako wartość klucza class obiektu my.address;
  • nazwę widoku akcji (my.address) jako wartość klucza view obiektu 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. Odśwież frontend Zabbixa. Kliknij My address → External IP, aby zobaczyć adres IP swojego komputera.