четверг, 7 июля 2016 г.

Исходящий звонок через AJAM c сервера Asterisk

Эта вторая статья из цикла статей "1С и Asterisk без использования внешних компонент". В ней будет рассмотрена возможность осуществления исходящего телефонного звонка по средствам AJAM из 1С.

Итак, в первой статей уже был рассмотрен способ подключения к AMI aka AJAM. Теперь рассмотрим одно из его практических применений. Для этого понадобится еще немного настроить Asterisk и клиентское рабочее место.

Создадим расширение осуществления исходящего телефонного звонка в Asterisk. В конец конфига /etc/asterisk/extensions.conf добавим свою секцию:

[call2back]
exten => _.,1,Answer
exten => _.,1,Wait(1)
exten => _.,n,Dial(Local/${EXTEN}@from-internal,300,Tt)
exten => _.,n,Hangup()

Рассмотрим что она (секция) описывает. call2back - имя секции (контекст команды дозвона) и последовательность действий: ответить на звонок, подождать 1 секунду, начать дозвон к абоненту ${EXTEN} (параметр команды дозвона) и завершить звонок.

На клиентском рабочем месте устанавливаем SIP-клиент и настаиваем автоматический ответ с собственного внутреннего телефонного номера. Например, внутренний номер 0319, следовательно в SIP-клиенте должен быть настроен автоответ на номер 0319.

Теперь для осуществления исходящего звонка через AJAM достаточно выполнить следующую последовательность команд:

1. Авторизация

http://asterisk_ipadress:8088/asterisk/mxml?action=login&username=1cajam&secret=myajamuserpass

параметры username и secret соответственно подставить из своих настроек AMI

2. Дозвон

http://asterisk_ipadress:8088/asterisk/mxml?action=originate&channel=SIP/0319&callerid=0319&timeout=15000&context=call2back&exten=subscriber&priority=1&async=yes

где 0319 - это внутренний номер, call2back - созданное ранее расширение, subscriber - номер телефона того, кому звоним.




В 1С это все можно осуществить через несложный код:

Организация соединения:

Соединение = Новый HTTPСоединение(IP,Port,,,,Таймаут,);

Отправка и чтение запроса:

ТекстКоманды="/asterisk/mxml?action=login&username=1cajam&secret=myajamuserpass";

Куки = "";

Запрос=Новый HTTPЗапрос();
Запрос.АдресРесурса=ТекстКоманды;
Запрос.Заголовки.Вставить("Connection", "keep-alive");
Запрос.Заголовки.Вставить("Cookie", Куки);

Ответ=Соединение.Получить(Запрос);

Куки=Ответ.Заголовки.Получить("Set-Cookie");
Куки=?(Куки=Неопределено,"",Куки);

ТекстКоманды="/asterisk/mxml?action=originate&channel=SIP/0319&callerid=0319&timeout=15000&context=call2back&exten=subscriber&priority=1&async=yes";

Запрос.АдресРесурса=ТекстКоманды;
Запрос.Заголовки.Вставить("Connection", "keep-alive");
Запрос.Заголовки.Вставить("Cookie", Куки);

Ответ=Соединение.Получить(Запрос);

ВАЖНО!!! При последовательном выполнении команд из 1С НЕ ЗАБЫВАТЬ про Cookie и пердкаждой следующей командой их перечитывать.

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


Настройка управления сервером Asterisk через AMI (Asterisk Manager Interface)

Данная статья является первой в планируемом цикле статей "1С и Asterisk без использования внешних компонент". Цикл статей будет представлять собой развитие статьи с инфостарта.

AMI – это интерфейс управления Asterisk-ом. Существуют два основных способа подключения к AMI:

  1. AMI поверх TCP (обычно называют просто AMI). 
  2. AMI поверх HTTP, т.е. AJAM (Asynchronous Javascript Asterisk Manager). 
В терминах 1С - это толстый и тонкий (веб) клиент. В этой статье будет рассмотрен именно второй. В дальнейшем данные настройки понадобятся для взаимодействия с сервером Asterisc из 1С.

