Cannot dial out using TDM400P

We have Asterisk set up with a TDM400P card (2 FXO modules). Incoming calls work great. On outgoing calls, we get a pause, then the call hangs up on our SIP phone. Plugging a regular analog phone in parallel to the PSTN line, if we pick up the regular analog phone, it holds the line open, and when we call from the SIP phone we can hear the tones being dialed out onto the PSTN line. After dialing there is a pause, and then simultaneously the SIP extension hangs up while the regular analog phone then completes the connection to the phone number and it starts ringing. The call continues as normal on the regular analog phone, but the SIP extension has already ended its call.

Looking at the CLI log, towards the end when the call is actually made, I see:

++++++++++++++++++
–Executing Dial(“SIP/501-588e”, “ZAP/3/w817300xxxx|120|W” in new stack
– Called 3/w817300xxxx
–Zap/3-1 answered SIP/501-588e
–Hungup ‘Zap/3-1’
== Spawn extension (macro-dialout-trunk, s, 14) exited non-zero on ‘SIP/501-588e’ in macro ‘dialout trunk’
== Spawn extension (macro-dialout-trunk, s, 14) exited non-zero on ‘SIP/501-588e’
++++++++++++++++++

The "Hangup ‘Zap/3-1’ seems to happen right when the call on the SIP phone ends.

Can anyone help me figure out what is going on here? I think it has to do with a misconfiguration of the TDM400P, or else not properly configuring Asterisk to use it, but since incoming calls work fine, some of it must be right.

Thanks in advance!

Can anyone help?

Thanks!

Hy.
I can help you.We can look toghether to your system and try it to set up.For sure is nothing complicated.
Please write me directly on zigosoft@zigosoft.com and i will help you.
Regards
Adrian Lazar
Manager on Zigosoft
Please visit our site: www.zigosoft.com

you should paste here relevant conf files,like zapata,zaptel,extensions.conf,otherwise you will probably get no reply

Here are the files you asked for. Sorry, they are really long files. This is from an install of Asterisk@Home 2.8, if that helps any. Thanks for your help, I can’t wait to see what you might be able to suggest!

zapata.conf
++++++++++++++++++++++++
;
; Zapata telephony interface
;
; Configuration file

[trunkgroups]

[channels]

loadzone=us
defaultzone=us

language=en
context=from-pstn
signalling=fxs_ks
;signalling=fxs_ls
;signalling=fxs_gs
rxwink=300 ; Atlas seems to use long (250ms) winks
;
; Whether or not to do distinctive ring detection on FXO lines
;
;usedistinctiveringdetection=yes

usecallerid=yes
hidecallerid=no
callwaiting=yes
usecallingpres=yes
callwaitingcallerid=yes
threewaycalling=yes
transfer=yes
cancallforward=yes
callreturn=yes
echocancel=yes
echocancelwhenbridged=no
echotraining=800
rxgain=0.0
txgain=0.0
group=0
callgroup=1
pickupgroup=1
immediate=yes

;faxdetect=both
faxdetect=incoming
;faxdetect=outgoing
;faxdetect=no

;Include genzaptelconf configs
#include zapata-auto.conf

group=1

;Include AMP configs
#include zapata_additional.conf
+++++++++++++++++++++++++

zapata_auto.conf
+++++++++++++++++++++++++
; Autogenerated by /usr/local/sbin/genzaptelconf – do not hand edit
; Zaptel Channels Configurations (zapata.conf)
;
; This is not intended to be a complete zapata.conf. Rather, it is intended
; to be #include-d by /etc/zapata.conf that will include the global settings
;
callerid=asreceived

; Span 1: WCTDM/0 “Wildcard TDM400P REV I Board 1”
; channel 1, WCTDM, inactive.
; channel 2, WCTDM, inactive.
signalling=fxs_ks

; Note: this is a trunk. Create a ZAP trunk in AMP for Channel 3
context=from-pstn
group=0
channel => 3

signalling=fxs_ks
; Note: this is a trunk. Create a ZAP trunk in AMP for Channel 4
context=from-pstn
group=0
channel => 4

; Span 2: ZTDUMMY/1 “ZTDUMMY/1 1”
+++++++++++++++++++++++++++

The zapata_additional.conf file is empty.

zaptel.conf
+++++++++++++++++++++++++++

Autogenerated by /usr/local/sbin/genzaptelconf – do not hand edit

Zaptel Configuration File

This file is parsed by the Zaptel Configurator, ztcfg

It must be in the module loading order

Span 1: WCTDM/0 “Wildcard TDM400P REV I Board 1”

channel 1, WCTDM, inactive.

channel 2, WCTDM, inactive.

fxsks=3
fxsks=4

Span 2: ZTDUMMY/1 “ZTDUMMY/1 1”

Global data

loadzone = us
defaultzone = us
+++++++++++++++++++++++++++

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

; dialparties.agi (sprackett.com/asterisk/)
; Asterisk::AGI (asterisk.gnuinter.net/)
; gsm (ibiblio.org/pub/Linux/utils/ … short.html)
; loligo sounds (loligo.com/asterisk/sounds/)
; mpg123 (voip-info.org/wiki-Asterisk+conf … nhold.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 => 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)
exten => 3333,1,Dial(Zap/3)

;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
+++++++++++++++++++++++++

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/
DIAL_OPTIONS = tr
DIAL_OUT = 9
DIRECTORY = last
DIRECTORY_OPTS =
FAX =
FAX_RX = system
FAX_RX_EMAIL = fax@mydomain.com
INCOMING = group-all
IN_OVERRIDE = forcereghours
NULL = ""
OPERATOR =
OUTCID_1 =
OUTCID_2 =
OUTMAXCHANS_1 = 1
OUTMAXCHANS_2 = 1
OUTPREFIX_1 =
OUTPREFIX_2 = w
OUT_1 = ZAP/g0
OUT_2 = ZAP/3
PARKNOTIFY = SIP/200
RECORDEXTEN = ""
REGDAYS = mon-fri
REGTIME = 7:55-17:05
RINGTIMER = 15
VM_PREFIX = *

;end of [globals]

[ext-meetme]
include => ext-meetme-custom
exten => STARTMEETME,1,MeetMe(${MEETME_ROOMNUM},${MEETME_OPTS},${PIN})
exten => STARTMEETME,n,Hangup
exten => h,1,Hangup

; end of [ext-meetme]

[ivr-2]
include => ivr-2-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()
exten => hang,1,Playback(vm-goodbye)
exten => hang,n,Hangup
exten => i,1,Playback(invalid)
exten => i,n,Goto(loop,1)
exten => t,1,Goto(loop,1)
exten => loop,1,Set(LOOPCOUNT=$[${LOOPCOUNT} + 1])
exten => loop,n,GotoIf($[${LOOPCOUNT} > 2]?hang,1)
exten => loop,n,Goto(ivr-2,s,begin)

; end of [ivr-2]

[ext-did]
include => ext-did-custom
exten => s,1,Set(FROM_DID=s)
exten => s,n,Goto(ext-local,501,1)
exten => _X.,1,Goto(ext-did,s,1)

; end of [ext-did]

[ext-local]
include => ext-local-custom
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/502
exten => ${VM_PREFIX}502,1,Macro(vm,502)

; end of [ext-local]

[outbound-allroutes]
include => outbound-allroutes-custom
include => outrt-001-zap/3 outgoing
exten => foo,1,Noop(bar)

; end of [outbound-allroutes]

[outrt-001-zap/3 outgoing]
include => outrt-001-zap/3 outgoing-custom
exten => _NXXNXXXXXX,1,Macro(dialout-trunk,2,${EXTEN},)
exten => _NXXNXXXXXX,n,Macro(outisbusy,)
exten => _NXXXXXX,1,Macro(dialout-trunk,2,${EXTEN},)
exten => _NXXXXXX,n,Macro(outisbusy,)

; end of [outrt-001-zap/3 outgoing]

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

; end of [from-internal-additional]
+++++++++++++++++++++++++++

extensions_custom.conf
+++++++++++++++++++++++++++
; This file contains example extensions_custom.conf entries.
; extensions_custom.conf should be used to include customizations
; to AMP’s Asterisk dialplan.

; All custom context should contain the string ‘custom’ in it’s name

; Extensions in AMP have access to the ‘from-internal’ context.
; The context ‘from-internal-custom’ is included in ‘from-internal’ by default

[ext-did-custom]
; this will allow calls to be routed by the ZAP channel they come in on.
; example a call comming in on ZAP cahnnel 1 will have Zap1 for it’s DID.

exten => s,2,GotoIf($["${CHANNEL:0:3}" = “Zap”]?ext-did|Zap${CHANNEL:4:1}|1)

[from-internal-custom]
;1234,1,Playback(demo-congrats) ; extensions can dial 1234
;1234,2,Hangup()
;h,1,Hangup()
;include => custom-recordme ; extensions can also dial 5678

include => custom-speed-dial

exten => _**.,1,Pickup(${EXTEN:2}) ; GXP-2000 phone press BLF to pick up ringing call

exten => *60,1,Answer
exten => *60,2,Playback(at-tone-time-exactly)
exten => *60,3,SayUnixTime(,IMp)
exten => *60,4,Playback(beep)
exten => *60,5,Hangup

exten => *61,1,Answer
exten => *61,2,AGI(weather.agi)
exten => *61,3,Hangup

exten => *62,1,Answer
exten => *62,2,AGI(wakeup.php)
exten => *62,3,Hangup

exten => *65,1,Answer
exten => *65,2,AGI(festival-script.pl|Your phone number is ${CALLERIDNUM}.)
exten => *65,3,Hangup

; CallingCard application
;add an incoimf route for the DID to Custom App: (un-comment next line)
;custom-callingcard,s,1

; un-comment the 6 lines below to work on incoming DIDs
;[custom-callingcard]
;exten => s,1,Answer
;exten => s,2,Wait,2
;exten => s,3,DeadAGI,a2billing.php
;exten => s,4,Wait,2
;exten => s,5,Hangup

[custom-meetme]
include => ext-meetme
exten => s,1,BackGround(enter-conf-call-number)
exten => h,1,Hangup()

[custom-wakeupext]
exten => s,1,Answer
exten => s,2,AGI(wakeup-ext.php);
exten => s,3,Hangup

; system wide speed dial app

[custom-speed-dial]
;Speed dialing record
exten => _3003XX.,1,DBput(SysSpeed/${EXTEN:3:3}=${EXTEN:6})
exten => _3003XX.,2,SayDigits(${EXTEN:6})
exten => _3003XX.,3,playback(at)
exten => _3003XX.,4,playback(position)
exten => _3003XX.,5,SayDigits(${EXTEN:3:3})
exten => _3003XX.,6,Hangup

;Speed dialing recall and dial
exten => _3XX,1,DBget(speedref=SysSpeed/${EXTEN})
exten => _3XX,2,playback(pls-wait-connect-call)
exten => _3XX,3,Goto(outbound-allroutes,${speedref},1)
exten => _3XX,102,playback(that-number)
exten => _3XX,103,playback(is-not-in-the)
exten => _3XX,104,playback(speed-dial)
exten => _3XX,105,playback(system)
exten => _3XX,106,playback(pls-try-again)
exten => _3XX,107,playback(goodbye)
exten => _3XX,108,Macro(hangupcall)

;Speed dialing recall and tell caller what it is, part one
exten => _*3XX,1,Answer
exten => _*3XX,2,DBget(speedref=SysSpeed/${EXTEN:1})
exten => _*3XX,3,SetVar(speedreflocation=${EXTEN:1})
exten => _*3XX,4,Goto(menu-SysSpeed,s,1)
exten => _*3XX,102,playback(speed-dial)
exten => _*3XX,103,playback(num-not-in-db)
exten => _*3XX,104,playback(pls-try-again)
exten => _*3XX,105,playback(goodbye)
exten => _*3XX,106,Macro(hangupcall)

[menu-SysSpeed]
;Speed dialing recall and tell caller what it is
exten => s,1,background(speed-dial)
exten => s,2,saydigits(${speedreflocation})
exten => s,3,background(has-been-set-to)
exten => s,4,saydigits(${speedref})
exten => s,5,background(press-1)
exten => s,6,background(to-call-this-number)
exten => s,7,background(or)
exten => s,8,background(hangup-try-again)
exten => s,9,background(silence/5)
exten => s,10,background(goodbye)
exten => s,11,Macro(hangupcall)
exten => 1,1,Goto(custom-speed-dial,${speedreflocation},1)

; custom-count2four,s,1 can be used as a custom target for
; a Digital Receptionist menu or a Call Group
;[custom-count2four]
;s,1,SayDigits(1234)
;s,2,Hangup

; custom-recordme,5678,1 can be used as a custom target for
; a Digital Receptionist menu or a Call Group
;[custom-recordme]
;exten => 5678,1,Wait(2)
;exten => 5678,2,Record(/tmp/asterisk-recording:gsm)
;exten => 5678,3,Wait(2)
;exten => 5678,4,Playback(/tmp/asterisk-recording)
;exten => 5678,5,Wait(2)
;exten => 5678,6,Hangup
++++++++++++++++++++++++++

Just wondering if you were ever able to fix this. I’m having the same problem.

That’s a lot of code to sift through. Save off these config files and re-create much simpler ones that zero in on (replicate) the problem. Post the simpler files for the forum to look over.

If you can’t break it with a much simpler config, start adding code back into it incrementally until it breaks. I’m sure you’ll find your gremlin if you go about it this way.

It’s easier to determine which animal made hoof prints if there aren’t Zebras, Antelope and Horses all in the same pasture.