Страница 1 из 1

MyPBX: добавить failover (транки разных типов)

Добавлено: 09 дек 2015, 16:33
Safety1st
В качестве офисной IP-АТС трудится коробочка ‘Yeastar MyPBX Standard’ с Asterisk версии 1.6.2.6 на борту. У нас 2 транка: мультиканальный SIP и аналоговая линия. У них разные правила набора номера (strip/prepend). Через web-интерфейс в настройке 'Outbound Routes' правила набора номера можно задать только целиком для всего маршрута, поэтому оба транка сразу (для автоматического выбора доступного) указать нельзя.
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: скрин
Изображение
К счастью, коробочка поддерживает создание кастомных конфигов, поэтому внести изменения в dialplan напрямую возможность есть.

Вот часть конфига, которая, на мой взгляд, отвечает за интересующий меня функционал:
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: extensions.conf
Маршрут со скрина, используется SIP-транк:

Код: Выделить всё

[CallingRule_Default]
exten = _8XXXXXXXXX.,1,Set(agiresult=0)
exten = _8XXXXXXXXX.,n,GotoIf($[${agiresult}=1]?play-no-balance,${EXTEN},1)
exten = _8XXXXXXXXX.,n,GotoIf($[${agiresult}=2]?play-ext-disabled,${EXTEN},1)
exten = _8XXXXXXXXX.,n,GotoIf($[${agiresult}=4]?ext-no-rate,${EXTEN},1)
exten = _8XXXXXXXXX.,n,noop(no pinset)
exten = _8XXXXXXXXX.,n(a8),Set(ORGINEXTEN=${EXTEN})
exten = _8XXXXXXXXX.,n,Set(ORGINCONTEXT=${IF($[${LEN(${ORGINCONTEXT})} > 0]?${ORGINCONTEXT}: ${CONTEXT})})
exten = _8XXXXXXXXX.,n,GetNextOutRouter(${ORGINCONTEXT},)
exten = _8XXXXXXXXX.,n,GotoByTimeConditionOutbound(,0)
exten = _8XXXXXXXXX.,n,Macro(trunkdial-failover-0.3,1,,${EXTEN:},trunk-SIPProvider)
Предыдущий маршрут, используется аналоговый транк:

Код: Выделить всё

[CallingRule_Analogue]
exten = _849[59]XXXXXXX,1,Set(agiresult=0)
exten = _849[59]XXXXXXX,n,GotoIf($[${agiresult}=1]?play-no-balance,${EXTEN},1)
exten = _849[59]XXXXXXX,n,GotoIf($[${agiresult}=2]?play-ext-disabled,${EXTEN},1)
exten = _849[59]XXXXXXX,n,GotoIf($[${agiresult}=4]?ext-no-rate,${EXTEN},1)
exten = _849[59]XXXXXXX,n,noop(no pinset)
exten = _849[59]XXXXXXX,n(a8),Set(ORGINEXTEN=${EXTEN})
exten = _849[59]XXXXXXX,n,Set(ORGINCONTEXT=${IF($[${LEN(${ORGINCONTEXT})} > 0]?${ORGINCONTEXT}: ${CONTEXT})})
exten = _849[59]XXXXXXX,n,GetNextOutRouter(${ORGINCONTEXT},)
exten = _849[59]XXXXXXX,n,GotoByTimeConditionOutbound(,0)
exten = _849[59]XXXXXXX,n,Macro(trunkdial-failover-0.3,1,99,${EXTEN:},trunk_2)

Re: MyPBX: добавить failover (транки разных типов)

Добавлено: 09 дек 2015, 17:22
Safety1st
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: Забыл кусок extensions.conf:

Код: Выделить всё

