[sub-maxcallcheck] exten => s,1,NoOp(sub-maxcallcheck start) exten => s,n,Set(REMOTE_TRUNK_USAGE=${CUT(DUNDILOOKUP(${USERNAME}#${PBX}|trunk_usage|b)|/|2)}) exten => s,n,Set(PBX_REMOTE_TRUNK_USAGE=${IF($[${ISNULL(${REMOTE_TRUNK_USAGE})}]?0:${CUT(REMOTE_TRUNK_USAGE|-|1)})}) exten => s,n,Set(USER_REMOTE_TRUNK_USAGE=${IF($[${ISNULL(${REMOTE_TRUNK_USAGE})}]?0:${CUT(REMOTE_TRUNK_USAGE|-|2)})}) ; Perform trunk limit checking for PBX exten => s,n,Set(GROUP(pbx)=${PBX}) ; pbx group count exten => s,n,Set(PBX_MAX_CALLS=${PBX_MAX_TRUNKS(${PBX})}) exten => s,n,Set(PBX_TRUNK_USAGE=$[${GROUP_COUNT(${PBX}@pbx)} + ${PBX_REMOTE_TRUNK_USAGE}]) exten => s,n,GotoIf($[${ISNULL(${USERNAME})}]?skip_user) exten => s,n,Set(GROUP(${PBX})=${USERNAME}) ; user group count within pbx exten => s,n,Set(HASH(USER_TRUNKS)=${PHONE_MAX_TRUNKS(${USERNAME},${PBX})}) ; set vars to contain max calls exten => s,n,Set(USER_TRUNK_USAGE=$[${GROUP_COUNT(${USERNAME}@${PBX})} + ${USER_REMOTE_TRUNK_USAGE}]) exten => s,n(skip_user),NoOp() ; Display usage count exten => s,n,Verbose(1|Current PBX channel usage count is: PBX(${PBX}) --> ${PBX_TRUNK_USAGE} of ${IF($["${PBX_MAX_CALLS}" = ""]?unlimited:${PBX_MAX_CALLS})}) exten => s,n,GotoIf($[${ISNULL(${USERNAME})}]?skip_user_display) exten => s,n,Verbose(1|Current DEVICE channel usage count is: DEVICE(${USERNAME}) --> ${USER_TRUNK_USAGE} of ${IF($["${HASH(USER_TRUNKS|max_calls)}" = ""]?unlimited:${HASH(USER_TRUNKS|max_calls)})}) exten => s,n(skip_user_display),NoOp() ; Perform check on limit for peer specifically exten => s,n,GotoIf($[${ISNULL(${USERNAME})}]?pbx_gc_chk) exten => s,n,GotoIf($["${HASH(USER_TRUNKS|max_calls)}" = ""]?pbx_gc_chk) exten => s,n,GotoIf($[${USER_TRUNK_USAGE} <= ${HASH(USER_TRUNKS|max_calls)}]?:too_many_trunks,1) ; Perform check on limit for vPBX exten => s,n(pbx_gc_chk),GotoIf($["${PBX_MAX_CALLS}" = ""]?cidchk) exten => s,n,GotoIf($[${PBX_TRUNK_USAGE} <= ${PBX_MAX_CALLS}]?:too_many_trunks,1) ; No restriction -- allowing call exten => s,n,Verbose(1|Allowing call from ${CHANNEL} to ${IF($[${EXISTS(${USERNAME})}]?${USERNAME}@)}${PBX} as we have enough room) exten => s,n,Return() ; Too many trunks in use! exten => too_many_trunks,1,Verbose(1|Too many trunks in use for PBX(${PBX})) exten => too_many_trunks,n,Answer() exten => too_many_trunks,n,Wait(1) exten => too_many_trunks,n,GotoIf($[${CUT(CHANNEL,/,1)} = Local]?assume_fwd) exten => too_many_trunks,n,Playback(mix-you-have-too-many-calls) exten => too_many_trunks,n,Goto(end) exten => too_many_trunks,n(assume_fwd),Playback(mix-party-calling-has-too-many-calls) exten => too_many_trunks,n(end),Hangup()