Упражнение 3. Сущности Plesk и авторизация
Это упражнение позволит вам создать расширение, которое выдает отчет о количестве учетных записей клиентов, сайтов, баз данных и почтовых учетных записей на сервере 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:
-
Упакуйте содержимое папки ex3 (но не саму папку) в архив ZIP, используя вашу любимую программу-архиватор.
Примечание: Удостоверьтесь в том, что файл
meta.xml
находится в корне распакованного архива. Это требование очень важно, и, если оно не выполнено, при попытке добавить расширение в Plesk возникнет ошибка. -
Войдите в Plesk как администратор и добавьте расширение на странице Управление сервером > Расширения.
Вы должны видеть ваше расширение в списке. Отрегулируйте настройки расширения и перейдите по ссылкам на форме, чтобы посмотреть статистику Plesk в различных форматах. Перепроверьте добавленную функциональность, чтобы убедиться, что все необходимое доступно в архиве расширения. Вы можете использовать для примера готовое расширение, доступное здесь.