Модуль регистратора в Clouden — это программный компонент, который обеспечивает взаимодействие биллинговой системы с внешними регистраторами доменных имён. Он позволяет автоматизировать процессы регистрации, продления, переноса и управления доменами, а также синхронизировать данные между системами. Данная статья описывает внутреннее устройство, жизненный цикл и принципы работы такого модуля, что необходимо для его разработки и интеграции.
Механизм работы модуля
В общих чертах жизненный цикл модуля регистратора в Clouden выглядит следующим образом:
- Установка модуля.
- Добавление подключения к регистратору.
- Настройка тарифного плана.
- Заказ и оплата услуги.
- Обработка открытия услуги.
- Включение, выключение, удаление услуги, а также выполнение дополнительных операций.
Установка модуля выполняется либо вручную, если он представлен набором файлов, либо из стандартного репозитория при помощи пакетного менеджера. После установки модуль становится доступен для выбора при добавлении подключения к регистратору в Clouden.
Каждый модуль опрашивается Clouden на предмет поддерживаемых возможностей и списка необходимых параметров. Делается это один раз на один запуск Clouden при первом обращении к модулю. Сделано это для ускорения работы Clouden за счёт исключения неподдерживаемых вызовов.
Структура модуля
Модуль регистратора состоит из двух файлов:
- etc/xml/billmgr_mod_XXX.xml — XML-описание модуля. Формат наименования файла строго регламентирован;
- processing/XXX — основной скрипт модуля. Формат наименования файла строго регламентирован.
Где XXX — название вашего модуля латиницей. Если название основного скрипта модуля содержит расширение файла, оно также включается в имя модуля. Например, если ваш скрипт называется pmregistrar.php, то именем модуля будет являться pmregistrar.php, а не registrar или pmregistrar.
Описание XML
Наименование файла должно иметь вид billmgr_mod_XXX.xml, где XXX — имя модуля. Файл копируется в каталог etc/xml относительно пути установки Clouden. Файл содержит описание самого модуля (описывается как плагин), а также описание дополнительных форм и сообщений.
- Секция
pluginотвечает за описание самого модуля. Свойствоnameсовпадает с именем модуля регистратора. Внутри секции может быть:- один элемент
groupсо значениемprocessing_module, который указывает на то, что данный модуль используется для обработчиков услуг; - несколько элементов
msg; - и секция
paramsс поднодой<type name="domain"/>, указывающей на то, что обработчик относится к регистраторам, то есть умеет обрабатывать услуги с типом, имеющим внутреннее имяdomain.
- один элемент
- Свойство
langу элементаmsgуказывает, к какому языку относится сообщение, атрибутnameможет иметь следующие значения:desc_short— краткое описание модуля. Отображается при выборе модуля в Clouden;desc_full— полное описание модуля. Отображается при построении списка установленных модулей в COREmanager.
- Секция
metadataс именемprocessing.edit.XXXотвечает за дополнительные поля модуля при добавлении и настройке обработчика. Формируется согласно стандартному описанию XML формы, с учётом необходимости расположения полей в секции<page name="connect"></page>для корректного размещения полей на формах в Clouden. - Секция
langсодержит переводы наименований полей на форме согласно стандартной схеме описания переводов. Раздел<messages name="label_processing_modules">отвечает за подпись наименования модуля в списке обработчиков.
Основной скрипт модуля
Основной скрипт модуля отвечает за передачу Clouden информации о поддерживаемых модулем функциях, а также обработку этих функций. При работе с модулем Clouden исполняет файл скрипта со следующими параметрами:
processing/xxx --command command [--item item] [--module module] [--itemtype itemtype] [--param param --value value]
[--runningoperation runningoperation] [--tld tld] [--searchstring searchstring]Где:
command— управляющая команда. Указывает на действие, которое необходимо выполнить модулю;item— код услуги, для которой выполняется действие;module— код обработчика, для которого выполняется действие;itemtype— внутреннее наименование типа продукта, для которого выполняется действие;param— наименование параметра;value— значение параметра;runningoperation— код текущей операции для выполняемого действия. Требуется для изменения параметров текущей операции, а также для создания задач;tld— наименование зоны, для которой выполняется действие;searchstring— строка поиска, используемая при импорте.
Параметр runningoperation передаётся, если модуль запущен Clouden после создания текущей операции. В этом случае, по завершению работы модуля нужно либо выполнить одну из функций Clouden (описаны далее в статье), которая удалит текущую операцию из очереди, либо выполнить одно или несколько из следующих действий:
- сохранить текст ошибки в свойствах текущей операции с помощью функции
runningoperation.edit; - выставить текущей операции ручной запуск для предотвращения автоматического перезапуска данной операции с помощью функции
runningoperation.setmanual; - создать задачу на ответственный отдел с помощью функции
task.edit.
Параметр command может принимать одно из следующих значений:
features— запрос списка поддерживаемых возможностей. В ответ на вызов данной команды модуль должен вернуть XML-документ следующего вида:
Ваш модуль может не поддерживать некоторые из описанных функций. В этом случае не сообщайте о поддержке отсутствующих функций при обработке команды features, в противном случае могут возникать ошибки обработки услуг.
check_connection— на вход модулю подаётся XML с параметрами подключения к регистратору. Формат входного документа выглядит следующим образом:
<doc>
<param>value</param>
...
<param>value</param>
</doc>Независимо от требований модуля, параметры представлены в незашифрованном виде.
Используя данные параметры, модуль должен проверить возможность использования их для подключения к регистратору и в случае ошибки вернуть её XML-описание. В случае успеха необходимо вернуть XML-документ вида:
<doc/>tune_connection— на вход обработчику передаётся XML-документ текущего описания формы подключения к регистратору, на выход нужно передать XML-документ с необходимыми изменениями;import— обработка импорта услуг. Помимо параметраcommand, обработчику в этом случае передаются параметры:module— код обработчика услуг;itemtype— внутреннее имя типа услуг;searchstring— строка поиска услуг.
Подробное описание импорта услуг приведено далее в статье.
open— команда открытия услуги. Модулю также передаются параметрыitemиrunningoperation(при запуске задания Clouden). По завершению обработки открытия услуг необходимо вызвать функциюdomain.openдля завершения обработки услуги и удаления задания из текущих операций;suspend— команда выключения услуги. Модулю также передаются параметрыitemиrunningoperation(при запуске задания Clouden). По завершению выключения услуги необходимо вызвать функциюservice.postsuspendдля перевода услуги в статус Остановлена и удаления задания из текущих операций;resume— команда включения услуги. Модулю также передаются параметрыitemиrunningoperation(при запуске задания Clouden). По завершению включения услуги необходимо вызвать функциюservice.postresumeдля перевода услуги в статус Активна и удаления задания из текущих операций;close— команда удаления услуги. Модулю также передаются параметрыitemиrunningoperation(при запуске задания Clouden). По завершению удаления услуги необходимо вызвать функциюservice.postcloseдля перевода услуги в статус Удалена и удаления задания из текущих операций;setparam— команда изменения параметров или тарифа услуги. Модулю также передаются параметрыitemиrunningoperation(при запуске задания Clouden). По завершению изменения параметров услуги необходимо вызвать функциюservice.postsetparamдля сохранения нового тарифного плана, обновления стоимости услуги для отображения в списке и удаления задания из текущих операций;prolong— команда продления срока действия услуги. Модулю также передаются параметрыitemиrunningoperation(при запуске задания Clouden). По завершению продления услуги необходимо вызвать функциюservice.postprolongдля удаления задания из текущих операций;transfer— обрабатывается аналогичноopen, за исключением специфики операции;sync_item— команда получения информации об услуге от регистратора. Модулю также передаётся параметрitem. Сохранение параметров выполняется с помощью функций, описанных ниже;tune_service— команда изменения формы редактирования домена. Модулю также передаётся параметрparam, содержащий наименование доменной зоны. На вход модуль получает текущее XML-описание формы редактирования домена, на выход необходимо вернуть изменённую форму;get_contact_type— команда получения списка необходимых типов контактов для регистрации домена в определённой зоне, а также дополнительной информации о поддержке данной зоны регистратором. Модулю также передаётся параметрtld, содержащий наименование доменной зоны. В общем случае модуль возвращает XML-документ следующего вида:
<doc ns="require" auth_code="require">
<contact_type>customer</contact_type>
<contact_type>owner</contact_type>
<contact_type>admin</contact_type>
<contact_type>bill</contact_type>
<contact_type>tech</contact_type>
</doc>Набор нод contact_type может быть полным или содержать только одно или несколько значений. Всё зависит от требований конкретного регистратора к регистрации доменов в конкретной зоне.
Чтобы модуль возвращал нормализованные контакты, добавьте к XML-описанию типа контакта type="normalized":
<doc ns="require" auth_code="require">
<contact_type type="normalized">customer</contact_type>
</doc>Типы customer, owner, admin, bill и tech являются встроенными. Чтобы модуль возвращал иное наименование типа, добавьте к XML-описанию плагина секцию описания сообщений для label_service_profile:
<messages name="label_service_profile">
<msg name="contact_type_name">Имя типа контакта</msg>
</messages>Где:
-
contact_type_name— имя вашего типа контакта;- Атрибут
ns="require"означает, что для переданной доменной зоны регистратор требует указание серверов имён. Атрибут может отсутствовать; - Атрибут
auth_code="require"означает, что для переданной доменной зоны регистратор требует указать пароль домена при трансфере. Атрибут может отсутствовать; - Атрибут
cancel_prolong_before="xxx"— за сколько дней до окончания срока действия домена необходимо вызвать функцию отмены автоматического продления. Атрибут может отсутствовать.
tune_service_profile— команда изменения формы параметров контакта доменов. Модулю также передаются параметрыparam, содержащий наименование доменной зоны, иvalue, содержащий наименование типа контакта. На вход модулю передаётся XML-форма контакта доменов, на выход модуль должен вернуть изменённый XML;validate_service_profile— команда проверки указанных в свойствах контакта данных. Модулю также передаётся параметрparam, содержащий наименование доменной зоны. На вход модулю подаётся XML-документ, содержащий все параметры текущей сессии пользователя. На выход модуль должен либо вернуть XML-описание ошибки проверки данных, либо пустой XML-документ;update_ns— команда изменения списка серверов имён домена. Модулю также передаются параметрыmodule, содержащий код обработчика, иitem, содержащий код услуги;cancel_prolong— команда отмены автоматического продления домена на стороне регистратора. Модулю также передаётся параметрitem, содержащий код услуги;whois— получение данных whois из модуля обработчика.
Ответ обработчика должен состоять из XML с нодой whois, содержащей whois-информацию по домену:
<doc>
<whois>NOT FOUND </whois>
</doc>contactverify,domainverify— команды верификации. В случаеcontactverifyверифицируются все услуги, принадлежащие контакту домена (контакт домена создаётся на стороне регистратора и имеет внешний ID), аdomainverifyверифицирует только домен (обычно у таких регистраторов данные о контакте домена передаются вместе с данными о самом домене, и контакт не имеет внешнего ID). На вход подаётся XML, содержащий внешний идентификатор контакта домена (если имеется) и все параметры услуги. На выход модуль в случае ошибки должен вернуть пустую XML или XML в формате:
<doc>
<response>
<file id="идентификатор файла из Clouden">ok</file> <!-- ok - в случае успешной отправки файла, err - в случае ошибки -->
...
</response>
</doc>uploadext— вызов данной команды возвращает список поддерживаемых обработчиком форматов файлов в формате:
<doc>
<ext>jpg</ext>
<ext>png</ext>
...
</doc>checkdomaindoc— данная команда проверяет статус верификации доменов/контактов доменов, ответ на неё должен быть возвращён в следующем формате:
<doc>
<response>
<item id="идентификатор услуги из BILLmananger">ok</item> <!-- ok - в случае успешной проверки, err - в случае ошибки -->
...
</response>
</doc>Пример реализации скрипта можно найти в конце статьи.
Структура связанных таблиц
- таблица item — содержит основную информацию об услугах:
- поле id — код услуги;
- поле processingmodule — код обработчика.
- таблица processingmodule — содержит основную информацию об обработчике услуг:
- поле id — код обработчика.
- таблица processingparam — содержит параметры модуля обработчика:
- поле processingmodule — код обработчика;
- поле intname — имя параметра;
- поле value — значение.
- таблица processingcryptedparam — содержит зашифрованные параметры модуля обработчика:
- поле processingmodule — код обработчика;
- поле intname — имя параметра;
- поле value — зашифрованное значение.
- таблица service_profile — содержит основную информацию о контактах доменов:
- поле id — код контакта домена.
- таблица service_profileparam — содержит параметры контактов доменов:
- поле service_profile — код контакта домена;
- поле intname — имя параметра;
- поле value — значение параметра.
- таблица service_profile2item — содержит привязки доменов к контактам:
- поле item — код услуги;
- поле service_profile — код контакта домена;
- поле type — тип контакта.
- таблица service_profile2processingmodule — содержит привязки контактов к обработчикам:
- поле service_profile — код контакта домена;
- поле processingmodule — код обработчика;
- поле type — тип контакта;
- поле externalid — код контакта на стороне регистратора;
- поле externalpassword — пароль контакта на стороне регистратора.
Импорт услуг
Импорт услуг в Clouden осуществляется в два этапа:
- получение от регистратора списка услуг по переданному условию;
- назначение услуг клиентам.
Для получения списка услуг в модуль передаётся управляющая команда import, при исполнении которой модуль должен:
- средствами API получить от регистратора список подходящих под условие доменов;
- по доменам получить информацию о контактах и сгруппировать их по ID у регистратора;
- зарегистрировать в Clouden контакты функцией
processing.import.profile(для разных типов контактов можно использовать один созданный контакт, но зарегистрировав его привязку к обработчику функциейservice_profile2processingmodule.edit); - зарегистрировать в Clouden домены функцией
processing.import.service; - привязать контакты к доменам функцией
service_profile2item.edit.
Работа с текущими операциями
Перед передачей большинства запросов модули Clouden создаёт операцию, которая будет перезапущена в случае, если предыдущая попытка закончилась неудачей и если включён автоматический перезапуск. Код операции передаётся в модуль параметром runningoperation и может отсутствовать.
Если модулем получен код текущей операции, то в случае ошибки обработки команды можно сохранить информацию о ней в параметрах текущей операции для отображения в Clouden с помощью функции runningoperation.edit, а также перевести её запуск в ручной режим с помощью функции runningoperation.setmanual.
В случае, если вы также хотите создать задачу на основе текущей операции для её решения администратором Clouden, вам необходимо:
- Получить тип задачи с помощью функции
task.gettype, передав в неё параметромoperationполученную модулем команду. - Зарегистрировать задачу с помощью функции
task.edit.
После этого задача появится в списке у сотрудников, входящих в отдел, выбранный в качестве ответственного в настройках обработчика.
Дополнительные поля доменов и контактов
При необходимости для определённого модуля регистратора можно добавить дополнительные поля. Эти поля будут добавлены к свойствам контакта при регистрации домена через данного регистратора либо в выбранной доменной зоне. Также такие поля можно добавить к свойствам домена.
В первом случае к XML-описанию плагина нужно добавить одну или несколько секций metadata и соответствующее описание сообщений в messages. В зависимости от того, для чего добавляются дополнительные параметры, секция может иметь вид:
service_profile.tld— влияет на контакты при использовании любого модуля регистрации;service_profile.type— влияет на контакты при использовании любого модуля регистрации;service_profile.type.tld— влияет на контакты при использовании любого модуля регистрации;service_profile.xxx;service_profile.xxx.tld;service_profile.xxx.type;service_profile.xxx.type.tld.
Где:
xxx— имя модуля;tld— имя доменной зоны;type— имя типа контакта.
К примеру, для добавления поля возраст (age) для владельца домена (owner) при регистрации в зоне .teen (абстрактный пример) нужно добавить к имеющемуся описанию плагина следующие XML:
Для тех же целей и также для заполнения списков выбора можно использовать обработку tune_service_profile.
Функции Clouden
paramlist— не требует параметров. Отдаёт список параметров конфигурации панели.processing.import.profile— сохранить в Clouden импортированный контакт домена. Параметры:module— код обработчика;type— тип контакта;sok=ok— признак сохранения параметров;externalid— код контакта на стороне регистратора;- список стандартных параметров контактов доменов;
- любые дополнительные параметры, которые нужно сохранить в свойства контакта домена.
Возвращает profile_id — код созданного контакта.
processing.import.service— сохранить в Clouden импортированный домен. Параметры:module— код обработчика;import_pricelist_intname— код зоны домена из Clouden;import_service_name— имя домена;status— статус услуги;expiredate— срок действия домена;domain— полное имя домена;service_status— дополнительный статус услуги. Возможные значения указаны ниже в документации;period— период заказа в месяцах;sok=ok— признак сохранения параметров;- любые дополнительные параметры, которые нужно сохранить в свойства домена.
Возвращает service_id — код созданного домена.
service_profile2item.edit— привязать контакты к доменному имени по типу:service_profile— код контакта в Clouden;item— код домена в Clouden;type— тип контакта (рекомендуется использовать стандартные типы customer, owner, admin, tech, bill).
runningoperation.delete— удаление текущей операции:elid— код текущей операции.
runningoperation.edit— изменение параметров текущей операции:elid— код текущей операции;sok=ok— признак сохранения параметров;errorxml— XML произошедшей ошибки.
runningoperation.setmanual— перевести текущую операцию в режим ручного запуска:elid— код текущей операции.
service.postclose— операция завершения удаления услуги. Меняет статус услуги и удаляет операцию на удаление:elid— код услуги;sok=ok— признак сохранения параметров.
service.postopen— операция завершения открытия услуги. Только удаляет операцию на открытие услуги:elid— код услуги;sok=ok— признак сохранения параметров.
service.postprolong— операция завершения продления услуги. Только удаляет операцию на продление услуги:elid— код услуги;sok=ok— признак сохранения параметров.
service.postresume— операция завершения включения услуги. Меняет статус услуги и удаляет операцию на включение:elid— код услуги;sok=ok— признак сохранения параметров.
service.postsetparam— операция завершения изменения параметров услуги. Сбрасывает ссылку на предыдущий тарифный план, удаляет текущую операцию и обновляет стоимость услуги для отображения в списке:elid— код услуги;sok=ok— признак сохранения параметров.
service.postsuspend— операция завершения выключения услуги. Меняет статус услуги и удаляет операцию на выключение:elid— код услуги;sok=ok— признак сохранения параметров.
service.saveparam— сохраняет произвольный параметр услуги:elid— код услуги;name— внутреннее имя параметра;value— значение параметра.
service.setexpiredate— изменяет срок действия услуги:elid— код услуги;expiredate— новый срок действия услуги.
service.setstatus— меняет дополнительный статус услуги:elid— код услуги;service_status— новый статус услуги.
service_profile2processingmodule.edit— сохраняет параметры привязки контакта домена к регистратору:service_profile— код контакта домена;sok=ok— признак сохранения параметров;processingmodule— код обработчика;type— тип контакта;externalid— код контакта на стороне регистратора;externalpassword— пароль контакта на стороне регистратора (необязательно).
Статусы услуги
Дополнительный статус услуги может принимать следующие значения:
1— домен не оплачен;2— домен зарегистрирован и делегирован;3— домен зарегистрирован, но не делегирован;4— домен удалён;5— домен проходит процедуру регистрации;6— домен проходит процедуру смены регистратора;7— домен на продлении;8— делегирование домена окончено.
Стандартные параметры контактов доменов
По умолчанию в Clouden контакт домена может иметь следующие свойства:
profiletype— юридический статус контакта:1— физ. лицо;2— юр. лицо;3— ИП.
firstname_locale— имя контактного лица в символах национального алфавита;middlename_locale— отчество контактного лица в символах национального алфавита;lastname_locale— фамилия контактного лица в символах национального алфавита;firstname— имя латиницей;middlename— отчество латиницей;lastname— фамилия латиницей;email— email-адрес;phone— номер телефона;mobile— номер мобильного телефона;fax— номер факса;passport— номер паспорта с серией;passport_org— организация, выдавшая паспорт;passport_date— дата выдачи паспорта в формате YYYY-MM-DD;birthdate— дата рождения в формате YYYY-MM-DD;location_country— код страны места нахождения из справочника стран Clouden;location_state— штат, регион и т.п. места нахождения контакта;location_postcode— почтовый индекс места нахождения контакта;location_city— город места нахождения контакта;location_address— адрес (улица, дом, квартира/офис и т.д.) места нахождения контакта;postal_country— код страны почтового адреса контакта из справочника стран Clouden;postal_state— штат, регион и т.п. почтового адреса контакта;postal_postcode— почтовый индекс почтового адреса контакта;postal_city— город почтового адреса контакта;postal_address— адрес (улица, дом, квартира/офис и т.д.) почтового адреса контакта;postal_addressee— ФИО получателя почты;company_locale— наименование организации в символах национального алфавита;company— наименование организации латиницей;inn— налоговый учётный номер организации;kpp— код постановки на учёт организации;ogrn— государственный регистрационный номер организации.
Пример модуля
C++ (с использованием библиотек Clouden)
Использование заголовочных файлов Clouden для разработки собственных модулей обработчиков доступно с версии Clouden 5.58.0. Кроме приведённого упрощённого примера, можно изучить примеры, представленные в пакете разработчика Clouden — billmanager-[Редакция Clouden]-devel, например:
yum install billmanager-corporate-devel
или
yum install billmanager-develПосле этого примеры можно найти в директории:
/usr/local/mgr5/src/examplesЕсли у вас возникла ошибка при попытке make:
Building for <ваша операционная система>
Compiling pmregru.cpp
pmregru.cpp:12:23: фатальная ошибка: json/json.h: Нет такого файла или каталога
#include <json/json.h>
^
компиляция прервана.
make: *** [.build/.obj/pmregru.o] Ошибка 1Выполните установку пакета:
make centos-prepareили
make debian-preparePHP
Пример иллюстрирует реализацию продажи доменов третьего уровня на основе имеющегося домена. Фактически пример только сохраняет минимальный набор данных в отдельной базе данных и манипулирует ими.
Модуль состоит из трёх основных файлов:
- etc/xml/billmgr_mod_pmregistrar.php.xml — XML-описание;
- processing/pmregistrar.php — основной скрипт модуля;
- dist/pmregistrar.php/domains.sql — дамп тестовой базы данных.
А также вспомогательного файла с полезными функциями:
- include/php/bill_util.php.
Пример можно просмотреть онлайн — https://github.com/ISPsystemLLC/billmanager/.
Функции bill_util.php
__MODULE__ для формирования имени файла лога. Выглядит это примерно так:set_include_path(get_include_path() . PATH_SEPARATOR . "/usr/local/mgr5/include/php");
define('__MODULE__', "pmXXX");
require_once 'bill_util.php';Файл bill_util.php предоставляет следующие функции:
Debug($str)— для вывода$strв качестве дополнительной информации в лог;Error($str)— для вывода$strв качестве сообщения об ошибке в лог;LocalQuery($function, $param, $auth = NULL)— выполняет в Clouden функцию$function, передав ей параметры из массива$paramи код сессии из$auth;HttpQuery($url, $param, $requesttype = "POST", $username = "", $password = "", $header = array("Accept: application/xml"))— выполняет к$urlзапрос с параметрами из$param, используя тип запроса$requesttypeи данные авторизации из$usernameи$password. Также можно передать дополнительные заголовки в$header;CgiInput($skip_auth = false)— получает массив параметров, полученных из скриптов в строке запроса или POST-данных.$skip_authотвечает за получение параметраauthиз cookie, если он отсутствует в полученных данных;ClientIp()— получить IP-адрес, с которого вызван скрипт;class Error— класс ошибки, имитирующий поведение, схожее с ошибками в COREmanager.