[Из песочницы] Автодозвон через обратный вызов из Elastix

Так как не все sip-телефоны умеют автодозвон, а иногда хочется его иметь, я попробовал его реализовать средствами *. Сам собой напрашивается вариант через call-файлы, но тут есть одна неприятность: при соединении у обоих абонентов аппараты звонят одновременно, и когда адресат автодозвона снимает трубку и слышит гудок ожидания, он иногда пугается и вешает трубку (хотя, у меня в офисе все довольно быстро привыкли). Я опробовал 2 варианта, второй показался мне более универсальным и логичным. Различаются они необходимостью править (переназначать) дефолтный контекст from-internal.Итак, общее для всех: в файл /etc/asterisk/extensions_custom.conf добавляем: [macro-autodial] ; проверим длину внутреннего номера (у меня 3), на всякий случай exten => s,1, ExecIf ($[»${ARG1:0:1}» = »*» | ${LEN (${ARG2})} != 3 ], Hangup) ; формируем .call-файл exten => s, n, System (echo «Channel: Local/${ARG1}@from-internal» > /tmp/${ARG2}${UNIQUEID}.call) exten => s, n, System (echo «MaxRetries: 10» >> /tmp/${ARG2}${UNIQUEID}.call) exten => s, n, System (echo «RetryTime: 20» >> /tmp/${ARG2}${UNIQUEID}.call) exten => s, n, System (echo «WaitTime: 40» >> /tmp/${ARG2}${UNIQUEID}.call) exten => s, n, System (echo -e «Callerid: \\x22CallBack ${ARG1}\\x22 \\x3C${ARG2}\\x3E» >> /tmp/${ARG2}${UNIQUEID}.call) ; звонить будем в контексте, который ниже exten => s, n, System (echo «Context: autodial-internal» >> /tmp/${ARG2}${UNIQUEID}.call) exten => s, n, System (echo «Extension: ${ARG2}» >> /tmp/${ARG2}${UNIQUEID}.call) exten => s, n, System (echo «Priority: 1» >> /tmp/${ARG2}${UNIQUEID}.call) ; кладем на вход астериску exten => s, n, System (sleep 15 && mv -f /tmp/${ARG2}${UNIQUEID}.call /var/spool/asterisk/outgoing/ &) ; говорим пользователю что-нибудь жизнеутверждающее exten => s, n, Playback (ozhidajte-soedinenija)

[autodial-internal] exten => _XXX,1, Dial (SIP/${EXTEN}) exten => _XXX,2, Hangup () А вот дальше начинаются различия.В первом варианте мы продолжаем в файле /etc/asterisk/extensions_custom.conf.В конец контекста [from-internal-custom] добавляем:

; *20<номер> автодозваниваемся на <номер> exten => _*20X.,1, Macro (autodial,${EXTEN:3},${CALLERID (number)}) exten => _*20X.,2, Hangup () Во втором же варианте переходим в файл /etc/asterisk/extensions_override_elastix.conf, который позволяет переназначать дефолтные контексты, не теряя при этом возможности менять настройки через веб-интерфейс.В нем:

[from-internal] ; сохраняем последний набранный номер exten => _[0–9*#]X.,1, Set (DB (LASTCALLED/${CALLERID (number)})=${EXTEN}) ; дальше в обработку exten => _[0–9*#]X.,2, Goto (from-internal-my,${EXTEN},1)

; *20 автодозваниваемся на последний набранный номер exten => *20,1, Macro (autodial,${DB (LASTCALLED/${CALLERID (number)})},${CALLERID (number)}) exten => *20,2, Hangup ()

; *20<номер> автодозваниваемся на <номер> exten => _*20X.,1, Macro (autodial,${EXTEN:3},${CALLERID (number)}) exten => _*20X.,2, Hangup ()

; цепляем [from-internal] в том виде, в котором он по дефолту, но под другим именем, для того, чтобы вызывать его после сохранения последнего номера [from-internal-my] include => from-internal-xfer include => bad-number В результате, *20номер поставит номер в автодозвон, а просто *20 совершит автодозвон последний набранный номер, причем последняя комбинация будет доступна только при втором варианте реализации.

© Habrahabr.ru