Asterisk Dialplan advanced (Диалплан расширенный)

Диалплан Asterisk со множеством приложений и функций мощнейший инструмент для настройки логики вызовов. Dialplan Asterisk позволяет решить задачи любой сложности.

Asterisk: Ввод данных счетчиков по телефону DTMF

[data-sent]
;вызов из модуля Freepbx "Custom Destinations"

exten => s,1,GoTo(verification_bill,s,1)

;ввод  и подтверждение номера лицевого счета

[verification_bill]
exten => s,1,Set(CHANNEL(language)=ru)
exten => s,n,Playback(ru/custom/pers_acc_enter_ru) ;"Введите номер лицевого счета после звукового сигнала, по завершении ввода нажмите решетку"
;голосовые сообщения в примере, записаны через модуль "System Recordings" во FreePBX 13, что влияет на специфическое расположение файлов

exten => s,n,Read(checkb,beep,,,6,15)
exten => s,n,SayDigits(${checkb}) ;проговаривается введенный номер
exten => s,n,Background(ru/custom/pers_acc_confirm_ru) ;"для подтверждения номера ЛС наберите "1", для повторного ввода номера ЛС наберите "2" "
exten => s,n,WaitExten(10)
exten => 2,1,Goto(s,1)
exten => 1,1,Goto(db_acc_check,s,1)
;читаем БД
[db_acc_check]
exten => s,1,MYSQL(Connect connidbill localhost user password db_name utf8)
exten => s,n,MYSQL(Query resultidbill ${connidbill} SELECT * FROM Counters WHERE PERSACC LIKE '%${checkb}%')
exten => s,n,MYSQL(Fetch fetchid ${resultidbill} PERSACC DATAB COUNTER)
exten => s,n,Set(_account=${PERSACC})
exten => s,n,Set(_countern=${COUNTER})
exten => s,n,Set(_count=ru/custom/count_num) ;Вспомогательное сообщение:"номер счетчика"

; проверка наличия Лицевого Счета  в Базе Данных

exten => s,n,GotoIf($["${PERSACC}" = ""]?notexist,s,1:dst1)


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

exten => s,n(dst1),Playback(${count}&ru/digits/1&ru/custom/data_count2)
exten => s,n,Read(datavar1,beep,,,6,15)
exten => s,n,SayDigits(${datavar1})

;помещаем введенные данные в текстовый файл с именем: 'номерЛС' в директорию /var/log/asterisk/

exten => s,n,System(echo "Счечик 1" - "${STRFTIME(${EPOCH},,%d-%m-%Y)}" - "${account}" - "${datavar1}" >> /var/log/asterisk/${account})

; далее если кол-во счетчиков на ЛС больше 1, принимаем данные для счетчика номер 2, если меньше кладем трубку, и отключаемся от MYSQL.

exten => s,n,GotoIf($["${COUNTER}" > "1"]?dst2:endandclear)

exten => s,n(dst2),Playback(${count}&ru/digits/2&ru/custom/data_count2)
exten => s,n,Read(datavar2,beep,,,6,15)
exten => s,n,SayDigits(${datavar2})
exten => s,n,System(echo "Счетчик 2" - "${STRFTIME(${EPOCH},,%d-%m-%Y)}" - "${account}" - "${datavar2}" >> /var/log/asterisk/${account})

; далее если кол-во счетчиков на ЛС больше 2, принимаем данные для счетчика номер 3, если меньше кладем трубку, и отключаемся от MYSQL.

exten => s,n,GotoIf($["${COUNTER}" > "2"]?dst3:endandclear)

exten => s,n(dst3),Playback(${count}&ru/digits/3&ru/custom/data_count2)
exten => s,n,Read(datavar3,beep,,,6,15)
exten => s,n,SayDigits(${datavar3})
exten => s,n,System(echo "Счетчик 3" - "${STRFTIME(${EPOCH},,%d-%m-%Y)}" - "${account}" - "${datavar3}" >> /var/log/asterisk/${account})

;повторяем цикл до 6-го счетчика

exten => s,n,GotoIf($["${COUNTER}" > "3"]?dst4:endandclear)

