У меня вот такой dial plan и я хоть убей не понимаю как его привести к желаемому результату:
Код: Выделить всё
[general]
static=yes
writeprotect=no
[globals]
DIR_RECORDS=/mnt/calls/
[default]
;Вешаем трубку
[handup-sip]
exten => _X!,1,HangUp()
;[recording]
;exten => s,1,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2})
;exten => s,n,Set(monopt=nice -n 19 /usr/local/bin/lame -b 32 --silent "${DIR_RECORDS}${fname}.wav" "${DIR_RECORDS}${fname}.mp3" && rm -f "${DIR_RECORDS}${fname}.wav" && chmod o+r "${DIR_RECORDS}${fname}.mp3")
;exten => s,n,Set(CDR(filename)=${fname}.mp3)
;exten => s,n,Set(CDR(realdst)=${ARG2})
;exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt})
;exten => s,n(no),Verbose(Exit record)
;exten => s,n,Return()
;Исходящие звонки
[call-out]
;Комната для конференций
exten => 9999,1,Answer()
exten => 9999,n,ConfBridge(1,confer)
;Номер для записи звуков, окончание записи #
exten => _350X, 1, NoOp()
exten => _350X, n, Wait(2)
exten => _350X, n, Playback(beep)
exten => _350X, n, Record(/tmp/music${EXTEN:2}:wav)
exten => _350X, n, Wait(1)
exten => _350X, n, Playback(/tmp/music${EXTEN:2})
exten => _350X, n, Wait(2)
exten => _350X, n, Hangup()
;Управление голосовой почтой
exten => 5000,1,VoiceMailMain()
;Звонок на внутренний номер
;exten => _XXXX,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => _XXXX,n,Dial(SIP/${EXTEN},10)
exten => _XXXX,n,Set(dstNUM=${EXTEN})
exten => _XXXX,n,GotoIf($["${SIPPEER(${EXTEN},status)}" = ""]?num-not-exist,1)
exten => _XXXX,n,GotoIf($["${SIPPEER(${EXTEN},status):0:2}" = "UN"]?num-not-connected,1)
exten => _XXXX,n,ChanIsAvail(SIP/${EXTEN},s)
exten => _XXXX,n,NoOp(=========== ChanIsAvail STATUS: ${AVAILSTATUS} ===========)
exten => _XXXX,n,GoToIf($[${AVAILSTATUS} = 2]?num-BUSY,1)
exten => _XXXX,n,GoToIf($[${AVAILSTATUS} = 3]?num-BUSY,1)
exten => _XXXX,n,Goto(num-${DIALSTATUS},1)
exten => num-not-exist,1,Wait(2)
exten => num-not-exist,n,Playback(invalid)
exten => num-not-connected,1,Wait(2)
exten => num-not-connected,n,Playback(ss-noservice)
exten => num-BUSY,1,Wait(2)
exten => num-BUSY,n,Playback(vm-isonphone)
exten => num-NOANSWER,1,Wait(2)
exten => num-NOANSWER,n,Voicemail(${dstNUM},u)
exten => num-CHANUNAVAIL,1,Wait(2)
exten => num-CHANUNAVAIL,n,Playback(vm-isunavail)
;Звонок на внешний номер
;exten => _XXXX.,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => _XXXX.,1,Dial(SIP/${EXTEN}@164719)
include => handup-sip
;Входящие звонки
[call-in]
exten => 164719,1,Goto(ivr-main,s,1)
[ivr-main]
exten => s,1,Answer()
exten => s,2,Background(/etc/asterisk/ivr/ivr-main)
exten => s,3,WaitExten(5)
;exten => _XXXX,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => _XXXX,1,Dial(SIP/${EXTEN},15)
;Задаем переменную для передачи в голосовую почту
exten => _XXXX,n,Set(dstNUM=${EXTEN})
;Проверяем статус пира, существует или нет
exten => _XXXX,n,GotoIf($["${SIPPEER(${EXTEN},status)}" = ""]?num-not-exist,1)
;Проверяем статус пира, подключен или нет
exten => _XXXX,n,GotoIf($["${SIPPEER(${EXTEN},status):0:2}" = "UN"]?num-not-connected,1)
;Проверяем канал на занятость
exten => _XXXX,n,ChanIsAvail(SIP/${EXTEN},s)
;Выводим в лог значение функции ChanIsAvail, нужно только для отладки, можно удалить строку
exten => _XXXX,n,NoOp(=========== ChanIsAvail STATUS: ${AVAILSTATUS} ===========)
;Если функция возвращает 2 или 3, значит абонент занят
exten => _XXXX,n,GoToIf($[${AVAILSTATUS} = 2]?num-BUSY,1)
exten => _XXXX,n,GoToIf($[${AVAILSTATUS} = 3]?num-BUSY,1)
;Обрабатываем остальные статусы
exten => _XXXX,n,Goto(num-${DIALSTATUS},1)
;Если номера не существует говорим "Ошибочный номер, попробуйте еще раз"
exten => num-not-exist,1,Wait(2)
exten => num-not-exist,n,Playback(invalid)
;Если номер не подключен, говорим "Набранный вами номер отключен, проверьте номер и повторите попытку
exten => num-not-connected,1,Wait(2)
exten => num-not-connected,n,Playback(ss-noservice)
;Если номер занят, говорим "Занято"
exten => num-BUSY,1,Wait(2)
exten => num-BUSY,n,Playback(vm-isonphone)
;Если номер не отвечает, включаем голосовую почту
exten => num-NOANSWER,1,Wait(2)
exten => num-NOANSWER,n,Voicemail(${dstNUM},u)
;Если еще по какой-то причине будет статус CHANUNAVAIL, говорим, что номер не доступен в данный момент
exten => num-CHANUNAVAIL,1,Wait(2)
exten => num-CHANUNAVAIL,n,Playback(vm-isunavail)
;Если в голосовом меню не выбрали внутренний номер, адресуем звонок секретарю
;exten => t,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => t,1,Queue(secretary,t)