Asterisk + freepbx: подмена номера при переадресации

Проблема: Есть 2 транка — trunk-1 и trunk 2, и два пользователя (user1 и user2) звонки которых соот-но идут через эти транки. В случае если user2 устанавливает переадресацию на внешний номер (mobile1) звонок выходит через trunk-2 но номер звонящего подставляется user1.

Необходимо: подменить номер звонящего c user1 на user2.

Решение:

Переписываем из extensions_additional.conf в extensions_override_freepbx.conf контекст macro-user-callerid в macro-user-callerid после первых двух строк:

exten => s,1,Set(TOUCH_MONITOR=${UNIQUEID})
exten => s,n,Set(AMPUSER=${IF($["foo${AMPUSER}" = "foo"]?${CALLERID(number)}:${AMPUSER})})

добавляем:

; Block for check call forwardig
exten => s,n,Set(__FWTRACE=${IF($["foo${FWTRACE}" = "foo"]?${AMPUSER}:${FWTRACE})})
exten => s,n,NoOp(FWDCHECK: Start check for call forwarding ${FWTRACE})
; If call not forwarded goto internalcall
exten => s,n,GotoIf($["${CALLERID(rdnis)}"=""]?internalcall)
; Get forward number
exten => s,n,Set(_TMPFWNUMBER=${CUT(CHANNEL,@,1):-})
exten => s,n,Set(_FWNUMBER=${CUT(TMPFWNUMBER,/,2):-})
;xten => s,n,SET(__FWTRACE="${FWTRACE}-${CALLERID(rdnis)}-${FWNUMBER}")
; Check if forward number is digit (if not - goto internall call)
exten => s,n,Set(_CHECKFW=${REGEX("^[0-9]+$" ${FWNUMBER})})
exten => s,n,GotoIf($["${CHECKFW}" = "0"]?internalcall)
; Check if forward number less then 7 digit - goto internall call
exten => s,n,Set(_CHECKFW=${REGEX("^[0-9]{1,6}$" ${FWNUMBER})})
exten => s,n,GotoIf($["${CHECKFW}" = "1"]?fwinternalcall)
; Check if forward number in asterisk database
exten => s,n,GotoIf($["${DB_EXISTS(AMPUSER/${FWNUMBER}/cidnum)}"="1"]?fwinternalcall)
; All check done, call is forward to external number
exten => s,n(fwexternalcall),NoOp(FWDCHECK: Forward to External Number)
exten => s,n,Set(__FWTRACE=${FWTRACE}-${FWNUMBER})
; replace caller number
exten => s,n,Set(CALLERID(number)=${IF($["foo${CALLERID(rdnis)}" = "foo"]?${CALLERID(number)}:${CALLERID(rdnis)})})
exten => s,n,Set(AMPUSER=${IF($["foo${CALLERID(rdnis)}" = "foo"]?${CALLERID(number)}:${CALLERID(rdnis)})})
exten => s,n,Set(AMPUSERCID=${IF($["foo${CALLERID(rdnis)}" = "foo"]?${CALLERID(number)}:${CALLERID(rdnis)})})
; go to end
exten => s,n,Goto(endcheck)
exten => s,n(fwinternalcall),NoOp(FWDCHECK: Forward To Internal Number ${FWNUMBER})
exten => s,n,Set(__FWTRACE=${FWTRACE}-${FWNUMBER})
exten => s,n,Goto(endcheck)
exten => s,n(internalcall),NoOp(FWDCHECK: Internal Call)
exten => s,n,Set(__FWTRACE=${FWTRACE}-${ARG2})
exten => s,n(endcheck),NoOp(FWDCHECK: Exit from check forwarding)
exten => s,n,NoOp(FWDCHECK: TRACE ${FWTRACE})

После применения в логах появится трассирока звонка вида:

"FWDCHECK: TRACE  user1-user2-..-userN-externalnumber"

Звонок наружу пойдеи ичерез транк пользователя userN под его номером.

Личные изыскания по вопросу товарища Rayder’a

 
comments powered by Disqus