;!
;! Automatically generated configuration file
;! Filename: extensions.conf (/etc/asterisk/extensions_macro.conf)
;! Generator: Manager
;! Creation Date: Mon Mar 18 04:12:42 2013
;!
[macro-dundi-e164]
;
; ARG1 is the extension to Dial
;
; Extension "s" is not a wildcard extension that matches "anything".
; In macros, it is the start extension. In most other cases,
; you have to goto "s" to execute that extension.
;
; For wildcard matches, see above - all pattern matches start with
; an underscore.
exten => s,1,Goto(${ARG1},1)
include => dundi-e164-lookup
;
; Here are the entries you need to participate in the IAXTEL
; call routing system. Most IAXTEL numbers begin with 1-700, but
; there are exceptions. For more information, and to sign
; up, please go to www.gnophone.com or www.iaxtel.com
;
[macro-trunkdial]
;
; Standard trunk dial macro (hangs up on a dialstatus that should
; terminate call)
; ${ARG1} - What to dial
;
exten => s,1,Dial(${ARG1})
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,Hangup
exten => s-BUSY,1,Hangup
exten => _s-.,1,NoOp
[stdexten]
;
; Standard extension subroutine:
; ${EXTEN} - Extension
; ${ARG1} - Device(s) to ring
; ${ARG2} - Optional context in Voicemail (if empty, then "default")
;
; Note that the current version will drop through to the next priority in the
; case of their pressing '#'. This gives more flexibility in what do to next:
; you can prompt for a new extension, or drop the call, or send them to a
; general delivery mailbox, or...
;
; The use of the LOCAL() function is purely for convenience. Any variable
; initially declared as LOCAL() will disappear when the innermost Gosub context
; in which it was declared returns. Note also that you can declare a LOCAL()
; variable on top of an existing variable, and its value will revert to its
; previous value (before being declared as LOCAL()) upon Return.
;
exten => _X.,50000(stdexten),NoOp(Start stdexten)
exten => _X.,n,Set(LOCAL(ext)=${EXTEN})
exten => _X.,n,Set(LOCAL(dev)=${ARG1})
exten => _X.,n,Set(LOCAL(cntx)=${ARG2})
exten => _X.,n,Set(LOCAL(mbx)="${ext}"$["${cntx}" ? "@${cntx}" :: ""])
exten => _X.,n,Dial(${dev},20) ; Ring the interface, 20 seconds maximum
exten => _X.,n,Goto(stdexten-${DIALSTATUS},1) ; Jump based on status (NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER)
exten => stdexten-NOANSWER,1,Voicemail(${mbx},u) ; If unavailable, send to voicemail w/ unavail announce
exten => stdexten-NOANSWER,n,NoOp(Finish stdexten NOANSWER)
exten => stdexten-NOANSWER,n,Return() ; If they press #, return to start
exten => stdexten-BUSY,1,Voicemail(${mbx},b)
; If busy, send to voicemail w/ busy announce
exten => stdexten-BUSY,n,NoOp(Finish stdexten BUSY)
exten => stdexten-BUSY,n,Return() ; If they press #, return to start
exten => _stdexten-.,1,Goto(stdexten-NOANSWER,1) ; Treat anything else as no answer
exten => a,1,VoicemailMain(${mbx}) ; If they press *, send the user into VoicemailMain
exten => a,n,Return()
[stdPrivacyexten]
;
; Standard extension subroutine:
; ${ARG1} - Extension
; ${ARG2} - Device(s) to ring
; ${ARG3} - Optional DONTCALL context name to jump to (assumes the s,1 extension-priority)
; ${ARG4} - Optional TORTURE context name to jump to (assumes the s,1 extension-priority)`
; ${ARG5} - Context in voicemail (if empty, then "default")
;
; See above note in stdexten about priority handling on exit.
;
exten => _X.,60000(stdPrivacyexten),NoOp(Start stdPrivacyexten)
exten => _X.,n,Set(LOCAL(ext)=${ARG1})
exten => _X.,n,Set(LOCAL(dev)=${ARG2})
exten => _X.,n,Set(LOCAL(dontcntx)=${ARG3})
exten => _X.,n,Set(LOCAL(tortcntx)=${ARG4})
exten => _X.,n,Set(LOCAL(cntx)=${ARG5})
exten => _X.,n,Set(LOCAL(mbx)="${ext}"$["${cntx}" ? "@${cntx}" :: ""])
exten => _X.,n,Dial(${dev},20,p) ; Ring the interface, 20 seconds maximum, call screening
; option (or use P for databased call _X.creening)
exten => _X.,n,Goto(stdexten-${DIALSTATUS},1) ; Jump based on status (NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER)
exten => stdexten-NOANSWER,1,Voicemail(${mbx},u) ; If unavailable, send to voicemail w/ unavail announce
exten => stdexten-NOANSWER,n,NoOp(Finish stdPrivacyexten NOANSWER)
exten => stdexten-NOANSWER,n,Return() ; If they press #, return to start
exten => stdexten-BUSY,1,Voicemail(${mbx},b) ; If busy, send to voicemail w/ busy announce
exten => stdexten-BUSY,n,NoOp(Finish stdPrivacyexten BUSY)
exten => stdexten-BUSY,n,Return() ; If they press #, return to start
exten => stdexten-DONTCALL,1,Goto(${dontcntx},s,1) ; Callee chose to send this call to a polite "Don't call again" script.
exten => stdexten-TORTURE,1,Goto(${tortcntx},s,1) ; Callee chose to send this call to a telemarketer torture script.
exten => _stdexten-.,1,Goto(stdexten-NOANSWER,1) ; Treat anything else as no answer
exten => a,1,VoicemailMain(${mbx}) ; If they press *, send the user into VoicemailMain
exten => a,n,Return
[macro-page];
;
; Paging macro:
;
; Check to see if SIP device is in use and DO NOT PAGE if they are
;
; ${ARG1} - Device to page
exten => s,1,ChanIsAvail(${ARG1},s) ; s is for ANY call
exten => s,n,GoToIf([${AVAILSTATUS} = "1"]?autoanswer:fail)
exten => s,n(autoanswer),Set(_ALERT_INFO="RA") ; This is for the PolyComs
exten => s,n,SIPAddHeader(Call-Info: Answer-After=0) ; This is for the Grandstream, Snoms, and Others
exten => s,n,NoOp() ; Add others here and Post on the Wiki!!!!
exten => s,n,Dial(${ARG1})
exten => s,n(fail),Hangup
[page]
exten => _X.,1,Macro(page,SIP/${EXTEN})
[mainmenu]
;
; Example "main menu" context with submenu
;
exten => s,1,Answer
exten => s,n,Background(thanks) ; "Thanks for calling press 1 for sales, 2 for support, ..."
exten => s,n,WaitExten
exten => 1,1,Goto(submenu,s,1)
exten => 2,1,Hangup
include => default
;
[submenu]
exten => s,1,Ringing ; Make them comfortable with 2 seconds of ringback
exten => s,n,Wait,2
exten => s,n,Background(submenuopts) ; "Thanks for calling the sales department. Press 1 for steve, 2 for..."
exten => s,n,WaitExten
exten => 1,1,Goto(default,steve,1)
exten => 2,1,Goto(default,mark,2)
[macro-phone]
exten => s,1,Dial(SIP/${MACRO_EXTEN}&IAX2/${MACRO_EXTEN},25)
exten => s,n,Goto(${DIALSTATUS},1)
exten => ANSWER,1,Hangup
exten => CANCEL,1,Hangup
exten => NOANSWER,1,Voicemail(${MACRO_EXTEN}@default,u)
exten => BUSY,1,Voicemail(${MACRO_EXTEN}@default,b)
exten => CONGESTION,1,Voicemail(${MACRO_EXTEN}@default,b)
exten => CHANUNAVAIL,1,Voicemail(${MACRO_EXTEN}@default,u)
exten => a,1,VoicemailMain(${MACRO_EXTEN}@default)
[macro-pagingintercom]
exten = s,1,SIPAddHeader(Alert-Info: ${PAGING_HEADER})
exten = s,2,Page(${ARG1},${ARG2})
exten = s,3,Hangup
[macro-stsdialresult]
; **** this is not complete - but a good start ****
; 603 Refused - hangup
; 404 Failed, Invalid user, no skype credit (Can't tell the difference) - hangup
; 408 UNPLACED whatever that means, try next channel
; 600 Busy - hangup
; 403 Anything else - hangup
;ISUP Cause value SIP response
; ---------------- ------------
; 1 unallocated number 404 Not Found
; 2 no route to network 404 Not found
; 3 no route to destination 404 Not found
; 16 normal call clearing --- (*)
; 17 user busy 486 Busy here
; 18 no user responding 408 Request Timeout
; 19 no answer from the user 480 Temporarily unavailable
; 20 subscriber absent 480 Temporarily unavailable
; 21 call rejected 403 Forbidden (+)
; 22 number changed (w/o diagnostic) 410 Gone
; 22 number changed (w/ diagnostic) 301 Moved Permanently
; 23 redirection to new destination 410 Gone
; 26 non-selected user clearing 404 Not Found (=)
; 27 destination out of order 502 Bad Gateway
; 28 address incomplete 484 Address incomplete
; 29 facility rejected 501 Not implemented
; 31 normal unspecified 480 Temporarily unavailable
exten => s,1,NoOp(HANGUPCAUSE is ${HANGUPCAUSE} and DIALSTATUS is ${DIALSTATUS})
exten => s,2(debug1),Verbose(1,debug1 "${HANGUPCAUSE}:${DIALSTATUS}")
exten => s,3,Set(TIMEOUT(absolute)=120)
exten => s,4,GotoIf($[${HANGUPCAUSE} = 0]?s,6)
exten => s,5,Goto(cause-${HANGUPCAUSE},1)
exten => s,6,GotoIf($[${DIALSTATUS} = NOANSWER]?cause-19,1)
exten => s,7,GotoIf($[${DIALSTATUS} = BUSY]?cause-2,1)
exten => s,8,GotoIf($[${DIALSTATUS} = CHANUNAVAIL]?cause-0,1)
exten => s,9,GotoIf($[${DIALSTATUS} = ANSWER]?exit-1,1)
exten => s,10,Goto(cause-0,1)
exten => cause-0,1,NoOp(AST_CAUSE_NOTDEFINED)
exten => cause-0,n,Verbose(1,debug "cause-0")
exten => cause-0,n,Playback(error)
;exten => cause-0,n,Congestion
exten => cause-0,n,Goto(exit-1,1)
exten => cause-1,1,NoOp(AST_CAUSE_FAILURE)
exten => cause-1,n,Verbose(1,debug "cause-1 invalid destination")
exten => cause-1,n,Playback(invalid)
exten => cause-1,n,Hangup
exten => cause-2,1,NoOp(AST_CAUSE_BUSY)
exten => cause-2,n,Verbose(1,debug "cause-2 busy")
exten => cause-2,n,Busy
exten => cause-3,1,NoOp(AST_CAUSE_FAILURE)
exten => cause-3,n,Verbose(1,debug "cause-3")
;exten => cause-3,n,Playback(error)
exten => cause-3,n,Goto(exit-1,1)
exten => cause-4,1,NoOp(AST_CAUSE_CONGESTION)
exten => cause-4,n,Verbose(1,debug "cause-4")
exten => cause-4,n,Goto(exit-1,1)
exten => cause-5,1,NoOp(AST_CAUSE_UNALLOCATED)
exten => cause-5,n,Verbose(1,debug "cause-5 invalid destination")
exten => cause-5,n,Playback(invalid)
exten => cause-5,n,Hangup
exten => cause-18,1,NoOp(AST_CAUSE_CALL_UNPLACED)
exten => cause-18,n,Verbose(1,debug "cause-18 unplaced")
exten => cause-18,n,Goto(exit-1,1)
exten => cause-19,1,NoOp(AST_CAUSE_NO_ANSWER)
exten => cause-19,n,Verbose(1,debug "cause-19 noanswer")
exten => cause-19,n,Playback(noanswer)
exten => cause-19,n,Hangup
exten => cause-21,1,NoOp(AST_CAUSE_CALL_REJECTED)
exten => cause-21,n,Verbose(1,debug "cause-21 rejected")
exten => cause-21,n,Playback(rejected)
exten => cause-21,n,Hangup
exten => _cause-X,1,NoOp(UNKNOWN_CAUSECODE)
exten => _cause-X,n,Verbose(1,debug "cause-X")
exten => _cause-X,n,Playback(error)
;exten => _cause-X,n,Congestion
exten => _cause-X,n,Goto(exit-1,1)
exten => exit,1(exit),Noop
[custom-wakeup]
exten => *62,1,agi(wakeup.php)
exten => *62,n,Hangup
[macro-senddigits]
exten => s,1,Wait(10) ; wait 5 second
exten => s,n,SendDTMF(${hkno}) ; send the number
[macro-senddigits1]
exten => s,1,Wait(10) ; wait 5 second
exten => s,n,SendDTMF(${hkno}) ; send the number
[macro-nomusic]
exten => s,1,NoOp(Turn off MOH for this channel)
exten => s,2,SetMusicOnHold(none)
[queue-member-manager]
exten = handle_member,1,Verbose(2, Looping through queues to log in or out queue members)
exten = handle_member,n,Set(thisActiveMember=${CHANNEL(channeltype)}/${CHANNEL(peername)})
exten = handle_member,n,Set(queue_field=1)
exten = handle_member,n,Set(thisQueueXtn=${CUT(QUEUES,\,,${queue_field})})
exten = handle_member,n,While($[${EXISTS(${thisQueueXtn})}])
exten = handle_member,n,Macro(member-loginlogout)
exten = handle_member,n,Set(queue_field=$[${queue_field} + 1])
exten = handle_member,n,Set(thisQueueXtn=${CUT(QUEUES,\,,${queue_field})})
exten = handle_member,n,EndWhile()
[macro-member-loginlogout]
exten = s,1,Verbose(2, Logging queue member in or out of the request queue)
exten = s,n,Set(thisQueue=${thisQueueXtn})
exten = s,n,Set(queueMembers=${QUEUE_MEMBER_LIST(${thisQueue})})
exten = s,n,MacroIf("${queueMembers}" = ""]?q_login)
exten = s,n,Set(field=1)
exten = s,n,Set(logged_in=0)
exten = s,n,Set(thisQueueMember=${CUT(queueMembers,\,,${field})})
exten = s,n,While($[${EXISTS(${thisQueueMember})}])
exten = s,n,GotoIf($["${thisQueueMember}" != "${thisActiveMember}"]?check_next)
exten = s,n,Set(logged_in=1)
exten = s,n,ExitWhile()
exten = s,n(check_next),Set(field=$[${field} + 1])
exten = s,n,Set(thisQueueMember=${CUT(queueMembers,\,,${field})})
exten = s,n,EndWhile()
exten = s,n,MacroIf($[${logged_in} = 0]?q_login:q_logout)
[macro-q_login]
exten = s,1,Verbose(2, Logging ${thisActiveMember} into the ${thisQueue} queue)
exten = s,n,AddQueueMember(${thisQueue},${thisActiveMember})
exten = s,n,Playback(silence/1)
exten = s,n,ExecIf($["${AQMSTATUS}" = "ADDED"]?Playback(agent-loginok):Playback(an-error-has-occurred))
[macro-q_logout]
exten = s,1,Verbose(2, Logged ${thisActiveMember} out of ${thisQueue} queue)
exten = s,n,RemoveQueueMember(${thisQueue},${thisActiveMember})
exten = s,n,Playback(silence/1)
exten = s,n,ExecIf($["${AQMSTATUS}" = "REMOVED"]?Playback(agent-loggedoff):Playback(an-error-has-occurred))
[macro-undefined]
exten = s,1,Set(CALLERID(all)=${IF($[${LEN(${ARG4})} > 2]?${ARG4}:)})
exten = s,n,Goto(${ARG1},${ARG2},${ARG3})
[macro-trunkdial-failover-record]
exten = s,1,Set(CALLERID(num)=${IF($[${LEN(${CID_${CALLERID(num)}})} > 2]?${CID_${CALLERID(num)}}:)})
exten = s,n,Set(TOUCH_MIXMONITOR=${ARG5}-${ARG6}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)})
exten = s,n,Set(TOUCH_MIXMONITOR_FORMAT=${RECORD_FORMAT})
exten = s,n,MixMonitor(${ARG5}-${ARG6}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}.${RECORD_FORMAT}|b|)
exten = s,n,GotoIf($[${LEN(${CALLERID(num)})} > 6]?1-dial,1)
exten = s,n,Set(CALLERID(all)=${IF($[${LEN(${CID_${ARG3}})} > 6]?${CID_${ARG3}}:${GLOBAL_OUTBOUNDCID})})
exten = s,n,Goto(1-dial,1)
exten = 1-dial,1,Dial(${ARG1},${RINGTIMEOUTBOUND},${DIALOPTIONS})
exten = 1-dial,n,Gotoif(${LEN(${ARG2})} > 0 ?1-${DIALSTATUS},1:1-out,1)
exten = 1-CHANUNAVAIL,1,Dial(${ARG2})
exten = 1-CHANUNAVAIL,n,Hangup()
exten = 1-CONGESTION,1,Dial(${ARG2})
exten = 1-CONGESTION,n,Hangup()
exten = 1-NOANSWER,1,Dial(${ARG2})
exten = 1-NOANSWER,n,Hangup()
exten = 1-out,1,Hangup()
[macro-stdexten]
exten = s,1,Set(__DYNAMIC_FEATURES=${FEATURES})
exten = s,2,Set(ORIG_ARG1=${ARG1})
exten = s,3,GotoIf($["${FOLLOWME_${ARG1}}" = "1"]?6:4)
exten = s,4,Dial(${ARG2},${RINGTIME},${DIALOPTIONS})
exten = s,5,Goto(s-${DIALSTATUS},1)
exten = s,6,Macro(stdexten-followme,${ARG1},${ARG2})
exten = s-NOANSWER,1,Voicemail(${ORIG_ARG1},u)
exten = s-NOANSWER,2,Goto(default,s,1)
exten = s-BUSY,1,Voicemail(${ORIG_ARG1},b)
exten = s-BUSY,2,Goto(default,s,1)
exten = _s-.,1,Goto(s-NOANSWER,1)
exten = a,1,VoicemailMain(${ORIG_ARG1})
[macro-stdexten-followme]
exten = s,1,Answer
exten = s,2,Set(ORIG_ARG1=${ARG1})
exten = s,3,Dial(${ARG2},${RINGTIME},${DIALOPTIONS})
exten = s,4,Set(__FMCIDNUM=${CALLERID(num)})
exten = s,5,Set(__FMCIDNAME=${CALLERID(name)})
exten = s,6,Followme(${ORIG_ARG1},${FOLLOWMEOPTIONS})
exten = s,7,Voicemail(${ORIG_ARG1},u)
exten = s-NOANSWER,1,Voicemail(${ORIG_ARG1},u)
exten = s-BUSY,1,Voicemail(${ORIG_ARG1},b)
exten = s-BUSY,2,Goto(default,s,1)
exten = _s-.,1,Goto(s-NOANSWER,1)
exten = a,1,VoicemailMain(${ORIG_ARG1})
[macro-local-callingrule-cid-0.1]
exten = s,1,Set(CALLERID(all)=${IF($[${LEN(${ARG4})} > 2]?${ARG4}:)})
exten = s,n,Goto(${ARG1},${ARG2},${ARG3})
[macro-superdial]
; add some abilities to Dial(Technology/resource[&Technology2/resource2...][|timeout][|options][|URL]):
; ${ARG1} - Technology/resource[&Technology2/resource2...] (like SIP/2201)
; ${ARG2} - timeout in seconds
; ${ARG3} - Dial command options
; ${ARG4} - URL (see Dial command for info)
; ${ARG5} - Group name (used if you want to limit the number of calls in any way)
; ${ARG6} - Max. group number (maximum number of concurrent calls you want to allow for that group)
; ${ARG7} - Caller ID name (typically for outgoing calls only)
; ${ARG8} - Caller ID number (typically for outgoing calls only)
; ${ARG9} - CDR account name (over-rides account group setting in sip.conf or iax.conf)
; ${ARG10} - voicemail to send to if noanswer (typically for incoming calls only)
; Usage instructions:
; for an outgoing call, in extensions.conf you just list multiple lines like:
; exten => s,1,Macro(superdial,IAX2/voipjet/${tfnumber},,,,voip,${MAXVOIPCALLS},yourname,8005551234,voipjet)
; exten => s,2,Macro(superdial,IAX2/alpeh-com/${tfnumber},,,,voip,${MAXVOIPCALLS},yourname,8005551234,aleph)
; and it will take the first one that is available
;
; it also works for incoming like so ..
; exten => s,1,Wait(2)
; exten => s,2,Macro(superdial,${PHONE1},15,Ttm,,pstn,${MAXPSTNCALLS},${CALLERIDNAME},${CALLERIDNUM},pstn,u${GENERALVM})
; exten => s,3,Macro(superdial,${PHONE1},15,Ttm,,pstn,${MAXPSTNCALLS},${CALLERIDNAME},${CALLERIDNUM},pstn,u${GENERALVM})
; exten => s,4,Voicemail(b${GENERALVM})
; and then goes to unavailable voicemail if one times out .. otherwise (eg if busy) it tries the next extension
; if all are busy or unavailable .. it gets to the last priority which is the busy voicemail
;
exten => s,1,Set(GROUP()=${ARG5})
exten => s,2,Set(GROUPCOUNT=${GROUP_COUNT(${ARG5})})
exten => s,3,GotoIf($[${GROUPCOUNT} > ${ARG6}]?104)
exten => s,4,GotoIf($["${ARG7}" = ""]?macro-superdial,s,6)
exten => s,5,Set(CALLERID(name)=${ARG7}) ; skip this if ARG7 is empty
exten => s,6,GotoIf($["${ARG8}" = ""]?macro-superdial,s,8)
exten => s,7,Set(CALLERID(number)=${ARG8}) ; skip this if ARG8 is empty
exten => s,8,GotoIf($["${ARG9}" = ""]?macro-superdial,s,10)
exten => s,9,SetAccount(${ARG9}) ; skip this if ARG9 is empty
exten => s,10,Dial(${ARG1},${ARG2},${ARG3},${ARG4})
exten => s,11,Goto(s-${DIALSTATUS},1)
exten => s,104,Goto(s-CHANUNAVAIL,1)
exten => s-BUSY,1,Noop
exten => s-NOANSWER,1,GotoIf($["${ARG10}" = ""]?macro-superdial,s-NOANSWER,3)
exten => s-NOANSWER,2,Voicemail(${ARG10})
exten => s-NOANSWER,3,Noop
exten => _s-.,1,Noop
[macro-trunkdial-failover-0.3]
exten = s,1,GotoIf($[${LEN(${FMCIDNUM})} > 6]?1-fmsetcid,1)
exten = s,n,GotoIf($[${LEN(${GLOBAL_OUTBOUNDCIDNAME})} > 1]?1-setgbobname,1)
exten = s,n,Set(CALLERID(num)=${IF($[${LEN(${CID_${CALLERID(num)}})} > 2]?${CID_${CALLERID(num)}}:)})
exten = s,n,Set(CALLERID(all)=${IF($[${LEN(${ARG5})} > 2]?${ARG5}:)})
exten = s,n,GotoIf($[${LEN(${CALLERID(num)})} > 6]?1-dial,1)
exten = s,n,Set(CALLERID(all)=${IF($[${LEN(${CID_${ARG3}})} > 6]?${CID_${ARG3}}:${GLOBAL_OUTBOUNDCID})})
exten = s,n,Set(CALLERID(all)=${IF($[${LEN(${ARG5})} > 2]?${ARG5}:)})
exten = s,n,Goto(1-dial,1)
exten = 1-setgbobname,1,Set(CALLERID(name)=${GLOBAL_OUTBOUNDCIDNAME})
exten = 1-setgbobname,n,Goto(s,3)
exten = 1-fmsetcid,1,Set(CALLERID(num)=${FMCIDNUM})
exten = 1-fmsetcid,n,Set(CALLERID(name)=${FMCIDNAME})
exten = 1-fmsetcid,n,Goto(s,4)
exten = 1-dial,1,Dial(${ARG1})
exten = 1-dial,n,Gotoif(${LEN(${ARG2})} > 0 ?1-${DIALSTATUS},1:1-out,1)
exten = 1-CHANUNAVAIL,1,Dial(${ARG2})
exten = 1-CHANUNAVAIL,n,Hangup()
exten = 1-CONGESTION,1,Dial(${ARG2})
exten = 1-CONGESTION,n,Hangup()
exten = 1-out,1,Hangup()
[macro-trunkdial-failover-0.3a]
exten = s,1, Set(GROUP()=OUTBOUND_GROUP)
exten = s,2, Noop(${GROUP_COUNT(OUTBOUND_GROUP)})
exten = s,3, GotoIf($[${GROUP_COUNT(OUTBOUND_GROUP)} > 1]?1-CHANUNAVAIL,1)
exten = s,4,Set(CALLERID(num)=${IF($[${LEN(${CID_${CALLERID(num)}})} > 2]?${CID_${CALLERID(num)}}:)})
exten = s,n,GotoIf($[${LEN(${CALLERID(num)})} > 6]?1-dial,1)
exten = s,n,Set(CALLERID(all)=${IF($[${LEN(${CID_${ARG3}})} > 6]?${CID_${ARG3}}:${GLOBAL_OUTBOUNDCID})})
exten = s,n,Goto(1-dial,1)
exten = 1-dial,1,Dial(${ARG1})
exten = 1-dial,n,Gotoif(${LEN(${ARG2})} > 0 ?1-${DIALSTATUS},1:1-out,1)
exten = 1-CHANUNAVAIL,1,Dial(${ARG2})
exten = 1-CHANUNAVAIL,n,Hangup()
exten = 1-CONGESTION,1,Dial(${ARG2})
exten = 1-CONGESTION,n,Hangup()
exten = 1-NOANSWER,1,Dial(${ARG2})
exten = 1-NOANSWER,n,Hangup()
exten = 1-out,1,Hangup()