User Tools

Site Tools


communigate_pro_2020

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

communigate_pro_2020 [2021/06/08 07:37]
admin created
communigate_pro_2020 [2026/06/25 08:44] (current)
val
Line 1: Line 1:
-====== Communigate Pro 2020 ======+====== Communigate Pro 2025 ======
  
   * [[https://​www.communigate.ru/​|Официальный сайт]]   * [[https://​www.communigate.ru/​|Официальный сайт]]
   * [[https://​www.communigate.ru/​CommuniGatePro/​russian/​|Документация к платформе CommuniGate Pro и руководство Администратора]]   * [[https://​www.communigate.ru/​CommuniGatePro/​russian/​|Документация к платформе CommuniGate Pro и руководство Администратора]]
   * [[http://​wiki.rsu.edu.ru/​wiki/​Communigate_Pro|Полнофункциональная система унифицированных коммуникаций (почта+телефония+IM) с защитой от вирусов,​ спама и нежелательного контента,​ с возможностью обучения фильтра пользователями]]   * [[http://​wiki.rsu.edu.ru/​wiki/​Communigate_Pro|Полнофункциональная система унифицированных коммуникаций (почта+телефония+IM) с защитой от вирусов,​ спама и нежелательного контента,​ с возможностью обучения фильтра пользователями]]
 +  * Разобраться:​ в чем особенности The 4th Version Mailbox (.mb4) Format ​
 ===== Модуль 1. Установка,​ интерфейс администрирования и запуск CGP ===== ===== Модуль 1. Установка,​ интерфейс администрирования и запуск CGP =====
  
 +  * [[https://​youtu.be/​8gEMcyh1OkA|Communigate - импортзамещение по настоящему]]
 ===== Теория ===== ===== Теория =====
  
   * [[https://​ru.wikipedia.org/​wiki/​CommuniGate_Pro|CommuniGate Pro - Википедия]]   * [[https://​ru.wikipedia.org/​wiki/​CommuniGate_Pro|CommuniGate Pro - Википедия]]
   * [[http://​ru.wikipedia.org/​wiki/​Унифицированные_коммуникации|Унифицированные коммуникации]]   * [[http://​ru.wikipedia.org/​wiki/​Унифицированные_коммуникации|Унифицированные коммуникации]]
-  * Примеры больших клиентов ([[http://www.connect.ru/newsdetail.asp?id=6605|Tele2]], [[http://​www.amby.ru/​news-24.01.2006.html|SIPnet]])+  * Примеры больших клиентов ([[https://www.communigate.ru/Papers/​Initial_installation.pdf|TELE2, Beeline, AT&T, T­mobile]], [[http://​www.amby.ru/​news-24.01.2006.html|SIPnet]])
   * [[http://​www.communigate.com/​CommuniGatePro/​russian/​|Документация]]   * [[http://​www.communigate.com/​CommuniGatePro/​russian/​|Документация]]
  
Line 17: Line 19:
 ==== 1.1 Схема стенда,​ настройка системы ==== ==== 1.1 Схема стенда,​ настройка системы ====
  
 +  * !!! Используем **Debian 11** !!!
   * 2Gb ОЗУ (clamav)   * 2Gb ОЗУ (clamav)
   * [[Настройка стендов слушателей]]   * [[Настройка стендов слушателей]]
Line 32: Line 35:
 </​code>​ </​code>​
  
-  * [[Локализация системы#Локализация временной зоны]]+  * Настраиваем подключение и подключаемся через PuTTY, тестируем работу сети
  
-==== 1.2 Установка сервера ==== +<​code>​ 
-  ​[[http://www.communigate.ru/main/purchase/download.html|Скачать ​дистрибутив]] +root@server:​~#​ ping ya.ru 
-  * [[ftp://ftp.communigate.ru/pub/​CommuniGatePro/​]]+ 
 +root@server:​~#​ apt update 
 +</​code>​ 
 +==== 1.2 Развертывание инфраструктуры Microsoft AD и CA ==== 
 + 
 +  ​- Импорт системы MS Server 2016 server.corpX.un (включение в сеть класса) 
 +  - Импорт системы MS Windows 10 clientN 
 +  - Переименование MS Server 2016 в server 
 +  - Установка ​[[http://gate.isp.un/unix/Microsoft/SW_DVD5_Office_Professional_Plus_2016_64Bit_Russian_MLF_X20-42453.ISO|MS Office]] в Windows 10 
 +  - Установка [[https://​www.google.com/​chrome/​|Chrome]],​ [[https://​www.thunderbird.net/​en-US/​|Thunderbird]] в Windows 10 
 +  - Назначение роли AD corpX.un (лучше перед этим назначить IP 172.16.1.X) 
 +  - Назначение роли CA (после AD!!!) 
 +  - Назначение IP 172.16.1.X/​24 MS Server 2016  
 +  - Настройка DNS clientN на server 
 +  - Включение clientN в домен 
 +  - Добавление в DNS на server записи mail.corpX.un (!!! Это все понадобится ​уже в 3-м модуле) 
 +  - [[Материалы по Windows#​Установка русского Language pack в Windows Server 2016]] (не обязательно,​ и может быть уже произведена) 
 +  - Добавление в домен user1/​Pa$$w0rd1 (возможно,​ не понадобится) 
 + 
 +==== 1.3 Установка CGP сервера ==== 
 + 
 +  * [[https://communigatepro.ru/server|Скачать дистрибутив с communigatepro.ru]]
  
 === Debian/​Ubuntu === === Debian/​Ubuntu ===
 <​code>​ <​code>​
-# wget http://www.communigate.ru/pub/​CommuniGatePro/CGatePro-Linux_amd64.deb+# wget https://doc.communigatepro.ru/packages/CGatePro-Linux_6.5-5_amd64.deb
  
 # dpkg -i CGatePro*.deb # dpkg -i CGatePro*.deb
 +
 +# dpkg -l | grep cgatepro-linux
  
 # service CommuniGate start # service CommuniGate start
Line 50: Line 76:
  
  
-==== 1.Первоначальная настройка ==== +==== 1.Первоначальная настройка ====
- +
-  * [[http://​172.16.1.100+X:​8010]]+
  
 <​code>​ <​code>​
 +http://​172.16.1.100+X:​8010
 +</​code><​code>​
 Postmaster Password: xxxxxx Postmaster Password: xxxxxx
 Main Domain Name: corpX.un Main Domain Name: corpX.un
Line 70: Line 96:
 </​code>​ </​code>​
  
-==== 1.Тестирование работоспособности почтовой подсистемы ====+==== 1.Тестирование работоспособности почтовой подсистемы ====
  
 <​code>​ <​code>​
Line 77: Line 103:
  
 # echo Hello | mail -s Hello postmaster@localhost # echo Hello | mail -s Hello postmaster@localhost
- 
-# cat /​var/​CommuniGate/​Accounts/​postmaster.macnt/​INBOX.mbox 
- 
-  или 
  
 # cat /​var/​CommuniGate/​Accounts/​postmaster.macnt/​INBOX.mslc/​data1 # cat /​var/​CommuniGate/​Accounts/​postmaster.macnt/​INBOX.mslc/​data1
Line 109: Line 131:
 <​code>​ <​code>​
 Users->​Account Defaults->​ Users->​Account Defaults->​
-  Settings->​ 
-    Password Encryption: A-crpt 
   Mail Settings->​   Mail Settings->​
     Mailbox Storage: Mail Storage Limit: 3G     Mailbox Storage: Mail Storage Limit: 3G
Line 118: Line 138:
   Mailbox Storage: Mail Storage Limit: 10G   Mailbox Storage: Mail Storage Limit: 10G
 # cat /​var/​CommuniGate/​Accounts/​Settings/​domain.settings | grep AccountDefaults # cat /​var/​CommuniGate/​Accounts/​Settings/​domain.settings | grep AccountDefaults
 +
 +# cat /​var/​CommuniGate/​Domains/​compX.un/​Settings/​domain.settings | grep AccountDefaults
  
 Users->​Domains->​corpX.un->​Objects->​Template->​Mail Settings Users->​Domains->​corpX.un->​Objects->​Template->​Mail Settings
Line 145: Line 167:
  
   * [[https://​communigate.ru/​communigatepro/​russian/​CLI.html|Интерфейс Командной Строки / API]]   * [[https://​communigate.ru/​communigatepro/​russian/​CLI.html|Интерфейс Командной Строки / API]]
 +  * [[Настройка терминалов]]
  
 <​code>​ <​code>​
Line 176: Line 199:
 QUIT QUIT
 </​code>​ </​code>​
 +
  
 ==== 2.4 Создание учетной записи из внешней программы ==== ==== 2.4 Создание учетной записи из внешней программы ====
 +
  
   * [[https://​pypi.org/​project/​CGPCLI/​|CGPCLI is Python libary that allows you to reach CGP servers and execute CLI commands from your Python code.]]   * [[https://​pypi.org/​project/​CGPCLI/​|CGPCLI is Python libary that allows you to reach CGP servers and execute CLI commands from your Python code.]]
Line 183: Line 208:
 **Примечание**:​ демонстрирует преподаватель **Примечание**:​ демонстрирует преподаватель
  
 +  * Программирование диалогов expect [[Программирование диалогов expect#​Communigate CLI]]
   * Perl [[Язык программирования Perl#​Пример 5]]   * Perl [[Язык программирования Perl#​Пример 5]]
  
-==== 2.5 Создание пользователей с помощью ​текстового файла ====+==== 2.5 Импорт информации о пользователях из текстового файла ====
  
 **Примечание**: ​ **Примечание**: ​
   - использовать кодировку utf-8 и табуляцию между столбцами   - использовать кодировку utf-8 и табуляцию между столбцами
-  - добавить символ новой строки в конце файла+  - добавить символ новой строки в конце файла, но, без лишних пустых строк
   - атрибут telephoneNumber убрать,​ появится в следующих лабораторных работах   - атрибут telephoneNumber убрать,​ появится в следующих лабораторных работах
   - удалить пользователей по окончании работы   - удалить пользователей по окончании работы
Line 200: Line 226:
  
 ==== 2.6 Управление дополнительным доменами в CGP ==== ==== 2.6 Управление дополнительным доменами в CGP ====
- 
-=== Настройка дополнительного ip адреса (ip alias) в ОС === 
- 
-  * [[Настройка сети в Linux#​Статическая настройка параметров]] (потребуется перезапуск CGP) 
  
 === Создаем новый домен === === Создаем новый домен ===
Line 212: Line 234:
 === Создаем пользователя в новом домене и назначаем ему права администратора === === Создаем пользователя в новом домене и назначаем ему права администратора ===
 <​code>​ <​code>​
 +Права в основном домене
 +# less /​var/​CommuniGate/​Accounts/​Settings/​access.settings
 +
 Users->​Domains->​compX.un->​Objects->​Create Account: user3 Users->​Domains->​compX.un->​Objects->​Create Account: user3
  
Line 226: Line 251:
 </​code>​ </​code>​
  
-=== Для будущей поддержки SSL/TLS привязываем домены ​к разным адресам сервера ===+=== Настройка DNS ===
 <​code>​ <​code>​
-Users->​Domains->​compX.un->Domain Settings->​Assigned IP Addresses->​[172.16.1.200+X]+mail.corpX.un. A 172.16.1.100+X
  
-Users->​Domains->​corpX.un->​Domain Settings->​Assigned IP Addresses->[172.16.1.100+X], [127.0.0.1]+mail.compX.un. A 172.16.1.100+X 
 +</​code>​ 
 + 
 +=== Настройка алиасов доменов === 
 +<​code>​ 
 +Users->​Domains->​corpX.un->​Domain Settings->​Domain Aliases: mail.corpX.un 
 + 
 +Users->Domains->​compX.un->​Domain Settings->​Domain Aliases: mail.compX.un
 </​code>​ </​code>​
  
 === Логинемся как user3 из домена compX.un и управляем доменом === === Логинемся как user3 из домена compX.un и управляем доменом ===
 <​code>​ <​code>​
-http://172.16.1.200+X:8010/+http://mail.compX.un:8010/
 </​code>​ </​code>​
  
Line 261: Line 293:
 ===== Лабораторные работы ===== ===== Лабораторные работы =====
  
 +  * !!! Для корректной работы с сертификатом достаточно ввести windows clientN в домен, подключаемся локальной учетной записью до лабораторной работы с GSSAPI
 ==== 3.1 Создание сертификата TLS для доменов ==== ==== 3.1 Создание сертификата TLS для доменов ====
  
-=== Настройка DNS === 
-<​code>​ 
-mail.corpX.un. A 172.16.1.100+X 
- 
-mail.compX.un. A 172.16.1.200+X 
-</​code>​ 
- 
-=== Настройка алиасов доменов === 
-<​code>​ 
-Users->​Domains->​corpX.un->​Domain Settings->​Domain Aliases: mail.corpX.un 
- 
-Users->​Domains->​compX.un->​Domain Settings->​Domain Aliases: mail.compX.un 
-</​code>​ 
 === Сертификат для домена corpX.un === === Сертификат для домена corpX.un ===
 <​code>​ <​code>​
Line 283: Line 303:
 </​code><​code>​ </​code><​code>​
 Private Key  Private Key 
-Key Size: 1024+Key Size: 2048
 </​code><​code>​ </​code><​code>​
 Generate Key Generate Key
 Certificate Generator Certificate Generator
 Common Name: mail.corpX.un Common Name: mail.corpX.un
 +Alternative Name: mail.corpX.un ​   !!!Для Chrome
 Country: RU Country: RU
 State/​Province:​ Moscow region State/​Province:​ Moscow region
Line 298: Line 319:
   * Либо Generate Self Signed либо [[Материалы по Windows#​Windows CA для Linux сервисов]]   * Либо Generate Self Signed либо [[Материалы по Windows#​Windows CA для Linux сервисов]]
  
- 
-=== Сертификат для домена compX.un === 
-<​code>​ 
-Безопасность->​SSL/​TLS->​Генератор Сертификатов->​Имя-Идентификатор:​ mail.compX.un 
-</​code>​ 
  
 ==== 3.2 Подключение почтовых клиентов ==== ==== 3.2 Подключение почтовых клиентов ====
Line 313: Line 329:
 === По протоколам SMTP и IMAP === === По протоколам SMTP и IMAP ===
  
-  * Развернуть систему ​client1+  * [[Протокол IMAP]] 
 +  * [[Сервис MTA#Протокол SMTP]] 
 +  * Ввести ​систему ​clientN в домен, если используется сертификат,​ подписанный Microsoft CA
   * [[https://​mail.bmstu.ru/​~postmaster/​5.Dostup_k_serveru_s_ispol'​zovaniem_pochtovogo_klienta_Mozilla_Thunderbird.pdf|Доступ к серверу с использованием почтового клиента Mozilla Thunderbird]]   * [[https://​mail.bmstu.ru/​~postmaster/​5.Dostup_k_serveru_s_ispol'​zovaniem_pochtovogo_klienta_Mozilla_Thunderbird.pdf|Доступ к серверу с использованием почтового клиента Mozilla Thunderbird]]
  
 === По протоколам MS Exchange и Active Sync === === По протоколам MS Exchange и Active Sync ===
-  * [[https://​www.communigate.ru/​pub/​client/​]] (проверенная версия CGatePro-MAPI-AMD64-1.54.12.35.msi.zip) +
-  * Работу выполнять на host системе,​ через Панель Управления->​Mail+
   * Имя пользователя указывать полностью,​ с доменом   * Имя пользователя указывать полностью,​ с доменом
-  ​[[http://wiki.rsu.edu.ru/wiki/​%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_Microsoft_Outlook_2007|Настройка Microsoft Outlook 2007 для сервера rsu.edu.ru]], ​[[https://​mail.bmstu.ru/​~postmaster/​6.Dostup_k_serveru_s_ispol'​zovaniem_pochtovogo_klienta_Microsoft_Outlook.pdf|Доступ к серверу mail.bmstu.ru с использованием почтового клиента Microsoft Outlook]]+ 
 +  ​https://communigatepro.ru/plugins#​mapi 
 +  * [[https://​mail.bmstu.ru/​~postmaster/​6.Dostup_k_serveru_s_ispol'​zovaniem_pochtovogo_klienta_Microsoft_Outlook.pdf|Доступ к серверу mail.bmstu.ru с использованием почтового клиента Microsoft Outlook]]
  
 ==== 3.3 Подключение через web интерфейс ==== ==== 3.3 Подключение через web интерфейс ====
Line 336: Line 355:
  
 === Выбор интерфейса и локализация пользователя === === Выбор интерфейса и локализация пользователя ===
- 
-**Примечание**:​ при первом подключении установить само подписанный сертификат в базу данных доверенных сертификатов серверов в firefox 
  
 <​code>​ <​code>​
Line 350: Line 367:
 </​code>​ </​code>​
  
-=== Управление подключениями ===+=== Локализация сообщений === 
 + 
 +<​code>​ 
 +Master->​Settings->​Strings 
 + 
 +# cat /​var/​CommuniGate/​Settings/​Strings.settings 
 +</​code>​ 
 + 
 +=== Управление подключениями и блокировками ===
 <​code>​ <​code>​
 Monitors->​Access->​Sessions Monitors->​Access->​Sessions
  
 KILLACCOUNTSESSIONS user1 KILLACCOUNTSESSIONS user1
 +
 +GETTEMPBLACKLISTEDIPS
 +...
 +
 +TEMPBLACKLISTIP 10.5.N.M DELETE
 </​code>​ </​code>​
  
Line 371: Line 401:
  
 == Синхронизация == == Синхронизация ==
 +
 +<​code>​
 +попробуйте на всех нодах удалить - создать все записи
 +в разделе центральный справочник,​ вот по этому пути: Пользователи -> Домены -> domain.name -> Установки Домена
 +
 +USERS->​DOMAINS->​corpX.un->​DOMAIN SETTINGS->​Directory Integration
 +</​code>​
  
 <​code>​ <​code>​
Line 382: Line 419:
 USERS->​ACCOUNT DEFAULTS->​PREFERENCES USERS->​ACCOUNT DEFAULTS->​PREFERENCES
   Contacts:   Contacts:
-    Name: Адресная книга ​corp9+    Name: Адресная книга
     Search Base: $domain$     Search Base: $domain$
 </​code>​ </​code>​
Line 403: Line 440:
  
 <​code>​ <​code>​
 +# less /​var/​CommuniGate/​Directory/​Main.data
 +
 # ldapsearch -x -D "​user1@corpX.un"​ -W -b"​cn=corpX.un"​ -H ldaps://​mail.corpX.un:​636 ​ # ldapsearch -x -D "​user1@corpX.un"​ -W -b"​cn=corpX.un"​ -H ldaps://​mail.corpX.un:​636 ​
 +</​code><​code>​
 +USERS->​DOMAINS-corpX.un->​Domain Settings
 +  Directory Integration->​Delete All
 +
 +USERS->​Directory Integration->​Regular Domains->​Passwords
 +
 +DIRECTORY->​Units->​Main
 +  Remove Unit
 +
 +DIRECTORY->​Units
 +  Create Local Unit->​Unit Name: Main
 +  ​
 +USERS->​DOMAINS-corpX.un->​Domain Settings
 +  Directory Integration->​Insert All
 +</​code><​code>​
 +# ldapsearch -x -D "​uid=user1,​cn=corpX.un"​ ...
 </​code>​ </​code>​
  
Line 417: Line 472:
 </​code>​ </​code>​
  
-  * Добавление атрибутов+=== Добавление атрибутов ​===
 <​code>​ <​code>​
 Directory->​Units->​Main->​Schema Directory->​Units->​Main->​Schema
 +...
 +telephoneNumber
 +...
  
 Users->​Directory Integration Users->​Directory Integration
Line 425: Line 483:
 </​code>​ </​code>​
  
-== Подключение адресной книги к почтовому клиенту ==+=== Подключение адресной книги к почтовому клиенту ​===
  
   * [[Thunderbird#​Получение списка контактов через LDAP]] в Thunderbird   * [[Thunderbird#​Получение списка контактов через LDAP]] в Thunderbird
Line 449: Line 507:
 </​code>​ </​code>​
  
-=== Заменяем логотип в Samoware ​интерфейсе === +=== Заменяем логотип в Pronto ​интерфейсе ===
- +
-  * [[http://​val.bmstu.ru/​unix/​CGP/​logo-big-samoware.svg]]+
  
 <​code>​ <​code>​
 # find /​opt/​CommuniGate/​WebSkins/​ -type d # find /​opt/​CommuniGate/​WebSkins/​ -type d
  
-Named Skins: Create: ​Samoware+Named Skins: Create: ​hPronto-
  
-Upload File: logo-big-samoware.svg+Upload File: logo-big.png
  
 # find /​var/​CommuniGate/​Accounts/​WebSkins/​ # find /​var/​CommuniGate/​Accounts/​WebSkins/​
Line 516: Line 572:
  
 corpX.un. MX 10 mail.corpX.un. corpX.un. MX 10 mail.corpX.un.
- 
-mail.corpX.un. A 172.16.1.200+X 
- 
-compX.un. MX 10 mail.corpX.un. 
 </​code>​ </​code>​
  
Line 531: Line 583:
 === Почтовый relay для локальной сети === === Почтовый relay для локальной сети ===
  
-  * Продемонстрировать отправку письма без аутентификации из локальной сети на внешний ящик+  * Можно продемонстрировать отправку письма без аутентификации из локальной сети на внешний ящик
  
 <​code>​ <​code>​
Line 545: Line 597:
 ==== 4.2 Использование встроенных средств CGP для борьбы со SPAMом ==== ==== 4.2 Использование встроенных средств CGP для борьбы со SPAMом ====
  
-  * [[http://systemzone.ru/misc/​sommunigate/​522-ispolzovanie-vstroennyx-vozmozhnostej-communigate-pro-dlya-borby-so-spamom.html|Использование встроенных возможностей CommuniGate Pro для борьбы со спамом]]+  * [[http://system-administrators.info/?p=1893|Использование встроенных возможностей CommuniGate Pro для борьбы со спамом]]
  
 === Настройка параметров приемника SMTP === === Настройка параметров приемника SMTP ===
Line 572: Line 624:
  
 === Помощь пользователей === === Помощь пользователей ===
- 
-  * [[https://​www.communigate.ru/​main/​purchase/​scriptrepository.html|Библиотека скриптов для CommuniGate Pro (бесплатно)]] 
  
 в файле strings.data в строках SpamFalseNegativeReportEmail и SpamFalsePositiveReportEmail можете указать адреса,​ куда перенаправлять неправильно определённые письма,​ тогда появятся кнопки для этого в файле strings.data в строках SpamFalseNegativeReportEmail и SpamFalsePositiveReportEmail можете указать адреса,​ куда перенаправлять неправильно определённые письма,​ тогда появятся кнопки для этого
  
 +[[https://​val.bmstu.ru/​unix/​CGP/​Scripts.zip|Библиотека скриптов для CommuniGate Pro (бесплатно)]] содержит [[https://​val.bmstu.ru/​unix/​CGP/​sweepMailboxes.pl|программу для массового удаления вредоносных писем]] ​
 ==== 4.3 Использование внешних фильтров для борьбы с вирусами и SPAMом ==== ==== 4.3 Использование внешних фильтров для борьбы с вирусами и SPAMом ====
  
Line 584: Line 635:
 === Развертывание антивируса === === Развертывание антивируса ===
  
-  * !!! Тестировать с client1 отключив через поиск Параметры Защитника Windows и наблюдая clamav.log 
   * [[Сервис Clamav]]   * [[Сервис Clamav]]
   * Модуль AppArmor [[Модуль AppArmor#​Определение наличия и правка профилей для служб]]   * Модуль AppArmor [[Модуль AppArmor#​Определение наличия и правка профилей для служб]]
   * [[http://​media.kaspersky.com/​utilities/​ConsumerUtilities/​eicar.zip|eicar.zip]]   * [[http://​media.kaspersky.com/​utilities/​ConsumerUtilities/​eicar.zip|eicar.zip]]
 <​code>​ <​code>​
 +# wget -O /​var/​CommuniGate/​eicar.zip http://​media.kaspersky.com/​utilities/​ConsumerUtilities/​eicar.zip
 +
 # usermod -G mail clamav # usermod -G mail clamav
  
Line 620: Line 672:
  
 # ./configure --with-antivirus=clamav --with-spamassassin=yes --with-cgpro_dir=/​var/​CommuniGate # ./configure --with-antivirus=clamav --with-spamassassin=yes --with-cgpro_dir=/​var/​CommuniGate
 +...
 +3 Without database support
  
 # make && make install # make && make install
Line 663: Line 717:
 Parameter: ClamSpam Parameter: ClamSpam
 </​code>​ </​code>​
 +
 +=== Тестирование ===
 + 
 +  * Вирусы - файл eicar с client1, отключив через поиск "​Параметры Защитника Windows"​ и наблюдая clamav.log
 +  * Спам - отравкой сообщения с одним словом,​ можно как при тестровании в п.1.5 и наблюдая syslog
  
 === Использование простых правил управления спамом === === Использование простых правил управления спамом ===
Line 688: Line 747:
 GETACCOUNTMAILRULES user1 GETACCOUNTMAILRULES user1
  
 +!!! Это пример,​ лучше включить Junk Mail Control для учетной записи пользователя в интерфейсе администрирования !!! 
 SETACCOUNTMAILRULES user1 ((3, MoveSpam,​(("​Header Field",​ in, "​X-Junk-Score*XXXXXXXXXX*"​)),​ (("​Store in", "​~/​Junk"​),​ (Discard)))) SETACCOUNTMAILRULES user1 ((3, MoveSpam,​(("​Header Field",​ in, "​X-Junk-Score*XXXXXXXXXX*"​)),​ (("​Store in", "​~/​Junk"​),​ (Discard))))
 </​code>​ </​code>​
Line 719: Line 779:
 <​code>​ <​code>​
   Set Reply-To to Group: no   Set Reply-To to Group: no
 +  E-mails from Members Only: no
 +  Hide in Directory: no
 </​code>​ </​code>​
  
-  * Создаем правила,​ меняющие заголовок для писем в группу,​ и заменяющие Reply-To для писем из группы ​+  * Создаем правила,​ меняющие заголовок для писем в группу,​ и заменяющие Reply-To для писем из группы 
 +  * !!! Если создавать через CLI SETSERVERMAILRULES,​ надо все оформить одной строкой и _убрать_ коментарии на русском !!! 
 +  * Правило replace_from_group1 подразумевает указание в поле To только адрес того, кому отвечаем,​ адрес группы надо указвать в поле Cc. Возможно,​ удобенее не использовать это правило,​ а отвечать,​ указывая группу в качестве обратного адреса ​
  
 <​code>​ <​code>​
Line 731: Line 795:
     6,     6,
     mark_to_group1,​     mark_to_group1,​
-    ((Subject, "is not", "​*[group1]*"​),​ ("Any To or Cc", is, "*group1@corpX*")),+    ((Subject, "is not", "​*[group1]*"​),​ ("Any To or Cc", is, "​group1@*"​)),​
     (("Tag Subject",​ "​[group1] ")),     (("Tag Subject",​ "​[group1] ")),
     "​Помечаем тему всех писем, идущих в группу"​     "​Помечаем тему всех писем, идущих в группу"​
Line 738: Line 802:
     4,     4,
     replace_from_group1,​     replace_from_group1,​
-    ((Subject, is, "​*[group1]*"​),​ (To, "is not", "​*group1@corpX*")),+    ((Subject, is, "​*[group1]*"​),​ (To, "is not", "​*group1@*"​)),​
     (("Add Header",​ "​Reply-To:​ group1@corpX.un"​)),​     (("Add Header",​ "​Reply-To:​ group1@corpX.un"​)),​
     "​Устанавливаем Reply-To в группу для всех ответов из группы"​     "​Устанавливаем Reply-To в группу для всех ответов из группы"​
Line 747: Line 811:
 === Использование общих папок и прав доступа к ним === === Использование общих папок и прав доступа к ним ===
  
-  * Для ​user1:+  * Для ​postmaster:
 <​code>​ <​code>​
 + Create Folder-> ​ + Create Folder-> ​
   Имя Папки: group1   Имя Папки: group1
   Folder location: Root   Folder location: Root
- 
  
 group1 * group1 *
   Открыть доступ к папке   Открыть доступ к папке
 +    user1     ​Запись
     user2     ​Запись     user2     ​Запись
 </​code>​ </​code>​
  
-  * user2:+  * user1 и user2
 <​code>​ <​code>​
 Папки->​Управление->​Псевдонимы Папок Папки->​Управление->​Псевдонимы Папок
  
 Имя Псевдонима:​ group1 Имя Псевдонима:​ group1
-Имя Папки: ~user1/group1+Имя Папки: ~postmaster/group1
 </​code>​ </​code>​
  
-=== Использование расширеного формата почтовых адресов ===+=== Использование расширенного формата почтовых адресов ===
 <​code>​ <​code>​
-gate.isp.un% mail group1#​user1@corpX.un +# echo Hello | mail -s Hello group1#postmaster@corpX.un
- +
-mail.corpX.un# echo Hello | mail -s Hello group1#user1@corpX.un+
 </​code>​ </​code>​
  
Line 782: Line 844:
 Settings->​Router Settings->​Router
 ... ...
-<​group1@corpX.un>​ = group1#user1@corpX.un+<​group1@corpX.un>​ = group1#postmaster@corpX.un
 ... ...
 </​code>​ </​code>​
Line 791: Line 853:
  
 <​code>​ <​code>​
-Users->​Domains-corpX.un->​Objects->​user1->​Settings+Users->​Domains-corpX.un->​Objects->​postmaster->​Settings
 Aliases: group1 Aliases: group1
 </​code>​ </​code>​
  
-  * От имени ​user1 создаем правила:​+  ​* [[https://​doc.communigatepro.ru/​russian/​development/​Rules.html]] 
 +  * [[https://​doc.communigatepro.ru/​admin/​mail/​QueueRules.html]] 
 +  * Операции условий равно ( is ) и не равно обрабатывают параметры как "​шаблоны"​ строки:​ символы звёздочка (*)  
 +  * Операции условий среди ( in ) и не среди обрабатывают параметры как наборы из одной или нескольких "​шаблонов",​ разделённых символами запятой (,) 
 +  ​* От имени ​postmaster ​создаем правила:​
  
 <​code>​ <​code>​
Line 801: Line 867:
   Добавить Правило:​ Move to group1   Добавить Правило:​ Move to group1
   Изменить   Изменить
-    Любой Кому/​Копия:​ равно ​*group1*+    Любой Кому/​Копия:​ равно group1@*
     Записать в: group1     Записать в: group1
     Выбросить     Выбросить
Line 807: Line 873:
 ==== 5.2 Электронная подпись и шифрование S/MIME ==== ==== 5.2 Электронная подпись и шифрование S/MIME ====
  
-  * Устанавливаем в базу данных доверенных сертификатов серверов в Thunderbird само подписанный сертификат CGP+=== Активация функциональности ​===
  
-Пользователь user1 создает у себя в интерфейсе сертификат для подписи и шифрования и отправляет подписанное письмо ​по адресу postmaster@corpX.un+<​code>​ 
 +USERS->​DOMAINS-corpX.un->​SECURITY->​S/​MIME 
 +  Создаем самоподписанный сертификат (будет работать как коневой УЦ) 
 +</​code>​ 
 + 
 +=== Использование в Samoware === 
 + 
 +Пользователи user1 создает у себя в интерфейсе сертификат для подписи и расшифровки и отправляет ​_подписанноеписьмо ​user2
  
 Подделать текст письма можно: Подделать текст письма можно:
 <​code>​ <​code>​
-# vim /​var/​CommuniGate/​Accounts/​postmaster.macnt/​INBOX.mbox+# vim /​var/​CommuniGate/​Accounts/​user2.macnt/​INBOX.mslc/data1
 </​code>​ </​code>​
 +
 +=== Использование в Thunderbird ===
 +
 +  * Устанавливаем в базу данных доверенных сертификатов серверов в Thunderbird само подписанный сертификат УЦ CGP, свой сертификат и закрытый ключ и ВСЕ сертификаты респондентов,​ короче,​ не очень удобно )
  
 ==== 5.3 IM and Presence ==== ==== 5.3 IM and Presence ====
  
 +  * Выяснить в службе поддержки,​ куда девается ФИО при добавлении в "​Друзья"​ ?
   * [[Thunderbird#​Настройка учетной записи XMPP]] в Thunderbird   * [[Thunderbird#​Настройка учетной записи XMPP]] в Thunderbird
  
 ==== 5.4 Общие календари и задания ==== ==== 5.4 Общие календари и задания ====
  
 +  * По аналогии с общими почтовыми папками
 ==== 5.5 Использование облачного хранилища ==== ==== 5.5 Использование облачного хранилища ====
  
   * Settings->​Services->​HTTPU->​Request Size Limit: unlimited   * Settings->​Services->​HTTPU->​Request Size Limit: unlimited
   * ​[[https://​mail.bmstu.ru/​~postmaster/​7.Ispolzovanie_cloud_diska.pdf|Использование облачного хранилища]]   * ​[[https://​mail.bmstu.ru/​~postmaster/​7.Ispolzovanie_cloud_diska.pdf|Использование облачного хранилища]]
 +  * https://​mail.bmstu.ru/​filebrowser.wcgp?​subDir=~логин_сотрудника
  
 ==== 5.6 Перлюстрация писем ==== ==== 5.6 Перлюстрация писем ====
Line 868: Line 948:
   * !!! Работает **только** при подключении через HTTPS   * !!! Работает **только** при подключении через HTTPS
 <​code>​ <​code>​
-# ldapsearch -x -D "​cn=Administrator,​cn=Users,​dc=corpX,​dc=un"​ -W -server -b "​dc=corpX,​dc=un"​ "​sAMAccountName=user100+X"​+# ldapsearch -x -D "​cn=Administrator,​cn=Users,​dc=corpX,​dc=un"​ -W -H ldap://server -b "​dc=corpX,​dc=un"​ "​sAMAccountName=user100+X
 + 
 +# ldapsearch -x -D "​user100+X@corp2.un"​ -W -H ldap://​server -b "​dc=corpX,​dc=un"
  
 # apt install libauthen-simple-ldap-perl # apt install libauthen-simple-ldap-perl
  
-# wget http://www.communigate.ru/CGAUTH/​authLDAPNewAD.pl+# wget https://val.bmstu.ru/unix/CGP/​authLDAPNewAD.pl
 </​code>​ </​code>​
  
Line 923: Line 1005:
  
 <​code>​ <​code>​
-cat /​root/​AccountList.txt+Users->​DOMAINS->​corpX.un->​Account Defaults->​Settings->​ 
 +  Password Encryption: clear 
 + 
 +# cat /​var/​CommuniGate/​Accounts/​user101.macnt/​account.settings 
 + 
 +cat /​root/​AccountList.txt
 Name    Password Name    Password
 user100+X Pa$$w0rd100+X user100+X Pa$$w0rd100+X
  
-cd /​opt/​CommuniGate/​Migration/​+cd /​opt/​CommuniGate/​Migration/​
  
 ./​MoveAccounts --IMAP /​root/​AccountList.txt 172.16.1.254 127.0.0.1 ./​MoveAccounts --IMAP /​root/​AccountList.txt 172.16.1.254 127.0.0.1
Line 945: Line 1032:
   * Перенос ключа принципала в CGP (Users->​Domains->​corpX.un->​Security->​Kerberos)   * Перенос ключа принципала в CGP (Users->​Domains->​corpX.un->​Security->​Kerberos)
   * Входим в домен как user100+X с рабочей станции client1   * Входим в домен как user100+X с рабочей станции client1
-  * [[Thunderbird#​Авто конфигурация клиента]] Thunderbird (IMAP GSSAPI)+  ​* [[https://​www.communigate.ru/​CommuniGatePro/​russian/​MAPI.html|MAPI-Коннектор]] Kerberos GSSAPI 
 +  * [[#​Модуль 8. Использование CGP в качестве Web сервера]] 
 +  ​* [[Thunderbird#​Авто конфигурация клиента]] Thunderbird (IMAP/SMTP GSSAPI)
  
 ==== 6.4 Использование CGP в качестве RADIUS сервера ==== ==== 6.4 Использование CGP в качестве RADIUS сервера ====
Line 972: Line 1061:
   - Как организовать использование в Communigate учетных записей из Microsoft Active Directory?   - Как организовать использование в Communigate учетных записей из Microsoft Active Directory?
   - Какую часть протокола RADIUS реализует Communigate?​   - Какую часть протокола RADIUS реализует Communigate?​
 +
 ===== Модуль 7. SIP, PBX, встроенные приложения,​ номерной план, пример своего приложения ===== ===== Модуль 7. SIP, PBX, встроенные приложения,​ номерной план, пример своего приложения =====
  
Line 981: Line 1071:
 ===== Лабораторные работы ===== ===== Лабораторные работы =====
  
-  * [[ZoIPer]] user3 +==== 7.1 Внутренняя телефония ====
-  * [[SIP Phone Panasonic KX-HDVXXX]] 401+
  
-==== 7.1 Локализация PBX ====+=== Звонки из интерфейса Samoware ​===
  
-<​code>​ +  * !!! Подключаться через https, вебинаристам по IP адресу с домашнего компьютера 
-Users->​Domains->​corpX.un->​PBX->​Create Custom Enviroment+  * Тестовый звонок на номер **echotest**
  
-Languages->​Create:​ russian+=== Подключение телефонных аппаратов и внутренний план нумерации ===
  
-select russian+<​code>​ 
 +Users->​Domains->​corpX.un->​Objects->​userN->​Settings 
 +Aliases: 40N 
 +Alt SIP Password: tpassword40N
 </​code>​ </​code>​
-  ​* [[http://​ftp.communigate.ru/​pub/​stuff/​noarch/​pbx_russian_files_51.zip]]+ 
 +  ​* [[ZoIPer]] или [[PhonerLite]] user2/402 
 +  * [[SIP Phone Panasonic KX-HDVXXX]] 402 
 + 
 +=== Информация о регистрации SIP пользовательского оборудования === 
 <​code>​ <​code>​
-!!! Upload tar файлов из архива !!!+Users->​Domains->​corpX.un->​Objects->​user1->​Status
  
-# ls CGateProSoftware/​CommuniGate/​PBXApps/​+или
  
-# ls /​var/​CommuniGate/​Accounts/​PBXApps+GETACCOUNTINFO user1 KEY SIPContacts 
 +...
 </​code>​ </​code>​
  
-==== 7.2 Таблица маршрутизации применительно к SIP, номерной план ==== 
  
-=== Через таблицу маршрутизации ​===+==== 7.2 Распространение IP телефонии за пределы офиса ==== 
 + 
 +=== Пользователь pbx === 
 <​code>​ <​code>​
-S:<​6363@*= gatewayincoming{pbx,​media}#​pbx+Users->​Domains->​corpX.un->​Objects->pbx->​Settings->​Access Rights 
 + 
 +  Can Modify This Domain and its Accounts Settings 
 +    Can Access All Files 
 +    Can Impersonate 
 +    Can Administer Other Domains
 </​code>​ </​code>​
  
-=== Организация внутреннего плана нумерации ​===+=== Добавление служебных номеров ===
 <​code>​ <​code>​
-Users->Domains->​corpX.un->​Objects->​user2->​Settings +Settings->Router 
-Aliases402+..
 +Signal:<​311@*> ​ = echotest#​pbx@localhost ​ ; testing address 
 +...
 </​code>​ </​code>​
  
-=== Информация о регистрации SIP пользовательского оборудования ===+=== Звонки в соседний офис ​=== 
 <​code>​ <​code>​
-Users->Domains->corpX.un->Objects->​user1->Status+Settings->Router 
 +... 
 +<​000(3d)@*   = *@telnum 
 +... 
 +Signal:​telnum ​       = pstn                    ; unknown telnum ​-> PSTN 
 +Signal:<​*@pstn     = gatewaycaller{*}#​pbx ​   ; start '​gatewaycaller'​ app
  
-или+или ​сразу
  
-GETACCOUNTINFO ​user1 KEY SIPContacts+;​Signal:<​000(3d)@*> ​  = gatewaycaller{*}#​pbx 
 +<​000(3d)@*> ​  = gatewaycaller{*}#​pbx 
 + 
 +Users->​Account Defaults->​PSTN 
 +  или 
 +Users->​Domains->​corpX.un->​Account Defaults->​PSTN 
 +  или 
 +Users->​Domains->​corpX.un->​Objects->​user1->​Real-Time->​PSTN->​CLASS_OF_SERVICE_TELEPHONY 
 + 
 +Gateway Domain: server.corp.un 
 + 
 + 
 +Users->​Domains->​corpX.un->​Objects->​user1->​Real-Time->​PSTN 
 + 
 +Caller ID: 00X401 
 +</​code>​ 
 + 
 +=== Организация исходящих вызовов в PSTN через voip провайдера с аутентификацией === 
 +<​code>​ 
 +Settings->​Router 
 +... 
 +<​8(10d)@*> ​   = 8*@telnum 
 +<​+7(10d)@*> ​   = 8*@telnum 
 + 
 +;<​+(7-20d)@*> ​        = +*@telnum ​              ; +nnnnn calls -> to telnum 
 +;... 
 +... 
 + 
 +Users->​Account Defaults->​PSTN 
 +  или 
 +Users->​Domains->​corpX.un->​Account Defaults->​PSTN 
 +  или 
 +Users->​Domains->​corpX.un->​Objects->​user1->​Real-Time->​PSTN 
 + 
 +Gateway Domain: voip1.un 
 +Name for Gateway: 00000X 
 +Password for Gateway: spasswordX 
 +</​code>​ 
 + 
 +=== Организация входящих вызовов из PSTN (регистрация на voip провайдере) === 
 +<​code>​ 
 +Users->​Domains->​corpX.un->​Objects->​pbx->​Real-Time->​RSIP 
 +Name: voip1 
 +Register Every: 5 min 
 +Account: 00000X 
 +at Host: voip1.un 
 +Authentication Name: 00000X 
 +Password: spasswordX 
 +Target: логин пользователя,​ если оставить пустой,​ будет IVR 
 + 
 +GETACCOUNTRSIPS pbx
 200 data follow 200 data follow
-( +{ 
-  { +  ​sipnet =  { 
-    ​"" ​=  ​"​sip:​user1@195.19.35.219:​5060"​+    ​authName ​=  ​00000X
-    ​@regdata ​=  ​+    ​domain ​=  ​voip1.un
-      Allow =  (ACK, BYE, CANCEL, INFO, INVITE, NOTIFY, OPTIONS, REFER)+    ​fromName ​=  ​00000X
-      ​CSeq ​=  ​#68190+    ​password ​=  ​spasswordX
-      ​Call-ID ​=  ​3498b62-d4014eab@195.19.35.219+    ​period ​=  ​5m
-      ​Supported ​=  ​(x-sipura)+  ​}
-      ​User-Agent =  "​Linksys/​SPA3102-3.3.6(GW)"​+
-    }; + 
-    ​Expires =  #T14-10-2014_05:​30:​41;​ + 
-  } +Users->​Domains->​corpX.un->​Objects->pbx->​Real-Time->​Incoming Call Rules->​Edit 
-)+Redirect To is #pbx
 </​code>​ </​code>​
  
Line 1046: Line 1209:
 </​code>​ </​code>​
  
-==== 7.3 Правила для голоса ​====+==== 7.3 Локализация PBX ====
  
 <​code>​ <​code>​
-Settings->Router +Users->Domains->​corpX.un->PBX->Create Custom Enviroment
-... +
-Signal:<​311@* = echotest#​pbx@localhost ​ ; testing address +
-... +
-</code>+
  
-pbx пользователь+Languages->Create: russian
  
 +select russian
 +</​code>​
 +  * [[http://​ftp.communigate.ru/​pub/​stuff/​noarch/​pbx_russian_files_51.zip]]
 <​code>​ <​code>​
-Users->​Domains->​corpX.un->​Objects->​pbx->​Settings->​Access Rights+!!! Upload tar файлов из архива !!!
  
-  Can Modify This Domain and its Accounts Settings +# ls CGateProSoftware/​CommuniGate/​PBXApps/​ 
-    Can Access All Files + 
-    Can Impersonate +# ls /​var/​CommuniGate/​Accounts/​PBXApps
-    Can Administer Other Domains+
 </​code>​ </​code>​
 +
  
 ==== 7.4 Встроенные приложения ​ ==== ==== 7.4 Встроенные приложения ​ ====
Line 1077: Line 1239:
 </​code>​ </​code>​
 <​code>​ <​code>​
-пункт techsupport - можно ​заменить ​на свое название,​ например ​abcd +можно ​добавить свое название,​ например ​group1 
-для озвучивания пункта необходимо загрузить файл ​forabcd.wav через+для озвучивания пункта необходимо загрузить файл ​forgroup1.wav через
 Users->​Domains->​corpX.un->​PBX Users->​Domains->​corpX.un->​PBX
 +
 +Файл можно записать через голосовую почту, содержание примерно:​ "​что бы позвонить в наш отдел"​
 </​code>​ </​code>​
 <​code>​ <​code>​
Line 1117: Line 1281:
 ==== 7.5 Пишем свое небольшое приложение ==== ==== 7.5 Пишем свое небольшое приложение ====
  
-  * [[http://​www.communigate.com/​CommuniGatePro/​russian/​CGPL.html|Язык Программирования CommuniGate Pro (CG/PL)]]+  * [[http://​www.communigate.ru/​CommuniGatePro/​russian/​CGPL.html|Язык Программирования CommuniGate Pro (CG/PL)]]
  
 === Hello World по номеру 301 === === Hello World по номеру 301 ===
Line 1142: Line 1306:
   Create Forwarder: 301   Create Forwarder: 301
   Forward To: sayhello#​pbx   Forward To: sayhello#​pbx
 +  ​
 +или  ​
 +
 +SETTINGS-ROUTER
 +  ...  ​
 +  Signal:<​301@*> ​ = sayhello#​pbx@localhost
 +  ...
 </​code>​ </​code>​
  
Line 1174: Line 1345:
 </​code>​ </​code>​
  
-=== Перевод звонка без сопровождения (blind transfer) === 
  
-В приложении пример скрипта,​ реализующего b2bua в режиме бриджа (не миксера) и позволяющего с помощью DTMF команд выполнить перевод звонка без сопровождения (blind transfer). Данный скрипт воспринимает DTMF команды,​ посланные как SIP INFO запросы,​ а не в медиа канале (например,​ в hPronto на странице Preferences -> Dialer опцию "​Sending Method"​ нужно установить в signal). 
-Если нужно, чтобы DTMF команды работали и в том случае,​ когда они посылаются в голосовом канале (rfc2833 или inband), то нужно подключать стороны через миксер,​ а не через бридж, для этого нужно немного модифицировать часть скрипта до вызова процедуры bridgedCallLoop(). 
  
-Пожалуйста,​ дайте нам знать, если потребуется помощь в модификации скрипта для подключения сторон с использованием миксера (чтобы обрабатывать DTMF, отправленные как inband или rfc2833). 
- 
-Сам механизм перевода следующий. При установлении соединения каждый из участников может набрать #nnnn (4-значный номер),​ чтобы дать сигнал для перевода партнера на 4-значный номер nnnn. После удачного перевода инициатор перевода будет отсоединен. На набор каждой цифры номера дается не более 5 секунд. Если за это время не было введена цифра, то перевод не осуществляется и нужно будет заново набирать #nnnn для осуществления попытки перевода (см. комментарии в скрипте). Также в процессе набора номера,​ если уже ошиблись,​ можно набрать *, чтобы начать набор #nnnn заново. 
- 
-Логику меню набора номера для перевода можно адаптировать. 
- 
-Приложение b2bua-transfer.sppr нужно закачать в PBX окружение (в WebAdmin -> Users -> PBX). 
-Для направления звонков в это приложение лучше использовать серверное сигнальное правило,​ потому что при направлении через запись в маршрутизаторе нужно будет вводить префиксы,​ чтобы не было зацикливания. 
- 
-Серверное сигнальное правило может выглядить примерно так: 
- 
-<​code>​ 
-Data 
-Operation ​      ​IS ​      ​INVITE 
-Call Type       ​IS ​      AV 
-Submit Address ​ IS NOT   LOCAL [0.0.0.0]* 
-Target Address ​ IS       ​sip:​*@domain.name 
- 
-Action 
-Redirect To              b2bua-transfer#​pbx@domain.name 
-Discard Rules 
-</​code>​ 
- 
-Здесь первые три условия стандартные,​ третье условие позволяет избежать зацикливания данного правила,​ так как оно не будет применяться для звонков,​ инициированных PBX приложением (то есть для вызова из исходящей ноги Caller приложения правило уже применяться не будет). 
-Далее нужно прописать набор условий (например,​ Target Address), которые будут задавать набор адресов отправителей и получателей звонка,​ для которых должно запускаться это приложение с логикой перевода через DTMF. В примере выше правило будет запускаться для всех номеров получателей в домене domain.name. 
-В логике скрипта можно дополнительно добавить проверку,​ чтобы пользоваться данными DTMF командами могли только локальные пользователи,​ а не внешние и т.п. 
- 
-Скрипт приведен как пример,​ он тщательно не тестировался,​ но функционал трансфера проверили - работает. Если будут какие-либо ошибки или вопросы по его использованию,​ пожалуйста,​ обращайтесь. 
- 
-<​code>​ 
-// ================================================== // 
-//             ​simple B2BUA application ​              // 
-//             ​supporting DTMF commands ​              // 
-// ================================================== // 
- 
-entry     ​Caller ​                  ​forward;​ 
-procedure bridgedCallLoop(peerLeg) forward; 
-function ​ transferTo(numDigits) ​   forward; 
-procedure doSysLog(str) {SysLog("​B2BUA:​ " + str);} 
- 
-// 
-// ingress task entry 
-// 
-entry Main { 
-  var callParams ​             = NewDictionary();​ 
-  callParams.(""​) ​            = LocalURI(); 
-  callParams.fromName ​        = RemoteRealName();​ 
-  callParams.From ​            = RemoteURI();​ 
-  callParams.("​Call-ID"​) ​     = PendingRequestData("​Call-ID"​) + "​.b2b";​ 
-  callParams.("​Max-Forwards"​) = PendingRequestData("​Max-Forwards"​)-1;​ 
-  callParams.customIdentity ​  = "";​ 
- 
-  doSysLog("​callParams:​ " + callParams.objectToString());​ 
-  var peerLeg = spawn Caller(callParams);​ 
-  if(!IsTask(peerLeg)) { 
-    doSysLog("​failed to spawn Caller task"​);​ 
-    RejectCall(peerLeg);​ stop; 
-  } 
- 
-  var errorCode = StartBridge(peerLeg);​ 
-  if(errorCode != null) { 
-    void(SendEvent(peerLeg,"​stop",​errorCode));​ 
-    doSysLog("​call failed: " + errorCode.string());​ 
-    RejectCall(errorCode);​ stop; 
-  } 
- 
-  bridgedCallLoop(peerLeg);​ 
-  stop; 
-} 
- 
-// 
-// egress task entry 
-// 
-entry Caller { 
-  var peerLeg = Vars().parent,​ callParams = Vars().startParameter,​ bridgeEvent,​input,​errorCode;​ 
- 
-  void(Impersonate(SIPURIToEmail(callParams.From)));​ 
-  void(SignalOption("​refer","​peer"​));​ 
-  void(SignalOption("​bridgeBreak","​disconnect"​));​ 
- 
-  bridgeEvent = ReadInput(10);​ 
-  if(!IsStartBridgeEvent(bridgeEvent) || bridgeEvent.sender != peerLeg) {doSysLog("​unexpected start event: " + bridgeEvent.objectToString());​ stop;} 
-  errorCode = StartBridgedCall(callParams,​bridgeEvent);​ 
-  ​ 
-  if(errorCode) {RejectBridge(bridgeEvent,​errorCode);​ stop;} 
- 
-  while(true) { 
-    input = ReadInput(3600);​ 
-  exitif !IsCallProvisionEvent(input);​ 
-  } 
- 
-  if((IsDictionary(input) && input.what == "​stop"​) || IsBreakBridgeEvent(input)) {stop;} 
-  if(!IsCallCompletedEvent(input)) { 
-    doSysLog("​unexpected event: " + input.objectToString());​ 
-    errorCode = "​unexpected event";​ 
-  } elif(input.parameter != null) { 
-    doSysLog("​call failed: " + input.parameter);​ 
-    errorCode = input.parameter;​ 
-  } 
-  if(errorCode) {RejectBridge(bridgeEvent,​errorCode);​ stop;} 
- 
-  bridgedCallLoop(peerLeg);​ 
-  stop; 
-} 
- 
-// 
-// Main loop: processing events and DTMF commands in the connected state 
-// 
-procedure bridgedCallLoop(peerLeg) { 
-  if(!IsTask(peerLeg)) {return;} 
-  
-  while(IsConnected()) { 
-    var input = ReadInput(60);​ 
-    doSysLog("​main loop INPUT: " + (input.string() || "​NULL"​));​ 
- 
-    if(input == "#"​) { 
-      input = transferTo(4); ​ // after "#"​ enter 4-digit number to transfer the call to 
-      if(IsString(input)) { 
-        void(SendEvent(peerLeg,"​peerTransfer",​input + "​@"​ + MyDomain()));​ 
-        input = null; 
-      } 
-    } 
-    ​ 
-    if(input == null) { 
-      null; 
-    ​ 
-    } elif(IsDictionary(input) && input.sender == peerLeg && input.what == "​peerTransfer"​ && IsString(input.parameter)) { 
-      var transferError = TransferCall(input.parameter);​ 
-      if(transferError == null) { 
-        doSysLog("​call transferred to: " + input.parameter);​ 
-        Disconnect();​ 
-      } else { 
-        doSysLog("​transfer failed: " + transferError.string());​ 
-      } 
- 
-    } elif(IsDisconnectEvent(input) || IsBreakBridgeEvent(input)) { 
-      void(SendEvent(peerLeg,"​stop","​disconnected"​));​ 
-      Disconnect();​ 
- 
-    } elif(IsDictionary(input) && input.what == "​stop"​) { 
-      Disconnect();​ 
- 
-    } elif(IsString(input)) { 
-      void(SendEvent(peerLeg,"​dtmf",​input));​ 
- 
-    } elif(IsCallInfoEvent(input)) { 
-      doSysLog("​relaying INFO received: " + input.objectToString());​ 
-      void(SendEvent(peerLeg,"​info",​input.parameter));​ 
- 
-    } elif(IsDictionary(input) && input.what == "​dtmf"​) { 
-      void(SendDTMF(input.parameter));​ 
- 
-    } elif(IsDictionary(input) && input.what == "​info"​) { 
-      void(SendCallInfo(input.parameter));​ 
- 
-    } else { 
-      doSysLog("​unknown event: " + input.objectToString());​ 
-    } 
-  } 
-  return; 
-} 
- 
-// 
-// Entering a number with '​numDigits'​ digits, 5-second timeout to enter one digit. 
-// If entered number has less than '​numDigits'​ digits, do nothing and return back to the main loop. 
-// If '​*'​ is entered, return back to the main loop immediately without waiting of 5-second timeout. 
-// After returning to mail loop one can enter the '#'​ again and make another attempt to enter the number to transfer the call. 
-// 
-function transferTo(numDigits) { 
-  var buffer = "";​ 
-  if(!IsNumber(numDigits) || numDigits <= 0) {return null;} 
-  for(var i = 0; i < numDigits; i += 1) { 
-    var input = ReadInput(5);​ 
-    doSysLog("​transfer INPUT: " + (input.string() || "​NULL"​));​ 
-    if(input == null || input == "​*"​) {  // return to the mail loop where one can make another attempt to enter #nnnn 
-      return null; 
-    } elif(IsDigit(input)) { 
-      buffer += input; 
-    } else {    // unexpected event, for example, Disconnect or BreakBridge event 
-      return input; 
-    } 
-  } 
-  return buffer; ​ // return the entered number with '​numDigits'​ digits 
-} 
-</​code>​ 
- 
-==== 7.6 Роутинг SIP-звонков ==== 
- 
-=== Добавление маршрута для номерного плана на SIP шлюз === 
-<​code>​ 
-Settings->​Router 
-... 
-S:<​1(2d)@*> ​    = 1*@192.168.1.3 ;​smg1016 ​ 
- 
-S:<​0X(3d)@*> ​   = *@mail.corpX.un 
-... 
-</​code>​ 
- 
-=== Организация исходящих вызовов в PSTN через voip провайдера с аутентификацией === 
-<​code>​ 
-Settings->​Router 
-... 
- 
-<​8(10d)@*> ​   = 8*@telnum 
-<​+7(10d)@*> ​   = 8*@telnum 
- 
-;<​+(7-20d)@*> ​        = +*@telnum ​              ; +nnnnn calls -> to telnum 
-;... 
-... 
-Signal:​telnum ​       = pstn                    ; unknown telnum -> PSTN 
-Signal:<​*@pstn> ​     = gatewaycaller{*}#​pbx ​   ; start '​gatewaycaller'​ app 
-... 
- 
-Users->​Account Defaults->​PSTN 
-  или 
-Users->​Domains->​corpX.un->​Account Defaults->​PSTN 
-  или 
-Users->​Domains->​corpX.un->​Objects->​user1->​Real-Time->​PSTN 
- 
-Gateway Domain: voip1.un 
-Name for Gateway: 00000X 
-Password for Gateway: spasswordX 
-</​code>​ 
- 
-=== Организация входящих вызовов из PSTN (регистрация на voip провайдере) === 
-<​code>​ 
-Users->​Domains->​corpX.un->​Objects->​pbx->​Real-Time->​RSIP 
-Name: voip1 
-Register Every: 5 min 
-Account: 00000X 
-at Host: voip1.un 
-Authentication Name: 00000X 
-Password: spasswordX 
-Target: 
- 
-GETACCOUNTRSIPS pbx 
-200 data follow 
-{ 
-  sipnet =  { 
-    authName =  00000X; 
-    domain =  voip1.un; 
-    fromName =  00000X; 
-    password =  spasswordX; 
-    period =  5m; 
-  }; 
-} 
- 
- 
-Users->​Domains->​corpX.un->​Objects->​pbx->​Real-Time->​Incoming Call Rules->​Edit 
-Redirect To is #pbx 
-</​code>​ 
  
 ===== Вопросы ===== ===== Вопросы =====
Line 1476: Line 1393:
  
 # cat /​var/​CommuniGate/​WebSkins/​webcallback.wcgp # cat /​var/​CommuniGate/​WebSkins/​webcallback.wcgp
 +
 +!!! Только на уровне сервера !!!
 </​code><​code>​ </​code><​code>​
 entry sysEntry is entry sysEntry is
Line 1552: Line 1471:
 </​code>​ </​code>​
  
-==== Использование интерфейса ​SMNP для мониторинга ====+==== Использование интерфейса ​SNMP для мониторинга ====
  
   * [[https://​github.com/​pdacity/​cgp_snmp_zabbix|pdacity/​cgp_snmp_zabbix]]   * [[https://​github.com/​pdacity/​cgp_snmp_zabbix|pdacity/​cgp_snmp_zabbix]]
Line 1563: Line 1482:
 ===== Дополнительные материалы ===== ===== Дополнительные материалы =====
  
 +==== Русификация сообщений ====
 +
 +  * https://​www.communigate.ru/​CommuniGatePro/​russian/​SysAdmin.html#​Strings
 ==== Миграция с MS Exchange на CGP ==== ==== Миграция с MS Exchange на CGP ====
 <​code>​ <​code>​
Line 1685: Line 1607:
 Можно просто удалить account.info (и, желательно,​ перезапустить сервер,​ потоьу что содержимое может кэшироваться в памяти) Сервер потом сам перечитает папки и воссоздаст строчки для них. ​ Можно просто удалить account.info (и, желательно,​ перезапустить сервер,​ потоьу что содержимое может кэшироваться в памяти) Сервер потом сам перечитает папки и воссоздаст строчки для них. ​
 </​code>​ </​code>​
 +
 +==== Перевод звонка без сопровождения (blind transfer) ====
 +
 +В приложении пример скрипта,​ реализующего b2bua в режиме бриджа (не миксера) и позволяющего с помощью DTMF команд выполнить перевод звонка без сопровождения (blind transfer). Данный скрипт воспринимает DTMF команды,​ посланные как SIP INFO запросы,​ а не в медиа канале (например,​ в hPronto на странице Preferences -> Dialer опцию "​Sending Method"​ нужно установить в signal).
 +Если нужно, чтобы DTMF команды работали и в том случае,​ когда они посылаются в голосовом канале (rfc2833 или inband), то нужно подключать стороны через миксер,​ а не через бридж, для этого нужно немного модифицировать часть скрипта до вызова процедуры bridgedCallLoop().
 +
 +Пожалуйста,​ дайте нам знать, если потребуется помощь в модификации скрипта для подключения сторон с использованием миксера (чтобы обрабатывать DTMF, отправленные как inband или rfc2833).
 +
 +Сам механизм перевода следующий. При установлении соединения каждый из участников может набрать #nnnn (4-значный номер),​ чтобы дать сигнал для перевода партнера на 4-значный номер nnnn. После удачного перевода инициатор перевода будет отсоединен. На набор каждой цифры номера дается не более 5 секунд. Если за это время не было введена цифра, то перевод не осуществляется и нужно будет заново набирать #nnnn для осуществления попытки перевода (см. комментарии в скрипте). Также в процессе набора номера,​ если уже ошиблись,​ можно набрать *, чтобы начать набор #nnnn заново.
 +
 +Логику меню набора номера для перевода можно адаптировать.
 +
 +Приложение b2bua-transfer.sppr нужно закачать в PBX окружение (в WebAdmin -> Users -> PBX).
 +Для направления звонков в это приложение лучше использовать серверное сигнальное правило,​ потому что при направлении через запись в маршрутизаторе нужно будет вводить префиксы,​ чтобы не было зацикливания.
 +
 +Серверное сигнальное правило может выглядить примерно так:
 +
 +<​code>​
 +Data
 +Operation ​      ​IS ​      ​INVITE
 +Call Type       ​IS ​      AV
 +Submit Address ​ IS NOT   LOCAL [0.0.0.0]*
 +Target Address ​ IS       ​sip:​*@domain.name
 +
 +Action
 +Redirect To              b2bua-transfer#​pbx@domain.name
 +Discard Rules
 +</​code>​
 +
 +Здесь первые три условия стандартные,​ третье условие позволяет избежать зацикливания данного правила,​ так как оно не будет применяться для звонков,​ инициированных PBX приложением (то есть для вызова из исходящей ноги Caller приложения правило уже применяться не будет).
 +Далее нужно прописать набор условий (например,​ Target Address), которые будут задавать набор адресов отправителей и получателей звонка,​ для которых должно запускаться это приложение с логикой перевода через DTMF. В примере выше правило будет запускаться для всех номеров получателей в домене domain.name.
 +В логике скрипта можно дополнительно добавить проверку,​ чтобы пользоваться данными DTMF командами могли только локальные пользователи,​ а не внешние и т.п.
 +
 +Скрипт приведен как пример,​ он тщательно не тестировался,​ но функционал трансфера проверили - работает. Если будут какие-либо ошибки или вопросы по его использованию,​ пожалуйста,​ обращайтесь.
 +
 +<​code>​
 +// ================================================== //
 +//             ​simple B2BUA application ​              //
 +//             ​supporting DTMF commands ​              //
 +// ================================================== //
 +
 +entry     ​Caller ​                  ​forward;​
 +procedure bridgedCallLoop(peerLeg) forward;
 +function ​ transferTo(numDigits) ​   forward;
 +procedure doSysLog(str) {SysLog("​B2BUA:​ " + str);}
 +
 +//
 +// ingress task entry
 +//
 +entry Main {
 +  var callParams ​             = NewDictionary();​
 +  callParams.(""​) ​            = LocalURI();
 +  callParams.fromName ​        = RemoteRealName();​
 +  callParams.From ​            = RemoteURI();​
 +  callParams.("​Call-ID"​) ​     = PendingRequestData("​Call-ID"​) + "​.b2b";​
 +  callParams.("​Max-Forwards"​) = PendingRequestData("​Max-Forwards"​)-1;​
 +  callParams.customIdentity ​  = "";​
 +
 +  doSysLog("​callParams:​ " + callParams.objectToString());​
 +  var peerLeg = spawn Caller(callParams);​
 +  if(!IsTask(peerLeg)) {
 +    doSysLog("​failed to spawn Caller task"​);​
 +    RejectCall(peerLeg);​ stop;
 +  }
 +
 +  var errorCode = StartBridge(peerLeg);​
 +  if(errorCode != null) {
 +    void(SendEvent(peerLeg,"​stop",​errorCode));​
 +    doSysLog("​call failed: " + errorCode.string());​
 +    RejectCall(errorCode);​ stop;
 +  }
 +
 +  bridgedCallLoop(peerLeg);​
 +  stop;
 +}
 +
 +//
 +// egress task entry
 +//
 +entry Caller {
 +  var peerLeg = Vars().parent,​ callParams = Vars().startParameter,​ bridgeEvent,​input,​errorCode;​
 +
 +  void(Impersonate(SIPURIToEmail(callParams.From)));​
 +  void(SignalOption("​refer","​peer"​));​
 +  void(SignalOption("​bridgeBreak","​disconnect"​));​
 +
 +  bridgeEvent = ReadInput(10);​
 +  if(!IsStartBridgeEvent(bridgeEvent) || bridgeEvent.sender != peerLeg) {doSysLog("​unexpected start event: " + bridgeEvent.objectToString());​ stop;}
 +  errorCode = StartBridgedCall(callParams,​bridgeEvent);​
 +  ​
 +  if(errorCode) {RejectBridge(bridgeEvent,​errorCode);​ stop;}
 +
 +  while(true) {
 +    input = ReadInput(3600);​
 +  exitif !IsCallProvisionEvent(input);​
 +  }
 +
 +  if((IsDictionary(input) && input.what == "​stop"​) || IsBreakBridgeEvent(input)) {stop;}
 +  if(!IsCallCompletedEvent(input)) {
 +    doSysLog("​unexpected event: " + input.objectToString());​
 +    errorCode = "​unexpected event";​
 +  } elif(input.parameter != null) {
 +    doSysLog("​call failed: " + input.parameter);​
 +    errorCode = input.parameter;​
 +  }
 +  if(errorCode) {RejectBridge(bridgeEvent,​errorCode);​ stop;}
 +
 +  bridgedCallLoop(peerLeg);​
 +  stop;
 +}
 +
 +//
 +// Main loop: processing events and DTMF commands in the connected state
 +//
 +procedure bridgedCallLoop(peerLeg) {
 +  if(!IsTask(peerLeg)) {return;}
 + 
 +  while(IsConnected()) {
 +    var input = ReadInput(60);​
 +    doSysLog("​main loop INPUT: " + (input.string() || "​NULL"​));​
 +
 +    if(input == "#"​) {
 +      input = transferTo(4); ​ // after "#"​ enter 4-digit number to transfer the call to
 +      if(IsString(input)) {
 +        void(SendEvent(peerLeg,"​peerTransfer",​input + "​@"​ + MyDomain()));​
 +        input = null;
 +      }
 +    }
 +    ​
 +    if(input == null) {
 +      null;
 +    ​
 +    } elif(IsDictionary(input) && input.sender == peerLeg && input.what == "​peerTransfer"​ && IsString(input.parameter)) {
 +      var transferError = TransferCall(input.parameter);​
 +      if(transferError == null) {
 +        doSysLog("​call transferred to: " + input.parameter);​
 +        Disconnect();​
 +      } else {
 +        doSysLog("​transfer failed: " + transferError.string());​
 +      }
 +
 +    } elif(IsDisconnectEvent(input) || IsBreakBridgeEvent(input)) {
 +      void(SendEvent(peerLeg,"​stop","​disconnected"​));​
 +      Disconnect();​
 +
 +    } elif(IsDictionary(input) && input.what == "​stop"​) {
 +      Disconnect();​
 +
 +    } elif(IsString(input)) {
 +      void(SendEvent(peerLeg,"​dtmf",​input));​
 +
 +    } elif(IsCallInfoEvent(input)) {
 +      doSysLog("​relaying INFO received: " + input.objectToString());​
 +      void(SendEvent(peerLeg,"​info",​input.parameter));​
 +
 +    } elif(IsDictionary(input) && input.what == "​dtmf"​) {
 +      void(SendDTMF(input.parameter));​
 +
 +    } elif(IsDictionary(input) && input.what == "​info"​) {
 +      void(SendCallInfo(input.parameter));​
 +
 +    } else {
 +      doSysLog("​unknown event: " + input.objectToString());​
 +    }
 +  }
 +  return;
 +}
 +
 +//
 +// Entering a number with '​numDigits'​ digits, 5-second timeout to enter one digit.
 +// If entered number has less than '​numDigits'​ digits, do nothing and return back to the main loop.
 +// If '​*'​ is entered, return back to the main loop immediately without waiting of 5-second timeout.
 +// After returning to mail loop one can enter the '#'​ again and make another attempt to enter the number to transfer the call.
 +//
 +function transferTo(numDigits) {
 +  var buffer = "";​
 +  if(!IsNumber(numDigits) || numDigits <= 0) {return null;}
 +  for(var i = 0; i < numDigits; i += 1) {
 +    var input = ReadInput(5);​
 +    doSysLog("​transfer INPUT: " + (input.string() || "​NULL"​));​
 +    if(input == null || input == "​*"​) {  // return to the mail loop where one can make another attempt to enter #nnnn
 +      return null;
 +    } elif(IsDigit(input)) {
 +      buffer += input;
 +    } else {    // unexpected event, for example, Disconnect or BreakBridge event
 +      return input;
 +    }
 +  }
 +  return buffer; ​ // return the entered number with '​numDigits'​ digits
 +}
 +</​code>​
 +
communigate_pro_2020.1623127055.txt.gz · Last modified: 2021/06/08 07:37 by admin