Uniform distribution of outgoing

  1. Go to the System file customization section

System file customization section
  1. Open modules.conf for editing

Modules.conf file
  1. Add the following code to the end of the file:

load => func_global.so
Code for Modules.conf
  1. Open the extensions.conf file for editing

Extensions.conf file
  1. 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
Code for extensions.conf

In the lines of the form "Set(PUSH(rrItem)=SIP-1601534775)", the ids of providers are listed, among which outgoing ones should be evenly distributed. The ID can be copied in the browser's address bar when editing the provider. The "busyLevel" variable defines the maximum allowed number of simultaneous calls through the provider.

Last updated

Was this helpful?