[all-outgoing-custom]exten => _X!,1,NoOp() same => n,Set(NEED_RETURN=0) ; Описываем список провайдеров same => n,Set(PUSH(rrItem)=SIP-1601534775) same => n,Set(PUSH(rrItem)=SIP-1611151795) same => n,Set(PUSH(rrItem)=SIP-1681205343) ; Максимальное количество одновременных звонков через линию same => n,Set(busyLevel=50) ; Проверка, есть ли провайдер в списке. same => n,ExecIf($[ "${FIELDNUM(rrItem,\,,${PROVIDER_ID})}"=="0" ]?return) ; Если ID приоритетного провайдера определен, то сразу к проверке. same => n,GotoIf($[ "${rrElement}x"!="x" ]?check) ; Инициализация массива same => n,Set(rrArray=${EMPTY}) same => n,Set(i=${SHIFT(rrItem)}) same => n,While(1) same => n,ExecIf($[ "${i}x"=="x" ]?ExitWhile()) same => n,ExecIf($[ "${rrArray}x"!="x" ]?Set(rrArray=${rrArray},)) same => n,ExecIf($[ "${GLOBAL(${i})}x"=="x" ]?Set(GLOBAL(${i})=0)) same => n,Set(rrArray=${rrArray}${i}:${GLOBAL(${i})}) same => n,Set(i=${SHIFT(rrItem)}) same => n,EndWhile ; Поиск элемента с меньшим весом same => n,Set(rrArray=${SORT(${rrArray})}) same => n,Set(rrElement=${SHIFT(rrArray)}) same => n,While(1) same => n,ExecIf($[ $[${GROUP_COUNT(${rrElement})} < ${busyLevel}] ]?ExitWhile()) same => n,ExecIf($[ "${rrElement}x"=="x" ]?ExitWhile()) same => n,NoOp( ${rrElement} - is busy) same => n,Set(rrElement=${SHIFT(rrArray)}) same => n,EndWhile same => n,NoOp(--- ${rrElement} ---) ; Проверка совпадает ли провайдер same => n(check),ExecIf($[ "${PROVIDER_ID}x"!="${rrElement}x" ]?Set(NEED_RETURN=1)) same => n,ExecIf($[ "${PROVIDER_ID}x"!="${rrElement}x" ]?return) ; Увеличиваем счетчик same => n,Set(GLOBAL(${rrElement})=$[${GLOBAL(${rrElement})} +1]) ; Счетчик активных звонков через провайдера same => n,Set(GROUP()=${rrElement}) same => n,return
В строках вида «Set(PUSH(rrItem)=SIP-1601534775)» перечисляются идентификаторы провайдеров, среди которых следует равномерно распределять исходящие. Идентификатор можно скопировать в адресной строке браузера при редактировании провайдера.
В переменной «busyLevel» определяется максимально допустимое количество одновременных звонков через провайдера.
Для каждого провайдера потребуется описать исходящий маршрут. Шаблон в маршрутах должен быть одинаковым.