Упражнение 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 в различных форматах.