[macro-trunkdial-failover-0.3]
exten = s,1,NOOP(do call out)
exten = s,2,GotoIf(${DB_EXISTS(oblacklist/${ARG3})}?Blacklist-Handle,s,1)
exten = s,3,Gotoif($[${LEN(${FromSystemAlert})}>0]?6:4)})
exten = s,4,Gotoif($[${LEN(${ARG$[${ARG1}+4]})}>0]?5:6)
exten = s,5,Goto(s,6)
exten = s,6,Set(TCOUNT=4)
exten = s,n,Set(CDR(userfield)=Outbound)
exten = s,n,Set(OldCallerID=${IF($[${LEN(${PINUSER_CONTEXT})} > 0]?${PINUSER_CONTEXT:13}:${MACRO_CONTEXT:13})})
exten = s,n,Set(TOUCH_MONITOR=${OldCallerID}-${ARG3})
exten = s,n,NOOP(${DOD_${ARG${TCOUNT}}_${OldCallerID}})
exten = s,n,Set(TIMEOUT(absolute)=${IF($[${LEN(${ABSOLUTE_TIMEOUT_${OldCallerID}})} > 0]?${ABSOLUTE_TIMEOUT_${OldCallerID}}:${ABSOLUTE_TIMEOUT})})
exten = s,n,Set(DLSTAT=UNKNOW})
exten = s,n,SetCktCustom(sendrpid,no,no)
exten = s,n,Gotoif(${ARG1}>0?1-dial,1)
exten = 1-dial,1,Gotoif($[$[${TCOUNT}-3]>${ARG1}]?nextrouter,1)
exten = 1-dial,2,Gotoif($[${LEN(${DOD_${ARG${TCOUNT}}_${OldCallerID}})} > 2]?setdod,1:1-dial,3)
exten = 1-dial,3,Set(CALLERID(name)=${IF($[${LEN(${CID_${ARG${TCOUNT}}})} > 2]?${CID_${ARG${TCOUNT}}}:${CALLERID(name)})})
exten = 1-dial,4,Set(CALLERID(num)=${IF($[${LEN(${CID_${ARG${TCOUNT}}})} > 2]?${CID_${ARG${TCOUNT}}}:${CALLERID(num)})})
exten = 1-dial,5,Set(_SIPSRTP=${SIPPEER(${ARG${TCOUNT}},srtpcapable)})
exten = 1-dial,6,Set(OUTDIALOPT=${IF($[${LEN(${GSM_${ARG${TCOUNT}}})} > 0]?tTkKWwXxr:${DIALOPTIONS})})
exten = 1-dial,7,NOOP(null for std)
exten = 1-dial,8,Gotoif($[${LEN(${FromSystemAlert})}>0]?sys-dial,1)})
exten = 1-dial,9,Dial(${${ARG${TCOUNT}}}/${ARG2}${PREFIX_${ARG${TCOUNT}}}${ARG3},,${OUTDIALOPT})
exten = 1-dial,n,Goto(1-${DIALSTATUS},1)
exten = sys-dial,1,Macro(sysdial,${${ARG${TCOUNT}}}/${ARG2}${PREFIX_${ARG${TCOUNT}}}${ARG3},,${OUTDIALOPT})
exten = setdod,1,Set(CALLERID(name)=${DOD_${ARG${TCOUNT}}_${OldCallerID}})
exten = setdod,2,Set(CALLERID(num)=${DOD_${ARG${TCOUNT}}_${OldCallerID}})
exten = setdod,3,Goto(1-dial,5)
exten = 1-BUSY,1,Set(DLSTAT=9-${DIALSTATUS})
exten = 1-BUSY,2,Goto(2-dial,1)
exten = 1-CHANUNAVAIL,1,Set(DLSTAT=9-${DIALSTATUS})
exten = 1-CHANUNAVAIL,2,Goto(2-dial,1))
exten = 1-CONGESTION,1,Set(DLSTAT=9-${DIALSTATUS})
exten = 1-CONGESTION,2,Goto(2-dial,1)
exten = 2-dial,1,Set(TCOUNT=$[${TCOUNT}+1])
exten = 2-dial,2,Goto(1-dial,1)
exten = 1-out,1,playback(all-busy-now-try-call-later)
exten = 1-out,2,Hangup()
exten = 9-BUSY,1,playback(all-busy-now-try-call-later)
exten = 9-BUSY,2,Hangup()
exten = 9-CHANUNAVAIL,1,playback(all-busy-now-try-call-later)
exten = 9-CHANUNAVAIL,2,Hangup()
exten = 9-CONGESTION,1,playback(all-busy-now-try-call-later)
exten = 9-CONGESTION,2,Hangup()
exten = nextrouter,1,GotoIf($[${LEN(${NEXTROUTER})} > 0]?${NEXTROUTER},${ORGINEXTEN},1:${DLSTAT},1)
exten = h,1,NOOP(no thing to do)

