Uniform distribution of outgoing
Go to the System file customization section

Open modules.conf for editing

Add the following code to the end of the file:
load => func_global.so

Open the extensions.conf file for editing

Add the following code to the end of the file:
[all-outgoing-custom]
exten => _X!,1,NoOp()
same => n,Set(NEED_RETURN=0)
; We describe the list of providers
same => n,Set(PUSH(rrItem)=SIP-1601534775)
same => n,Set(PUSH(rrItem)=SIP-1611151795)
same => n,Set(PUSH(rrItem)=SIP-1681205343)
; Maximum number of simultaneous calls over the line
same => n,Set(busyLevel=50)
; Checking if there is a provider in the list.
same => n,ExecIf($[ "${FIELDNUM(rrItem,\,,${PROVIDER_ID})}" == "0" ]?return)
; If the ID of the priority provider is determined, then immediately proceed to verification.
same => n,GotoIf($[ "${rrElement}x" != "x" ]?check)
; Initializing an array
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
; Finding an item with a lower weight
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} ---)
; Checking whether the provider matches
same => n(check),ExecIf($[ "${PROVIDER_ID}x" != "${rrElement}x" ]?Set(NEED_RETURN=1))
same => n,ExecIf($[ "${PROVIDER_ID}x" != "${rrElement}x" ]?return)
; Increasing the counter
same => n,Set(GLOBAL(${rrElement})=$[${GLOBAL(${rrElement})} + 1])
; The counter of active calls through the provider
same => n,Set(GROUP()=${rrElement})
same => n,return

For each provider, you will need to describe the outgoing route. The template in the routes must be the same.
Last updated
Was this helpful?