FreePBX custom context
extensions_custom.conf sip_custom.conf from-internal-custom
Во FreePBX предусмотрено использование пользовательских (custom) файлов.
Эти файлы находятся в директории конфигурационных файлов Asterisk и имеют отличительные названия, например:
extensions_custom.conf
sip_custom.conf
и т.д. и т.п.
для более подробной информации о структуре файлов и контекстов FreePBX смотрите статью Файлы и стандартные контексты FreePBX
[from-internal]
Стандартный контекст FreePBX from-internal включает в себя файл extensions_custom.conf
Таким образом, если задать какой-либо шаг диалплана в файле extensions_custom.conf
без [имени контекста], это действие будет включено в контекст from-internal и выполняться как диалплан FreePBX.
exten => _810./_1XX,1,Playback(tt-monkeys)
[from-internal-custom]
Стандартный контекст FreePBX from-internal включает в себя контекст from-internal-custom.
Создайте контекст с таким именем в файле extensions_custom.conf
и заданный там диалплан будет выполняться, как диалплан FreePBX.
exten => _810./_2XX,1,Goto(app-blackhole,hangup,1)
Рассмотрим простой пример:
Для более гибкого использования FreePBX, может потребоваться написание собственных контекстов в диалплане.
Требуется преобразовывать набираемый номер #XX в *XX.
Замените стандартный контекст екстеншенов from-internal на собственный custom.
В файле /etc/asterisk/extensions_custom.conf создайте контекст:
[custom] exten => _1XX,1,Goto(from-internal,${EXTEN},1) exten => _[*02-9].,1,Goto(from-internal,${EXTEN},1) exten => _#.,1,Noop(add) exten => _#.,n,Set(add=*) exten => _#.,n,Goto(custom-add,${EXTEN},1) [custom-add] exten => _#.,1,Goto(from-internal,${add}${EXTEN:1},1)
При наборе внутренних номеров начинающихся на <1>, а также номеров на другие цифры, вызов будет направлен на обработку в стандартный контекст from-internal. Набранная же решетка <#>, будет заменена звездочкой <*> и направлена туда же.
Кастомная запись разговоров с отображением в Asterisk CDR FreePBX 12
Предположим у вас имеется АТС соединенная транком Е1 с Asterisk, абоненты которой совершают звонки через Asterisk и далее наружу через канал E1 провайдера подключенный к Asterisk.
Исходящие вызовы должны записываться, а ссылки на записанные файлы отображаться во встроенном интерфейсе CDR FreePBX привязанные к внутреннему номеру абонента удаленной АТС. Вызовы же наружу должны закрываться внешним номером CID.
[from-pbx] include => record [record] exten => _X.,1,Set(CALLERID(all)="${CALLERID(num)}" <8123216111>) exten => _X.,n,Set(CDR(userfield)=avaya/${CALLERID(name)}) exten => _X.,n,Gosub(sub-record-check-custom1,s,1(out,${EXTEN},)) exten => _X.,n,Dial(DAHDI/g0/${EXTEN} [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()