Упражнение 3. Сущности Plesk и авторизация

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

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

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

Шаг 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:

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

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 для взаимодействия с API RPC. Этот класс уже определен, он требует только вызова API RPC. Откройте /plib/library/Reporter.php и измените конструктор класса так, чтобы он запрашивал необходимую статистику:

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

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

http://download1.parallels.com/Plesk/PP17/Onyx/Doc/en-US/online/plesk-api-rpc/37024.htm

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

http://download1.parallels.com/Plesk/PP17/Onyx/Doc/en-US/online/plesk-api-rpc/37002.htm

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

http://download1.parallels.com/Plesk/PP17/Onyx/Doc/en-US/online/plesk-api-rpc/35551.htm

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

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

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

<?php

require_once('pm/Loader.php');
pm_Loader::registerAutoload();
pm_Bootstrap::init();

pm_Context::init('panel-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('pm/Loader.php');
pm_Loader::registerAutoload();
pm_Bootstrap::init();

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

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

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

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

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

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

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

 

Leave your feedback on this topic here

If you have questions or need support, please visit the Plesk forum or contact your hosting provider.
The comments below are for feedback on the documentation only. No timely answers or help will be provided.