exten => s,n(dst4),Playback(${count}&ru/digits/4&ru/custom/data_count2)
exten => s,n,Read(datavar4,beep,,,6,15)
exten => s,n,SayDigits(${datavar4})
exten => s,n,System(echo "Счетчик 4" - "${STRFTIME(${EPOCH},,%d-%m-%Y)}" - "${account}" - "${datavar4}" >> /var/log/asterisk/${account})

exten => s,n,GotoIf($["${COUNTER}" > "4"]?dst5:endandclear)

exten => s,n(dst5),Playback(${count}&ru/digits/5&ru/custom/data_count2)
exten => s,n,Read(datavar5,beep,,,6,15)
exten => s,n,SayDigits(${datavar5})
exten => s,n,System(echo "Счетчик 5" - "${STRFTIME(${EPOCH},,%d-%m-%Y)}" - "${account}" - "${datavar5}" >> /var/log/asterisk/${account})


exten => s,n,GotoIf($["${COUNTER}" > "5"]?dst6:endandclear)

exten => s,n(dst6),Playback(${count}&ru/digits/6&ru/custom/data_count2)
exten => s,n,Read(datavar6,beep,,,6,15)
exten => s,n,SayDigits(${datavar6})
exten => s,n,System(echo "Счетчик 6" - "${STRFTIME(${EPOCH},,%d-%m-%Y)}" - "${account}" - "${datavar6}" >> /var/log/asterisk/${account})

;отключаемся от БД
exten => s,n(endandclear),Noop(***ENDandCLEAR***)
exten => s,n,MYSQL(Clear ${resultidbill})
exten => s,n,MYSQL(Disconnect ${connidbill})

;отправляем данные на емайл

exten => h,1,System(mail -s "Данные счетчиков лицевой счет номер ${account}"  info@asterisk-pbx.ru <  /var/log/asterisk/${account})

;перемещаем файл с данными в архив /var/log/asterisk/datac/

exten => h,3,System(mv -f  /var/log/asterisk/${account}  /var/log/asterisk/datac/${account}-${STRFTIME(${EPOCH},,%H:%M-%d-%m-%Y)})
exten => h,n,hangup()

;сообщение: лицевой счет не существует

[notexist]
exten => s,1,Playback(ru/custom/pers_acc_not_exist_ru)
exten => s,n,Hangup
 

Dynamic Clip Routing

Внутренний абонент Asterisk вызывает внешнего. Когда внешний абонент перезванивает на городскую линию Asterisk, его вызов направляется непосредственно на звонившего внутреннего абонента
Для определения внутреннего номера звонившего абонента, используется стандартная БД CDR FreepBX - asteriskcdrdb.

[dynamic_did]
exten => _X.,1,Set(CHANNEL(language)=ru)
exten => _X.,n,Set(CALLID=${CALLERID(num):-11})
exten => _X.,n,MYSQL(Connect connidcdr localhost userdb passworddb asteriskcdrdb utf8)
;; All CALL
exten => _X.,n,MYSQL(Query resultidcdr ${connidcdr} SELECT * FROM cdr WHERE dst LIKE '%${CALLID}%' ORDER BY calldate DESC)
;; NOANSWER CALL ONLY
;;exten => _X.,n,MYSQL(Query resultidcdr ${connidcdr} SELECT * FROM cdr WHERE dst LIKE '%${CALLID}%' AND disposition LIKE 'NO ANSWER' ORDER BY calldate DESC)
;;
exten => _X.,n,MYSQL(Fetch fetchid ${resultidcdr} accid calldate clid src dst)
exten => _X.,n,Set(number=${src})
exten => _X.,n,NoOp(caller --> ${clid} callee --> ${dst})
exten => _X.,n,GOTOIF($["${dst}" = ""]?nodst:dst)
exten => _X.,n(dst),MYSQL(Clear ${resultidcdr})
exten => _X.,n,MYSQL(Disconnect ${connidcdr})
exten => _X.,n,Dial(SIP/${number},20,tT)
exten => _X.,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?nodst)
exten => _X.,n,GotoIf($["${DIALSTATUS}" = "NOANSWER"]?nodst)
exten => _X.,n,GotoIf($["${DIALSTATUS}" = "FAILED"]?nodst)
exten => _X.,n(nodst),MYSQL(Clear ${resultidcdr})
exten => _X.,n,MYSQL(Disconnect ${connidcdr})
exten => _X.,n,Goto(from-trunk,${DID},1)
exten => h,1,hangup()