[macro-sysdial]
exten = s,1,Set(CALLERID(num)=Alarm)
exten = s,2,Set(CALLERID(name)=Alarm)
exten = s,3,Dial(${ARG1},${ARG2},${ARG3})
exten = s,4,Goto(sys-${DIALSTATUS},1)
exten = sys-ANSWER,1,Hangup()

Re: MyPBX: добавить failover (транки разных типов)

Добавлено: 11 дек 2015, 11:41
Safety1st
Это не так просто, как мне кажется? Или, наоборот, слишком легко, что неинтересно подсказать? :)

Re: MyPBX: добавить failover (транки разных типов)

Добавлено: 11 дек 2015, 13:02
ded
Я в общих чертах подскажу.
в настройке 'Outbound Routes' правила набора номера можно задать только целиком для всего маршрута, и это правильно, а разные правила набора номера (strip/prepend), точнее - правила преобразования набранного номера, тансляцию - сделать на самих транках.
Такая же логика присутствует и во FreePBX. Кастомайзить в файлах руками особо не нужно.

Btw, по вопросам поддержки китайской станции Yeastar надо обращаться к производителю.

Re: MyPBX: добавить failover (транки разных типов)

Добавлено: 14 дек 2015, 20:56
Safety1st
Благодарю!

А как вам идея: в контексте CallingRule_Analogue дописать пару строчек, чтобы в случае возврата из макроса trunkdial-failover-0.3 с состоянием BUSY выполнялся повторный вызов макроса, но с другими аргументами (как в CallingRule_Default)?

P.S. И вендору, и дистрибьютору написал :)

Re: MyPBX: добавить failover (транки разных типов)

Добавлено: 15 дек 2015, 18:31
Safety1st
Решение найдено! Замутил с подачи нашего гендира :lol:

Такая ситуация, оказывается, в MyPBX GUI уже предусмотрена. Надо просто вбить те же шаблонные extension'ы в соседнем маршруте.
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: скрины
Изображение

Изображение

Изображение
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: Как это выглядит в dialplan'е:

Код: Выделить всё

[CallingRule_Analogue]
exten = _849[59]XXXXXXX,1,Set(agiresult=0)
exten = _849[59]XXXXXXX,n,GotoIf($[${agiresult}=1]?play-no-balance,${EXTEN},1)
exten = _849[59]XXXXXXX,n,GotoIf($[${agiresult}=2]?play-ext-disabled,${EXTEN},1)
exten = _849[59]XXXXXXX,n,GotoIf($[${agiresult}=4]?ext-no-rate,${EXTEN},1)
exten = _849[59]XXXXXXX,n,noop(no pinset)
exten = _849[59]XXXXXXX,n(a8),Set(ORGINEXTEN=${EXTEN})
exten = _849[59]XXXXXXX,n,Set(ORGINCONTEXT=${IF($[${LEN(${ORGINCONTEXT})} > 0]?${ORGINCONTEXT}: ${CONTEXT})})
exten = _849[59]XXXXXXX,n,GetNextOutRouter(${ORGINCONTEXT},CallingRule_Default)
exten = _849[59]XXXXXXX,n,GotoByTimeConditionOutbound(,0)
exten = _849[59]XXXXXXX,n,Macro(trunkdial-failover-0.3,1,99,${EXTEN:},trunk_2)

