VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

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

Проблемы Asterisk без вэб-оболочек и их решения

Модераторы: april22, Zavr2008

Ответить
Аватара пользователя
Safety1st
Сообщения: 9
Зарегистрирован: 10 ноя 2015, 13:14
Откуда: Moscow, Russia

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

Сообщение 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)
Аватара пользователя
Safety1st
Сообщения: 9
Зарегистрирован: 10 ноя 2015, 13:14
Откуда: Moscow, Russia

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

Сообщение 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()
Аватара пользователя
Safety1st
Сообщения: 9
Зарегистрирован: 10 ноя 2015, 13:14
Откуда: Moscow, Russia

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

Сообщение Safety1st »

Это не так просто, как мне кажется? Или, наоборот, слишком легко, что неинтересно подсказать? :)
ded
Сообщения: 15628
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение ded »

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

Btw, по вопросам поддержки китайской станции Yeastar надо обращаться к производителю.
Аватара пользователя
Safety1st
Сообщения: 9
Зарегистрирован: 10 ноя 2015, 13:14
Откуда: Moscow, Russia

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

Сообщение Safety1st »

Благодарю!

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

P.S. И вендору, и дистрибьютору написал :)
Аватара пользователя
Safety1st
Сообщения: 9
Зарегистрирован: 10 ноя 2015, 13:14
Откуда: Moscow, Russia

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

Сообщение 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'ов):
Изображение
Ответить
© 2008 — 2025 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH