[Resolved] Transfer to voicemail

OK, The *125 transfer to voice mail trick is working perfectly on my system EXCEPT for extensions that start with ‘11’ like *111, *112, *116 and the like. When you try to transfer to voicemail from them you get the voice telling you that your extension is busy. For example if I am at 125 and I try to transfer a call to 111 by pressing *111, I hear a message saying that extension 125 is busy.

Any ideas?

Post your extensions.

I hope this is what you are looking for both the extensions.conf and extensions_additional.conf.

extensions.conf[code]; Asterisk Management Portal (AMP)
; Copyright © 2004 Coalescent Systems Inc

; dialparties.agi (http://www.sprackett.com/asterisk/)
; Asterisk::AGI (http://asterisk.gnuinter.net/)
; gsm (http://www.ibiblio.org/pub/Linux/utils/compress/!INDEX.short.html)
; loligo sounds (http://www.loligo.com/asterisk/sounds/)
; mpg123 (http://voip-info.org/wiki-Asterisk+config+musiconhold.conf)

; include extension contexts generated from AMP
#include extensions_additional.conf

; Customizations to this dialplan should be made in extensions_custom.conf
; See extensions_custom.conf.sample for an example
#include extensions_custom.conf

[from-trunk] ; just an alias since VoIP shouldn’t be called PSTN
include => from-pstn

[from-pstn]
include => from-pstn-custom ; create this context in extensions_custom.conf to include customizations
include => ext-did
exten => fax,1,Goto(ext-fax,in_fax,1)

; ############################################################################
; Macros [macro]
; ############################################################################

; Rings one or more extensions. Handles things like call forwarding and DND
; We don’t call dial directly for anything internal anymore.
; ARGS: $TIMER, $OPTIONS, $EXT1, $EXT2, $EXT3, …
; Use a Macro call such as the following:
; Macro(dial,$DIAL_TIMER,$DIAL_OPTIONS,$EXT1,$EXT2,$EXT3,…)
[macro-dial]
;exten => s,1,GotoIf($[ “${MACRO_CONTEXT}” = “macro-rg-group” ]?4:2) ; if this is from rg-group, don’t strip prefix
;exten => s,2,GotoIf($["${CALLERID(name):0:${LEN(${RGPREFIX})}}" != “${RGPREFIX}”]?4:3) ; check for ring-group prefix
;exten => s,3,Set(CALLERID(name)=${CALLERID(name):${LEN(${RGPREFIX})}}) ; strip off prefix
exten => s,1,AGI,dialparties.agi
exten => s,2,NoOp(Returned from dialparties with no extensions to call)
exten => s,3,Set(DIALSTATUS=BUSY)
exten => s,10,Dial(${ds}) ; dialparties will set the priority to 10 if $ds is not null
exten => s,20,NoOp(Returned from dialparties with hunt groups to dial )
exten => s,21,Set(HuntLoop=0)
exten => s,22,GotoIf($[${HuntMembers} >= 1]?30 ) ; if this is from rg-group, don’t strip prefix
exten => s,23,NoOp(Returning there are no members left in the hunt group to ring)

exten => s,30,Set(HuntMember=HuntMember${HuntLoop})
exten => s,31,GotoIf($[$["${CALLTRACE_HUNT}" != “” ] & $["${RingGroupMethod}" = “hunt” ]]?32:35 ) ; Set CAll Trace for Hunt member we are going to call
exten => s,32,Set(CT_EXTEN=${CUT(ARG3,$[${HuntLoop} + 1])})
exten => s,33,Set(DB(CALLTRACE/${CT_EXTEN})=${CALLTRACE_HUNT})
exten => s,34,Goto(s,42)

exten => s,35,GotoIf($[$["${CALLTRACE_HUNT}" != “” ] & $["${RingGroupMethod}" = “memoryhunt” ]]?36:50 ) ;Set Call Trace for each hunt member we are going to call "Memory groups have multiple members to set CALL TRACE For hence the loop
exten => s,36,Set(CTLoop=0)
exten => s,37,GotoIf($[${CTLoop} > ${HuntLoop}]?42 ) ; if this is from rg-group, don’t strip prefix
exten => s,38,Set(CT_EXTEN=${CUT(ARG3,$[${CTLoop} + 1])})
exten => s,39,Set(DB(CALLTRACE/${CT_EXTEN})=${CALLTRACE_HUNT})
exten => s,40,Set(CTLoop=$[1 + ${CTLoop}])
exten => s,41,Goto(s,37)
exten => s,42,Dial(${${HuntMember}}${ds} ) ; dialparties will set the priority to 20 if $ds is not null and its a hunt group
exten => s,43,Set(HuntLoop=$[1 + ${HuntLoop}])
exten => s,44,Set(HuntMembers=$[${HuntMembers} - 1])
exten => s,45,Goto(s,22)
exten => s,50,DBdel(CALLTRACE/${CT_EXTEN})
exten => s,51,Goto(s,42)

;exten => s,1,GotoIf($[ “${MACRO_CONTEXT}” = “macro-rg-group” ]?4:2) ; if this is from rg-group, don’t strip prefix
;exten => s,2,GotoIf($[${CALLERID(name):0:${LEN(${RGPREFIX})}} != ${RGPREFIX}]?4:3) ; check for ring-group prefix
;exten => s,3,Set(CALLERID(name)=${CALLERID(name):${LEN(${RGPREFIX})}}) ; strip off prefix
;exten => s,4,AGI,dialparties.agi
;exten => s,5,NoOp(Returned from dialparties with no extensions to call)
;exten => s,6,Set(DIALSTATUS=BUSY)
;exten => s,10,Dial(${ds}) ; dialparties will set the priority to 10 if $ds is not null

; Ring an extension, if the extension is busy or there is no answer send it
; to voicemail
; ARGS: $VMBOX, $EXT
[macro-exten-vm]
exten => s,1,Macro(user-callerid)
exten => s,2,Set(FROMCONTEXT=exten-vm)
exten => s,3,Macro(record-enable,${ARG2},IN)
exten => s,4,Macro(dial,${RINGTIMER},${DIAL_OPTIONS},${ARG2})
exten => s,5,GotoIf($["${CHANNEL:0:5}" = “Local”]?s-${DIALSTATUS},1) ; if the channel is Local, then do not go to voicemail. This is primarily to avoid vm for call-forwarded extensions in ring groups
exten => s,6,GotoIf($["${ARG1}" = “novm”]?s-${DIALSTATUS},1) ; no voicemail in use for this extension
exten => s,7,NoOp(Sending to Voicemail box ${ARG2})
exten => s,8,Macro(vm,${ARG1},${DIALSTATUS})
exten => s-BUSY,1,NoOp(Extension is reporting BUSY and has no Voicemail)
exten => s-BUSY,2,Busy()
exten => s-BUSY,3,Wait(60)
exten => s-BUSY,4,NoOp()
exten => _s-.,1,Congestion()

[macro-vm]
exten => s,1,Macro(user-callerid)
exten => s,2,Goto(s-${ARG2},1)
exten => s-BUSY,1,Macro(get-vmcontext,${ARG1})
exten => s-BUSY,2,Voicemail(b${ARG1}@${VMCONTEXT}) ; Voicemail Busy message
exten => s-BUSY,3,Hangup()
exten => _s-.,1,Macro(get-vmcontext,${ARG1})
exten => _s-.,2,Voicemail(u${ARG1}@${VMCONTEXT}) ; Voicemail Unavailable message
exten => _s-.,3,Hangup()
exten => o,1,Background(one-moment-please) ; 0 during vm message will hangup
;exten => o,2,GotoIf($[“foo${FROM_DID}” = “foo”]?from-pstn,s,1:from-pstn,${FROM_DID},1)
exten => o,2,Goto(ext-group,500,1)
exten => a,1,Macro(get-vmcontext,${ARG1})
exten => a,2,VoiceMailMain(${ARG1}@${VMCONTEXT})
exten => a,3,Hangup

; get the voicemail context for the user in ARG1
[macro-get-vmcontext]
exten => s,1,Set(VMCONTEXT=${DB(AMPUSER/${ARG1}/voicemail)})
exten => s,2,GotoIf($[“foo${VMCONTEXT}” = “foo”]?200:300)
exten => s,200,Set(VMCONTEXT=default)
exten => s,300,NoOp()

; For some reason, if I don’t run setCIDname, CALLERID(name) will be blank in my AGI
; ARGS: none
[macro-fixcid]
exten => s,1,Set(CALLERID(name)=${CALLERID(name)})

; Ring groups of phones
; ARGS: comma separated extension list
; 1 - Ring Group Strategy
; 2 - ringtimer
; 3 - prefix
; 4 - extension list
[macro-rg-group]
exten => s,1,Macro(user-callerid)
exten => s,2,GotoIf($["${CALLERID(name):0:${LEN(${RGPREFIX})}}" != “${RGPREFIX}”]?4:3) ; check for old prefix
exten => s,3,Set(CALLERID(name)=${CALLERID(name):${LEN(${RGPREFIX})}}) ; strip off old prefix
exten => s,4,Set(RGPREFIX=${ARG3}) ; set new prefix
exten => s,5,Set(CALLERID(name)=${RGPREFIX}${CALLERID(name)}) ; add prefix to callerid name
exten => s,6,Set(RecordMethod=Group) ; set new prefix
exten => s,7,Macro(record-enable,${MACRO_EXTEN},${RecordMethod})
exten => s,8,Set(RingGroupMethod=${ARG1}) ;
exten => s,9,Macro(dial,${ARG2},${DIAL_OPTIONS},${ARG4})
exten => s,10,Set(RingGroupMethod=’’) ;

;
; Outgoing channel(s) are busy … inform the client
;
[macro-outisbusy]
exten => s,1,Playback(all-circuits-busy-now)
exten => s,2,Playback(pls-try-call-later)
exten => s,3,Macro(hangupcall)

; What to do on hangup.
[macro-hangupcall]
exten => s,1,ResetCDR(w)
exten => s,2,NoCDR()
exten => s,3,Wait(5)
exten => s,4,Hangup

[macro-faxreceive]
exten => s,1,Set(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID}.tif)
exten => s,2,Set(EMAILADDR=${FAX_RX_EMAIL})
exten => s,3,rxfax(${FAXFILE})
exten => s,103,Set(EMAILADDR=${FAX_RX_EMAIL})
exten => s,104,Goto(3)

; dialout and strip the prefix
[macro-dialout]
exten => s,1,Macro(user-callerid)
exten => s,2,GotoIf($["${ECID${CALLERID(number)}}" = “”]?5) ;check for CID override for exten
exten => s,3,Set(CALLERID(all)=${ECID${CALLERID(number)}})
exten => s,4,Goto(7)
exten => s,5,GotoIf($["${OUTCID_${ARG1}}" = “”]?7) ;check for CID override for trunk
exten => s,6,Set(CALLERID(all)=${OUTCID_${ARG1}})
exten => s,7,Set(length=${LEN(${DIAL_OUT_${ARG1}})})
exten => s,8,Dial(${OUT_${ARG1}}/${ARG2:${length}})
exten => s,9,Congestion
exten => s,109,Macro(outisbusy)

; dialout using default OUT trunk - no prefix
[macro-dialout-default]
exten => s,1,Macro(user-callerid)
exten => s,2,Macro(record-enable,${CALLERID(number)},OUT)
exten => s,3,Macro(outbound-callerid,${ARG1})
exten => s,4,Dial(${OUT}/${ARG1})
exten => s,5,Congestion
exten => s,105,Macro(outisbusy)

; dialout using a trunk, using pattern matching (don’t strip any prefix)
; arg1 = trunk number, arg2 = number, arg3 = route password
[macro-dialout-trunk]
exten => s,1,GotoIf($["${ARG3}" = “”]?3:2) ; arg3 is pattern password
exten => s,2,Authenticate(${ARG3})
exten => s,3,Macro(user-callerid)
exten => s,4,Macro(record-enable,${CALLERID(number)},OUT)
exten => s,5,Macro(outbound-callerid,${ARG1})
exten => s,6,Set(GROUP()=OUT_${ARG1})
exten => s,7,GotoIf($[ ${GROUP_COUNT()} > ${OUTMAXCHANS_${ARG1}} ]?108)
; if we’ve used up the max channels, continue at (n+101)
exten => s,8,Set(DIAL_NUMBER=${ARG2})
exten => s,9,Set(DIAL_TRUNK=${ARG1})
exten => s,10,AGI(fixlocalprefix) ; this sets DIAL_NUMBER to the proper dial string for this trunk
exten => s,11,Set(OUTNUM=${OUTPREFIX_${ARG1}}${DIAL_NUMBER}) ; OUTNUM is the final dial number
exten => s,12,Set(custom=${CUT(OUT_${ARG1},:,1)}) ; Custom trunks are prefixed with “AMP:“
exten => s,13,GotoIf($[”${custom}” = “AMP”]?16)
exten => s,14,Dial(${OUT_${ARG1}}/${OUTNUM}|120|W) ; Regular Trunk Dial, allow recording.
exten => s,15,Goto(s-${DIALSTATUS},1)

; This is a custom trunk. Substitute $OUTNUM$ with the actual number and rebuild the dialstring
; example trunks: “AMP:CAPI/XXXXXXXX:b$OUTNUM$,30,r”, “AMP:OH323/$OUTNUM$@XX.XX.XX.XX:XXXX"
exten => s,16,Set(pre_num=${CUT(OUT_${ARG1},$,1)})
exten => s,17,Set(the_num=${CUT(OUT_${ARG1},$,2)}) ; this is where we expect to find string OUTNUM
exten => s,18,Set(post_num=${CUT(OUT_${ARG1},$,3)})
exten => s,19,GotoIf($[”${the_num}" = “OUTNUM”]?20:21) ; if we didn’t find “OUTNUM”, then skip to Dial
exten => s,20,Set(the_num=${OUTNUM}) ; replace “OUTNUM” with the actual number to dial
exten => s,21,Dial(${pre_num:4}${the_num}${post_num})
exten => s,22,Goto(s-${DIALSTATUS},1)

exten => s,108,Noop(max channels used up)
exten => s-BUSY,1,NoOp(Trunk is reporting BUSY)
exten => s-BUSY,2,Busy()
exten => s-BUSY,3,Wait(60)
exten => s-BUSY,4,NoOp()

exten => _s-.,1,NoOp(Dial failed due to ${DIALSTATUS})

; Adds a dynamic agent/member to a Queue
; Prompts for call-back number - in not entered, uses CIDNum
[macro-agent-add]
exten => s,1,Wait(1)
exten => s,2,Macro(user-callerid)
exten => s,3,Read(CALLBACKNUM,agent-user) ; get callback number from user
exten => s,4,GotoIf($["${CALLBACKNUM}" = “”]?5:7)) ; if user just pressed # or timed out, use cidnum
exten => s,5,Set(CALLBACKNUM=${CALLERID(number)})
exten => s,6,GotoIf($["${CALLBACKNUM}" = “”]?2)) ; if still no number, start over
exten => s,7,GotoIf($["${ARG2}" = “”]?9:8)) ; arg2 is queue password
exten => s,8,Authenticate(${ARG2})
exten => s,9,AddQueueMember(${ARG1}|Local/${CALLBACKNUM}@from-internal/n) ; using chan_local allows us to have agents over trunks
exten => s,10,UserEvent(Agentlogin|Agent: ${CALLBACKNUM})
exten => s,11,Wait(1)
exten => s,12,Playback(agent-loginok)
exten => s,13,Hangup()

; Removes a dynamic agent/member from a Queue
; Prompts for call-back number - in not entered, uses CIDNum
[macro-agent-del]
exten => s,1,Wait(1)
exten => s,2,Macro(user-callerid)
exten => s,3,Read(CALLBACKNUM,agent-user) ; get callback number from user
exten => s,4,GotoIf($["${CALLBACKNUM}" = “”]?5:7)) ; if user just pressed # or timed out, use cidnum
exten => s,5,Set(CALLBACKNUM=${CALLERID(number)})
exten => s,6,GotoIf($["${CALLBACKNUM}" = “”]?2)) ; if still no number, start over
exten => s,7,RemoveQueueMember(${ARG1}|Local/${CALLBACKNUM}@from-internal/n)
exten => s,8,UserEvent(RefreshQueue)
exten => s,9,Wait(1)
exten => s,10,Playback(agent-loggedoff)
exten => s,11,Hangup()

; arg1 = trunk number, arg2 = number
[macro-dialout-enum]
; This has been violently beaten upon by Rob Thomas, xrobau@gmail.com
; to 1: Be compliant with all the depreciated bits in asterisk 1.2 and
; above, and 2: to give a good shot at attempting to be compliant with
; RFC3761 by honouring the order in which records are returned.
exten => s,1,Macro(user-callerid)
exten => s,n,Macro(record-enable,${CALLERID(number)},OUT)
exten => s,n,Macro(outbound-callerid,${ARG1})
exten => s,n,Set(GROUP()=OUT_${ARG1})
exten => s,n,GotoIf($[ ${GROUP_COUNT()} > ${OUTMAXCHANS_${ARG1} ]?nochans)
exten => s,n,Set(DIAL_NUMBER=${ARG2})
exten => s,n,Set(DIAL_TRUNK=${ARG1})
exten => s,n,AGI(fixlocalprefix) ; this sets DIAL_NUMBER to the proper dial string for this trunk
exten => s,n,GotoIf($["${DIAL_NUMBER:0:1}" = “+”]?hasplus) ; Skip next line if it already is prefixed by a plus
exten => s,n,Set(DIAL_NUMBER=+${DIAL_NUMBER}) ; Add a plus to the start, becasue ENUMLOOKUP needs it.
; OK, this is now quite complex. To remain compliant, we have to iterate
; through, in order, the returned records. Since we want to make this
; call over the network, we can ignore tel: lines. Even if it’s first
; priority.
exten => s,n(hasplus),Set(ENUMCOUNT=${ENUMLOOKUP(${DIAL_NUMBER},ALL,c,e164.org)}) ; Should e164.org be a var? I think so.
; Now the count may be zero, so if it is, just go to failed
exten => s,n,GotoIf($[ $[ ${ENUMCOUNT} = 0 ] | $[x${ENUMCOUNT} = x ] ]?failed)
; Now, let’s start through them.
exten => s,n,Set(ENUMPTR=1)
exten => s,n(startloop),Set(ENUM=${ENUMLOOKUP(${DIAL_NUMBER},ALL,${ENUMPTR},e164.org)})
; Sanity check the return, make sure there’s something in there.
exten => s,n,GotoIf($[${LEN(${ENUM})} = 0 ]?continue)
exten => s,n,GotoIf($["${ENUM:0:3}" = “sip” ]?sipuri)
exten => s,n,GotoIf($["${ENUM:0:3}" = “iax” ]?iaxuri)
; It doesn’t matter if you don’t have h323 enabled, as when it tries to dial, it cares
; about dialstatus and retries if there are any enum results left.
exten => s,n,GotoIf($["${ENUM:0:3}" = “h32” ]?h323uri)
; If we’re here, it’s not a protocol we know about. Let’s increment the pointer
; and if it’s more than ENUMCOUNT, we know we’ve run out of options. We also can
; come here if the enum string we’ve received is empty, or if the Dial command
; returned CONGESTION or CHANUNAVAIL.
exten => s,n(continue),Set(ENUMPTR=$[${ENUMPTR}+1])
exten => s,n,GotoIf($[${ENUMPTR} > ${ENUMCOUNT}]?failed)
; OK. If we’re here, we’ve still got some enum entries to go through. Back to
; the start with you!
exten => s,n,Goto(startloop)
; If the prefix is ‘sip:’…
exten => s,n(sipuri),Set(DIALSTR=SIP/${ENUM:4})
exten => s,n,Goto(dodial)
; If it’s IAX2…
exten => s,n(iaxuri),Set(DIALSTR=IAX2/${ENUM:5})
exten => s,n,Goto(dodial)
; Or even if it’s H323.
exten => s,n(h323uri),Set(DIALSTR=H323/${ENUM:5})

exten => s,n(dodial),Dial(${DIALSTR})
exten => s,n,NoOp(Dial exited in macro-enum-dialout with ${DIALSTATUS})
; Now, if we’re still here, that means the Dial failed for some reason.
; If it’s CONGESTION or CHANUNAVAIL we probably want to try again on a
; different channel. However, if it’s the last one, we don’t have any
; left, and I didn’t keep any previous dialstatuses, so hopefully
; someone looking throught the logs would have seen the NoOp’s
exten => s,n,GotoIf($["${ENUMPTR}" = “${ENUMCOUNT}”]?noneleft)
exten => s,n,GotoIf($[ $[ “${DIALSTATUS}” = “CHANUNAVAIL” ] | $[ “${DIALSTATUS}” = “CONGESTION” ] ]?continue)
; If we’re here, then it’s BUSY or NOANSWER or something and well, deal with it.
exten => s,n(noneleft),Goto(s-${DIALSTATUS},1)
; Here are the exit points for the macro.
exten => s,n(failed),NoOp(EnumLookup failed)
exten => s,n,Goto(end)
exten => s,n(nochans),NoOp(max channels used up)
exten => s,n(end),NoOp(Exiting macro-dialout-enum)

exten => s-BUSY,1,NoOp(Trunk is reporting BUSY)
exten => s-BUSY,2,Busy()
exten => s-BUSY,3,Wait(60)
exten => s-BUSY,4,NoOp()

exten => _s-.,1,NoOp(Dial failed due to ${DIALSTATUS})

[macro-record-enable]
exten => s,1,GotoIf(${LEN(${BLINDTRANSFER})} > 0?2:4)
exten => s,2,ResetCDR(w)
exten => s,3,StopMonitor()
exten => s,4,AGI(recordingcheck,${TIMESTAMP},${UNIQUEID})
exten => s,5,Noop(No recording needed)
exten => s,999,Monitor(wav49,${CALLFILENAME}, mb)

;exten => s,3,BackGround(for-quality-purposes)
;exten => s,4,BackGround(this-call-may-be)
;exten => s,5,BackGround(recorded)

; This macro is for dev purposes and just dumps channel/app variables. Useful when designing new contexts.
[macro-dumpvars]
exten => s,1,Noop(ACCOUNTCODE=${ACCOUNTCODE})
exten => s,2,Noop(ANSWEREDTIME=${ANSWEREDTIME})
exten => s,3,Noop(BLINDTRANSFER=${BLINDTRANSFER})
exten => s,4,Noop(CALLERID=${CALLERID(all)})
exten => s,5,Noop(CALLERID(name)=${CALLERID(name)})
exten => s,6,Noop(CALLERID(number)=${CALLERID(number)})
exten => s,7,Noop(CALLINGPRES=${CALLINGPRES})
exten => s,8,Noop(CHANNEL=${CHANNEL})
exten => s,9,Noop(CONTEXT=${CONTEXT})
exten => s,10,Noop(DATETIME=${DATETIME})
exten => s,11,Noop(DIALEDPEERNAME=${DIALEDPEERNAME})
exten => s,12,Noop(DIALEDPEERNUMBER=${DIALEDPEERNUMBER})
exten => s,13,Noop(DIALEDTIME=${DIALEDTIME})
exten => s,14,Noop(DIALSTATUS=${DIALSTATUS})
exten => s,15,Noop(DNID=${DNID})
exten => s,16,Noop(EPOCH=${EPOCH})
exten => s,17,Noop(EXTEN=${EXTEN})
exten => s,18,Noop(HANGUPCAUSE=${HANGUPCAUSE})
exten => s,19,Noop(INVALID_EXTEN=${INVALID_EXTEN})
exten => s,20,Noop(LANGUAGE=${LANGUAGE})
exten => s,21,Noop(MEETMESECS=${MEETMESECS})
exten => s,22,Noop(PRIORITY=${PRIORITY})
exten => s,23,Noop(RDNIS=${RDNIS})
exten => s,24,Noop(SIPDOMAIN=${SIPDOMAIN})
exten => s,25,Noop(SIP_CODEC=${SIP_CODEC})
exten => s,26,Noop(SIPCALLID=${SIPCALLID})
exten => s,27,Noop(SIPUSERAGENT=${SIPUSERAGENT})
exten => s,28,Noop(TIMESTAMP=${TIMESTAMP})
exten => s,29,Noop(TXTCIDNAME=${TXTCIDNAME})
exten => s,30,Noop(UNIQUEID=${UNIQUEID})
exten => s,31,Noop(TOUCH_MONITOR=${TOUCH_MONITOR})
exten => s,32,Noop(MACRO_CONTEXT=${MACRO_CONTEXT})
exten => s,33,Noop(MACRO_EXTEN=${MACRO_EXTEN})
exten => s,34,Noop(MACRO_PRIORITY=${MACRO_PRIORITY})

[macro-user-logon]
; check device type
exten => s,1,Set(DEVICETYPE=${DB(DEVICE/${CALLERID(number)}/type)})
exten => s,2,GotoIf($["${DEVICETYPE}" = “fixed”]?s-FIXED,1)
; get user’s extension
exten => s,3,Set(AMPUSER=${ARG1})
exten => s,4,GotoIf($["${AMPUSER}" = “”]?5:9)
exten => s,5,BackGround(please-enter-your)
exten => s,6,Playback(extension)
exten => s,7,Read(AMPUSER,then-press-pound)
; get user’s password and authenticate
exten => s,8,Wait(1)
exten => s,9,Set(AMPUSERPASS=${DB(AMPUSER/${AMPUSER}/password)})
exten => s,10,GotoIf($[${LEN(${AMPUSERPASS})} = 0]?s-NOPASSWORD,1)
; do not continue if the user has already logged onto this device
exten => s,11,Set(DEVICEUSER=${DB(DEVICE/${CALLERID(number)}/user)})
exten => s,12,GotoIf($["${DEVICEUSER}" = “${AMPUSER}”]?s-ALREADYLOGGEDON,1)
exten => s,13,Authenticate(${AMPUSERPASS})
; devices can only be mapped to one user - loggoff anyone else who is here
exten => s,14,Macro(user-logoff)
; map user to device
exten => s,15,Set(AMPUSERDEVICES=${DB(AMPUSER/${AMPUSER}/device)})
exten => s,16,GotoIf($[${LEN(${AMPUSERDEVICES})} = 0]?18)
exten => s,17,Set(AMPUSERDEVICES=${AMPUSERDEVICES}&)
exten => s,18,Set(AMPUSERDEVICES=${AMPUSERDEVICES}${CALLERID(number)})
exten => s,19,Set(DB(AMPUSER/${AMPUSER}/device)=${AMPUSERDEVICES})
; map device to user
exten => s,20,Set(DB(DEVICE/${CALLERID(number)}/user)=${AMPUSER})
; create symlink from dummy device mailbox to user’s mailbox
exten => s,21,System(/bin/ln -s /var/spool/asterisk/voicemail/default/${AMPUSER}/ /var/spool/asterisk/voicemail/device/${CALLERID(number)})

exten => s-FIXED,1,NoOp(Device is FIXED and cannot be logged into)
exten => s-FIXED,2,Playback(ha/phone)
exten => s-FIXED,3,SayDigits(${CALLERID(number)})
exten => s-FIXED,4,Playback(is-curntly-unavail)
exten => s-FIXED,5,Playback(vm-goodbye)
exten => s-FIXED,6,Hangup ;TODO should play msg indicated device cannot be logged into

exten => s-ALREADYLOGGEDON,1,NoOp(This device has already been logged into by this user)
exten => s-ALREADYLOGGEDON,2,Playback(vm-goodbye)
exten => s-ALREADYLOGGEDON,3,Hangup ;TODO should play msg indicated device is already logged into

exten => s-NOPASSWORD,1,NoOp(This extension does not exist or no password is set)
exten => s-NOPASSWORD,2,Playback(an-error-has-occured)
exten => s-NOPASSWORD,3,Playback(vm-goodbye)
exten => s-NOPASSWORD,4,Hangup ;TODO should play msg indicated device is already logged into

[macro-user-logoff]
; check device type
exten => s,1,Set(DEVICETYPE=${DB(DEVICE/${CALLERID(number)}/type)})
exten => s,2,GotoIf($["${DEVICETYPE}" = “fixed”]?s-FIXED,1)
; remove entry from user’s DEVICE key
; delete the symlink to user’s voicemail box
exten => s,3,System(rm -f /var/spool/asterisk/voicemail/device/${CALLERID(number)})
exten => s,4,Set(DEVAMPUSER=${DB(DEVICE/${CALLERID(number)}/user)})
exten => s,5,Set(AMPUSERDEVICES=${DB(AMPUSER/${DEVAMPUSER}/device)})
exten => s,6,AGI(list-item-remove.php,${AMPUSERDEVICES},${CALLERID(number)},AMPUSERDEVICES,&)
; reset user -> device mapping
; users can log onto multiple devices, need to just remove device from value
exten => s,7,Set(DB(AMPUSER/${DEVAMPUSER}/device)=${AMPUSERDEVICES})
; reset device -> user mapping
exten => s,8,Set(DB(DEVICE/${CALLERID(number)}/user)=none)
exten => s,9,Playback(vm-goodbye)

exten => s-FIXED,1,NoOp(Device is FIXED and cannot be logged out of)
exten => s-FIXED,2,Playback(an-error-has-occured)
exten => s-FIXED,3,Playback(vm-goodbye)
exten => s-FIXED,4,Hangup ;TODO should play msg indicated device cannot be logged into

;sets the callerid of the device to that of the logged in user
[macro-user-callerid]
exten => s,1,Set(AMPUSER=${DB(DEVICE/${CALLERID(number)}/user)})
exten => s,2,Set(EMERGENCYCID=${DB(DEVICE/${CALLERID(number)}/emergency_cid)})
exten => s,3,Set(AMPUSERCIDNAME=${DB(AMPUSER/${AMPUSER}/cidname)})
exten => s,4,GotoIf($["${AMPUSERCIDNAME}" = “”]?6)
exten => s,5,Set(CALLERID(all)="${AMPUSERCIDNAME}" <${AMPUSER}>)
exten => s,6,NoOp(Using CallerID ${CALLERID(all)})

; overrides callerid out trunks
; arg1 is trunk
; macro-user-callerid should be called before using this macro
[macro-outbound-callerid]
exten => s,1,Set(USEROUTCID=${DB(AMPUSER/${CALLERID(number)}/outboundcid)})
exten => s,2,GotoIf($["${OUTCID_${ARG1}:1:2}" = “”]?4) ;check for CID override for trunk (global var)
exten => s,3,Set(CALLERID(all)=${OUTCID_${ARG1}})
exten => s,4,GotoIf($["${USEROUTCID:1:2}" = “”]?6) ; check CID override for extension
exten => s,5,Set(CALLERID(all)=${USEROUTCID})
exten => s,6,GotoIf($["${EMERGENCYROUTE:1:2}" = “”]?8) ; check EMERGENCYROUTE override (set by route)
exten => s,7,Set(CALLERID(all)=${EMERGENCYCID}) ; emergency cid for device
exten => s,8,NoOp(CallerID set to ${CALLERID(all)})

; ############################################################################
; Applications [app]
; ############################################################################
; Moved to external file applications.conf

#include applications.conf

;
; ############################################################################
; Inbound Contexts [from]
; ############################################################################

[from-sip-external]

;give external sip users congestion and hangup
exten => _.,1,Set(TIMEOUT(absolute)=15)
exten => _.,2,Congestion
exten => _.,3,Hangup

[from-internal]
;allow phones to use applications
include => app-userlogonoff
include => app-directory
include => app-dnd
include => app-callforward
include => app-callwaiting
include => app-messagecenter
include => app-calltrace
include => parkedcalls
include => from-internal-custom
;allow phones to dial other extensions
include => ext-fax
include => ext-zapbarge
include => ext-record
include => ext-test
;allow phones to access generated contexts
include => from-internal-additional
exten => s,1,Macro(hangupcall)
exten => h,1,Macro(hangupcall)

; ############################################################################
; Extension Contexts [ext]
; ############################################################################

[ext-zapbarge]
exten => 888,1,Macro(user-callerid)
exten => 888,2,Set(GROUP()=${CALLERID(number)})
exten => 888,3,Answer
exten => 888,4,Wait(1)
exten => 888,5,ZapBarge
exten => 888,6,Hangup

[ext-fax]
exten => s,1,Answer
exten => s,2,Goto(in_fax,1)
exten => in_fax,1,GotoIf($["${FAX_RX}" = “system”]?2:analog_fax,1)
exten => in_fax,2,Macro(faxreceive)
exten => in_fax,3,system(tiff2ps -2eaz -w 8.5 -h 11 ${FAXFILE} | ps2pdf - ${FAXFILE}.pdf)
exten => in_fax,4,system(mime-construct --to ${EMAILADDR} --subject “Fax from ${CALLERID(number)} ${CALLERID(name)}” --attachment ${CALLERID(number)}.pdf --type application/pdf --file ${FAXFILE}.pdf)
exten => in_fax,5,system(rm ${FAXFILE} ${FAXFILE}.pdf)
exten => in_fax,6,Hangup
exten => analog_fax,1,GotoIf($["${FAX_RX}" = “disabled”]?3:2) ;if fax is disabled, just hang up
exten => analog_fax,2,Set(DIAL=${DB(DEVICE/${FAX_RX}/dial)});
exten => analog_fax,3,Dial(${DIAL},20,d)
exten => analog_fax,4,Hangup
;exten => out_fax,1,wait(7)
exten => out_fax,1,txfax(${TXFAX_NAME}|caller)
exten => out_fax,2,Hangup
exten => h,1,Hangup()

[ext-record]
exten => *77,1,Macro(user-callerid)
exten => *77,2,Wait(2)
exten => *77,3,Record(${CALLERID(number)}-ivrrecording:wav)
exten => *77,4,Wait(2)
exten => *77,5,Hangup
exten => *99,1,Macro(user-callerid)
exten => *99,2,Playback(${CALLERID(number)}-ivrrecording)
exten => *99,3,Wait(2)
exten => *99,4,Hangup

;this is where parked calls go if they time-out. Should probably re-ring
[default]
include => ext-local
exten => s,1,Playback(vm-goodbye)
exten => s,2,Macro(hangupcall)

[ext-test]
exten => 7777,1,Goto(from-pstn,s,1)
exten => 666,1,Goto(ext-fax,in_fax,1)
exten => h,1,Macro(hangupcall)

;echo test
exten => *43,1,Answer
exten => *43,2,Wait(2)
exten => *43,3,Playback(demo-echotest)
exten => *43,4,Echo
exten => *43,5,Playback(demo-echodone)
exten => *43,6,Hangup
[/code]

extensions_additional.conf

[globals]
#include globals_custom.conf
APP-DIRECTORY = #
APP-DIRECTORY-TOTAL = *411
APP-DND-ON = *78
APP-DND-OFF = *79
APP-MESSAGECENTER = *98
APP-MESSAGECENTER-DIRECT = *97
APP-CALLWAITING-ON = *70
APP-CALLWAITING-OFF = *71
APP-CALLFORWARD-ON = *72
APP-CALLFORWARD-OFF = *73
APP-CALLFORWARD-BUSY-ON = *90
APP-CALLFORWARD-BUSY-OFF = *91
APP-CALLTRACE = *69
APP-USERLOGON = *11
APP-USERLOGOFF = *12
AFTER_INCOMING = 
CALLFILENAME = ""
DIALOUTIDS = 1/2/3/4/5/6/7/8/9/
DIAL_OPTIONS = Ttr
DIAL_OUT = 9
DIRECTORY = last
DIRECTORY_OPTS = e
FAX = 
FAX_RX = disabled
FAX_RX_EMAIL = fax@mydomain.com
INCOMING = group-all
IN_OVERRIDE = forcereghours
NULL = ""
OPERATOR = 
OUTCID_2 = Multicom
OUTCID_3 = Multicom
OUTCID_4 = Multicom
OUTCID_5 = Multicom
OUTCID_6 = Multicom
OUTCID_7 = Multicom
OUTCID_8 = Multicom
OUTCID_9 = 
OUTMAXCHANS_2 = 1
OUTMAXCHANS_3 = 
OUTMAXCHANS_4 = 
OUTMAXCHANS_5 = 
OUTMAXCHANS_6 = 
OUTMAXCHANS_7 = 
OUTMAXCHANS_8 = 
OUTMAXCHANS_9 = 2
OUTPREFIX_2 = 
OUTPREFIX_3 = 
OUTPREFIX_4 = 
OUTPREFIX_5 = 
OUTPREFIX_6 = 
OUTPREFIX_7 = 
OUTPREFIX_8 = 
OUTPREFIX_9 = 
OUT_1 = ZAP/g0
OUT_2 = ZAP/17
OUT_3 = ZAP/18
OUT_4 = ZAP/19
OUT_5 = ZAP/20
OUT_6 = ZAP/21
OUT_7 = ZAP/22
OUT_8 = ZAP/23
OUT_9 = IAX2/teliax_trunk
PARKNOTIFY = SIP/200
RECORDEXTEN = ""
REGDAYS = mon-fri
REGTIME = 7:55-17:05
RINGTIMER = 25
VM_PREFIX = *


;end of [globals]


[ext-group]
include => ext-group-custom
exten => 0,1,Macro(user-callerid,)
exten => 0,n,GotoIf($[${CALLERID(name):0:${LEN(${RGPREFIX})}} != ${RGPREFIX}]?NEWPREFIX)
exten => 0,n,Set(CALLERID(name)=${CALLERID(name):${LEN(${RGPREFIX})}})
exten => 0,n(NEWPREFIX),Set(RGPREFIX=OPER:)
exten => 0,n,Set(CALLERID(name)=${RGPREFIX}${CALLERID(name)})
exten => 0,n,Set(RecordMethod=Group)
exten => 0,n,Macro(record-enable,${MACRO_EXTEN},${RecordMethod})
exten => 0,n,Set(RingGroupMethod=memoryhunt)
exten => 0,n(DIALGRP),Macro(dial,15,${DIAL_OPTIONS},250-501-111-101)
exten => 0,n,Set(RingGroupMethod=)
exten => 0,n,Goto(ext-group,500,1)
exten => 500,1,Macro(user-callerid,)
exten => 500,n,GotoIf($[${CALLERID(name):0:${LEN(${RGPREFIX})}} != ${RGPREFIX}]?NEWPREFIX)
exten => 500,n,Set(CALLERID(name)=${CALLERID(name):${LEN(${RGPREFIX})}})
exten => 500,n(NEWPREFIX),Set(RGPREFIX=Oper:)
exten => 500,n,Set(CALLERID(name)=${RGPREFIX}${CALLERID(name)})
exten => 500,n,Set(RecordMethod=Group)
exten => 500,n,Macro(record-enable,${MACRO_EXTEN},${RecordMethod})
exten => 500,n,Set(RingGroupMethod=memoryhunt)
exten => 500,n(DIALGRP),Macro(dial,5,${DIAL_OPTIONS},501-224-502-111-101-503-109-250-125-103)
exten => 500,n,Set(RingGroupMethod=)
exten => 500,n,Goto(ivr-3,s,1)
exten => 510,1,Macro(user-callerid,)
exten => 510,n,GotoIf($[${CALLERID(name):0:${LEN(${RGPREFIX})}} != ${RGPREFIX}]?NEWPREFIX)
exten => 510,n,Set(CALLERID(name)=${CALLERID(name):${LEN(${RGPREFIX})}})
exten => 510,n(NEWPREFIX),Set(RGPREFIX=Oper:)
exten => 510,n,Set(CALLERID(name)=${RGPREFIX}${CALLERID(name)})
exten => 510,n,Set(RecordMethod=Group)
exten => 510,n,Macro(record-enable,${MACRO_EXTEN},${RecordMethod})
exten => 510,n,Set(RingGroupMethod=ringall)
exten => 510,n(DIALGRP),Macro(dial,20,${DIAL_OPTIONS},100-101-102-103-116)
exten => 510,n,Set(RingGroupMethod=)
exten => 510,n,Goto(ext-local,${VM_PREFIX}111,1)
exten => 520,1,Macro(user-callerid,)
exten => 520,n,GotoIf($[${CALLERID(name):0:${LEN(${RGPREFIX})}} != ${RGPREFIX}]?NEWPREFIX)
exten => 520,n,Set(CALLERID(name)=${CALLERID(name):${LEN(${RGPREFIX})}})
exten => 520,n(NEWPREFIX),Set(RGPREFIX=Sales:)
exten => 520,n,Set(CALLERID(name)=${RGPREFIX}${CALLERID(name)})
exten => 520,n,Set(RecordMethod=Group)
exten => 520,n,Macro(record-enable,${MACRO_EXTEN},${RecordMethod})
exten => 520,n,Set(RingGroupMethod=ringall)
exten => 520,n(DIALGRP),Macro(dial,30,${DIAL_OPTIONS},100-102-126-113-119)
exten => 520,n,Set(RingGroupMethod=)
exten => 520,n,Goto(ext-group,500,1)
exten => 530,1,Macro(user-callerid,)
exten => 530,n,GotoIf($[${CALLERID(name):0:${LEN(${RGPREFIX})}} != ${RGPREFIX}]?NEWPREFIX)
exten => 530,n,Set(CALLERID(name)=${CALLERID(name):${LEN(${RGPREFIX})}})
exten => 530,n(NEWPREFIX),Set(RGPREFIX=Sales:)
exten => 530,n,Set(CALLERID(name)=${RGPREFIX}${CALLERID(name)})
exten => 530,n,Set(RecordMethod=Group)
exten => 530,n,Macro(record-enable,${MACRO_EXTEN},${RecordMethod})
exten => 530,n,Set(RingGroupMethod=hunt)
exten => 530,n(DIALGRP),Macro(dial,20,${DIAL_OPTIONS},500-501-502)
exten => 530,n,Set(RingGroupMethod=)
exten => 530,n,Goto(ext-local,100,1)
exten => 540,1,Macro(user-callerid,)
exten => 540,n,GotoIf($[${CALLERID(name):0:${LEN(${RGPREFIX})}} != ${RGPREFIX}]?NEWPREFIX)
exten => 540,n,Set(CALLERID(name)=${CALLERID(name):${LEN(${RGPREFIX})}})
exten => 540,n(NEWPREFIX),Set(RGPREFIX=Support:)
exten => 540,n,Set(CALLERID(name)=${RGPREFIX}${CALLERID(name)})
exten => 540,n,Set(RecordMethod=Group)
exten => 540,n,Macro(record-enable,${MACRO_EXTEN},${RecordMethod})
exten => 540,n,Set(RingGroupMethod=ringall)
exten => 540,n(DIALGRP),Macro(dial,20,${DIAL_OPTIONS},125)
exten => 540,n,Set(RingGroupMethod=)
exten => 540,n,Goto(timeconditions,1,1)
exten => 541,1,Macro(user-callerid,)
exten => 541,n,GotoIf($[${CALLERID(name):0:${LEN(${RGPREFIX})}} != ${RGPREFIX}]?NEWPREFIX)
exten => 541,n,Set(CALLERID(name)=${CALLERID(name):${LEN(${RGPREFIX})}})
exten => 541,n(NEWPREFIX),Set(RGPREFIX=X911:)
exten => 541,n,Set(CALLERID(name)=${RGPREFIX}${CALLERID(name)})
exten => 541,n,Set(RecordMethod=Group)
exten => 541,n,Macro(record-enable,${MACRO_EXTEN},${RecordMethod})
exten => 541,n,Set(RingGroupMethod=hunt)
exten => 541,n(DIALGRP),Macro(dial,4,${DIAL_OPTIONS},98007200#)
exten => 541,n,Set(RingGroupMethod=)
exten => 541,n,Goto(ext-local,${VM_PREFIX}541,1)
exten => 550,1,Macro(user-callerid,)
exten => 550,n,GotoIf($[${CALLERID(name):0:${LEN(${RGPREFIX})}} != ${RGPREFIX}]?NEWPREFIX)
exten => 550,n,Set(CALLERID(name)=${CALLERID(name):${LEN(${RGPREFIX})}})
exten => 550,n(NEWPREFIX),Set(RGPREFIX=Support:)
exten => 550,n,Set(CALLERID(name)=${RGPREFIX}${CALLERID(name)})
exten => 550,n,Set(RecordMethod=Group)
exten => 550,n,Macro(record-enable,${MACRO_EXTEN},${RecordMethod})
exten => 550,n,Set(RingGroupMethod=ringall)
exten => 550,n(DIALGRP),Macro(dial,20,${DIAL_OPTIONS},103-116-211)
exten => 550,n,Set(RingGroupMethod=)
exten => 550,n,Goto(ext-local,${VM_PREFIX}541,1)

; end of [ext-group]


[disa]
include => disa-custom
exten => 1,1,Playback(enter-password)
exten => 1,n,DISA(/etc/asterisk/disa-1.conf|from-internal)

; end of [disa]


[ext-queues]
include => ext-queues-custom
exten => 123,1,Answer
exten => 123,n,Set(CALLERID(name)=${CALLERIDNAME})
exten => 123,n,Set(MONITOR_FILENAME=/var/spool/asterisk/monitor/q${EXTEN}-${TIMESTAMP}-${UNIQUEID})
exten => 123,n,Playback()
exten => 123,n,Queue(123|t|||120)
exten => 123,n,Goto(ivr-3,s,1)
exten => 123*,1,Macro(agent-add,123,)
exten => 123**,1,Macro(agent-del,123,123)
exten => 1911,1,Answer
exten => 1911,n,Set(CALLERID(name)=Service${CALLERIDNAME})
exten => 1911,n,Set(MONITOR_FILENAME=/var/spool/asterisk/monitor/q${EXTEN}-${TIMESTAMP}-${UNIQUEID})
exten => 1911,n,Playback(custom/Join_Que)
exten => 1911,n,Queue(1911|t|||300)
exten => 1911,n,Goto(ext-local,${VM_PREFIX}541,1)
exten => 1911*,1,Macro(agent-add,1911,)
exten => 1911**,1,Macro(agent-del,1911,1911)

; end of [ext-queues]


[ivr-3]
include => ivr-3-custom
include => ext-local
include => app-directory
exten => h,1,Hangup
exten => s,1,Set(LOOPCOUNT=0)
exten => s,n,Answer
exten => s,n,Wait(1)
exten => s,n(begin),Set(TIMEOUT(digit)=10)
exten => s,n,Set(TIMEOUT(response)=10)
exten => s,n,Background(custom/WelcomeToMulticom)
exten => hang,1,Playback(vm-goodbye)
exten => hang,n,Hangup
exten => 0,1,Goto(ext-group,500,1)
exten => 411,1,Goto(timeconditions,3,1)
exten => 911,1,Goto(timeconditions,1,1)
exten => t,1,Goto(ext-group,500,1)
exten => i,1,Playback(invalid)
exten => i,n,Goto(loop,1)
exten => loop,1,Set(LOOPCOUNT=$[${LOOPCOUNT} + 1])
exten => loop,n,GotoIf($[${LOOPCOUNT} > 2]?hang,1)
exten => loop,n,Goto(ivr-3,s,begin)

; end of [ivr-3]


[ivr-4]
include => ivr-4-custom
include => ext-local
include => app-directory
exten => h,1,Hangup
exten => s,1,Set(LOOPCOUNT=0)
exten => s,n,Answer
exten => s,n,Wait(1)
exten => s,n(begin),Set(TIMEOUT(digit)=10)
exten => s,n,Set(TIMEOUT(response)=10)
exten => s,n,Background(custom/Que_Menu)
exten => hang,1,Playback(vm-goodbye)
exten => hang,n,Hangup
exten => 1,1,Goto(ext-local,${VM_PREFIX}541,1)
exten => i,1,Playback(invalid)
exten => i,n,Goto(loop,1)
exten => loop,1,Set(LOOPCOUNT=$[${LOOPCOUNT} + 1])
exten => loop,n,GotoIf($[${LOOPCOUNT} > 2]?hang,1)
exten => loop,n,Goto(ivr-4,s,begin)

; end of [ivr-4]


[timeconditions]
include => timeconditions-custom
exten => 1,1,GotoIfTime(9:00-17:00|mon-fri|*|*?ext-queues,1911,1)
exten => 1,n,Goto(ext-group,541,1)
exten => 2,1,GotoIfTime(9:00-17:00|mon-fri|*|*?ext-queues,123,1)
exten => 2,n,Goto(ivr-3,s,1)
exten => 3,1,GotoIfTime(9:00-17:00|mon-fri|*|*?ext-group,520,1)
exten => 3,n,Goto(ext-local,100,1)

; end of [timeconditions]


[ext-meetme]
include => ext-meetme-custom
exten => 600,1,Set(MEETME_ROOMNUM=600)
exten => 600,n,GotoIf($[${DIALSTATUS} = ANSWER]?USER)
exten => 600,n,Answer
exten => 600,n,Wait(1)
exten => 600,n(USER),Set(MEETME_OPTS=ci)
exten => 600,n,Goto(STARTMEETME,1)
exten => STARTMEETME,1,MeetMe(${MEETME_ROOMNUM},${MEETME_OPTS},${PIN})
exten => STARTMEETME,n,Hangup
exten => h,1,Hangup

; end of [ext-meetme]


[ext-did]
include => ext-did-custom
exten => s,1,Set(FROM_DID=s)
exten => s,n,Set(FAX_RX=disabled)
exten => s,n,Answer
exten => s,n,Playtones(ring)
exten => s,n,NVFaxDetect(0)
exten => s,n,Goto(ivr-3,s,1)
exten => _X.,1,Goto(ext-did,s,1)
exten => ,1,Set(FROM_DID=)
exten => ,n,Goto(ext-local,1000,1)

; end of [ext-did]


[ext-local]
include => ext-local-custom
exten => 100,1,Macro(exten-vm,100,100)
exten => 100,hint,SIP/100
exten => ${VM_PREFIX}100,1,Macro(vm,100)
exten => 101,1,Macro(exten-vm,101,101)
exten => 101,hint,SIP/101
exten => ${VM_PREFIX}101,1,Macro(vm,101)
exten => 102,1,Macro(exten-vm,102,102)
exten => 102,hint,SIP/102
exten => ${VM_PREFIX}102,1,Macro(vm,102)
exten => 103,1,Macro(exten-vm,103,103)
exten => 103,hint,SIP/103
exten => ${VM_PREFIX}103,1,Macro(vm,103)
exten => 107,1,Macro(exten-vm,107,107)
exten => 107,hint,CUSTOM/107
exten => ${VM_PREFIX}107,1,Macro(vm,107)
exten => 109,1,Macro(exten-vm,109,109)
exten => 109,hint,SIP/109
exten => ${VM_PREFIX}109,1,Macro(vm,109)
exten => 110,1,Macro(exten-vm,novm,110)
exten => 110,hint,SIP/110
exten => 111,1,Macro(exten-vm,111,111)
exten => 111,hint,SIP/111
exten => ${VM_PREFIX}111,1,Macro(vm,111)
exten => 112,1,Macro(exten-vm,112,112)
exten => 112,hint,SIP/112
exten => ${VM_PREFIX}112,1,Macro(vm,112)
exten => 113,1,Macro(exten-vm,113,113)
exten => 113,hint,SIP/113
exten => ${VM_PREFIX}113,1,Macro(vm,113)
exten => 116,1,Macro(exten-vm,116,116)
exten => 116,hint,SIP/116
exten => ${VM_PREFIX}116,1,Macro(vm,116)
exten => 119,1,Macro(exten-vm,119,119)
exten => 119,hint,SIP/119
exten => ${VM_PREFIX}119,1,Macro(vm,119)
exten => 125,1,Macro(exten-vm,125,125)
exten => 125,hint,SIP/125
exten => ${VM_PREFIX}125,1,Macro(vm,125)
exten => 126,1,Macro(exten-vm,126,126)
exten => 126,hint,SIP/126
exten => ${VM_PREFIX}126,1,Macro(vm,126)
exten => 127,1,Macro(exten-vm,127,127)
exten => 127,hint,SIP/127
exten => ${VM_PREFIX}127,1,Macro(vm,127)
exten => 210,1,Macro(exten-vm,novm,210)
exten => 210,hint,SIP/210
exten => 211,1,Macro(exten-vm,novm,211)
exten => 211,hint,SIP/211
exten => 224,1,Macro(exten-vm,224,224)
exten => 224,hint,SIP/224
exten => ${VM_PREFIX}224,1,Macro(vm,224)
exten => 225,1,Macro(exten-vm,novm,225)
exten => 225,hint,SIP/225
exten => 250,1,Macro(exten-vm,250,250)
exten => 250,hint,IAX2/250
exten => ${VM_PREFIX}250,1,Macro(vm,250)
exten => 251,1,Macro(exten-vm,251,251)
exten => 251,hint,IAX2/251
exten => ${VM_PREFIX}251,1,Macro(vm,251)
exten => 252,1,Macro(exten-vm,252,252)
exten => 252,hint,IAX2/252
exten => ${VM_PREFIX}252,1,Macro(vm,252)
exten => 400,1,Macro(exten-vm,novm,400)
exten => 400,hint,ZAP/3
exten => 501,1,Macro(exten-vm,501,501)
exten => 501,hint,SIP/501
exten => ${VM_PREFIX}501,1,Macro(vm,501)
exten => 502,1,Macro(exten-vm,502,502)
exten => 502,hint,SIP/501
exten => ${VM_PREFIX}502,1,Macro(vm,502)
exten => 503,1,Macro(exten-vm,503,503)
exten => 503,hint,SIP/501
exten => ${VM_PREFIX}503,1,Macro(vm,503)
exten => 515,1,Macro(exten-vm,515,515)
exten => 515,hint,CUSTOM/515
exten => ${VM_PREFIX}515,1,Macro(vm,515)
exten => 541,1,Macro(exten-vm,541,541)
exten => 541,hint,CUSTOM/541
exten => ${VM_PREFIX}541,1,Macro(vm,541)
exten => 1000,1,Macro(exten-vm,1000,1000)
exten => 1000,hint,SIP/1000
exten => ${VM_PREFIX}1000,1,Macro(vm,1000)

; end of [ext-local]


[outbound-allroutes]
include => outbound-allroutes-custom
include => outrt-001-outside
include => outrt-002-telax
exten => foo,1,Noop(bar)

; end of [outbound-allroutes]


[outrt-001-outside]
include => outrt-001-outside-custom
exten => 911,1,Macro(dialout-trunk,2,${EXTEN},,)
exten => 911,n,Macro(dialout-trunk,3,${EXTEN},,)
exten => 911,n,Macro(dialout-trunk,4,${EXTEN},,)
exten => 911,n,Macro(dialout-trunk,8,${EXTEN},,)
exten => 911,n,Macro(dialout-trunk,6,${EXTEN},,)
exten => 911,n,Macro(dialout-trunk,7,${EXTEN},,)
exten => 911,n,Macro(dialout-trunk,5,${EXTEN},,)
exten => 911,n,Macro(outisbusy,)
exten => _011.,1,Macro(dialout-trunk,2,${EXTEN},,)
exten => _011.,n,Macro(dialout-trunk,3,${EXTEN},,)
exten => _011.,n,Macro(dialout-trunk,4,${EXTEN},,)
exten => _011.,n,Macro(dialout-trunk,8,${EXTEN},,)
exten => _011.,n,Macro(dialout-trunk,6,${EXTEN},,)
exten => _011.,n,Macro(dialout-trunk,7,${EXTEN},,)
exten => _011.,n,Macro(dialout-trunk,5,${EXTEN},,)
exten => _011.,n,Macro(outisbusy,)
exten => _1314XXXXXXX,1,Macro(dialout-trunk,2,${EXTEN:4},,)
exten => _1314XXXXXXX,n,Macro(dialout-trunk,3,${EXTEN:4},,)
exten => _1314XXXXXXX,n,Macro(dialout-trunk,4,${EXTEN:4},,)
exten => _1314XXXXXXX,n,Macro(dialout-trunk,8,${EXTEN:4},,)
exten => _1314XXXXXXX,n,Macro(dialout-trunk,6,${EXTEN:4},,)
exten => _1314XXXXXXX,n,Macro(dialout-trunk,7,${EXTEN:4},,)
exten => _1314XXXXXXX,n,Macro(dialout-trunk,5,${EXTEN:4},,)
exten => _1314XXXXXXX,n,Macro(outisbusy,)
exten => _1NXXNXXXXXX,1,Macro(dialout-trunk,2,${EXTEN},,)
exten => _1NXXNXXXXXX,n,Macro(dialout-trunk,3,${EXTEN},,)
exten => _1NXXNXXXXXX,n,Macro(dialout-trunk,4,${EXTEN},,)
exten => _1NXXNXXXXXX,n,Macro(dialout-trunk,8,${EXTEN},,)
exten => _1NXXNXXXXXX,n,Macro(dialout-trunk,6,${EXTEN},,)
exten => _1NXXNXXXXXX,n,Macro(dialout-trunk,7,${EXTEN},,)
exten => _1NXXNXXXXXX,n,Macro(dialout-trunk,5,${EXTEN},,)
exten => _1NXXNXXXXXX,n,Macro(outisbusy,)
exten => _314XXXXXXX,1,Macro(dialout-trunk,2,${EXTEN:3},,)
exten => _314XXXXXXX,n,Macro(dialout-trunk,3,${EXTEN:3},,)
exten => _314XXXXXXX,n,Macro(dialout-trunk,4,${EXTEN:3},,)
exten => _314XXXXXXX,n,Macro(dialout-trunk,8,${EXTEN:3},,)
exten => _314XXXXXXX,n,Macro(dialout-trunk,6,${EXTEN:3},,)
exten => _314XXXXXXX,n,Macro(dialout-trunk,7,${EXTEN:3},,)
exten => _314XXXXXXX,n,Macro(dialout-trunk,5,${EXTEN:3},,)
exten => _314XXXXXXX,n,Macro(outisbusy,)
exten => _91XXXXXXXXXX,1,Macro(dialout-trunk,2,${EXTEN:1},,)
exten => _91XXXXXXXXXX,n,Macro(dialout-trunk,3,${EXTEN:1},,)
exten => _91XXXXXXXXXX,n,Macro(dialout-trunk,4,${EXTEN:1},,)
exten => _91XXXXXXXXXX,n,Macro(dialout-trunk,8,${EXTEN:1},,)
exten => _91XXXXXXXXXX,n,Macro(dialout-trunk,6,${EXTEN:1},,)
exten => _91XXXXXXXXXX,n,Macro(dialout-trunk,7,${EXTEN:1},,)
exten => _91XXXXXXXXXX,n,Macro(dialout-trunk,5,${EXTEN:1},,)
exten => _91XXXXXXXXXX,n,Macro(outisbusy,)
exten => _9NXXXXXX,1,Macro(dialout-trunk,2,${EXTEN:1},,)
exten => _9NXXXXXX,n,Macro(dialout-trunk,3,${EXTEN:1},,)
exten => _9NXXXXXX,n,Macro(dialout-trunk,4,${EXTEN:1},,)
exten => _9NXXXXXX,n,Macro(dialout-trunk,8,${EXTEN:1},,)
exten => _9NXXXXXX,n,Macro(dialout-trunk,6,${EXTEN:1},,)
exten => _9NXXXXXX,n,Macro(dialout-trunk,7,${EXTEN:1},,)
exten => _9NXXXXXX,n,Macro(dialout-trunk,5,${EXTEN:1},,)
exten => _9NXXXXXX,n,Macro(outisbusy,)
exten => _9XXXXXXXXXX,1,Macro(dialout-trunk,2,${EXTEN:1},,)
exten => _9XXXXXXXXXX,n,Macro(dialout-trunk,3,${EXTEN:1},,)
exten => _9XXXXXXXXXX,n,Macro(dialout-trunk,4,${EXTEN:1},,)
exten => _9XXXXXXXXXX,n,Macro(dialout-trunk,8,${EXTEN:1},,)
exten => _9XXXXXXXXXX,n,Macro(dialout-trunk,6,${EXTEN:1},,)
exten => _9XXXXXXXXXX,n,Macro(dialout-trunk,7,${EXTEN:1},,)
exten => _9XXXXXXXXXX,n,Macro(dialout-trunk,5,${EXTEN:1},,)
exten => _9XXXXXXXXXX,n,Macro(outisbusy,)
exten => _NXXNXXXXXX,1,Macro(dialout-trunk,2,${EXTEN},,)
exten => _NXXNXXXXXX,n,Macro(dialout-trunk,3,${EXTEN},,)
exten => _NXXNXXXXXX,n,Macro(dialout-trunk,4,${EXTEN},,)
exten => _NXXNXXXXXX,n,Macro(dialout-trunk,8,${EXTEN},,)
exten => _NXXNXXXXXX,n,Macro(dialout-trunk,6,${EXTEN},,)
exten => _NXXNXXXXXX,n,Macro(dialout-trunk,7,${EXTEN},,)
exten => _NXXNXXXXXX,n,Macro(dialout-trunk,5,${EXTEN},,)
exten => _NXXNXXXXXX,n,Macro(outisbusy,)
exten => _NXXXXXX,1,Macro(dialout-trunk,2,${EXTEN},,)
exten => _NXXXXXX,n,Macro(dialout-trunk,3,${EXTEN},,)
exten => _NXXXXXX,n,Macro(dialout-trunk,4,${EXTEN},,)
exten => _NXXXXXX,n,Macro(dialout-trunk,8,${EXTEN},,)
exten => _NXXXXXX,n,Macro(dialout-trunk,6,${EXTEN},,)
exten => _NXXXXXX,n,Macro(dialout-trunk,7,${EXTEN},,)
exten => _NXXXXXX,n,Macro(dialout-trunk,5,${EXTEN},,)
exten => _NXXXXXX,n,Macro(outisbusy,)

; end of [outrt-001-outside]


[outrt-002-telax]
include => outrt-002-telax-custom
exten => _8.,1,Macro(dialout-trunk,9,${EXTEN:1},,)
exten => _8.,n,Macro(outisbusy,)

; end of [outrt-002-telax]


[from-internal-additional]
include => from-internal-additional-custom
include => ext-group
include => ext-queues
include => ext-meetme
include => ext-local
include => outbound-allroutes
exten => h,1,Hangup

; end of [from-internal-additional]

Ugg… It’s AMP/trixbox. I don’t see the extension in here either.

I figured it out. *11 and *12 are already used to log into and out of queues. I just reset them to *41 and *42 and everything works.