[CallingRule_Default]
exten = _849[59]XXXXXXX,1,Set(agiresult=0)
exten = _849[59]XXXXXXX,n,GotoIf($[${agiresult}=1]?play-no-balance,${EXTEN},1)
exten = _849[59]XXXXXXX,n,GotoIf($[${agiresult}=2]?play-ext-disabled,${EXTEN},1)
exten = _849[59]XXXXXXX,n,GotoIf($[${agiresult}=4]?ext-no-rate,${EXTEN},1)
exten = _849[59]XXXXXXX,n,noop(no pinset)
exten = _849[59]XXXXXXX,n(a8),Set(ORGINEXTEN=${EXTEN})
exten = _849[59]XXXXXXX,n,Set(ORGINCONTEXT=${IF($[${LEN(${ORGINCONTEXT})} > 0]?${ORGINCONTEXT}: ${CONTEXT})})
exten = _849[59]XXXXXXX,n,GetNextOutRouter(${ORGINCONTEXT},)
exten = _849[59]XXXXXXX,n,GotoByTimeConditionOutbound(,0)
exten = _849[59]XXXXXXX,n,Macro(trunkdial-failover-0.3,1,,${EXTEN:},trunk-SIPProvider)
exten = _8XXXXXXXXX.,1,Set(agiresult=0)
exten = _8XXXXXXXXX.,n,GotoIf($[${agiresult}=1]?play-no-balance,${EXTEN},1)
exten = _8XXXXXXXXX.,n,GotoIf($[${agiresult}=2]?play-ext-disabled,${EXTEN},1)
exten = _8XXXXXXXXX.,n,GotoIf($[${agiresult}=4]?ext-no-rate,${EXTEN},1)
exten = _8XXXXXXXXX.,n,noop(no pinset)
exten = _8XXXXXXXXX.,n(a8),Set(ORGINEXTEN=${EXTEN})
exten = _8XXXXXXXXX.,n,Set(ORGINCONTEXT=${IF($[${LEN(${ORGINCONTEXT})} > 0]?${ORGINCONTEXT}: ${CONTEXT})})
exten = _8XXXXXXXXX.,n,GetNextOutRouter(${ORGINCONTEXT},)
exten = _8XXXXXXXXX.,n,GotoByTimeConditionOutbound(,0)
exten = _8XXXXXXXXX.,n,Macro(trunkdial-failover-0.3,1,,${EXTEN:},trunk-SIPProvider)

