Расширения
Расширения позволяют простым способом, установив всего один файл, расширять функционал сервера CommuniGate и его пользовательского интерфейса, не прибегая к модификации встроенного функционала сервера.
Установить расширение, скачанное с сайта communigatepro.ru или разработанное самостоятельно, можно в разделе Пользователи → Расширения интерфейса администрирования Dash.
Формат файла расширения
Файл расширения представляет собой ZIP-архив с расширением .cgplugin
.
В корне архива обязательно должен находиться файл описания расширения cgplugin.json
. JSON-Schema для него: cgplugin.schema.json.
Основные параметры файла конфигурации расширения:
id
(обязательно) - Название расширения. Латиница, цифры и подчёркивание. Должно быть уникальным для конкретного расширения. Рекомендуется использовать обратную запись названия домена перед именем расширения, например,ru_communigatepro_ExamplePlugin
author
(обязательно) - Имя автора расширения. Например,Ivan Ivanov
илиAO SBK
version
(обязательно) - Версия расширения по SemVer 2.0. Например,1.0.0
title
(обязательно) - Имя поля из словарей локализации, которое будет использоваться при отображении расширения в интерфейсе администрирования. Например,PluginTitle
.description
(необязательно) - Имя поля из словарей локализации, которое будет использоваться при отображении описания расширения в интерфейсе администрирования. Например,PluginDescription
.url
- Адрес домашней страницы расширения. Например,https://communigatepro.ru/
icon
- Опциональное имя файла иконки из архива для отображения расширения при просмотре его через интерфейс администрирования. Иконка должна быть в формате svg и иметь пропорции 1:1 (квадратные).min_product_version
- Опциональный параметр, который указывает минимальную версию сервера, необходимую для корректной работы плагина. Если параметр не указан, предполагается, что плагин совместим со всеми версиями сервера.
Локализация
При загрузке расширения из него автоматически загружаются доступные файлы локализации с расширением .data
в формате Словарей CommuniGate Pro.
Данные из этих словарей будут доступны другому коду, в том числе, скриптам на CG/PL, содержащимся в расширении, с префиксом вида <id расширения>.
.
Точки расширения
Список точек расширения заполняется в секции extends
файла описания. Доступны несколько типов расширений, описанные ниже.
Параметры конфигурации
Описываются в секции config
в виде объекта с описаниями параметров конфигурации. Каждый ключ - идентификатор одного параметра конфигурации, под которым он будет храниться и передаваться запускаемым из расширения скриптам CG/PL.
type
(обязательно) - Тип параметра, используется для выбора формата хранения параметра и типа отображаемого в интерфейсе администрирования виджета. На данный момент поддерживаются только параметры типовstring
иboolean
.title
(обязательно) - Строка из файлов локализации, которая будет использоваться при отображении названия параметра в интерфейсе администрирования.required
- Обязателен ли параметр конфигурации для заполнения (если поле отсутствует, параметр необязательный).editPresentation
- Позволяет указать способ отображения элемента управления для параметра. Для типаstring
поддерживаютсяpassword
иmultilineText
. Если дляstring
ничего не указано, будет показано обычное однострочное поле ввода.enum
- Позволяет задать несколько допустимых вариантов для параметра конфигурации.enumTitle
(обязательно, если есть enum) - Строка из файлов локализации, которая указывает на словарь, который будет использоваться при отображении вариантов параметра конфигурации в интерфейсе администрирования.
Пример:
{
"extends": {
"config": {
"APIKey": {
"type": "string",
"editPresentation": "password",
"title": "APIKeyTitle",
"required": true
},
"ServerType": {
"type": "string",
"enum": ["proxy", "DNS", "mail"],
"enumTitle": "ServerTypeEnumTitle",
"required": true,
"title": "ServerTypeTitle"
}
}
}
}
Проверка параметров конфигурации
В расширение можно добавить файл сценария на языке CG/PL, выполняющий проверку корректности заполнения параметров конфигурации. Данный файл должен находиться в архиве с расширением.
Такой файл сценария может как выполнять базовые проверки по регулярным выражениям или заполнению полей, так и проверять корректность введённых параметров путём обращения к внешнему серверу. В файле сценария должен содержаться метод checkConfig
, выполняющий проверку параметров конфигурации, доступных ему через свойство pluginSettings
окружения запуска сценария.
Пример параметра:
{
"extends": {
"config": {
"APIKey": {
"type": "string",
"title": "APIKeyTitle",
"required": true
}
},
"checkConfig": "checkconfig.scgp"
}
}
Пример файла сценария:
entry checkConfig {
var settings = Vars().pluginSettings;
if (Length(settings.APIKey) != 10) {
SetResult("invalid API key")
}
}
Видеоконференции
Описываются в секции vcs
в виде объекта с описаниями предоставляемых расширением скриптов для интеграции систем видеоконференцсвязи (далее - ВКС). Ключ - идентификатор, который будет использоваться для определения конкретной системы ВКС внутри CommuniGate Pro. Каждое описание - объект со следующими параметрами:
title
(обязательно) - Строка из файлов локализации, которая будет использоваться при отображении параметра в интерфейсе пользователя.script
(обязательно) - Имя (с расширением) находящегося в архиве файла сценария на языке CG/PL, реализующего интеграцию с ВКС.icon
- Опционально: имя svg-файла с пиктограммой из архива. Пиктограмма будет отображаться пользователю в элементах интерфейса, связанных с конкретной системой видеоконференций. Она должна иметь пропорции 1:1 (квадратные).
Пример:
{
"extends": {
"vcs": {
"bbb": {
"title": "BBBTitle",
"script": "bbb.scgp",
"icon": "bbb.svg"
}
}
}
}
Каждый модуль поддержки видеоконференции должен быть отдельным сценарием CG/PL в формате scgp.
Каждая функция оформляется отдельным методом внутри файла сценария (отдельной «точкой входа»). Сценарий всегда запускается в контексте пользователя, создающего конференцию, будь то через событие в календаре или через кнопку в чате.
Точки входа, которые должны быть реализованы в коде файла сценария, описаны ниже.
Точка входа createConf
createConf
Создаёт видеоконференцию.
Параметры доступны в словаре
Vars().startParameter
:title
(опционально)Тема конференции.
description
(опционально)Подробное описание темы конференции.
isAllDay
(опционально)Флаг, определяющий тип конференции, если конференция длится целый день с 0 до 24 часов - 1, если конференция имеет любое другое время начало и конца - 0.
rRule
(опционально)Правило повторения события и ВКС, согласно RFC5545, section 3.8.5.3.
Примеры:
FREQ=DAILY;UNTIL=20241215T000000Z
ежедневное повторение, до 15 декабря 2024 г.
FREQ=WEEKLY;BYDAY=SU,MO,TU,WE,TH,FR
еженедельное повторение каждый день недели.
FREQ=MONTHLY;INTERVAL=2;BYMONTHDAY=2;UNTIL=20250328T000000Z
ежемесячно каждый второй месяц второй день до 28 марта 2025 г.
FREQ=MONTHLY;BYDAY=-1SU,-1MO,-1TU,-1WE,-1TH,-1FR,-1SA;UNTIL=20250319T000000Z
ежемесячно каждый последний понедельник, вторник, среду, четверг, пятницу, субботу, воскресенье до 19 марта 2025 г.
FREQ=MONTHLY;INTERVAL=2;BYDAY=1SU,1TU,1FR;UNTIL=20250321T000000Z
ежемесячно каждый второй месяц каждый первый вторник, пятницу, воскресенье до 21 марта 2025 г.
FREQ=YEARLY;BYMONTH=4;BYMONTHDAY=6;UNTIL=20261231T000000Z
ежегодно каждый четвертый месяц каждое шестое число до 31 декабря 2026 г.
from
(опционально)Время начала конференции в UnixTime.
duration
(опционально)Продолжительность конференции в секундах.
offset
(опционально)Смещение временной зоны организатора относительно UTC (0) в секундах.
participants
(опционально)Массив объектов, описывающих участников конференции.
name
(опционально)Имя участника
email
Адрес e-mail участника
Возвращаемое значение - словарь с полями:
cid
ID созданной конференции в строковом формате или ID созданной конференции и дополнительные параметры, если есть, в Base64Url после создания ВКС. Строка должна быть URL friendly и не содержать пробелов, двоеточия.
link
Общая ссылка на подключение к конференции.
participantLinks
(опционально)Cловарь, содержащих в себе индивидуальные ссылки на подключение к конференции для всех зарегистрированных участников. Если данная интеграция не поддерживает создание индивидуальных ссылок, параметр можно не указывать, ключ в словаре - aдрес e-mail участника, значение - индивидуальная ссылка для подключения к конференции:
description
(опционально)Подробное описание темы конференции. Если поле будет возвращено, то оно перезапишет данное поле в календарном событии. Возвращённая пустая строка очистит поле в календарном событии.
Ошибка:
error
Текстовое описание ошибки при создании конференции. Если произошла ошибка, поле должно присутствовать.
Точка входа updateConf
updateConf
Обновляет видеоконференцию.
Параметры доступны в словаре
Vars().startParameter
. Аналогичны параметрам точки входаcreateConf
плюсcid
.cid
Идентификатор конференции или идентификатор конференции и дополнительные параметры в Base64Url, необходимые для обновления ВКС.
title
(опционально)Тема конференции.
description
(опционально)Подробное описание темы конференции.
isAllDay
(опционально)Флаг, определяющий тип конференции, если конференция длится целый день с 0 до 24 часов - 1, если конференция имеет любое другое время начало и конца - 0.
rRule
(опционально)Правило повторения события и ВКС, согласно RFC5545, section 3.8.5.3.
Примеры:
FREQ=DAILY;UNTIL=20241215T000000Z
ежедневное повторение, до 15 декабря 2024 г.
FREQ=WEEKLY;BYDAY=SU,MO,TU,WE,TH,FR
еженедельное повторение каждый день недели.
FREQ=MONTHLY;INTERVAL=2;BYMONTHDAY=2;UNTIL=20250328T000000Z
ежемесячно каждый второй месяц второй день до 28 марта 2025 г.
FREQ=MONTHLY;BYDAY=-1SU,-1MO,-1TU,-1WE,-1TH,-1FR,-1SA;UNTIL=20250319T000000Z
ежемесячно каждый последний понедельник, вторник, среду, четверг, пятницу, субботу, воскресенье до 19 марта 2025 г.
FREQ=MONTHLY;INTERVAL=2;BYDAY=1SU,1TU,1FR;UNTIL=20250321T000000Z
ежемесячно каждый второй месяц каждый первый вторник, пятницу, воскресенье до 21 марта 2025 г.
FREQ=YEARLY;BYMONTH=4;BYMONTHDAY=6;UNTIL=20261231T000000Z
ежегодно каждый четвертый месяц каждое шестое число до 31 декабря 2026 г.
from
(опционально)Время начала конференции в UnixTime.
duration
(опционально)Продолжительность конференции в секундах.
offset
(опционально)Смещение временной зоны организатора относительно UTC (0) в секундах.
participants
(опционально)Массив объектов, описывающих участников конференции.
name
(опционально)Имя участника
email
Адрес e-mail участника
Возвращаемое значение - словарь с полями, полностью совпадает по формату с возвращаемым значением точки входа
createConf
.cid
(опционально, возвращается, если при обновлении удалилась старая ВКС)ID созданной конференции в строковом формате. Строка должна быть URL friendly и не содержать пробелов, двоеточия.
link
(опционально, возвращается, если при обновлении удалилась старая ВКС)Общая ссылка на подключение к конференции.
participantLinks
(опционально)Словарь, содержащий в себе индивидуальные ссылки на подключение к конференции для всех зарегистрированных участников. Если данная интеграция не поддерживает создание индивидуальных ссылок, параметр можно не указывать, ключ в словаре - aдрес e-mail участника, значение - индивидуальная ссылка для подключения к конференции.
description
(опционально)Подробное описание темы конференции. Если поле будет возвращено, то оно перезапишет данное поле в календарном событии. Возвращённая пустая строка очистит поле в календарном событии.
Ошибка:
error
Текстовое описание ошибки при обновлении конференции. Если произошла ошибка, поле должно присутствовать.
Точка входа deleteConf
deleteConf
Удаляет видеоконференцию.
Параметры доступны в словаре
Vars().startParameter
:cid
идентификатор конференции или идентификатор конференции и дополнительные параметры в Base64Url, необходимые для удаления ВКС (ID и дополнительные параметры, закодированные в Base64Url, разбирает сам плагин на своё усмотрение).
description
(опционально)Подробное описание темы конференции.
Возвращаемое значение - словарь с полями:
description
(опционально)Подробное описание темы конференции. Если поле будет возвращено, то оно перезапишет данное поле в календарном событии. Возвращённая пустая строка очистит поле в календарном событии.
Ошибка:
error
Текстовое описание ошибки при удалении конференции. Если произошла ошибка, поле должно присутствовать.
Занятость участников
Описывается в секции freebusy
в виде объекта с описаниями предоставляемых расширением скриптов для получения информации о занятости (далее - Free/Busy). Ключ - идентификатор, который будет использоваться для определения типа сервера, откуда будет загружаться информация о занятости внутри CommuniGate Pro. Каждое описание - объект со следующими параметрами:
title
(обязательно)Строка из файлов локализации, которая будет использоваться при отображении в интерфейсе пользователя типа подключаемого источника.
script
(обязательно)Имя (с расширением) находящегося в архиве файла сценария на языке CG/PL, реализующего получение информации о занятости.
config
(опционально)Параметры, передаваемые в скрипт, аналогичны параметрам расширения. Доступны в скрипте в словаре Vars().freebusySettings.
checkConfig
(опционально)Имя (с расширением) находящегося в архиве файла сценария на языке CG/PL, реализующего проверку параметров FreeBusy (из секции config выше).
Пример:
{
"extends": {
"config": {},
"freebusy": {
"CommunigatePro": {
"title": "CommunigateProTitle",
"script": "freebusy.scgp",
"config": {
"Host": {
"type": "string",
"required": true,
"title": "HostTitle"
}
},
"checkConfig": "checkFreeBusyConfig.scgp"
}
}
}
}
Каждый модуль получения информации о доступности / занятости участников (Free/Busy) должен быть отдельным сценарием CG/PL в формате scgp.
Точки входа, которые должны быть реализованы в коде файла сценария, описаны ниже.
Точка входа getFreeBusy
getFreeBusy
Получение информации Free/Busy.
Параметры доступны в словаре
Vars().startParameter
:email
(обязательно)e-mail пользователя для которого запрашивается информация.
timeStart
(опционально)Начало запрашиваемого периода информации о занятости в формате временной метки.
timeEnd
(опционально)Окончание запрашиваемого периода информации о занятости в формате временной метки.
Возвращаемое значение - строка в формате iCalendar Object RFC 5545, section 3.4, включающий в себя компонент RFC 5545, section 3.6.4. В случае ошибки должна возвращаться пустая строка.
В скрипте доступны следующие данные, кроме описанного выше Vars().startParameter
:
Vars().pluginSettings
- словарьОбщие настройки расширения, описанные в
extends/config
Vars().freebusySettings
- словарьНастройки домена получения Free/Busy, описанные в
extends/freebusy/freebusyid_/config
Host
Host адрес почтового сервера для домена
...
Остальные параметры, указанные в секции
extends/freebusy/config
и настроеные администратором сервера/домена.
Пример файла сценария:
entry getFreeBusy is
// email передаётся в словаре startParameter
var param = Vars().startParameter;
var email = param.email;
var timeStart = param.timeStart;
var timeEnd = param.timeEnd;
if (isDate(timeStart)) {
// обработать временные данные
}
// pluginSettings и freebusySettings общие для запросов на данный Free/Busy домен (в сервере передаётся как переменные среды окружения env)
var pluginSettings = Vars().pluginSettings;
var freebusySettings = Vars().freebusySettings;
var host = freebusySettings.Host;
// отправиляем запрос за информацией
var params = NewDictionary();
params.responseFormat = "";
var url = host + "~" + email + "/freebusy.vfb";
var httpResult = HTTPCall(url, params);
if (isString(httpResult)) {
SetResult(httpResult);
} else {
SetResult(httpResult.body);
}
end entry;
Файл сценария проверки параметров получения информации о доступности / занятости участников (Free/Busy) может как выполнять базовые проверки по регулярным выражениям или заполнению полей, так и проверять корректность введённых параметров путём обращения к внешнему серверу. Это должен быть отдельный сценарий в формате scgp. В файле сценария должен содержаться метод checkConfig
, выполняющий проверку параметров конфигурации Free/Busy, доступных ему через словарь Vars().freebusySettings окружения запуска сценария. Так же доступны общие парамеры расширения в словаре Vars().pluginSettings.
Пример файла сценария проверки параметров Free/Busy:
entry checkConfig {
// Общие настройки расширения, если необходимы
var pluginSettings = Vars().pluginSettings;
// Настройки Free/Busy
var freebusySettings = Vars().freebusySettings;
if (Length(freebusySettings.Host) == 0) {
SetResult("Host is empty");
stop;
}
if (Length(freebusySettings.Password) < 6) {
SetResult("Password too short");
stop;
}
var req = NewDictionary();
req.method = "GET";
var res = HTTPCall(freebusySettings.Host), req);
if (!res.isDictionary()) {
SetResult("failed to connect to server");
stop;
}
}
Помощники
В расширении можно добавить исполняемые файлы помощников (как бинарные, так и на скриптовых языках). Используются так же как и установленные и настроенные на странице Помощники.
Помощники в расширениях могут быть двух типов: фильтрации сообщений и помощники приложений. Имя помощника определяется названием секции в cgplugin.json
. Включение помощников осуществляется включением выключением расширения. Настройка помощников осуществляется со страницы настройки расширения. Параметры настройки определяются также в cgplugin.json
. Помощникам, установленным в составе расширений, доступны настройки расширения. Для получения настроек расширения помощник должен отправить серверу (после установки версии протокола) GETCONFIG
, подписка на обновление конфигурации расширения, команда серверу SUBSCRIBECONFIG
и ответ сервера в случае изменения настроек CONFIGUPDATED
. Описание протокола.
Пример протокола (I - сообщения сервера, O - сообщения помощника):
O: H00007 GETCONFIG
I: H00007 OK { type = "cat" }
O: H00005 SUBSCRIBECONFIG
I: H00005 OK
I: 00010 CONFIGUPDATED { type = "dog" }
O: 00010 OK
Помощники определяются в объекте helpers
объектами с описаниями программ для разных архитектур. В разделе all
могут быть указаны помощники, написанные на скриптовых языках и независимые от архитектуры, при этом, если для текущей архитектуры будет переопределён helper_id
, то будет использоваться именно он. (в примере ниже на архитектуре x86_64 будут запущены два помощника: all/@helper_id1
и x86_64/helper_id2
). Наличие в секции config
параметров LogLevel
, RestartPause
, Timeout
необходимо для задания настройки помощников в расширении. Если они не заданы, то сервер установит в этом случае предопределённые настройки.
{
"extends": {
"config": {
"LogLevel": {
"type": "string",
"required": false,
"title": "LogLevelTitle"
},
"RestartPause": {
"type": "string",
"required": false,
"title": "RestartPauseTitle"
},
"Timeout": {
"type": "string",
"required": false,
"title": "TimeoutTitle"
},
"SomeExtensionParameter1": {
"type": "string",
"required": false,
"title": "SomeExtensionParameter1Title"
},
"SomeExtensionParameter2": {
"type": "string",
"required": false,
"title": "SomeExtensionParameter2Title"
}
},
"helpers": {
"all": {
"helper_id1": {
"system_exe": "/usr/bin/bash",
"exe": "script1.sh",
"params": "--logAll -k value1 --key2=value2",
"type": "filter"
},
"helper_id2": {
"system_exe": "/usr/bin/perl",
"exe": "script2.pl",
"params": "--p1 --p2 --p3",
"type": "app"
}
},
"x86_64": {
"helper_id2": {
"exe": "program2",
"params": "--p1 --p2",
"type": "app"
}
}
}
}
}
В описании помощников в расширениях должен быть задан хотя бы один из элементов system_exe
, exe
.
system_exe
(опционально) - исполняемый файл, уже присутствующий в системе, предполагался для указания интерпретатора скриптового языка.exe
(опционально) - исполняемый файл в составе расширения, бинарный или на скриптовом языке.params
(опционально) - Параметры, передаваемые помощнику.type
(обязательно) - тип помощника,app
илиfilter
.
Интерфейсы
В расширении можно добавить файлы интерфейсов (wssp, wcgp, изображения, js, css...) Файлы из расширения будут использоваться при совпадении имени скина и имени файла. Порядок поиска файлов скинов: интерфейсы, заданные для домена, "общесерверные" интерфейсы, интерфейсы в расширениях, интерфейсы в поставке сервера (стоковые). При этом в расширениях может только один раз указываться конкретный интерфейс. Если расширение выключено, указанные в нём файлы и скины не участвуют в поиске. При включении / выключении расширения с файлами интерфейсов на сервере происходит сброс кэша интерфейсов.
Описывается в секции WebSkins
в виде объекта с именами интерфейсов, где в каждом объекте указывается каталог с файлами или список файлов. Для неименованного интерфейса можно указать в качестве имени интерфейса (объекта с описанием используемых файлов) пустую строку или строки unnamed
, noname
{
"extends": {
"WebSkins": {
"": {
"dirs": ["WebSkins"]
},
"hPronto-": {
"files": ["login.wssp", "login.css"]
}
}
}
}
В описании интерфейсов в расширениях должно быть задано хотя бы одно из dirs
, files
. Все файлы, перечисленные в массиве files
, должны присутствовать в расширении, как и каталог, если таковой указан в dirs
.
dirs
(опционально) - список каталогов (не более 1 каталога) с файлами интерфейса.files
(опционально) - файлы интерфейса, лежащие в корне расширения.
Технология единого входа (Single sign-on)
В расширении указывается список методов авторизации SSO. Для этого необходимы скрипты wcgp из неименованного (базового) скина. Данное расширение "несамостоятельно" и требует наличия точки расширения Интерфейсы (WebSkins) с неименованным интерфейсом.
Описывается в массиве SingleSignOn
список объектов с полями
script
(обязательно) - имя файла скриптаwcgp
, добавляемого тем же плагином, на который Web-интерфейс потом будет перенаправлен при нажатии соответствующей кнопки на экране входа (должен быть в плагине и добавлен в неименованный интерфейс).title
(обязательно) - cтрока из файлов локализации, которая будет использоваться при отображении метода входа.icon
- (опционально) имя файла в форматеsvg
иконки. (Файл должен быть в плагине и добавлен в неименованный интерфейс)
Пример
{
"extends": {
"WebSkins": {
"unnamed": {
"dirs": ["WebSkins"]
}
},
"SingleSignOn": [
{
"script": "sso1.wcgp",
"title": "Title1",
"icon": "icon1.svg"
},
{
"script": "sso2.wcgp",
"title": "Title2"
}
]
}
}
Файлам wcgp и wssp доступен список Single Sign-On, как массив словарей по переменной SingleSignOnList
.
Каждый элемент массива - словарь с полями, описанными выше: script
, title
, icon
(опционально). Кроме того, в каждом элементе есть поле PluginId
, его можно использовать для перевода поля title
(подстановки строк из файла локализации плагина).