Выборка данных за последние 120 минут

 SELECT * FROM cdr WHERE dst LIKE '%${CALLID}%' AND calldate >= DATE_SUB(NOW(), INTERVAL 120 MINUTE) ORDER BY calldate DESC;

или за три часа:

 SELECT * FROM cdr WHERE dst LIKE '%${CALLID}%' AND calldate >= DATE_SUB( NOW(), INTERVAL 03 HOUR) ORDER BY calldate DESC;

Вывод консоли Asterisk при маршрутизации по cdr БД:

 -- Executing [3216111@from-samsung:1] Goto("SIP/samsung-00001694", "dynamic_did,3216111,1") in new stack
    -- Goto (dynamic_did,1111,1)
    -- Executing [3216111v@dynamic_did:1] Set("SIP/samsung-00001694", "CHANNEL(language)=ru") in new stack
    -- Executing [3216111@dynamic_did:2] Set("SIP/samsung-00001694", "CALLID=8129981138 ") in new stack
    -- Executing [3216111@dynamic_did:3] MYSQL("SIP/samsung-00001694", "Connect connidcdr localhost userdb passworddb asteriskcdrdb utf8") in new stack
    -- Executing [3216111@dynamic_did:4] MYSQL("SIP/samsung-00001694", "Query resultidcdr 11 SELECT * FROM cdr WHERE dst LIKE '%8129981138%' AND calldate >= DATE_SUB(NOW(), INTERVAL 03 HOUR)") in new stack
    -- Executing [3216111@dynamic_did:5] MYSQL("SIP/samsung-00001694", "Fetch fetchid 12 accid calldate clid src dst") in new stack
[2014-12-15 13:45:45] WARNING[6925][C-00000c60]: app_mysql.c:498 aMYSQL_fetch: ast_MYSQL_fetch: More fields (24) than variables (5)
    -- Executing [3216111@dynamic_did:6] Set("SIP/samsung-00001694", "number=1000") in new stack
    -- Executing [3216111@dynamic_did:7] NoOp("SIP/samsung-00001694", "кто звонил --> 1000 кому звонил --> 8129981138") in new stack
    -- Executing [3216111@dynamic_did:8] GotoIf("SIP/samsung-00001694", "0?nodst:dst") in new stack
    -- Goto (dynamic_did,1111,9)
    -- Executing [3216111@dynamic_did:9] MYSQL("SIP/samsung-00001694", "Clear 12") in new stack
    -- Executing [3216111@dynamic_did:10] MYSQL("SIP/samsung-00001694", "Disconnect 11") in new stack
    -- Executing [3216111@dynamic_did:11] Dial("SIP/samsung-00001694", "SIP/1000,20,tT") in new stack
[dynamic_route]
exten => _X.,1,Set(CHANNEL(language)=ru)
exten => _X.,n,Set(CALLID=${CALLERID(num):-7})
exten => _X.,n,MYSQL(Connect connidcdr localhost dbuser dbpassword dbname utf8)
exten => _X.,n,MYSQL(Query resultidcdr ${connidcdr} SELECT * FROM Callers WHERE CID LIKE '%${CALLID}%')
exten => _X.,n,MYSQL(Fetch fetchid ${resultidcdr} CID EXT)
exten => _X.,n,Set(number=${EXT})
exten => _X.,n,NoOp(caller --> ${CID} callee --> ${EXT})
exten => _X.,n,GotoIf($["${EXT}" = ""]?nodst:dst)
exten => _X.,n(dst),MYSQL(Clear ${resultidcdr})
exten => _X.,n,MYSQL(Disconnect ${connidcdr})
exten => _X.,n,Dial(SIP/${number},20,tT)
exten => _X.,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?nodst)
exten => _X.,n,GotoIf($["${DIALSTATUS}" = "NOANSWER"]?nodst)
exten => _X.,n,GotoIf($["${DIALSTATUS}" = "FAILED"]?nodst)
exten => _X.,n(nodst),MYSQL(Clear ${resultidcdr})
exten => _X.,n,MYSQL(Disconnect ${connidcdr})
exten => _X.,n,Goto(from-trunk,${DID},1)
exten => h,1,hangup()
 mysql> create database CLIP;
 mysql> use CLIP;
 mysql> CREATE TABLE Callers (CID VARCHAR(20), EXT VARCHAR(4), NAME VARCHAR(35));
 mysql> INSERT Callers (CID,EXT,NAME) values (999000774,1000,'Test');
