Проблема: Есть 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