Итак, для подключения к AMI первым делом необходимо создать пользователя. Для этого поправить конфиг /etc/asterisk/manager.conf, следующим образом:


[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0
allowmultiplelogin = yes
webenabled = yes
httptimeout = 60

[1cajam]
secret = myajamuserpass
deny=0.0.0.0/0.0.0.0
permit=0.0.0.0/0.0.0.0
read = call,cdr,user,config
write = call,originate,reporting,command,system


В секции [general] описаны правила, разрешающие подключение через AMI. Секция [1cajam] описывает пользователя и его привилегии. Имя секции (1cajam) - это имя пользователя AMI (создавать его в системе не нужно, достаточно описать в конфиге), secret - это его пароль. Опции deny и permit определяют IP-адреса, с которых возможно осуществлять подключение (в данном случае разрешено с любого IP). read, write - это привилегии чтения и записи таблиц Asterisk.

Далее, т.к. управление будет осуществляться через AJAM - необходимо опубликовать интерфейс. Правим конфиг /etc/asterisk/http.conf.

Для протокола HTTP на порту 8088:

[general]
enabled=yes
enablestatic=yes
bindaddr=0.0.0.0
bindport=8088
prefix=asterisk

Для протокола HTTPS на порту 4443:

[general]
enabled=yes
bindaddr=0.0.0.0
bindport=8088
prefix=asterisk

enablestatic=yes
tlsenable=yes
tlsbindaddr=0.0.0.0:4443
tlscertfile=/etc/asterisk/ssl/ajam.pem
tlsprivatekey=/etc/asterisk/ssl/ajam.pem

Соответственно для протокола HTTPS необходимо сгенерировать сертификаты:

#cd /tmp
#openssl req -new -x509 -days 365 -nodes -out /tmp/foo.pem -keyout /tmp/foo.pem
#mkdir /etc/asterisk/ssl #mv /tmp/foo.pem /etc/asterisk/ssl/ajam.pem

Перечитываем настройки и проверяем настройки:


#service asterisk restart
#asterisk -rx "http show status"

В ответ должны получить что-то типа:

HTTP Server Status:
Prefix: /asterisk
Server Enabled and Bound to 0.0.0.0:8088

HTTPS Server Enabled and Bound to 0.0.0.0:4443

Enabled URI's:
/asterisk/httpstatus => Asterisk HTTP General Status
/asterisk/phoneprov/... => Asterisk HTTP Phone Provisioning Tool
/asterisk/amanager => HTML Manager Event Interface w/Digest authentication
/asterisk/arawman => Raw HTTP Manager Event Interface w/Digest authentication
/asterisk/manager => HTML Manager Event Interface
/asterisk/rawman => Raw HTTP Manager Event Interface
/asterisk/static/... => Asterisk HTTP Static Delivery
/asterisk/amxml => XML Manager Event Interface w/Digest authentication
/asterisk/mxml => XML Manager Event Interface
/asterisk/ws => Asterisk HTTP WebSocket

Enabled Redirects:
  None.

Т.е. наш сервер ждет подключение по http на порту 8088 и по https на порту 4443.

Также работоспособность можно проверить через браузер попыткой авторизации:

http://asterisk_ipadress:8088/asterisk/mxml?action=login&username=1cajam&secret=myajamuserpass

Собственно все! Дополнительные материалы можно посмотреть здесь.

вторник, 9 февраля 2016 г.

1С 8.3 Корректное отключение главного узла РИБ и создание самостоятельной БД, быстрое создание/восстановление узла РИБ без выгрузки начального образа для конфигураций на основе БСП.

Собственно сабж!

Для чего это нужно? Допустим необходимо создать тестовую БД для разработки с актуальными данными или необходимо быстро восстановить работоспособность РИБ при "падении" одного из узлов, или для "быстрого" создания нового узла РИБ .

Имеем: 1С:Предприятие 8.3 (8.3.6.2390), РИБ по следующей схеме:


Данные во всех узлах синхронизируются полностью. Это идеальный случай - для исходных данных (данных восстановления) можно использовать любой узел РИБ. В случае, когда обмен происходит по собственным правилам или, например, установлен фильтр по организациям, то для исходных данных (данных восстановления) необходимо выбирать узел с наиболее полными данными.

!!!ВАЖНО!!! Перед созданием БД необходимо выполнить полную синхронизацию всех узлов РИБ с узлом, из которого планируется создавать новую БД, и на время создания в этом узле отключить синхронизацию данных!

Убедиться, что в главном узле обмена (из которого создаем) нет зарегистрированных изменений для подчиненного узла (который создаем/восстанавливаем), в подчиненном, соответственно, не должно быть
зарегистрированных изменений для главного узла.

Все действия выполняются в монопольном режиме (т.е. у целевой БД должны отсутствовать активные соединения)

Приступим. В качестве "исходного узла" выберем "Центральный узел обмена" (см. схему РИБ). В нем аккумулируются данные всех узлов.

ВАЖНО!!! В качестве "исходного узла" рекомендуется выбирать узел, которой в последствии станет главным узлом для вновь созданного/восстановленного узла. 

Это не обязательное условие. Для восстановления РИБ подойдет любой узел с максимально актуальными данными, но это более сложный процесс. Возможно он будет рассмотрен в будущем.

0. Создать новый узел РИБ.
Данное действие необходимо если создается новый узел, в противном случае необходимо перейти к п. 1.

1. Выгружаем базу данных из "исходного узла" в файл (*.dt).

2. Загружаем полученную в п. 1 выгрузку в "чистую" БД.

3. Запускаем полученную в п. 2 БД в режиме предприятия и отключаем все настроенные синхронизации данных.

4. Отключаем автоматическое обновление предопределенных данных.

Это необходимо потому, что в главном узле предопределенные данные обновляется автоматически, а в подчиненные узлы уже "приезжают" с обменами.

Если не выполнить это действие, то после отключения главного узла при следующей реструктуризации БД произойдет задвоение предопределенных данных.

Для отключения необходимо запустить командную строку от имени Администратора (root`a), выполнить запуск конфигуратора с параметрами и дождаться выполнения (сам конфигуратор на экране не появится, но он будет отображаться в дереве процессов системы, т.е. необходимо дождаться когда процесс конфигуратора пропадет из дерева процессов):

для Linux-клиента "файловый" вариант БД:
/opt/1C/v8.3/x86_64/1cv8 DESIGNER /F"PathToLocalDB" /N"AdminUser" /P"AdminUserPass" /SetPredefinedDataUpdate -DoNotUpdateAutomatically

для Linux-клиента "клиент-серверный" вариант БД:
/opt/1C/v8.3/x86_64/1cv8 DESIGNER /S"SRVname:port\BDname" /N"AdminUser" /P"AdminUserPass" /SetPredefinedDataUpdate -DoNotUpdateAutomatically

для Windows-клиента "файловый" вариант БД:
"C:\Program Files (x86)\1cv83\8.3.6.2390\bin\1cv8.exe" DESIGNER /F"PathToLocalDB" /N"AdminUser" /P"AdminUserPass" /SetPredefinedDataUpdate -DoNotUpdateAutomatically

для Windows-клиента "клиент-серверный" вариант БД:
"C:\Program Files (x86)\1cv83\8.3.6.2390\bin\1cv8.exe" DESIGNER /S"SRVname:port\DBname" /N"AdminUser" /P"AdminUserPass" /SetPredefinedDataUpdate -DoNotUpdateAutomatically

соответственно подставить свои путь к исполнительному файлу 1cv8 или 1cv8.exe и переменные, где:

PathToLocalDB - путь к файловой БД
AdminUser - администратор БД
AdminUserPass - пароль Администратора БД
SRVname - имя сервера БД (либо IP адрес)
port - порт агента сервера (по-умолчанию 1540)
BDname - имя БД в кластере серверов



5. Отключаем главный узел обмена.
Как и в предыдущем пункте, для этого необходимо запустить конфигуратор из командной строки с параметрами и дождаться его выполнения:

для Linux-клиента "файловый" вариант БД:
/opt/1C/v8.3/x86_64/1cv8 DESIGNER /F"PathToLocalDB" /N"AdminUser" /P"AdminUserPass" /ResetMasterNode 

для Linux-клиента "клиент-серверный" вариант БД:
/opt/1C/v8.3/x86_64/1cv8 DESIGNER /S"SRVname:port\BDname" /N"AdminUser" /P"AdminUserPass" /ResetMasterNode 

для Windows-клиента "файловый" вариант БД:
"C:\Program Files (x86)\1cv83\8.3.6.2390\bin\1cv8.exe" DESIGNER /F"PathToLocalDB" /N"AdminUser" /P"AdminUserPass" /ResetMasterNode 

для Windows-клиента "клиент-серверный" вариант БД:
"C:\Program Files (x86)\1cv83\8.3.6.2390\bin\1cv8.exe" DESIGNER /S"SRVname:port\DBname" /N"AdminUser" /P"AdminUserPass" /ResetMasterNode 



6. Запускаем 1С в режиме предприятия и, и в появившемся предложении о восстановлении связи с "главным узлом обмена", подтвердить ОТКЛЮЧЕНИЕ.

7. Настраиваем узлы.

Если нам необходима БД для разработки - удаляем лишние узлы обмена и сценарии синхронизации. Все БД готова. Можно переходить к п. 8

Если создаем новый узел РИБ:

  • Удаляем лишние узлы обмена и сценарии синхронизации так, чтобы осталось 2 узла: узел, полученный в п. 0 (У0) и главный узел для полученного узла (ГУ). ГУ - будет "текущим" узлом, т.е. в форме списка возле него будет зеленая точка/кружок.
  • Меняем местами (переименовываем) кода и наименования У0 и ГУ так, чтобы У0 стал "текущим" узлом.
  • Восстанавливаем связь с главным узлом (для этого есть масса обработок на просторах интернета или можно нарисовать свою)
  • Включаем синхронизацию и настраиваем сценарии синхронизации.
  • Сбрасываем регистрацию изменений в У0 и ГУ
  • Устанавливаем номера сообщений отправки/получения в 0.
  • В настройках синхронизации данных изменяем свойство "Префикс этой информационной базы" на префикс У0.
  • Запускаем 1С в У0 в режиме предприятия и отказываемся от помощи мастера настройки синхронизации. 
  • Проверяем синхронизацию данных У0 с ГУ.
  • Восстанавливаем настройки и возможность входа пользователей.

Если восстанавливаем узел РИБ - действия такие же как и для создания нового узла, только в качестве У0 необходимо использовать восстанавливаемый узел.


8. Восстанавливаем автоматическое обновление предопределенных данных.

Как и в п. 4, для этого необходимо запустить конфигуратор из командной строки с параметрами и дождаться его выполнения:

для Linux-клиента "файловый" вариант БД:
/opt/1C/v8.3/x86_64/1cv8 DESIGNER /F"PathToLocalDB" /N"AdminUser" /P"AdminUserPass" /SetPredefinedDataUpdate -Auto

для Linux-клиента "клиент-серверный" вариант БД:
/opt/1C/v8.3/x86_64/1cv8 DESIGNER /S"SRVname:port\BDname" /N"AdminUser" /P"AdminUserPass" /SetPredefinedDataUpdate -Auto

для Windows-клиента "файловый" вариант БД:
"C:\Program Files (x86)\1cv83\8.3.6.2390\bin\1cv8.exe" DESIGNER /F"PathToLocalDB" /N"AdminUser" /P"AdminUserPass" /SetPredefinedDataUpdate -Auto

для Windows-клиента "клиент-серверный" вариант БД:
"C:\Program Files (x86)\1cv83\8.3.6.2390\bin\1cv8.exe" DESIGNER /S"SRVname:port\DBname" /N"AdminUser" /P"AdminUserPass" /SetPredefinedDataUpdate -Auto

ЗЫ

Проверялось на "Управление торговлей, редакция 11.1 (11.1.10.185)".