mysql> select * from Callers limit 100;
+-----------+------+------+
| CID       | EXT  | NAME |
+-----------+------+------+
| 999000774 | 1000 | Test |
+-----------+------+------+
2 rows in set (0.00 sec)

Asterisk Dialplan advanced (Диалплан расширенный)

Ввод данных DTMF и запись в текстовый файл.

Вызывающий абонент вводит dtmf сигналы, набираемые цифры записываются в текстовый файл.

exten => s,1,Answer()
exten => s,2,Playback(access-code)
exten => s,3,Read(myvar,beep,,,6,15)
exten => s,n,SayDigits(${myvar})
exten => s,n,Set(CDR(userfield)=${myvar})
exten => s,n,Verbose(${myvar})
exten => s,n,System(echo "${CALLERID(num)}" - "${myvar}" >> /var/log/asterisk/test)

Описание шагов контекста:

  • Asterisk app: Answer - ответить на вызов (установить соединение)
  • Asterisk app: Playback - проиграть стандартное сообщение (введите код).
  • Asterisk app: Read - считать данные вводимые пользователем и сохранить их в переменную $myvar
  • Asterisk app: SayDigits - проговорить данные сохраненные в переменной.
  • Asterisk app: Set / function 'CDR' - сохранить данные из переменной в поле userfield CDR.
  • Asterisk app: Verbose - вывести данные переменной в консоль и лог.
  • Asterisk app: System - записать данные переменно в текстовый файл с новой строки.

Asterisk Dialplan advanced (Диалплан расширенный)

 

Ввод DTMF и сохранение в Базу данных

exten => s,n,Authenticate(/tmp/pass,a)
exten => s,n,Playback(/var/lib/asterisk/sounds/custom/data)
exten => s,n,Read(data,beep,,,3,15)
exten => s,n,SayDigits(${data})
exten => s,n,MYSQL(Connect connid localhost test test test)
exten => s,n,MYSQL(Query resultid ${connid} INSERT INTO _${myvar} SET callerid=${CALLERID(name)}, data=${data}, date=${STRFTIME(${EPOCH},,%C%y%m%d%H%M)})
exten => s,n,MYSQL(Clear ${connid})

Похоже на предыдущий пример, только данные сохраняются в MYSQL.

  • MYSQL(Connect connid dhhost[:dbport] dbuser dbpass dbname [dbcharset]) - соединиться с БД
  • MYSQL(Query resultid ${connid} query-string) - записать данные в БД
  • MYSQL(Clear ${resultid}) - очистить память
 

Ограничение количества одновременных вызовов по набранному номеру (call limit).

