====== Равномерное распределение исходящих ====== [[:faq|Обратно к инструкциям]] - Перейдите в раздел [[:custom-files|Кастомизация системных файлов]] - Откройте на редактирование **modules.conf** и добавьте в конец файла load => func_global.so Сохраните изменения - Откройте на редактирование файл **extensions.conf** - Добавьте следующий код в конец файла: [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**" определяется максимально допустимое количество одновременных звонков через провайдера. Для каждого провайдера потребуется описать исходящий маршрут. Шаблон в маршрутах должен быть одинаковым. [[:faq|Обратно к инструкциям]]