Это упражнение позволит вам создать расширение, которое выдает отчет о количестве учетных записей клиентов, сайтов, баз данных и почтовых учетных записей на сервере Plesk; формат отчета — простой текст или текст в XML или JSON. Во время написания этого расширения вы узнаете, как делать следующее:

  • Использовать персональную авторизацию (вызов файлов PHP обходных контроллеров).
  • Обращаться к сущностям Plesk через XML API.

Мы предполагаем, что идентификатор расширения — plesk-stats, и что вы начнете разработку с кода из папки ex3. Мы уже частично написали этот код, чтобы помочь вам сосредоточиться только на определенных областях. Кроме того, мы добавили в папку медиа-контент, необходимый для выполнения упражнения. Чтобы посмотреть завершенное упражнение, ознакомьтесь с содержимым папки ex3complete.

Шаг 1. Установите персональную авторизацию.

Расширение, которое мы собираемся написать, будет состоять из формы, в которой администратор может задать выходной формат данных, и формы, в которой пользователи будут запрашивать статистику. Так как статистика содержит защищенные данные, нам надо настроить контроль доступа, чтобы результаты отправлялись только определенным пользователям. Это можно сделать двумя способами:

  • Определите тип пользователя — администратор, реселлер или клиент — и ограничьте доступ в зависимости от типа. Для этого создайте экземпляр класса pm_Session и используйте его методы типа boolean isClient(), isReseller() и isAdmin() .

    $session = new pm_Session();
    $client = $session->getClient();
    if ($client->isAdmin()) {
    }
    
  • Напишите свой собственный метод авторизации.

Так как мы предполагаем, что веб-служба статистики будет использоваться сторонними приложениями, мы напишем свой собственный метод авторизации.

Начните с определения секретного токена authToken в нашем скрипте, запускаемом после авторизации, и сохранения его в хранилище пар «ключ-значение». Для этого добавьте следующие две строки в файл /plib/scripts/post-install.php:

pm_Settings::set('useAuth', true);
pm_Settings::set('authToken', md5(uniqid(rand(), true)));

Если вы прежде не писали скриптов для установки и не работали с хранилищем пар «ключ-значение», мы рекомендуем вам посмотреть Упражнение 2.

Затем добавьте форму, которая определяет метод выдачи данных. Здесь нет ничего нового, мы уже рассказывали, как это сделать, написав соответствующие контроллеры, действия и представления в Упражнении 1, поэтому мы уже добавили для вас необходимый код. Если вы хотите знать, что это за код, смотрите следующие файлы:

/htdocs/index.php
/plib/controllers/IndexController.php
/plib/library/Form/Settings.php
/plib/views/scripts/index/index.phtml

Стоит отметить, что, помимо других полей, форма содержит ссылки на статистику. Эти ссылки ведут к /public/?authToken=$authToken в корневой веб-папке расширения. Веб-папка /public связана с папкой /htdocs/public расширения. Это специальная папка. Если кто-либо запрашивает какой-либо ресурс из этой папки, управление будет передано напрямую обходным контроллерам ресурса. В нашем примере, если мы хотим иметь публично доступную конечную точку, нам надо создать скрипт внутри этой папки и сообщить потребителям URL этого скрипта.

Чтобы управлять запросами к статистике в /public, добавьте следующие строки в /htdocs/public/index.php:

if (pm_Settings::get('useAuth') && @$_GET['authToken'] != pm_Settings::get('authToken')) {
    die('Invalid auth token supplied.');
}

Этот код сравнивает токен из хранилища с токеном из запроса. Если они не совпадают, выполнение скрипта прекратится.

Отлично, теперь, когда у вас есть система авторизации, добавим немного статистики в вывод /htdocs/public/index.php.

Шаг 2. Получите информацию о сущностях Plesk.

Расширение будет использовать класс Modules_PanelStats_Reporter для взаимодействия с XML API. Этот класс уже определен, он требует только вызова XML API с помощью pm_ApiRpc. Откройте /plib/library/Reporter.php и измените конструктор класса так, чтобы он запрашивал необходимую статистику:

$request = '<server><get><stat/></get></server>';
$this->_stats = pm_ApiRpc::getService()->call($request)->server->get->result->stat->objects;

Описание операции, которую запрашивает этот код, можно найти здесь.

Описание ответа доступно здесь.

Согласно этому руководству, поле класса _stats содержит узлы, описанные здесь.

Предварительно написанные методы Modules_PanelStats_Reporter помогают обрабатывать данные ответа. Метод getResultsXml возвращает данные как дерево XML, getResultsJson возвращает результат в формате JSON, а getResultsPlain возвращает информацию как простой текст. Теперь эту информацию необходимо показать пользователям расширения.

Шаг 3. Предоставление статистики пользователям расширения.

Как обсуждалось на шаге 1, конечные пользователи будут запрашивать файл /htdocs/public/index.php для получения статистики, а в нем в настоящий момент реализован контроль доступа. Для предоставления статистики, измените этот файл, чтобы он выглядел следующим образом:

<?php

require_once('sdk.php');

pm_Context::init('plesk-stats');

if (pm_Settings::get('useAuth') && @$_GET['authToken'] != pm_Settings::get('authToken')) {
    die('Invalid auth token supplied.');
}

$reporter = new Modules_PanelStats_Reporter();

$format = isset($_GET['format']) ? $_GET['format'] : 'xml';

if ('plain' == $format) {
    echo $reporter->getResultsPlain();
} else if ('json' == $format) {
    header("Content-Type: application/json");
    echo $reporter->getResultsJson();
} else {
    header("Content-Type: text/xml");
    echo $reporter->getResultsXml();
}

В отличие от предыдущей версии файла, эта версия создает экземпляр класса Modules_PanelStats_Reporter и предоставляет статистику в зависимости от аргумента format операции GET.

Вы могли заметить, что код начинается со следующей строки:

require_once('sdk.php');

Примечание: Эта строка требуется для настройки автозагрузки классов в этом скрипте, так как функция автозагрузки не работает в /htdocs/public по умолчанию.

Шаг 4. Установите и протестируйте расширение.

Поздравляем! Вы выполнили упражнение. Чтобы установить ваше расширение в Plesk:

  1. Упакуйте содержимое папки ex3 (но не саму папку) в архив ZIP, используя вашу любимую программу-архиватор.

    Примечание: Удостоверьтесь в том, что файл meta.xml находится в корне распакованного архива. Это требование очень важно, и, если оно не выполнено, при попытке добавить расширение в Plesk возникнет ошибка.

  2. Войдите в Plesk как администратор и добавьте расширение на странице Управление сервером > Расширения.

Вы должны видеть ваше расширение в списке. Отрегулируйте настройки расширения и перейдите по ссылкам на форме, чтобы посмотреть статистику Plesk в различных форматах. Перепроверьте добавленную функциональность, чтобы убедиться, что все необходимое доступно в архиве расширения. Вы можете использовать для примера готовое расширение, доступное здесь.