[macro-trunkdial-failover-0.3]
exten = s,1,NOOP(do call out)
exten = s,2,GotoIf(${DB_EXISTS(oblacklist/${ARG3})}?Blacklist-Handle,s,1)
exten = s,3,Gotoif($[${LEN(${FromSystemAlert})}>0]?6:4)})
exten = s,4,Gotoif($[${LEN(${ARG$[${ARG1}+4]})}>0]?5:6)
exten = s,5,Goto(s,6)
exten = s,6,Set(TCOUNT=4)
exten = s,n,Set(CDR(userfield)=Outbound)
exten = s,n,Set(OldCallerID=${IF($[${LEN(${PINUSER_CONTEXT})} > 0]?${PINUSER_CONTEXT:13}:${MACRO_CONTEXT:13})})
exten = s,n,Set(TOUCH_MONITOR=${OldCallerID}-${ARG3})
exten = s,n,NOOP(${DOD_${ARG${TCOUNT}}_${OldCallerID}})
exten = s,n,Set(TIMEOUT(absolute)=${IF($[${LEN(${ABSOLUTE_TIMEOUT_${OldCallerID}})} > 0]?${ABSOLUTE_TIMEOUT_${OldCallerID}}:${ABSOLUTE_TIMEOUT})})
exten = s,n,Set(DLSTAT=UNKNOW})
exten = s,n,SetCktCustom(sendrpid,no,no)
exten = s,n,Gotoif(${ARG1}>0?1-dial,1)
exten = 1-dial,1,Gotoif($[$[${TCOUNT}-3]>${ARG1}]?nextrouter,1)
exten = 1-dial,2,Gotoif($[${LEN(${DOD_${ARG${TCOUNT}}_${OldCallerID}})} > 2]?setdod,1:1-dial,3)
exten = 1-dial,3,Set(CALLERID(name)=${IF($[${LEN(${CID_${ARG${TCOUNT}}})} > 2]?${CID_${ARG${TCOUNT}}}:${CALLERID(name)})})
exten = 1-dial,4,Set(CALLERID(num)=${IF($[${LEN(${CID_${ARG${TCOUNT}}})} > 2]?${CID_${ARG${TCOUNT}}}:${CALLERID(num)})})
exten = 1-dial,5,Set(_SIPSRTP=${SIPPEER(${ARG${TCOUNT}},srtpcapable)})
exten = 1-dial,6,Set(OUTDIALOPT=${IF($[${LEN(${GSM_${ARG${TCOUNT}}})} > 0]?tTkKWwXxr:${DIALOPTIONS})})
exten = 1-dial,7,NOOP(null for std)
exten = 1-dial,8,Gotoif($[${LEN(${FromSystemAlert})}>0]?sys-dial,1)})
exten = 1-dial,9,Dial(${${ARG${TCOUNT}}}/${ARG2}${PREFIX_${ARG${TCOUNT}}}${ARG3},,${OUTDIALOPT})
exten = 1-dial,n,Goto(1-${DIALSTATUS},1)
exten = sys-dial,1,Macro(sysdial,${${ARG${TCOUNT}}}/${ARG2}${PREFIX_${ARG${TCOUNT}}}${ARG3},,${OUTDIALOPT})
exten = setdod,1,Set(CALLERID(name)=${DOD_${ARG${TCOUNT}}_${OldCallerID}})
exten = setdod,2,Set(CALLERID(num)=${DOD_${ARG${TCOUNT}}_${OldCallerID}})
exten = setdod,3,Goto(1-dial,5)
exten = 1-BUSY,1,Set(DLSTAT=9-${DIALSTATUS})
exten = 1-BUSY,2,Goto(2-dial,1)
exten = 1-CHANUNAVAIL,1,Set(DLSTAT=9-${DIALSTATUS})
exten = 1-CHANUNAVAIL,2,Goto(2-dial,1))
exten = 1-CONGESTION,1,Set(DLSTAT=9-${DIALSTATUS})
exten = 1-CONGESTION,2,Goto(2-dial,1)
exten = 2-dial,1,Set(TCOUNT=$[${TCOUNT}+1])
exten = 2-dial,2,Goto(1-dial,1)
exten = 1-out,1,playback(all-busy-now-try-call-later)
exten = 1-out,2,Hangup()
exten = 9-BUSY,1,playback(all-busy-now-try-call-later)
exten = 9-BUSY,2,Hangup()
exten = 9-CHANUNAVAIL,1,playback(all-busy-now-try-call-later)
exten = 9-CHANUNAVAIL,2,Hangup()
exten = 9-CONGESTION,1,playback(all-busy-now-try-call-later)
exten = 9-CONGESTION,2,Hangup()
exten = nextrouter,1,GotoIf($[${LEN(${NEXTROUTER})} > 0]?${NEXTROUTER},${ORGINEXTEN},1:${DLSTAT},1)
exten = h,1,NOOP(no thing to do)
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: Скрин ключевой разницы в конфигурациях (на примере одного из шаблонных extension'ов):
Изображение