extensions.conf
[general]
static=yes
; we don't want asterisk to write the configuration, as it will write
; everything to a single file
writeprotect=yes
[globals]
#include "extensions-defs.conf"
; another #include. This one includes complete contetexts.
; What happens if a section that has existed is re-added?
;
; Currently Asterisk ignores the new section. And thus is is very simple
; to override existing extensions. However nobody guarantees that the
; configurations will be paserd the same way in the future. This is intended
; for immediate hacks and for long-run system breakage.
#include "extensions.d/*.conf"
[macro-stdexten]
;
; Standard extension macro:
; ${ARG1} - Device(s) to ring
; ${ARG2} - flags for Dial: if empty: tr. pass '-' for no flags.
; ${ARG3} - voicemail box. If empty: use the extension number.
exten => s,1,SetVar(VMBOX=${MACRO_EXTEN}); default for VMBOX, if no ARG3
exten => s,2,GotoIf($[${LEN(${ARG3})} > 0]?4)
exten => s,3,SetVar(VMBOX=${ARG3})
; Ring the interface, 20 seconds maximum
exten => s,4,SetVar(FLAGS=tr)
; why 'x'? see bourne shell 101
exten => s,5,GotoIf($[ "x${ARG2}" : x- ]:7); '-' as the 'flags' argument
exten => s,6,SetVar(FLAGS=${ARG2})
exten => s,7,Dial(${ARG1},20,${ARG2})
; Jump based on status (NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER)
exten => s,8,Goto(s-${DIALSTATUS},1)
[Mailbox]
exten=> 9999/_[1-9].,1,Answer
exten=> 9999/_[1-9].,2,Wait(1)
exten=> 9999/_[1-9].,3,VoicemailMain2(s${CALLERIDNUM})
exten=> 9999/_[1-9].,4,Hangup
I unavailable, send to voicemail w/ unavail announce
exten => s-NOANSWER,1,Voicemail(u${VMBOX})
; If they press #, return to start
exten => s-NOANSWER,2,Goto(default,s,1)
; If busy, send to voicemail w/ busy announce
exten => s-BUSY,1,Voicemail(b${VMBOX})
; If they press #, return to start
exten => s-BUSY,2,Goto(default,s,1)
; Treat anything
exten => _s-.,1,Goto(s-NOANSWER,1)
extensions.conf: unmodified: line 1
; You may want to improve this one
;
[macro-stdmeetme]
exten => s,1,MeetMe(${MACRO_EXTEN})
[macro-dialout]
;
; a macro for setting up a trunk
; usage:
;
; Arguments:
;
; ARG1: trunk channels: a '&'-separated list of channels
; ARG2: number: the number to dial.
;
; Example:
;
; exten => _9.,Macro(dialout,Zap/1&Zap2,${EXTEN:1})
;
exten => s,1,ChanIsAvail(${ARG1}); use
exten => s,102,Goto(s-CHANUNAVAIL,1) ; this indicates that all lines
exten => s,2,SetVar(DIALLINE=${AVAILORIGCHAN})
exten => s,3,Goto(start,1) ;
include => trunk-macros-common
[macro-trunksip]
;
; a macro for setting up a trunk
; usage:
;
; Arguments:
;
; ARG1: trunk channels: a '&'-separated list of channels
; ARG2: number: the number to dial.
;
; Example:
;
; exten => _9.,Macro(Zap/1&Zap2,${EXTEN:1})
;
exten => s,1,GotoIf($["${ARG3}" = ""],10)
; The group name is the sip/iax peer
exten => s,2,Cut(GROUPNAME,ARG1,&,1); leave only the first target
exten => s,3,Cut(GROUPNAME,GROUPNAME,/,2); extract peer name
exten => s,4,SetGroup(${GROUPNAME})
exten => s,5,SetGroup(${ARG3})
exten => s,106,Goto(s-CHANUNAVAIL,1)
exten => s,6,Goto(start,1)
exten => s,7,SetVar(DIALLINE=${ARG1})
exten => s,8,Goto(start,1)
include => trunk-macros-common
[trunk-macros-common]
;
; a macro for setting up a trunk
; usage:
;
; Arguments:
; DIALLINE: trunk channels: a '&'-separated list of channels
; ARG2: number: the number to dial.
;
; Example:
;
; exten => _9.,Macro(Zap/1&Zap2,${EXTEN:1})
;
exten => start,1,Dial(${ARG1}/${ARG2})
exten => start,2,Goto(s-${DIALSTATUS},1)
exten => s-ANSWER,1,Goto(s-HANGUP,1)
exten => s-HANGUP,1,Hangup
exten => s-NOANSWER,1,Goto(s-HANGUP,1)
exten => s-CHANUNAVAIL,1,Playtone(congestion)
exten => s-CHANUNAVAIL,2,Wait(3)
exten => s-CHANUNAVAIL,3,Goto(s-HANGUP,1)
exten => s-BUSY,1,Playtone(busy)
exten => s-BUSY,2,Wait(3)
exten => s-BUSY,3,Goto(s-HANGUP,1)
exten => s-CONGESTION,1,Goto(s-BUSY,1)
exten => s-CANCEL,1,Goto(s-HANGUP,1)
[phones]
; conf files in the extensions-phones.d subdirectory should have no context.
; They are all to be part of the 'phones' context
#include "extensions-phones.d/*.conf"