Контекст

  • Набирается номер 810ХХХХХХХ, в консоль выводится сообщение: набираем 810ХХХХХХХ
  • функция GROUP() назначает вызовы в группу long
  • В консоль выводится сообщение: кол-во одновременных вызовов - ${GROUP_COUNT(long)}, где ${GROUP_COUNT(long) = порядковый номер вызова.
  • Проверяется условие, если количество одновременных вызовов больше 1, вызов направляется в екстеншен over и разъединяется с выводом в консоль:

лимит превышен на - […] вызова.

  • Если вызов первый, номер набирается через SIP транк provider.
exten => _810.,1,Verbose(*** набираем - ${EXTEN} ***)
   same => n,Set(GROUP()=long)
   same => n,Verbose(*** кол-во одновременных вызовов -  ${GROUP_COUNT(long)} ***)
   same => n,GotoIf($[${GROUP_COUNT(long)} > 1]?over)
   same => n,Dial(PJSIP/${EXTEN}@siptrunk,,)
   same => n(over),Verbose(*** лимит превышен на - ${MATH(${GROUP_COUNT(long)}-1)} вызова ***)
   same => n,Set(DIALSTATUS=CHANUNAVAIL)

Asterisk Dialplan advanced (Диалплан расширенный)

Send Call Recording to email

[macro-mixmonitor]
exten => s,1,Gosub(sub-record-check-custom1,s,1(out,${EXTEN},))
exten => s,n,Dial(${ARG1},,e)
exten => h,1,System(mail -s "record-${CALLFILENAME}" -a /var/spool/asterisk/monitor/${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT} info@asterisk-pbx.ru < /home/txt)


[from-ext1]
exten => _1XX,1,Macro(mixmonitor,PJSIP/${EXTEN})
exten => _XXXXXXX,1,Macro(mixmonitor,SIP/siptrunk1/${EXTEN})

<fs large>Дополнительный пример</fs>

[from-exten-sip]
exten => _XXXXXXX,1,Macro(mixmonitor-sip,${EXTEN},${CALLERID(all)})

[macro-mixmonitor-sip]
exten => s,1,Gosub(sub-record-check-custom1,s,1(out,${EXTEN},))
exten => s,n,Set(_TITLE=${STRFTIME(${EPOCH},,%d.%m.%Y %H:%M:%S)}, EXT=${CALLERID(num)}, SRC=${CALLERID(name)}, DST=${ARG1})
exten => s,n,Set(_SPT=SIP/siptrunk)
exten => s,n,Dial(${SPT}/${ARG1},,e)
exten => s,n,NoOp( Dial Status: ${DIALSTATUS})
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,Hangup
exten => s-CONGESTION,1,Congestion
exten => s-CANCEL,1,Hangup
exten => s-BUSY,1,Busy
exten => s-CHANUNAVAIL,1,Hangup
exten => h,1,System(mail -s "Outgoing Call Record ${TITLE}" -a /var/spool/asterisk/monitor/${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT} info@asterisk-pbx.ru < /home/info)

<fs large>Анонимные входящие вызовы</fs>

[from-guest]
exten => _1XX,1,Macro(external,${EXTEN})
exten => _X.,1,Goto(app-blackhole,s,1)

[macro-external]
exten => s,1,Gosub(sub-record-check-custom1,s,1(out,${EXTEN},))
exten => s,n,Set(_DST=DST=${ARG1})
exten => s,n,Set(_TITLE=${STRFTIME(${EPOCH},,%d.%m.%Y %H:%M:%S)}, SRC=${CUT(CUT(SIP_HEADER(Via), ,2),:,1)})
exten =  s,n,Set(_UA=${SIP_HEADER(User-Agent)})
exten =  s,n,NoOp(${CUT(CUT(SIP_HEADER(FROM), ,2),:,1)})
exten => s,n,Dial(PJSIP/${ARG1},,e)
exten => s,n,NoOp( Dial Status: ${DIALSTATUS})
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,Hangup
exten => s-CONGESTION,1,Congestion
exten => s-CANCEL,1,Hangup
exten => s-BUSY,1,Busy
exten => s-CHANUNAVAIL,1,Hangup
exten => h,1,System(mail -s "Incoming Call Record ${TITLE}, ${UA}, ${DST}" -a /var/spool/asterisk/monitor/${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT} info@asterisk-pbx.ru < /home/txt)

<fs large>FreePBX совместимая запись разговоров.</fs>

[sub-record-check-custom1]
exten => s,1,Set(REC_POLICY_MODE_SAVE=${REC_POLICY_MODE})
exten => s,n,GotoIf($["${BLINDTRANSFER}" = ""]?check)
exten => s,n,ResetCDR()
exten => s,n,GotoIf($["${REC_STATUS}" != "RECORDING"]?check)
exten => s,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
exten => s,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MIXMON_FORMAT},a,${MIXMON_POST})
exten => s,n(check),Set(__MON_FMT=${IF($["${MIXMON_FORMAT}"="wav49"]?WAV:${MIXMON_FORMAT})})
exten => s,n,GotoIf($["${REC_STATUS}"!="RECORDING"]?next)
exten => s,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT})
exten => s,n,Return()
exten => s,n(next),ExecIf($[!${LEN(${ARG1})}]?Return())
exten => s,n,ExecIf($["${REC_POLICY_MODE}"="" & "${ARG3}"!=""]?Set(__REC_POLICY_MODE=${ARG3}))
exten => s,n,GotoIf($["${REC_STATUS}"!=""]?${ARG1},1)
exten => s,n,Set(__REC_STATUS=INITIALIZED)
exten => s,n,Set(NOW=${EPOCH})
exten => s,n,Set(__DAY=${STRFTIME(${NOW},,%d)})
exten => s,n,Set(__MONTH=${STRFTIME(${NOW},,%m)})
exten => s,n,Set(__YEAR=${STRFTIME(${NOW},,%Y)})
exten => s,n,Set(__TIMESTR=${YEAR}${MONTH}${DAY}-${STRFTIME(${NOW},,%H%M%S)})
;exten => s,n,Set(__FROMEXTEN=${IF($[${LEN(${AMPUSER})}]?${AMPUSER}:${IF($[${LEN(${REALCALLERIDNUM})}]?${REALCALLERIDNUM}:unknown)})})
exten => s,n,Set(__FROMEXTEN=${CALLERID(name)})
exten => s,n,Set(__CALLFILENAME=${ARG1}-${ARG2}-${FROMEXTEN}-${TIMESTR}-${UNIQUEID})
exten => s,n,Goto(${ARG1},1)



