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