;exten => out,1,ExecIf($["${REC_POLICY_MODE}"=""]?Set(__REC_POLICY_MODE=${DB(AMPUSER/${FROMEXTEN}/recording/out/external)}))
;статус записи вкл
exten => out,1,ExecIf($["${REC_POLICY_MODE}"=""]?Set(__REC_POLICY_MODE=always))
exten => out,n,GosubIf($["${REC_POLICY_MODE}"="always"]?record,1(exten,${ARG2},${FROMEXTEN}))
exten => out,n,Return()


exten => record,1,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
exten => record,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MIXMON_FORMAT},,${MIXMON_POST})
exten => record,n,Set(__REC_STATUS=RECORDING)
exten => record,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT})
exten => record,n,Return()

<spoiler>

[from-exten-sip2]
exten => _XXXXXXX,1,Macro(mixmonitor-sip2,${EXTEN})

[macro-mixmonitor-sip2]
exten => s,1,Gosub(sub-record-check-custom1,s,1(out,${EXTEN},))
exten => s,n,Set(_DST=DST=${ARG1})
exten => s,n,Set(_TRK=SIP/siptrunk)
exten => s,n,ChanIsAvail(${TRK}1&${TRK}2&${TRK}3&${TRK}4)
exten => s,n,Set(_TITLE=${STRFTIME(${EPOCH},,%d.%m.%Y %H:%M:%S)}, EXT=${CALLERID(num)}, SRC=${CUT(AVAILCHAN,,1)} )
exten => s,n,Dial(${CUT(AVAILCHAN,,1)}/${ARG1},,e)
exten => s,n,NoOp( Dial Status: ${DIALSTATUS})
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,Hangup
exten => s-CONGESTION,1,Congestion
exten => s-CANCEL,1,Hangup
exten => s-BUSY,1,Busy
exten => s-CHANUNAVAIL,1,Hangup
exten => h,1,System(mail -s "Outgoing Call Record ${TITLE}, ${DST}" -a /var/spool/asterisk/monitor/${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT} info@asterisk-pbx.ru < /home/info)
[from-exten-pjsip]
exten => _XXXXXXX,1,Macro(mixmonitor-pjsip,${EXTEN},${CALLERID(all)})

[macro-mixmonitor-pjsip]
exten => s,1,Gosub(sub-record-check-custom1,s,1(out,${EXTEN},))
exten => s,2,Set(_TITLE=${STRFTIME(${EPOCH},,%d.%m.%Y %H:%M:%S)}, EXT=${CALLERID(num)}, SRC=${CALLERID(name)}, DST=${ARG1})
exten => s,3,Dial(PJSIP/siptrunk${RAND(1,5)}/sip:${ARG1}@siptrunk.tld,,e)
exten => s,4,NoOp( Dial Status: ${DIALSTATUS})
exten => s,5,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,Hangup
exten => s-CONGESTION,1,Congestion
exten => s-CANCEL,1,Hangup
exten => s-BUSY,1,Busy
exten => s-CHANUNAVAIL,1,Goto(s,3)
exten => h,1,System(mail -s "Outgoing Call Record ${TITLE}" -a /var/spool/asterisk/monitor/${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT} info@asterisk.pbx.ru < /home/info)

</spoiler>

Asterisk Dialplan advanced (Диалплан расширенный)

~~socialite~~

Настройка Asterisk

  • asterisk/dialplan/examples.txt
  • Последние изменения: 2016/03/29