;-------------------------------------------------------------------- ; Begining of extensionsconf File ;-------------------------------------------------------------------- ; ; Static extension configuration file, used by ; the pbx_config module This is where you configure all your ; inbound and outbound calls in Asterisk ; ; This configuration file is reloaded ; - With the "extensions reload" command in the CLI ; - With the "reload" command (that reloads everything) in the CLI ; ; The "General" category is for certain variables [general] ; ; If static is set to no, or omitted, then the pbx_config will rewrite ; this file when extensions are modified Remember that all comments ; made in the file will be lost when that happens ; ; XXX Not yet implemented XXX ; static=yes ; ; if static=yes and writeprotect=no, you can save dialplan by ; CLI command 'save dialplan' too ; writeprotect=yes ; ; If autofallthrough is set, then if an extension runs out of ; things to do, it will terminate the call with BUSY, CONGESTION ; or HANGUP depending on Asterisk's best guess (strongly recommended) ; ; If autofallthrough is not set, then if an extension runs out of ; things to do, asterisk will wait for a new extension to be dialed ; (this is the original behavior of Asterisk 10 and earlier) ; autofallthrough=yes ; ; If clearglobalvars is set, global variables will be cleared ; and reparsed on an extensions reload, or Asterisk reload ; ; If clearglobalvars is not set, then global variables will persist ; through reloads, and even if deleted from the extensionsconf or ; one if its included files, will remain set to the previous value ; clearglobalvars=yes ; ; You can include other config files, use the #include command ; (without the ';') ; Note that this is different from the "include" command that ; includes contexts within other contexts The #include command ; works in all asterisk configuration files ; #include "filenameconf" ; ; The "Globals" category contains global variables that can be referenced ; in the dialplan with ${VARIABLE} or ${ENV(VARIABLE)} for Environmental ; variable ${${VARIABLE}} or ${text${VARIABLE}} or any hybrid ; [globals] ;CONSOLE=Console/dsp ; Console interface for demo ;CONSOLE=Zap/1 ;CONSOLE=Phone/phone0 ;IAXINFO=guest ; IAXtel username/password ;IAXINFO=myuser:mypass ;TRUNK=Zap/g2 ; ; Note the 'g2' in the TRUNK variable above It specifies which group ; (defined in zapataconf) to dial, ie group 2, and how to choose a ; channel to use in the specified group The four possible options are: ; ; g: select the lowest-numbered non-busy Zap channel (aka ascending ; sequential hunt group) ; G: select the highest-numbered non-busy Zap channel (aka descending ; sequential hunt group) ; r: use a round-robin search, starting at the next highest channel ; than last time (aka ascending rotary hunt group) ; R: use a round-robin search, starting at the next lowest channel ; than last time (aka descending rotary hunt group) ; ;TRUNKMSD=1 ; MSD digits to strip (usually 1 or 0) ;TRUNK=IAX2/user:pass@provider ; ; Seconds before call forward no answer to voicemail VM_DELAY=20 ; ; Seconds before no response message for non-voicemail extensions NO_VM_TIMEOUT=30 ; ;Sip/Voip Provider - This is you DID Provider LINE= USERID= COMPANY= PROTOCOL= ; COMPANYNAME=Company Name Here ; Your Comapny Name here ; ;SipPhonecom user info SIPLINE= ;your SipPhonecom Number Here SIPUSERID= ;Your User ID here SIPPASS= ;Your Password here ; ;IAXTEL user info IAXLINE= IAXTELUSER= IAXTELPASS= ; ;FreeWorld Dialup user info FWDLINE= FWDUSERID= FWDPASSWD= ; ;Used for rollover ; ;Your Sip Line Phone Numbers used for rollover SIPLINENMBR1= SIPLINENMBR2= SIPLINENMBR3= SIPLINENMBR4= ; ;Your Hard Line Phone Number used for rollover ZAPLINENMBR1= ZAPLINENMBR2= ZAPLINENMBR3= ZAPLINENMBR4= ; ;Sip Out-bound Dialing Rollover Company names ;SIPLINE1=Sip Company 1 ;SIPLINE2=Sip Company 2 ;SIPLINE3=Sip Company 3 ;SIPLINE4=Sip Company 4 ; ;Zap Out-Bound Dialing Rollover ;LINE1=zap1 ;LINE2=zap2 ;LINE3=zap3 ;LINE4=zap4 ;--------------------------------------------------------------- ; Any category other than "General" and "Globals" represent ; extension contexts, which are collections of extensions ; ; Extension names may be numbers, letters, or combinations ; thereof If an extension name is prefixed by a '_' ; character, it is interpreted as a pattern rather than a ; literal In patterns, some characters have special meanings: ; ; X - any digit from 0-9 ; Z - any digit from 1-9 ; N - any digit from 2-9 ; [1235-9] - any digit in the brackets (in this example, 1,2,3,5,6,7,8,9) ; - wildcard, matches anything remaining (eg _9011 matches ; anything starting with 9011 excluding 9011 itself) ; ! - wildcard, causes the matching process to complete as soon as ; it can unambiguously determine that no other matches are possible ; ; For example the extension _NXXXXXX would match normal 7 digit dialings, ; while _1NXXNXXXXXX would represent an area code plus phone number ; preceeded by a one ; ; Each step of an extension is ordered by priority, which must ; always start with 1 to be considered a valid extension The priority ; "next" or "n" means the previous priority plus one, regardless of whether ; the previous priority was associated with the current extension or not ; The priority "same" or "s" means the same as the previously specified ; priority, again regardless of whether the previous entry was for the ; same extension Priorities may be immediately followed by a plus sign ; and another integer to add that amount (most useful with 's' or 'n') ; Priorities may then also have an alias, or label, in ; parenthesis after their name which can be used in goto situations ; ; Contexts contain several lines, one for each step of each ; extension, which can take one of two forms as listed below, ; with the first form being preferred One may include another ; context in the current one as well, optionally with a ; date and time Included contexts are included in the order ; they are listed ; ;----------------------------------------------------------------------------- ; Magic Extensions to be used within a context ;----------------------------------------------------------------------------- ; s = start ; t = This gets jumped to on timeout waiting for keypress ; i = This gets jumped to on an invalid extension ; h = This gets jumped to when a call in a given context is hung up ; fax = This gets jumped to on fax tone detection ;----------------------------------------------------------------------------- ; Dial Options ;----------------------------------------------------------------------------- ; Dial jumps to priority n+101 on busy if n+101 exists ; 't' -- Allow the user to dial # then an extension to transfer ; 'T' -- to allow the calling user to transfer the call ; 'r' -- indicate ringing to the calling party, pass no audio until answer ; 'm' -- provide hold music to the calling party until answered ; 'd' -- data-quality (modem) call (minimum delay) ; 'c' -- clear-channel data call (PRI-PRI only) ; 'H' -- allow caller to hang up by hitting * ; 'C' -- reset call detail record for this call ; 'P[(x)]' -- privacy mode, using 'x' as database if provided ; 'g' -- goes on in context if the destination channel hangs up ;---------------------------------------------------------------------------- ; Zaptel Acceptable Dial Strings ;---------------------------------------------------------------------------- ; ; Digits 0 - 9 ; Symbols # * ; Wait W ; ; Ranges: ; Apps : *XX ; Corp Exten:10 - 40 ; Extensions:1000 - 8500 not currently mapped ; Test Tools:900 - 909 ; Call Park :700,701 - 709 ; Meetme :8505 - 8507 ; ACD : ;-------------------------------------------------------------------- ;-------------------------------------------------------------------- ; All Internal Extensions ; *XX used for global functions ; exten 1-999 used mapped extensions ; exten 1000 - 9999 User/Staff/Office Extensions ;-------------------------------------------------------------------- ; ;-------------------------------------------------------------------- ; inbound call mapping ;-------------------------------------------------------------------- ; [inbound] ;Old way ;exten => _XXXXXXX,1,Dial(SIP/${EXTEN},30,Tr) ;exten => _XXXXXXX,2,Voicemail(u${EXTEN}) ;exten => _XXXXXXX,3,Hangup ;exten => _XXXXXXX,102,Voicemail(b${EXTEN}) ;exten => _XXXXXXX,103,Hangup ; ;This Exten Goes to Automated attendant after putting ;caller ID into the Database exten => s,1,Set(Last/Caller=${CALLERIDNUM}) exten => s,2,Goto(autoattend,s,1) ; ;This exten Dial your ZAP lines exten => s2,1Set(${DB(Last/Caller=${CALLERIDNUM})}) exten => s2,2,Dial(ZAP/1,30,r) ;replace # with exten nmbr ;New way ;Extensions with Voicemail ;exten => s,1,Macro(exten-vm,${EXTEN},${VM_DELAY}) ; ; Extensions with no voicemail ;exten => s1,1,Macro(exten-novm,${EXTEN},${NO_VM_TIMEOUT}) ; ;This comes in from the PSTN and runs it threw a script ;To fix Caller ID Issues [in-pstn] exten => s,1,1,SetAccount(${MYPHONE1}) exten => s,n,SetCDRUserField(${CALLERID}); under development exten => s,n,Macro(fixcid) exten => s,n,Answer exten => s,n,DigitTimeout(3) exten => s,n,ResponseTimeout(3) exten => s,n,Wait(1) exten => s,n,BackGround(pls-wait-connect-call) exten => s,n,Dial(SIP/${EXTEN},30,Tt) exten => i,n,Playback(pbx-invalid) exten => i,n,Hangup ; [macro-fixcid] ;------------------------------------------------------------------------- ; My caller id name often comes in as O If there is a CID number, ; use that Otherwise set the caller ID name to No Caller ID ; ARGS: none ; For some reason GotoIf($[${CALLERIDNAME} = O]?true:false) fails so I use ; this crappy system call instead :( I'm not sure if this is because ; $CALLERIDNAME is usually 2 words or what but it sucks ;-------------------------------------------------------------------------- ; exten => s,1,System(test "${CALLERIDNAME}" = "O") exten => s,2,GotoIf($[${CALLERIDNUM} = O]?3:5) exten => s,3,SetCaller("No Caller ID") exten => s,4,Goto(6) exten => s,5,SetCaller(${CALLERIDNUM}) exten => s,6,NoOp ; landing point for no caller id exten => s,102,Goto(autoattend,s,1) ; landing point ; ;------------------------------------------------------------------- ;Start Autoattend Menu ;------------------------------------------------------------------- ; [autoattend] ; exten => s,1,GotoIfTime(*|*|1|jan?holiday,s,1) exten => s,n,GotoIfTime(*|*|4|jul?holiday,s,1) exten => s,n,GotoIfTime(*|*|11|nov?holiday,s,1) exten => s,n,GotoIfTime(*|*|24|nov?holiday,s,1) exten => s,n,GotoIfTime(*|*|25|dec?holiday,s,1) exten => s,n,GotoIfTime(08:00-17:00on-fri|*|*?day,s,1) exten => s,n,GotoIfTime(17:01-07:99|mon-fri|*|*?night,s,1) exten => s,n,GotoIfTime(09:00-16:00|sat|*|*?day,s1,1) exten => s,n,Goto(night,s,1); ; [holiday] ; ; provide Holiday greeting and provide emergency access for ; contract clients ; exten => s,1,Background(custom/office-closed-holiday) ; play the office we are closed message exten => s,2,Background(custom/office-hours) ; play the open hours message exten => s,3,Goto(night,s,8) ; ; #=hangup exten => #,1,Background(goodbye) exten => #,2,Hangup ; exten => t,1,VoiceMail(u${DEFVM}) ; If they take too long, send to vmail exten => t,2,Hangup ; exten => i,1,Background(pbx-invalid) ; "That's not valid, try again" exten => i,2,Wait(1) exten => i,3,Goto(office-night,s,8) ; [day] include => selection include => all-exten include => disa include => queues ; exten => s,1,Set(CALLERID(name)=Comapny Name Here) exten => s,n,Wait,2 exten => s,n,Answer exten => s,n,Background,day-msg exten => s,n,DigitTimeout,5 exten => s,n,ResponseTimeout,10 ; [night] include => selection include => all-exten include => disa include => queues ; exten => s,1,Wait,2 exten => s,2,Answer exten => s,3,Plaback,night-msg exten => s,4,Voicemail(u######) exten => s,5,Hangup ; ;------------------------------------------------------------------- ; END - Autoattend Menu ;------------------------------------------------------------------- ;------------------------------------------------------------------- ; Start - IVR Menu ;------------------------------------------------------------------- [selection] ; ;1Sales Dept exten => 1,1,GotoIfTime(08:00-16:59|mon-fri|*|*?selection,3,6) exten => 1,2,GotoIfTime(17:00-07:29|mon-fri|*|*?selection,3,3) exten => 1,3,Playback,sales-closed exten => 1,4,Playback,vm-goodbye exten => 1,5,Hangup exten => 1,6,Playback(pls-wait-connect-call) exten => 1,7,SetMusicOnHold,default exten => 1,8,SetCallerID,1 exten => 1,9,SetCallerIDName,Sales exten => 1,10,Goto,queues|200|1 ; ;2Billing Dept exten => 2,1,GotoIfTime(08:00-16:59|mon-fri|*|*?selection,4,6) exten => 2,2,GotoIfTime(17:00-07:29|mon-fri|*|*?selection,4,3) exten => 2,3,Playback,billing-closed exten => 2,4,Playback,vm-goodbye exten => 2,5,Hangup exten => 2,6,Playback(pls-wait-connect-call) exten => 2,7,SetMusicOnHold,default exten => 2,8,SetCallerID,2 exten => 2,9,SetCallerIDName,Sales exten => 2,10,Goto,queues|201|1 ; ;3Technical Support Dept exten => 3,1,GotoIfTime(08:30-17:29|mon-fri|*|*?selection,5,6) exten => 3,2,GotoIfTime(17:30-08:29|mon-fri|*|*?selection,5,3) exten => 3,3,Playback,tech-closed exten => 3,4,Playback,vm-goodbye exten => 3,5,Hangup exten => 3,6,Playback,(pls-wait-connect-call) exten => 3,7,SetMusicOnHold,default exten => 3,8,SetCallerID,3 exten => 3,9,SetCallerIDName,TechSupport exten => 3,10,Goto,queues|202|1 ; ;4 exten => 4,1,Playback,vm-goodbye exten => 4,n,Hangup ; exten => 5,1,Playback,vm-goodbye exten => 5,n,Hangup ; ;5 exten => 6,1,Playback,vm-goodbye exten => 6,n,Hangup ; ;7 exten => 7,1,Playback,vm-goodbye exten => 7,n,Hangup ; ;8 Fax Extension exten => 8,1,SetVar(CALLEDFAX=${EXTEN}) exten => 8,2,Answer exten => 8,3,Goto(fax,${EXTEN},1) ; ;9 exten => 9,1,Goto(day,s,1) ; exten => 0,1,Dial(SIP/|18|Tr) ; ; Repeat the previous menu exten => *,1,Goto(s,9) ; ; #=hangup exten => #,1,Background(goodbye) exten => #,2,Hangup ; exten => i,1,Background(pbx-invalid) ; "That's not valid, try again" exten => i,2,Wait(1) exten => i,3,Goto(s,9) ; exten = t,1,Playback(pls-wait-connect-call) exten = t,n,Goto(operator-queue,s,1) ; ;------------------------------------------------------------------- ; END - IVR Menu ;------------------------------------------------------------------- ;------------------------------------------------------------------- ; BEGIN - Outbound call handlers ;------------------------------------------------------------------- ; [default] ; ; this is where SIP extensions enter the dial plan ; exten => s,1,DigitTimeout,2 ; give them 2 seconds between digits exten => s,2,ResponseTimeout,30 ; give them 30 seconds to make a choice ; include => sip-trans ; include => internal-svc ; ; Master context for outbound call routing ; ; Handle pstn service numbers. ; This group should only be dialed using ; one of our two analog lines. ; ; This routine is only used by our SIP ; phones. The Panasonic handsets enter ; the dial plan at co3out and co4out ; depending on the selection of CO3 or ; or CO4 at the handset. ; exten => _0,1,Macro(dial-pstn,${EXTEN},${LONGTIMEOUT}) exten => _411,1,Macro(dial-pstn,${EXTEN},${LONGTIMEOUT}) exten => _611,1,Macro(dial-pstn,${EXTEN},${LONGTIMEOUT}) exten => _911,1,Macro(dial-pstn,${EXTEN},${LONGTIMEOUT}) ; ; ; handle outbound toll free calls - force analog ; exten => _1800.,1,Macro(dial-pstn-sip-iax,${EXTEN},${LONGTIMEOUT}) exten => _1855.,1,Macro(dial-pstn-sip-iax,${EXTEN},${LONGTIMEOUT}) exten => _1866.,1,Macro(dial-pstn-sip-iax,${EXTEN},${LONGTIMEOUT}) exten => _1877.,1,Macro(dial-pstn-sip-iax,${EXTEN},${LONGTIMEOUT}) exten => _1888.,1,Macro(dial-pstn-sip-iax,${EXTEN},${LONGTIMEOUT}) ; ; Handle outbound local calls ; ; All local numbers are 10 digits in our area. ; This plan has no pattern for seven digit dialing. ; On local calls, we favor our analog lines from ; Verizon, then fail over to Voicepulse. ; NOTE VoicePulse needs the local 10 digit phone ; number to be preceeded by a "1" and there ; will be per-minute charges against the ; account. ; ; local call rule try analog line first, then sip, then iax ; exten => _NXXNXXXXXX,1,Macro(dial-pstn-sip-iax,${EXTEN},${LONGTIMEOUT}) ; ; long distance rule sends call to iax first, then sip, then pstn ; ; for long distance calls, we try the VoicePulse IAX ; service first. if VoicePulse is not available we try ; the BroadVoice SIP service. if all else fails, we ; use an analog line from Verizon. This forces least ; cost routing of the call. ; exten => _1NXXNXXXXXX,1,Macro(dial-iax-sip-pstn,${EXTEN},${LONGTIMEOUT}) ; voicepulse first ; ; handle outbound internationl calls ; ; for international calls, we try the VoicePulse IAX ; service first. if VoicePulse is not available we try ; the BroadVoice SIP service. if all else fails, we ; use an analog line from Verizon. This forces least ; cost routing of the call. ; exten => _011.,1,Macro(dial-iax-sip-pstn,${EXTEN},${LONGTIMEOUT}) ; ; handle outbound local calls - force ZAP trunk ; exten => _9NXXNXXXXXX,1,Macro(dial-pstn,${EXTEN:1},${LONGTIMEOUT}) ; ; handle outbound long distance calls - force ZAP trunk ; exten => _91NXXNXXXXXX,1,Macro(dial-pstn,${EXTEN:1},${LONGTIMEOUT}) ; ; handle outbound internationl calls - force ZAP trunk ; exten => _9011.,1,Macro(dial-pstn,${EXTEN:1},${LONGTIMEOUT}) ; ; handle outbound local calls - force IAX via VoicePulse ; exten => _8NXXNXXXXXX,1,Macro(dial-iax,1${EXTEN:1},${LONGTIMEOUT}) ; ; handle outbound long distance calls - force IAX via VoicePulse ; exten => _81NXXNXXXXXX,1,Macro(dial-iax,${EXTEN:1},${LONGTIMEOUT}) ; ; handle outbound internationl calls - force IAX via VoicePulse ; exten => _8011.,1,Macro(dial-iax,${EXTEN:1},${LONGTIMEOUT}) ; ; handle outbound local calls - force SIP via BroadVoice ; exten => _7NXXNXXXXXX,1,Macro(dial-sip,${EXTEN:1},${LONGTIMEOUT}) ; ; handle outbound long distance calls - force SIP via BroadVoice ; exten => _71NXXNXXXXXX,1,Macro(dial-sip,${EXTEN:1},${LONGTIMEOUT}) ; ; handle outbound internationl calls - force SIP via BroadVoice ; exten => _7011.,1,Macro(dial-sip,${EXTEN:1},${LONGTIMEOUT}) ; exten => t,1,Goto(i,1) ; If they take too long, give up ; exten => i,1,Background(invalid) ; "That's not valid, try again" exten => i,2,Wait(1) exten => i,3,Goto(s,1) ; ;-------------------------------------------------------------------- ; END - Outbound call handlers ;-------------------------------------------------------------------- ; ;-------------------------------------------------------------------- ; outbound mapping ;-------------------------------------------------------------------- [outbound] ; ;provider ;US LD & Canada exten => _NXXNXXXXXX,1,SetCallerID(${LINE}) exten => _NXXNXXXXXX,n,SetCallerIDName(${COMPANYNAME}) exten => _NXXNXXXXXX,n,Dial(${PROTOCOL}/${EXTEN}@${COMPANY}) exten => _NXXNXXXXXX,n,Congestion exten => _NXXNXXXXXX,n,Hangup ; ; International exten => _011NXXNXXXXXX,1,SetCallerID(${LINE}) exten => _011NXXNXXXXXX,n,SetCallerIDName(${COMPANY}) exten => _011NXXNXXXXXX,n,Dial(SIP/${EXTEN}@sipbroadvoicecom) exten => _011NXXNXXXXXX,n,Congestion exten => _011NXXNXXXXXX,n,Hangup ; [asterlink] exten => _1NXXNXXXXXX,1,SetCallerID() exten => _1NXXNXXXXXX,2,SetCallerIDName() exten => _1NXXNXXXXXX,3,Dial(IAX2/#######@asterlink/${EXTEN}) exten => _1NXXNXXXXXX,4,Congestion exten => _1NXXNXXXXXX,5,Hangup ; ;[iaxtel] exten => _1700NXXXXXX,1,SetCallerID(${IAXLINE}) exten => _1700NXXXXXX,n,SetCallerIDName(${COMPANYNAME}) exten => _1700NXXXXXX,n,Dial(IAX2/${IAXTELUSER}:{IAXTELPASS}@iaxtelcom/${EXTEN}@iaxtel) exten => _1700NXXXXXX,n,Congestion exten => _1700NXXXXXX,n,Hangup ; ;[sipphone] exten => _1747NXXXXXX,1,SetCallerID(${SIPLINE}) exten => _1747NXXXXXX,n,Dial(SIP/${EXTEN:1}@sipphone) exten => _1747NXXXXXX,n,Playback(invalid) exten => _1747NXXXXXX,n,Congestion exten => _1747NXXXXXX,n,Hangup ; [fwd] exten => _#6,1,SetCallerId,${FWDCIDNAME} exten => _#6,2,Dial(IAX2/${FWDNUMBER}:${FWDPASSWORD}@iax2fwdnetnet/${EXTEN:1},60,r) exten => _#6,3,Congestion exten => _#6,4,Hangup ; [macro-sip-rollover] exten => s,1,GotoIf($[${sipline1} = Congestion]?3:2) exten => s,2,Dial(${sipline1},15,rt) exten => s,3,GotoIf($[${sipline2} = Congestion]?5:4) exten => s,4,Dial(${sipline2},15,rt) exten => s,5,GotoIf($[${sipline3} = Congestion]?7:6) exten => s,6,Dial(${sipline3},15,rt) exten => s,7,GotoIf($[${sipline4} = Congestion]?1:8) exten => s,8,Dial(${sipline4},15,rt) exten => s,9,Hangup ; ;------------------------------------------------------- ;#zap outbound mapping ;------------------------------------------------------- ; ;ignorepat => 9 ; [zap]; Local exten => _9NXXXXXX,1,SetCallerID(${ZAPLINE}) exten => _9NXXXXXX,n,Dial(Zap1/${EXTEN}) exten => _9NXXXXXX,n,Playback(invalid) exten => _9NXXXXXX,n,Congestion exten => _9NXXXXXX,n,Hangup ; ;Zap Ld exten => _8NXXNXXXXXX,1,SetCallerID(${ZAPLINE}) exten => _8NXXNXXXXXX,2,Dial(Zap1/${EXTEN}) exten => _8NXXNXXXXXX,3,Playback(invalid) exten => _8NXXNXXXXXX,4,Congestion exten => _8NXXNXXXXXX,5,Hangup ; [macro-zap-rollover] exten => s,1,GotoIf($[${zapline1} = Congestion]?3:2) exten => s,2,Dial(${zapline1},15,r) exten => s,3,GotoIf($[${zapline2} = Congestion]?5:4) exten => s,4,Dial(${zapline2},15,r) exten => s,5,GotoIf($[${zapline3} = Congestion]?7:6) exten => s,6,Dial(${zapline3},15,r) exten => s,7,GotoIf($[${zapline4} = Congestion]?1:8) exten => s,8,Dial(${zapline4},15,r) exten => s,9,Hangup ; ;------------------------------------------------------- ; Blocking 1-900 Calls and 976 Calls - ;------------------------------------------------------- [blocked] exten => _900NXXXXXX,1,Playback(ss-noservice) exten => _NXX976XXXX,1,Playback(ss-noservice) exten => _976XXXX,1,Playback(ss-noservice) ;-------------------------------------------------------- ;Basic *XX exten nmbrs in the US + Canada For Asterisk ;Including macros that go with the exten ;-------------------------------------------------------- [basic-*XX] ; *228 - Over-the-Air Service Provisioning ; *272 - Access Wireless Priority Service ; *00 - Inward Voice Activated Services (English) ; *01 - Inward Voice Activated Services (French) Canada ; *02 - Deactivation/Activation of In-Session Activation (ISA) on a per line basis ; *03 - Deactivation of In-Session Activation (ISA) on a per call basis ; *1X - Reserved For Local Assignment ; *2X - Reserved for expansion to 3digit VSCs ; *3X - Reserved for expansion to 3-digit VSCs ; *40 - Change Forward-To Number for Customer Programmable Call Forwarding Busy Line ; *41 - Change Forward-To Number for Customer Programmable Call Forwarding Don't Answer ; *42 - Six-Way Conference Calling Activation ; *43 - Drop last member of Six-Way Conference Call ; *44 - Voice Activated Dialing ; *45 - Voice Dialing Extended Dial Tone ; *46 - French Voice Activated Network Control Canada ; *47 - Override Feature Authorization ; *48 - Override Do Not Disturb ; *49 - Long Distance Signal ; *50 - Voice Activated Network Control ; *51 - Who Called Me? exten => *51,1,Answer exten => *51,n,Wait(1) exten => *51,n,SetVar(${DB(LastCaller=LASTCALL/${ARG1})}) exten => *51,n,SayDigits(${LastCaller}) exten => *51,n,Hangup ; *52 - Single Line Variety Package (SVP) - Call Hold ; *53 - Single Line Variety Package (SVP) - Distinctive Ring B ; *54 - Single Line Variety Package (SVP) - Distinctive Ring C ; *55 - Single Line Variety Package (SVP) - Distinctive Ring D ; *56 - Change Forward-To Number for ISDN Call Forwarding ; *57 - Customer Originated Trace ; *58 - ISDN MBKS Manual Exclusion Activation ; *59 - ISDN MBKS Manual Exclusion Deactivation ; *60 - Selective Call Rejection Activation ; *61 - Distinctive Ringing/Call Waiting Activation ; *62 - Selective Call Waiting ; *63 - Selective Call Forwarding Activation ; *64 - Selective Call Acceptance Activation ; *65 - Calling Number Delivery Activation ; *66 - Automatic Callback Activation ; *67 - Calling Number Delivery Blocking ; *68 - Call Forwarding Busy Line/Don't Answer Activation ; *69 - Automatic Recall Activation with macro exten => *69,1,Cut(CHANRES=CHANNEL|-|1) exten => *69,n,Cut(EXTENSION=CHANRES|/|2) exten => *69,n,Goto(s69,1,${EXTENSION}) exten => s69,1,Answer exten => s69,2,Wait(1) exten => s69,3,Set(${DB(LastCaller=LASTCALL/${ARG1})}) exten => s69,4,GotoIf($[${LastCaller}]?5:10) exten => s69,5,SayDigits(${LastCaller}) exten => s69,6,SetVar(TIMEOUT(ditig)=3) exten => s69,7,SetVar(TIMEOUT(response)=7) exten => s69,8,Background(press-one-to-callback) exten => s69,9,Goto(12) exten => s69,10,Playback(unidentified) exten => s69,11,Hangup exten => s69,12,NoOp exten => 1,1,Goto(all-exten,${LastCaller},1); exten => i,1,Playback(pbx-invalid) exten => i,2,Hangup exten => t,1,Playback(vm-goodbye) exten => t,2,Hangup ; *70 - Cancel Call Waiting exten => *70,1,DBdel(CW/${CALLERIDNUM}) exten => *70,2,Playback(de-activated) exten => *70,3,Hangup ; *71 - Enable Call Waiting exten => *71,1,Set(${DB(CW/${CALLERIDNUM}=YES)}) exten => *71,2,Playback(activated) exten => *71,3,Hangup ; *72 - Call Forwarding Activation exten => _*72,1,Set(${DB(CF/${CALLERIDNUM}=${EXTEN:3})}) exten => _*72,2,Answer exten => _*72,3,Wait(1) exten => _*72,4,Playback(call-fwd-unconditional) exten => _*72,5,Playback(for) exten => _*72,6,Playback(extension) exten => _*72,7,SayDigits(${CALLERIDNUM}) exten => _*72,8,Playback(is-set-to) exten => _*72,9,SayDigits(${EXTEN:3}) ; *73 - Call Forwarding Deactivation exten => *73,1,Set(${DB(CF/${CALLERIDNUM})}) exten => *73,2,Answer exten => *73,3,Wait(1) exten => *73,4,Playback(call-fwd-cancelled) exten => *73,5,Hangup ; *74 - Speed Calling 8 - Change List ; *75 - Speed Calling 30 - Change List ; *76 - Advanced Call Waiting Deluxe ; *77 - Anonymous Call Rejection Activation ; *78 - Do Not Disturb Activation exten = *78,1,Answer exten = *78,2,Set(${DB(DND/${CALLERIDNUM}=YES)}) exten = *78,3,Wait(1) exten = *78,4,Playback(do-not-disturb) exten = *78,5,Playback(activated) exten = *78,6,Hangup ; *79 - Do Not Disturb Deactivation exten = *79,1,Answer exten = *79,2,Set(${DB(DND/${CALLERIDNUM})}) exten = *79,3,Wait(1) exten = *79,4,Playback(do-not-disturb) exten = *79,5,Playback(de-activated) exten = *79,6,Hangup ; *80 - Selective Call Rejection Deactivation ; *81 - Distinctive Ringing/Call Waiting Deactivation ; *82 - Line Blocking Deactivation ; *83 - Selective Call Forwarding Deactivation ; *84 - Selective Call Acceptance Deactivation ; *85 - Calling Number Delivery Deactivation ; *86 - Automatic Callback Deactivation ; *87 - Anonymous Call Rejection Deactivation ; *88 - Call Forwarding Busy Line/Don't Answer Deactivation ; *89 - Automatic Recall Deactivation ; *90 - Customer Programmable Call Forwarding Busy Line Activation ; *91 - Customer Programmable Call Forwarding Busy Line Deactivation ; *92 - Customer Programmable Call Forwarding Don't Answer Activation ; *93 - Customer Programmable Call Forwarding Don't Answer Deactivation ; *94 - Reserved For Local Assignment ; *95 - Reserved For Local Assignment ; *96 - Reserved For Local Assignment ; *97 - Reserved For Local Assignment ; *98 - Reserved For Local Assignment ; *99 - pbx ext transfer [pbx-transfer] exten => *99,1,Playback,pbx-transfer exten => *99,2,Set(temp=SIP/${ARG1}) exten => *99,3,Goto(all-exten,${temp}|1) exten => *99,103,Goto(s|4) exten => *99,4,Set(dnd=DND/${ARG1}) exten => *99,5,Goto(s|7) exten => *99,105,Goto(s|6) exten => *99,6,Dial(SIP/${ARG1},60,tr) exten => *99,7,Hangup exten => *99,107,Hangup ; *100 aka *1XX Speed Dial Add/Delete/NotSet/Dial ;[system-speeddial] ; *1 - Set system speed dial to digits ; *1 0 - Delete system speed dial ; *1 - Review system speed dial exten => _*1XXX,1,Answer exten => _*1XXX,2,Set(${DB(SystemSpeedDial/${EXTEN:1:3}=${EXTEN:5})}) exten => _*1XXX,3,Wait(1) exten => _*1XXX,4,Playback(speed-dial) exten => _*1XXX,5,SayDigits(${EXTEN:2:3}) exten => _*1XXX,6,Playback(has-been-set-to) exten => _*1XXX,7,SayDigits(${EXTEN:5}) exten => _*1XXX,8,Hangup ; exten => _*1XX0,1,Answer exten => _*1XX0,2,Set(${DB9SystemSpeedDial/${EXTEN:1:3})}) exten => _*1XX0,3,Wait(1) exten => _*1XX0,4,Playback(speed-dial) exten => _*1XX0,5,SayDigits(digits/${EXTEN:2:3}) exten => _*1XX0,6,Playback(has-been-cleared) exten => _*1XX0,7,Hangup ; exten => _*1XX,1,Answer exten => _*1XX,2,Set(${DB(SystemSpeedDial=SystemSpeedDial/${EXTEN:1:3})}) exten => _*1XX,3,Wait(1) exten => _*1XX,4,Playback(speed-dial) exten => _*1XX,5,SayDigits(${EXTEN:2:3}) exten => _*1XX,6,Playback(is-set-to) exten => _*1XX,7,SayDigits(${SystemSpeedDial}) exten => _*1XX,8,Hangup exten => _*1XX,103,Playback(speed-dial) exten => _*1XX,104,SayDigits(${EXTEN:2:3}) exten => _*1XX,105,Playback(is-not-set) exten => _*1XX,106,Hangup ; exten => _*1XX,1,Set(${DB(NumberToCall=SystemSpeedDial/${EXTEN})}) exten => _*1XX,2,Dial(${TRUNKGROUP}/${NumberToCall},20); exten => _*1XX,3,Congestion exten => _*1XX,102,Answer exten => _*1XX,103,Wait(1) exten => _*1XX,104,Playback(speed-dial) exten => _*1XX,105,SayDigits(${EXTEN}) exten => _*1XX,106,Playback(is-not-set) exten => _*1XX,107,Hangup ; ;-------------------------------------------------------- ;Basic exten nmbrs For Asterisk ;Including macros that go with the exten ;-------------------------------------------------------- [basic-exten] ; * - directory ; not setup yet ;exten => *,1,Directory,default ;exten => *,2,Goto,s|1 ; # - disconnect ;exten => #,1,Playback,(vm-goodbye) ;exten => #,2,Hangup ; 0 Operator exten => 0,1,Macro(stdexten,0,SIP/0) ; 0 - Operator Queue exten => 0,1,Answer exten => 0,n,Queue(operator| exten => 0,n,Playback(vm-goodbye) ; ; 2 - 92 Reserved For Local Assignment ; ; 93 - 95 Put call in the queue for the next available agent [tranfer-queue] exten => 93,1,Answer exten => 93,n,Wait,1 exten => 93,n,Queue(sales) exten => 93,4,Hangup exten => 94,1,Answer exten => 94,n,Wait,1 exten => 94,n,Queue(billing) exten => 94,n,Hangup exten => 95,1,Answer exten => 95,n,Wait,1 exten => 95,n,Queue(techsupport) exten => 95,n,Hangup ; ; 96 - 98 - Reserved For future queue tranfers ; ; 99 -Login and wait for calls while offhook When calls arrive, you will he ; a beeping tone and the caller will join automatically [offhook] exten => 99,1,Answer exten => 99,2,SetMusicOnHold(default) exten => 99,3,Wait,1 exten => 99,4,AgentLogin ; ; 100-105 Queue Agents Login ; 1 Sales Turn on=100 Turn off=101 ; 2 Tech Support Turn on=102 Turn off=103 ; 3 Billing Turn on=104 Turn off=105 ; 4 other queues Turn on=XXX Turn off=XXX [agentlogin] exten => 100,1,AddQueueMember(sales|SIP/${CALLERIDNUM}) exten => 100,n,Playback(agent-loginok) exten => 100,n,Hangup exten => 101,1,RemoveQueueMember(sales|SIP/${CALLERIDNUM}) exten => 101,n,Playback(agent-loggedoff) exten => 101,n,Hangup exten => 102,1,AddQueueMember(billing|SIP/${CALLERIDNUM}) exten => 102,n,Playback(agent-loginok) exten => 102,n,Hangup exten => 103,1,RemoveQueueMember(billing|SIP/${CALLERIDNUM}) exten => 103,n,Playback(agent-loggedoff) exten => 103,n,Hangup exten => 104,1,AddQueueMember(techsupport|SIP/${CALLERIDNUM}) exten => 104,n,Playback(agent-loginok) exten => 104,n,Hangup exten => 105,1,RemoveQueueMember(techsupport|SIP/${CALLERIDNUM}) exten => 105,n,Playback(agent-loggedoff) exten => 105,n,Hangup ; ; 106 - 199 - Reserved For Local Assignment ; ; 200 - 202 Basic Call Queue's 200-202 [queues] exten => 200,1,Answer exten => 200,n,Queue(sale|TtH) exten => 200,n,WaitMusicOnHold(45) exten => 200,n,Voicemail(u200) exten => 200,n,Playback(vm-goodbye) exten => 200,n,Hangup exten => 201,1,Answer exten => 201,n,Queue(billing|TtH) exten => 201,n,WaitMusicOnHold(45) exten => 201,n,Voicemail(u201) exten => 201,n,Playback(vm-goodbye) exten => 201,n,Hangup exten => 202,1,Answer exten => 202,n,Queue(techsupport|TtH) exten => 202,n,WaitMusicOnHold(45) exten => 202,n,Voicemail(u202) exten => 202,n,Playback(vm-goodbye) exten => 202,n,Hangup ; ; 203 - 210 - Reserved For Local Assignment ; ; 211 - Paging via soundcard to a amp or paging system [paging] exten => 211,1,Dial(console/dsp) exten => 211,2,Answer exten => 211,3,Wait(1) exten => 211,4,Playback(touchtone/1) exten => 211,5,Playback(touchtone/1) exten => 211,6,Playback(touchtone/1) exten => 211,7,Wait(1) exten => 211,8,Hangup ; ; 212 - 299 - Reserved For Local Assignment ; 300 - 310 - Reserved For Local Assignment ; ; 311 - non-emerg not yet setup for e911 Non Emerg [non-emerg] exten => 311,1,Dial(SIP/${EXTEN}) exten => 311,2,Congestion exten => 311,102,Playback(ss-noservice) exten => 311,103,Congestion ; ; 312 - 399 Reserved For Local Assignment ; 400 - 410 Reserved For Local Assignment ; ; 411 - Directory Asistance [directory-asistance] exten => 411,1,Dial(SIP/411@gateway,30) exten => 411,2,hangup ; ; 412 - 499 - Reserved For Local Assignment ; ; 500 - Dials Digium Demo via IAX [digium-demo] exten => 500,1,Playback(demo-abouttotry); Let them know what's going on exten => 500,n,Dial(IAX2/guest@miserydigiumcom/s@default) ; Call the Asterisk demo exten => 500,n,Playback(demo-nogo) ; Couldn't connect to the demo site exten => 500,n,Goto(s,6) ; Return to the start over message ; ; 501 - Dials Digium with out Demo Prompts [digium] exten => 501,1,Dial(IAX2/guest@miserydigiumcom/s@default) ; ; 502 - 510 - Reserved For Local Assignment ; ; 511 Wakeup Service [wakeup] exten => 511,1,Answer exten => 511,2,Wait(1) exten => 511,3,AGI(callbackagi) exten => 511,4,Wait(1) exten => 511,5,Hangup ; ; 512 - 599 Reserved For Local Assignment ; 601 - 610 Reserved For Local Assignment ; ; 611 - Repair line [repair] exten => 611,1,Dial(SIP/${EXTEN}|18|r) exten => 611,2,Queue(repair|TtH) exten => 611,3,WaitMusicOnHold(45) exten => 611,4,Voicemail(u611) exten => 611,5,Playback(vm-goodbye) exten => 611,6,Hangup ; ; 612 - 6699 Reserved For Local Assignment ; ; 700 - 709 Call Parking on Asterisk also includes blind parking [parking] exten => 700,1,Answer exten => 700,n,SetMusicOnHold(default) exten => 700,n,ParkAndAnnounce(PARKED|60|SIP/${EXTEN}|70|4) exten => _70X,1,ParkedCall(${EXTEN} ; ; 700 - Blind Call Parking With Call Back Announce ;exten => _70X,1,Answer ;exten => _70X,n,Wait(1) ;exten => _70X,n,ParkAndAnnounce(pbx-transfer:PARKED|7200|SIP/${EXTEN:1}|default,${EXTEN:1},1) ; ; 711 - ValetParking ;[valetparking] ; Not working yet requires valetparking.c ;exten => 711,1,ValetParkCall(auto|mylot|360|10|1|default) ;exten => 711,n,ValetUnParkCall(fifo|mylot) ;exten => 711,n,ValetParkList(mylot) ;exten => 711,n,ValetParkCall(query|mylot|360|10|1|default) ;exten => 711,n,ValetUnparkCall(query|mylot) ; ; 712 - 797 Reserved For Local Assignmen ; ; 798 - 799 Confrance Stream Linsten to confrance call only ; requires ices and icecast. [stream] ; Conference Room exten => 798,1,Answer exten => 798,2,Wait(1) exten => 798,3,MeetMe(8508) ; Stream exten => 799,1,Answer exten => 799,2,Wait(1) exten => 799,3,Ices(/usr/local/etc/asterisk/asterisk-icesxml) ; ; 800 - 809 Inturnal and Extenal Meet-Me Conference Rooms [internal-conf] exten => _80X,1,Answer exten => _80X,n,Wait(1) exten => _80X,n,MeetMe({$ARG1},pdcMs) exten => _80X,n,4,Playback(vm-goodbye) exten => _80X,n,5,Hangup ; ; 810 - 899 Reserved For Local Assignment ; 900 - 910 Reserved For Local Assignment ; ; 911 Emergancy [emerg] exten => 911,1,Dial(SIP/${EXTEN}) exten => 911,n,Congestion exten => 911,n,Playback(no-911-1) exten => 911,n,Congestion ; ; 912 - 986 Reserved For Local Assignment ; ; 987 - Disa using voicemail passowords via agi [outside-inside] exten => 987,1,Answer ; 468 - INT exten => 987,2,Wait(1) exten => 987,3,Playback(please-enter-the) exten => 987,4,Playback(extension) exten => 987,5,Read(int_extension,then-press-pound) exten => 987,6,Playback(pls-enter-vm-password) exten => 987,7,Read(vm_passwd,then-press-pound) exten => 987,8,AGI(internal_authphp|${int_extension},${vm_passwd}) exten => 987,9,SetVar(CALLERIDNUM=${int_extension}) exten => 987,10,DISA(no-password|from-internal) exten => 987,101,Playback(vm-incorrect) exten => 987,102,Goto(3) ; ; 988 & 989 Pront recording and and special prompt recording + enable disable [prompts] ;988 - Prompt management exten => 988,1,Goto(app-prompt-management,s,1) ; ; 989 - Special announcement admin (Easy IVR) exten => 989,1,Goto(app-special-message,s,1) ; [app-special-message] ; Record/replay/turn on/off the special message played before ACD queue calls exten = s,1,Answer exten = s,2,Wait(1) exten = s,3,DigitTimeout(5) exten = s,4,BackGround(T-to-hear-cur-ancmnt) exten = s,5,BackGround(press-1) exten = s,6,BackGround(T-to-rec-ancmnt) exten = s,7,BackGround(press-2) exten = s,8,BackGround(T-to-enable-ancmnt) exten = s,9,BackGround(press-3) exten = s,10,BackGround(T-to-disable-ancmnt) exten = s,11,BackGround(press-4) ; exten = t,1,Playback(goodbye) exten = t,2,Hangup ; exten = i,1,Playback(pbx-invalid) exten = i,2,Goto(s,4) ; exten = 1,1,Playback(cc-special-message) exten = 1,2,Goto(s,4) ; exten = 2,1,Goto(app-special-message-record,s,1) ; exten = 3,1,SET($DB(SpecialMessage/1=1)}) exten = 3,2,Playback(enabled) exten = 3,3,Goto(s,4) ; exten = 4,1,DBdel(SpecialMessage/1) exten = 4,2,Playback(disabled) exten = 4,3,Goto(s,4) ; exten = *,1,Playback(goodbye) exten = *,2,Hangup ; [app-special-message-record] ; Record the new special message exten = s,1,Playback(vm-intro) exten = s,2,Record(new-special-message:wav) exten = s,3,Playback(beep) exten = s,4,BackGround(new-special-message) exten = s,5,BackGround(save-announce-press) exten = s,6,BackGround(digits/1) exten = s,7,BackGround(to-rerecord-announce) exten = s,8,BackGround(digits/2) exten = i,1,Playback(invalid) exten = i,2,Goto(s,3) ; exten = t,1,Goto(s,3) ; exten = 1,1,System(cp -f /var/lib/asterisk/sounds/new-special-messagewav /var/lib/asterisk/sounds/special-messagewav) exten = 1,2,Playback(your-msg-has-been-saved) exten = 1,3,Goto(app-special-message,s,1) ; exten = 2,1,Goto(s,1) ; exten = *,1,Goto(app-special-message,s,1) ; [macro-check-special-message] ; If the flag is set, play the special message, otherwise continue exten = s,1,Set(${DB(SpecialMessage=SpecialMessage/1)}) exten = s,2,Playback(system-status-msg) exten = s,3,Playback(special-message) exten = s,4,Ringing exten = s,5,Wait(4) exten = s,102,Noop ; [app-prompt-management] ; Flexible prompt recording exten = s,1,Answer exten = s,2,Wait(1) exten = s,3,DigitTimeout(5) exten = s,4,Read(PROMPT_NUMBER|enter-prompt-number|3) exten = s,5,SayDigits(${PROMPT_NUMBER}) exten = s,6,BackGround(T-to-hear-cur-ancmnt) exten = s,7,BackGround(press-1) exten = s,8,BackGround(T-to-rec-ancmnt) exten = s,9,BackGround(press-2) ; exten = t,1,Playback(goodbye) exten = t,2,Hangup ; exten = i,1,Playback(pbx-invalid) exten = i,2,Goto(s,5) ; exten = 1,1,Playback(beep) exten = 1,2,Playback(bsky-prompt-${PROMPT_NUMBER}) exten = 1,3,Playback(beep) exten = 1,4,Goto(s,6) ; exten = 2,1,Goto(app-prompt-management-record,s,1) ;exten = *,1,Playback(goodbye) exten = *,2,Hangup ; [app-prompt-management-record] ; New prompt recording exten = s,1,Playback(vm-intro) exten = s,2,Record(tmp-newprompt:wav) exten = s,3,Playback(beep) exten = s,4,BackGround(tmp-newprompt) exten = s,5,BackGround(save-announce-press) exten = s,6,BackGround(digits/1) exten = s,7,BackGround(to-rerecord-announce) exten = s,8,BackGround(digits/2) ; exten = i,1,Playback(invalid) exten = i,2,Goto(s,3) ; exten = t,1,Goto(s,3) ; exten = 1,1,System(cp -f /var/lib/asterisk/sounds/tmp-newpromptwav /var/lib/asterisk/sounds/prompt-${PROMPT_NUMBER}wav) exten = 1,2,Playback(your-msg-has-been-saved) exten = 1,3,Goto(app-prompt-management,s,4) ; exten = 2,1,Goto(s,1) ; exten = *,1,Goto(app-prompt-management,s,4) ; ; 990 - System Stataus & exten testing : Agi Requires sysstatagi [exten-test] exten => 990,1,AGI(systatagi) exten => 990,n,Wait(1) exten => 990,n,Playback(loadavgis) exten => 990,n,SayDigits(${LOADAVGPRE}) exten => 990,n,Playback(point) exten => 990,n,SayDigits(${LOADAVGSUF}) exten => 990,n,Wait(1) exten => 990,n,Playback(thereare) exten => 990,n,SayDigits(${NUMUSER}) exten => 990,n,Playback(userson) exten => 990,n,Wait(1) exten => 990,n,Hangup ; 991 - Say Phone Number exten => 991,1,Answer exten => 991,n,Wait(1) exten => 991,n,SayDigits(${CALLERIDNUM}) exten => 991,n,Hangup ; 992 - Say Date and Time exten => 992,1,Answer exten => 992,n,Wait(1) exten => 992,n,Datetime exten => 992,n,Hangup ; 993 - Echo Test exten => 993,1,Answer exten => 993,n,Wait(1) exten => 993,n,Playback(demo-echotest) exten => 993,n,Playback(beep) exten => 993,n,Echo exten => 993,n,Playback(demo-echodone) exten => 993,n,Hangup ; 994 - Milliwatt Tone exten => 994,1,Answer exten => 994,n,Milliwatt exten => 904,n,Hangup ; 995 - Record Promt Test Format Gsm exten => 995,1,Answer exten => 995,n,Wait(1) exten => 995,n,Record(record:gsm) exten => 995,n,Wait(1) exten => 995,n,Playback(record) exten => 995,n,Hangup; Music On Hold ; 996 - Music On Hold exten => 996,1,Answer exten => 996,n,Wait(1) exten => 996,n,MusicOnHold(default) ; 997 - 998 Reserved For Assignment ; 999 - Record and playback system-stat used for Autoatten SysStatus msg [sysstat-rec] exten => 999,1,Answer exten => 999,n,Wait(2) exten => 999,n,Record(/usr/local/share/sounds/systemstatus:gsm) exten => 999,n,Wait(2) exten => 999,n,Playback(/usr/local/share/asterisk/sounds/systemstatus) exten => 999,n,Wait(2) exten => 999,n,Hangup ;------------------------------------------------------------------------------- ;Exten 1000 - 9999 user for sip/iax/h323/mgcp/sccp exten : see "allexten" below ;------------------------------------------------------------------------------- ;--------------------------------------------------------- ;- Xmas Santa Line & other Special Lines ;--------------------------------------------------------- [santa-line] exten = NXXXXXX,1,Goto(app-xmas-record,s,1) exten = NXXXXXX,1,Goto(app-xmas-playback,s,1) ; [app-xmas-record] exten = s,1,Ringing exten = s,2,Wait(4) exten = s,3,Answer exten = s,4,Playback(xmas2-welcome) exten = s,5,Set(${DB(MessageCount=xmas/${CALLERIDNUM})}) exten = s,6,Set(${DB(MessageCount=$[${MessageCount} + 1])}) exten = s,7,Set(${DB(xmas/${CALLERIDNUM}=${MessageCount})}) exten = s,8,Record(xmas/${CALLERIDNUM}-${MessageCount}:ulaw|10|60) exten = s,9,Playback(xmas2-done) exten = s,10,Hangup exten = s,106,Set(${DB(MessageCount=1)}) exten = s,107,Goto(s,7) ; [app-xmas-playback] exten = s,1,Ringing exten = s,2,Wait(4) exten = s,3,Answer exten = s,4,Set(${DB(MessageCount=xmas/${CALLERIDNUM})}) exten = s,5,Set(${DB(CurrentMessage=1)}) exten = s,6,Playback(xmas2-recorded) exten = s,7,Playback(xmas/${CALLERIDNUM}-${CurrentMessage}) exten = s,8,Set(${DB(CurrentMessage=$[${CurrentMessage} + 1])}) exten = s,9,GotoIf(${DB([${CurrentMessage} ${MessageCount}]?12:10)}) exten = s,10,Playback(beep) exten = s,11,Goto(s,7) exten = s,12,Playback(xmas2-goodbye) exten = s,13,Hangup exten = s,105,Playback(xmas2-notrecorded) exten = s,106,Hangup ;------------------------------------- ;Dundi-e164 Setup ;------------------------------------- ;[dundi-e164-customers] ; ; If you are an ITSP or Reseller, list your customers here ; ;exten => _12564286000,1,Dial(SIP/customer1) ;exten => _12564286001,1,Dial(IAX2/customer2) ; ;[dundi-e164-via-pstn] ; ; If you are freely delivering calls to the PSTN, list them here ; ;exten => _1256428XXXX,1,Dial(Zap/g2/${EXTEN:7}) ; Expose all of 256-428 ;exten => _1256325XXXX,1,Dial(Zap/g2/${EXTEN:7}) ; Ditto for 256-325 ; [dundi-e164-local] ; ; Context to put your dundi IAX2 or SIP user in for ; full access ; ;include => dundi-e164-canonical ;include => dundi-e164-customers ;include => dundi-e164-via-pstn ; ;[dundi-e164-switch] ; ; Just a wrapper for the switch ; ;switch => DUNDi/e164 ; ;[dundi-e164-lookup] ; ; Locally to lookup, try looking for a local E164 solution ; then try DUNDi if we don't have one ; ;include => dundi-e164-local ;include => dundi-e164-switch ; ; DUNDi can also be implemented as a Macro instead of using ; the Local channel driver ; ;[macro-dundi-e164] ; ; ARG1 is the extension to Dial ; ;exten => s,1,Goto(${ARG1},1) ;include => dundi-e164-lookup ; ;--------------------------------------------------------- ; ; enum lookup serveice ; ;---------------------------------------------------------- [Enum164e] ; Home telephone from E164org lookup exten => 15552556690,1,Dial(${HOMEPHONES},20) exten => 15552556690,2,Voicemail2(u44) exten => 15552556690,3,HangUp ; ; Business Line from E164org lookup exten => 15552553925,1,Dial(${WORKPHONES},20) exten => 15552553925,2,Voicemail(u21) exten => 15552553925,3,HangUp ; [internal] exten => _XXXNXXXXXX,1,Macro(enum-call,localcall,1${EXTEN}) exten => _1604NXXXXXX,1,Macro(enum-call,localcall,${EXTEN}) exten => _011XXXXNXXXXXX,1,Macro(enum-call,localcall,${EXTEN:3}) exten => _0111NXXNXXXXXX,1,Macro(enum-call,NA,${EXTEN:3}) exten => _NXXNXXXXXX,1,Prefix(1) exten => _1NXXNXXXXXX,1,Macro(enum-call,NA,${EXTEN}) exten => _011X,1,Macro(enum-call,international,${EXTEN:3}) ; [macro-enum-call] exten => s,1,SetCallerID(1XXX5551212) exten => s,2,EnumLookup(${ARG2}) exten => s,53,Goto(${ARG1},${ARG2},1) exten => s,103,Goto(${ARG1},${ARG2},1) exten => s,3,GotoIf($[$[${ENUM:0:3} = SIP] | $[${ENUM:0:3} = IAX]]?4:5) exten => s,4,Dial(${ENUM}) exten => s,5,Goto(${ARG1},${ARG2},1) exten => s,105,Goto(${ARG1},${ARG2},1) ; ;------------------------------------------------------------------------- [all-exten] exten => 0,1,Macro(stdexten,0) ; Dial Operator exten => _[1-5]XXX,1,Macro(stdexten,${EXTEN}) ; User Exten / Sip exten => _[6-8]XXX,1,Macro(stdexten,${EXTEN}) ; User Exten / IAX ;------------------------------------------------------------------------- ;Extensions with Voicemail ;exten => ,1,Macro(exten-vm,${EXTEN},${VM_DELAY}) ; ; Extensions with no voicemail ;exten => ,1,Macro(exten-novm,${EXTEN},${NO_VM_TIMEOUT}) ;------------------------------------------------------------------------- [macro-stdexten] exten => s,1,GotoIf(${DB(CFIM/${ARG1})}?2:3) ; Get CFIM key exten => s,2,Dial(Local/${DB(CF/${ARG1})}/n) ; Unconditional forward exten => s,3,GotoIf(${DB(DND/${ARG1})}?106) exten => s,4,Set(${DB(LASTCALL/${ARG1})=${CALLERIDNUM}) exten => s,5,Dial(SIP/${ARG1}|20|r) ; 20sec timeout exten => s,6,Voicemail(u${ARG1}) exten => s,7,Hangup exten => s,106,Voicemail(b${ARG1}) exten => s,107,Hangup ; [macro-exten-vm] ; Call extension ${ARG1} for ${ARG2} seconds, divert to voicemail ; on busy or noreply exten => s,1,GotoIf(${DB(CFIM/${ARG1})}?2:3) ; Get CFIM key exten => s,2,Dial(Local/${DB(CF/${ARG1})}/n) ; Unconditional forward exten => s,3,Set(DNDStatus=DND/${ARG1}) exten => s,4,GotoIf(${DNDStatus}=YES?107:6) exten => s,5,Set(${DB(LASTCALL/${ARG1})=${CALLERIDNUM}) exten => s,6,Dial(SIP/${ARG1},${ARG2}) exten => s,7,Voicemail(u${ARG1}) exten => s,8,Playback(vm-goodbye) exten => s,9,Hangup exten => s,107,Voicemail(b${ARG1}) exten => s,108,Playback(vm-goodbye) exten => s,109,Hangup ; [macro-exten-novm] ; Call extension ${ARG1} for ${ARG2} seconds exten => s,1,GotoIf(${DB(CFIM/${ARG1})}?2:3) ; Get CFIM key exten => s,2,Dial(Local/${DB(CF/${ARG1})}/n) ; Unconditional forward exten => s,3,Set(${DB(DNDStatus=DND/${ARG1})}) exten => s,4,GotoIf(${DNDStatus}=1?103:102) exten => s,102,Dial(SIP/${ARG1},${ARG2}) exten => s,103,Playback(the-party-you-are-calling) exten => s,104,Playback(is-curntly-unavail) exten => s,105,Playback(pls-try-call-later) exten => s,106,Hangup exten => s,203,Busy ; [macro-unassigned-number] ; Gives tritone + number unassigned message to vacant numbers exten => s,1,Answer exten => s,2,Playback(the-number-u-dialed,noanswer) exten => s,3,SayDigits(${ARG1}) exten => s,4,Playback(not-yet-assigned,noanswer) exten => s,5,Busy ;[macro-dial-pstn] ; ; Enter with these ; ARG1 = number to dial ; ARG2 = timeout value ; ARG3 = flag determines if hangup or return on noanswer ; HR = hangup and return (default) ; RT = return without hangup (must set) ; ; Returns with FOUNDME = DIALSTATUS ; ; ; the 9w dials 9 then waits 5 sec for outside dialtone ; exten => s,1,SetGlobalVar(FOUNDME=ANSWER) exten => s,2,Dial(${PSTN}/9w${ARG1},${ARG2}) exten => s,3,SetGlobalVar(FOUNDME=${DIALSTATUS}) exten => s,4,Goto(s-${DIALSTATUS},1) ; ; returns here if busy ; exten => s,103,SetGlobalVar(FOUNDME=BUSY) exten => s,104,Goto(s-BUSY,1) ; ; exten => s-BUSY,1,BackGround(the-party-you-are-calling) exten => s-BUSY,2,BackGround(is-curntly-busy) exten => s-BUSY,3,SetGlobalVar(FOUNDME=BUSY) exten => s-BUSY,4,Goto(s-CLEANEXIT,1) ; exten => s-CANCEL,1,BackGround(canceled) exten => s-CANCEL,2,SetGlobalVar(FOUNDME=CANCEL) exten => s-CANCEL,3,Goto(s-CLEANEXIT,1) ; exten => s-CHANUNAVAIL,1,BackGround(channel) exten => s-CHANUNAVAIL,2,BackGround(is-curntly-unavail) exten => s-CHANUNAVAIL,3,SetGlobalVar(FOUNDME=CHANUNAVAIL) exten => s-CHANUNAVAIL,4,Goto(s-CLEANEXIT,1) ; exten => s-NOANSWER,1,BackGround(nbdy-avail-to-take-call) exten => s-NOANSWER,2,SetGlobalVar(FOUNDME=NOANSWER) exten => s-NOANSWER,3,Goto(s-CLEANEXIT,1) ; exten => s-ANSWER,1,SetGlobalVar(FOUNDME=ANSWER) exten => s-ANSWER,2,Goto(s-CLEANEXIT,3) ; exten => s-,1,BackGround(something-Usr2bly-wrong) exten => s-,2,SetGlobalVar(FOUNDME=ERROR) exten => s-,3,Goto(s-CLEANEXIT,1) ; exten => s-CLEANEXIT,1,GotoIf($[${ARG3} = RT]?3:2) exten => s-CLEANEXIT,2,Hangup exten => s-CLEANEXIT,3,NoOp ; ; [macro-dial-sip] ; ; ; Enter with these ; ARG1 = number to dial ; ARG2 = timeout value ; ARG3 = flag determines if hangup or return on no answer ; HR = hangup and return (default) ; RT = return without hangup (must set) ; ; Returns with FOUNDME = DIALSTATUS ; exten => s,1,SetGlobalVar(FOUNDME=ANSWER) exten => s,2,Dial(SIP/${ARG1}${SIPCO1},${ARG2}) exten => s,3,SetGlobalVar(FOUNDME=${DIALSTATUS}) exten => s,4,Goto(s-${DIALSTATUS},1) ; ; returns here if busy ; exten => s,103,SetGlobalVar(FOUNDME=BUSY) exten => s,104,Goto(s-BUSY,1) ; exten => s-BUSY,1,BackGround(the-party-you-are-calling) exten => s-BUSY,2,BackGround(is-curntly-busy) exten => s-BUSY,3,SetGlobalVar(FOUNDME=BUSY) exten => s-BUSY,4,Goto(s-CLEANEXIT,1) ; exten => s-CANCEL,1,BackGround(canceled) exten => s-CANCEL,2,SetGlobalVar(FOUNDME=CANCEL) exten => s-CANCEL,3,Goto(s-CLEANEXIT,1) ; exten => s-CHANUNAVAIL,1,BackGround(channel) exten => s-CHANUNAVAIL,2,BackGround(is-curntly-unavail) exten => s-CHANUNAVAIL,3,SetGlobalVar(FOUNDME=CHANUNAVAIL) exten => s-CHANUNAVAIL,4,Goto(s-CLEANEXIT,1) ; exten => s-NOANSWER,1,BackGround(nbdy-avail-to-take-call) exten => s-NOANSWER,2,SetGlobalVar(FOUNDME=NOANSWER) exten => s-NOANSWER,3,Goto(s-CLEANEXIT,1) ; exten => s-ANSWER,1,SetGlobalVar(FOUNDME=ANSWER) exten => s-ANSWER,2,Goto(s-CLEANEXIT,3) ; exten => s-,1,BackGround(something-Usr2bly-wrong) exten => s-,2,SetGlobalVar(FOUNDME=ERROR) exten => s-,3,Goto(s-CLEANEXIT,1) ; exten => s-CLEANEXIT,1,GotoIf($[${ARG3} = RT]?3:2) exten => s-CLEANEXIT,2,Hangup exten => s-CLEANEXIT,3,NoOp ; ; [macro-dial-iax] ; ; ; Enter with these ; ARG1 = number to dial ; ARG2 = timeout value ; ARG3 = flag determines if hangup or return on no answer ; HR = hangup and return (default) ; RT = return without hangup (must set) ; ; Returns with FOUNDME = DIALSTATUS ; exten => s,1,SetGlobalVar(FOUNDME=ANSWER) exten => s,2,GotoIf($[${LEN(${ARG1})} = 10]?2:4) exten => s,3,SetVar(NumToDial=1${ARG1}) exten => s,4,Goto(s,6) exten => s,5,SetVar(NumToDial=${ARG1}) exten => s,6,Goto(s,6) ; exten => s,7,Dial(${IAXCO1}/${NumToDial},${ARG2}) ; try VoicePulse server 1 exten => s,8,SetGlobalVar(FOUNDME=${DIALSTATUS}) exten => s,9,GotoIf($[${DIALSTATUS} = CHANUNAVAIL]?10:12) ; exten => s,10,Dial(${IAXCO2}/${NumToDial},${ARG2}) ; try VoicePulse server 2 exten => s,11,SetGlobalVar(FOUNDME=${DIALSTATUS}) exten => s,12,Goto(s-${DIALSTATUS},1) ; ; returns here if busy ; exten => s,108,NoOp exten => s,109,NoOp exten => s,110,NoOp exten => s,111,NoOp exten => s,112,SetGlobalVar(FOUNDME=BUSY) exten => s,113,Goto(s-BUSY,1) ; ; exten => s-BUSY,1,BackGround(the-party-you-are-calling) exten => s-BUSY,2,BackGround(is-curntly-busy) exten => s-BUSY,3,SetGlobalVar(FOUNDME=BUSY) exten => s-BUSY,4,Goto(s-CLEANEXIT,1) ; exten => s-CANCEL,1,BackGround(canceled) exten => s-CANCEL,2,SetGlobalVar(FOUNDME=CANCEL) exten => s-CANCEL,3,Goto(s-CLEANEXIT,1) ; exten => s-CHANUNAVAIL,1,BackGround(channel) exten => s-CHANUNAVAIL,2,BackGround(is-curntly-unavail) exten => s-CHANUNAVAIL,3,SetGlobalVar(FOUNDME=CHANUNAVAIL) exten => s-CHANUNAVAIL,4,Goto(s-CLEANEXIT,1) ; exten => s-NOANSWER,1,BackGround(nbdy-avail-to-take-call) exten => s-NOANSWER,2,SetGlobalVar(FOUNDME=NOANSWER) exten => s-NOANSWER,3,Goto(s-CLEANEXIT,1) ; exten => s-ANSWER,1,SetGlobalVar(FOUNDME=ANSWER) exten => s-ANSWER,2,Goto(s-CLEANEXIT,3) ; exten => s-,1,BackGround(something-Usr2bly-wrong) exten => s-,2,SetGlobalVar(FOUNDME=ERROR) exten => s-,3,Goto(s-CLEANEXIT,1) ; exten => s-CLEANEXIT,1,GotoIf($[${ARG3} = RT]?3:2) exten => s-CLEANEXIT,2,Hangup exten => s-CLEANEXIT,3,NoOp ; [macro-dial-pstn-sip-iax] ; ; ; This macro tries the PSTN circuit first, then ; fails over to our SIP provider and uses IAX ; as a last resort ; ; As part of a least cost routing plan, this ; routine is best used for local calls ; ; ; Enter with these ; ARG1 = number to dial ; ARG2 = timeout value ; ARG3 = flag determines if hangup or return on no answer ; HR = hangup and return (default) ; RT = return without hangup (must set) ; ; Returns with FOUNDME = DIALSTATUS ; exten => s,1,SetGlobalVar(FOUNDME=ANSWER) exten => s,2,Dial(${PSTN}/9w${ARG1},${ARG2}) exten => s,3,SetGlobalVar(FOUNDME=${DIALSTATUS}) exten => s,4,GotoIf($[${DIALSTATUS} = CHANUNAVAIL]?5:20) ; exten => s,5,SetGlobalVar(FOUNDME=ANSWER) exten => s,6,Dial(SIP/${ARG1}${SIPCO1},${ARG2}) exten => s,7,SetGlobalVar(FOUNDME=${DIALSTATUS}) exten => s,8,GotoIf($[${DIALSTATUS} = CHANUNAVAIL]?9:20) ; exten => s,9,GotoIf($[${LEN(${ARG1})} = 10]?10:12) exten => s,10,SetVar(NumToDial=1${ARG1}) exten => s,11,Goto(s,13) exten => s,12,SetVar(NumToDial=${ARG1}) ; exten => s,13,SetGlobalVar(FOUNDME=ANSWER) exten => s,14,Dial(${IAXCO1}/${NumToDial},${ARG2}) ; try VoicePulse server 1 exten => s,15,SetGlobalVar(FOUNDME=${DIALSTATUS}) exten => s,16,GotoIf($[${DIALSTATUS} = CHANUNAVAIL]?17:20) ; exten => s,17,SetGlobalVar(FOUNDME=ANSWER) exten => s,18,Dial(${IAXCO2}/${NumToDial},${ARG2}) ; try VoicePulse server 2 exten => s,19,SetGlobalVar(FOUNDME=${DIALSTATUS}) exten => s,20,Goto(s-${DIALSTATUS},1) ; ; returns here if busy on PSTN ; exten => s,103,SetGlobalVar(FOUNDME=BUSY) exten => s,104,Goto(s-BUSY,1) ; ; returns here if busy on SIP ; exten => s,107,SetGlobalVar(FOUNDME=BUSY) exten => s,108,Goto(s-BUSY,1) ; ; returns here if busy on IAXCO1 ; exten => s,115,SetGlobalVar(FOUNDME=BUSY) exten => s,116,Goto(s-BUSY,1) ; ; returns here if busy on IAXCO2 ; exten => s,119,SetGlobalVar(FOUNDME=BUSY) exten => s,120,Goto(s-BUSY,1) ; exten => s-BUSY,1,BackGround(the-party-you-are-calling) exten => s-BUSY,2,BackGround(is-curntly-busy) exten => s-BUSY,3,SetGlobalVar(FOUNDME=BUSY) exten => s-BUSY,4,Goto(s-CLEANEXIT,1) ; exten => s-CANCEL,1,BackGround(canceled) exten => s-CANCEL,2,SetGlobalVar(FOUNDME=CANCEL) exten => s-CANCEL,3,Goto(s-CLEANEXIT,1) ; exten => s-CHANUNAVAIL,1,BackGround(channel) exten => s-CHANUNAVAIL,2,BackGround(is-curntly-unavail) exten => s-CHANUNAVAIL,3,SetGlobalVar(FOUNDME=CHANUNAVAIL) exten => s-CHANUNAVAIL,4,Goto(s-CLEANEXIT,1) ; exten => s-NOANSWER,1,BackGround(nbdy-avail-to-take-call) exten => s-NOANSWER,2,SetGlobalVar(FOUNDME=NOANSWER) exten => s-NOANSWER,3,Goto(s-CLEANEXIT,1) ; exten => s-ANSWER,1,SetGlobalVar(FOUNDME=ANSWER) exten => s-ANSWER,2,Goto(s-CLEANEXIT,3) ; exten => s-,1,BackGround(something-Usr2bly-wrong) exten => s-,2,SetGlobalVar(FOUNDME=ERROR) exten => s-,3,Goto(s-CLEANEXIT,1) ; exten => s-CLEANEXIT,1,GotoIf($[${ARG3} = RT]?3:2) exten => s-CLEANEXIT,2,Hangup exten => s-CLEANEXIT,3,NoOp ; ; [macro-dial-iax-sip-pstn] ; ; This routine tries to connect using our IAX ; account with VoicePulse first If for any ; reason, VoicePulse is unavailable, it fails ; over to our SIP account with BroadVoice If ; BroadVoice fails also, it will use one of our ; analog lines with Verizon as a last resort ; ; As part of a least cost routing plan, this ; routine is best used for long distance or ; international calls ; ; Enter with these ; ARG1 = number to dial ; ARG2 = timeout value ; ARG3 = flag determines if hangup or return on no answer ; HR = hangup and return (default) ; RT = return without hangup (must set) ; ; Returns with FOUNDME = DIALSTATUS ; ; exten => s,1,GotoIf($[${LEN(${ARG1})} = 10]?2:4) exten => s,2,SetVar(NumToDial=1${ARG1}) exten => s,3,Goto(s,5) exten => s,4,SetVar(NumToDial=${ARG1}) ; exten => s,5,SetGlobalVar(FOUNDME=ANSWER) exten => s,6,Dial(${IAXCO1}/${NumToDial},${ARG2}) ; try VoicePulse server 1 exten => s,7,SetGlobalVar(FOUNDME=${DIALSTATUS}) exten => s,8,GotoIf($[${DIALSTATUS} = CHANUNAVAIL]?9:20) ; exten => s,9,SetGlobalVar(FOUNDME=ANSWER) exten => s,10,Dial(${IAXCO2}/${NumToDial},${ARG2}) ; try VoicePulse server 2 exten => s,11,SetGlobalVar(FOUNDME=${DIALSTATUS}) exten => s,12,GotoIf($[${DIALSTATUS} = CHANUNAVAIL]?13:20) ; exten => s,13,SetGlobalVar(FOUNDME=ANSWER) exten => s,14,Dial(SIP/${ARG1}${SIPCO1},${ARG2}) exten => s,15,SetGlobalVar(FOUNDME=${DIALSTATUS}) exten => s,16,GotoIf($[${DIALSTATUS} = CHANUNAVAIL]?18:20) ; exten => s,17,SetGlobalVar(FOUNDME=ANSWER) exten => s,18,Dial(${PSTN}/9w${ARG1},${ARG2}) exten => s,19,SetGlobalVar(FOUNDME=${DIALSTATUS}) exten => s,20,Goto(s-${DIALSTATUS},1) ; ; returns here if busy on IAXCO1 ; exten => s,107,Goto(s-BUSY,1) ; ; returns here if busy on IAXCO2 ; exten => s,111,Goto(s-BUSY,1) ; ; returns here if busy on SIPCO1 ; exten => s,115,Goto(s-BUSY,1) ; ; returns here if busy on PSTN ; exten => s,119,Goto(s-BUSY,1) ; exten => s-BUSY,1,BackGround(the-party-you-are-calling) exten => s-BUSY,2,BackGround(is-curntly-busy) exten => s-BUSY,3,SetGlobalVar(FOUNDME=BUSY) exten => s-BUSY,4,Goto(s-CLEANEXIT,1) ; exten => s-CANCEL,1,BackGround(canceled) exten => s-CANCEL,2,SetGlobalVar(FOUNDME=CANCEL) exten => s-CANCEL,3,Goto(s-CLEANEXIT,1) ; exten => s-CHANUNAVAIL,1,BackGround(channel) exten => s-CHANUNAVAIL,2,BackGround(is-curntly-unavail) exten => s-CHANUNAVAIL,3,SetGlobalVar(FOUNDME=CHANUNAVAIL) exten => s-CHANUNAVAIL,4,Goto(s-CLEANEXIT,1) ; exten => s-NOANSWER,1,BackGround(nbdy-avail-to-take-call) exten => s-NOANSWER,2,SetGlobalVar(FOUNDME=NOANSWER) exten => s-NOANSWER,3,Goto(s-CLEANEXIT,1) ; exten => s-ANSWER,1,SetGlobalVar(FOUNDME=ANSWER) exten => s-ANSWER,2,Goto(s-CLEANEXIT,3) ; exten => s-,1,BackGround(something-Usr2bly-wrong) exten => s-,2,SetGlobalVar(FOUNDME=ERROR) exten => s-,3,Goto(s-CLEANEXIT,1) ; exten => s-CLEANEXIT,1,GotoIf($[${ARG3} = RT]?3:2) exten => s-CLEANEXIT,2,Hangup exten => s-CLEANEXIT,3,NoOp ; ;------------------------------------------------------------------- ; END - Dial Definitions ;------------------------------------------------------------------- ; ;************************************************************* ; BEGIN - Route by user name contexts ;************************************************************* ; ; [select-ext-by-name] ; ; Transfer inbound call to user's internal extension ; exten => s,1,SetGlobalVar(FLOWCONTROL=select-ext-by-name,s,5) exten => s,2,Background(custom/emergency-menu-announce) exten => s,3,Background(custom/trans-to-cell-announce) exten => s,4,Goto(set-vars-by-name,s,1) exten => s,5,GotoIf($[${FLOWCONFIRM} = PROCEED]?6:12) exten => s,6,GotoIf($[${LEN(${EXT})} < 2]?7:8) exten => s,7,Goto(i,1) exten => s,8,GotoIf($[${LEN(${EXT})} > 2]?9:12) exten => s,9 Dial(${EXT},${SHORTTIMEOUT}) exten => s,10,VoiceMail(u${VM}) exten => s,11,Goto(s,16) ; exten => s,12,NoOp exten => s,13,Macro(pana-announce,${EXT},${NMFILE},${RINGINGLINE}) exten => s,14,Macro(pana-announce,${PAGE},${NMFILE},${RINGINGLINE}) exten => s,15,VoiceMail(u${VM}) exten => s,16,Background(goodbye) exten => s,17,Hangup ; ; returns here on a busy SIP extension ; exten => s,101,VoiceMail(b${VM}) exten => s,102,Background(goodbye) exten => s,103,Hangup ; ; exten => t,1,Goto(i,1) ; If they take too long, give up ; exten => i,1,Background(custom/is-invalid) ; "That's not valid, try again" exten => i,2,Goto(s,1) ; ; [select-vmail-by-name] ; ; Transfer inbound call to user's voice mail ; exten => s,1,Background(custom/emergency-menu-announce) exten => s,2,Background(custom/trans-to-cell-announce) exten => s,3,SetGlobalVar(FLOWCONTROL=select-vmail-by-name,s,5) exten => s,4,Goto(set-vars-by-name,s,1) exten => s,5,GotoIf($[${FLOWCONFIRM} = PROCEED]?6:7) exten => s,6,VoiceMail(u${VM}) exten => s,7,Hangup ; exten => t,1,Goto(i,1) ; If they take too long, give up ; exten => i,1,Background(custom/is-invalid) ; "That's not valid, try again" exten => i,2,Goto(s,1) ; ; [select-get-vmail-by-name] ; ; Local user retrieves voice mail ; exten => s,1,Background(custom/emergency-menu-announce) exten => s,2,Background(custom/trans-to-cell-announce) exten => s,3,SetGlobalVar(FLOWCONTROL=select-get-vmail-by-name,s,5) exten => s,4,Goto(set-vars-by-name,s,1) exten => s,5,GotoIf($[${FLOWCONFIRM} = PROCEED]?6:7) exten => s,6,VoiceMailMain(${VM}) exten => s,7,Hangup ; exten => t,1,Goto(i,1) ; If they take too long, give up ; exten => i,1,Background(custom/is-invalid) ; "That's not valid, try again" exten => i,2,Goto(s,1) ; ; [select-remote1-by-name] ; ; Transfer inbound call to user's first remote (cell) number ; exten => s,1,Background(custom/emergency-menu-announce) exten => s,2,Background(custom/trans-to-cell-announce) exten => s,3,SetGlobalVar(FLOWCONTROL=select-remote1-by-name,s,5) exten => s,4,Goto(set-vars-by-name,s,1) exten => s,5,GotoIf($[${FLOWCONFIRM} = PROCEED]?6:10) exten => s,6,Background(custom/standby-for-cell-bridge) exten => s,7,Background(${NMFILE}) exten => s,8,Macro(pstn-sip-iax,${REM1},${SHORTTIMEOUT},RT) exten => s,9,VoiceMail(u${VM}) exten => s,10,Hangup ; exten => t,1,Goto(i,1) ; If they take too long, give up ; exten => i,1,Background(custom/is-invalid) ; "That's not valid, try again" exten => i,2,Goto(s,1) ; ; [select-remote2-by-name] ; ; Transfer inbound call to user's second remote (home) number ; exten => s,1,Background(custom/emergency-menu-announce) exten => s,2,Background(custom/trans-to-cell-announce) exten => s,3,SetGlobalVar(FLOWCONTROL=select-remote2-by-name,s,5) exten => s,4,Goto(set-vars-by-name,s,1) exten => s,5,GotoIf($[${FLOWCONFIRM} = PROCEED]?6:10) exten => s,6,Background(custom/standby-for-cell-bridge) exten => s,7,Background(${NMFILE}) exten => s,8,Macro(pstn-sip-iax,${REM2},${SHORTTIMEOUT},RT) exten => s,9,VoiceMail(u${VM}) exten => s,10,Hangup ; exten => t,1,Goto(i,1) ; If they take too long, give up ; exten => i,1,Background(custom/is-invalid) ; "That's not valid, try again" exten => i,2,Goto(s,1) ; ; [select-find-by-name] ; ; ; Locate a user ; First try local extension ; Second try a page all ; Third try remote phone 1 ; Fourth try remote phone 2 ; Fifth drop caller in voicemail ; exten => s,1,Background(custom/emergency-menu-announce) exten => s,2,Background(custom/trans-to-cell-announce) exten => s,3,SetGlobalVar(FLOWCONTROL=select-find-by-name,s,5) exten => s,4,Goto(set-vars-by-name,s,1) ; exten => s,5,GotoIf($[${FLOWCONFIRM} = PROCEED]?6:31) ; exten => s,6,GotoIf($[${LEN(${EXT})} < 2]?18:8) exten => s,7,NoOp exten => s,8,Background(custom/standby-for-cell-bridge) exten => s,9,Background(${NMFILE}) exten => s,10,GotoIf($[${LEN(${EXT})} > 2]?11:13) ; exten => s,11 Dial(${EXT},${SHORTTIMEOUT}) exten => s,12,GotoIf($[${DIALSTATUS} = BUSY]?28:18) ; exten => s,13,Macro(pana-announce,${EXT},${NMFILE},${RINGINGLINE}) exten => s,14,GotoIf($[${FOUNDME} = BUSY]?28:15) ; exten => s,15,Background(custom/standby-for-cell-bridge) exten => s,16,Background(${NMFILE}) exten => s,17,Macro(pana-announce,${PAGE},${NMFILE},${RINGINGLINE}) ; exten => s,18,GotoIf($[${LEN(${REM1})} < 10]?23:19) exten => s,19,Background(custom/standby-for-cell-bridge) exten => s,20,Background(${NMFILE}) exten => s,21,Macro(pstn-sip-iax,${REM1},${SHORTTIMEOUT},RT) exten => s,22,GotoIf($[${FOUNDME} = BUSY]?28:23) ; exten => s,23,GotoIf($[${LEN(${REM2})} < 10]?30:24) exten => s,24,Background(custom/standby-for-cell-bridge) exten => s,25,Background(${NMFILE}) exten => s,26,Macro(pstn-sip-iax,${REM2},${SHORTTIMEOUT},RT) exten => s,27,GotoIf($[${FOUNDME} = BUSY]?28:30) ; exten => s,28,VoiceMail(b${VM}) exten => s,29,Goto(s,31) exten => s,30,VoiceMail(u${VM}) exten => s,31,Background(goodbye) exten => s,32,Hangup ; exten => t,1,Goto(i,1) ; If they take too long, give up ; exten => i,1,Background(custom/is-invalid) ; "That's not valid, try again" exten => i,2,Goto(s,1) ; ; [set-vars-by-name] ; ; exten => s,1,SetGlobalVar(ReturnTo=${FLOWCONTROL}) exten => s,2,SetGlobalVar(FLOWCONTROL=set-vars-by-name,s,2) exten => s,3,SetGlobalVar(FLOWCONFIRM=foo) exten => s,4,Background(custom/begin-process-by-name) ; exten => s,5,Background(custom/2repeat) exten => s,6,Background(custom/2return) ; exten => s,7,DigitTimeout,2 ; give them 2 seconds between digits exten => s,8,ResponseTimeout,30 ; give them 30 seconds to make a choice ; ; include => set-global-vars ; ; ; get confirmation of selection ; ; Macro returns with FLOWCONFIRM set ; to either PROCEED or ABORT code ; exten => s-CONFIRM,1,SetGlobalVar(FLOWCONFIRM=foo) exten => s-CONFIRM,2,SetGlobalVar(FLOWCONTROL=set-vars-by-name,s-CONFIRM,5) exten => s-CONFIRM,3,SetGlobalVar(CONFIRM=${NMFILE}) exten => s-CONFIRM,4,Goto(confirmation,s,1) exten => s-CONFIRM,5,SetGlobalVar(FLOWCONTROL=set-vars-by-name,s,4) exten => s-CONFIRM,6,Goto(s-${FLOWCONFIRM},1) ; exten => s-PROCEED,1,SetGlobalVar(FLOWCONTROL=${ReturnTo})) exten => s-PROCEED,2,Goto(${FLOWCONTROL}) ; ; the caller aborted the selection process ; loop them back to the top and let them ; try again ; ; ABORT = confirmation process ended with a rejection of selection exten => s-ABORT,1,SetGlobalVar(NM=${DEFCIDNAME}) ; set vars back to default setting exten => s-ABORT,2,SetGlobalVar(VM=${DEFVM}) exten => s-ABORT,3,SetGlobalVar(ID=${DEFCID}) exten => s-ABORT,4,SetGlobalVar(EXT=${DEFEXTEN}) exten => s-ABORT,5,SetGlobalVar(REM1=${DEFREM1}) exten => s-ABORT,6,SetGlobalVar(REM2=${DEFREM2}) exten => s-ABORT,7,SetGlobalVar(NMFILE=${DEFNMFILE}) exten => s-ABORT,8,SetGlobalVar(FLOWCONFIRM=foo) exten => s-ABORT,9,Goto(${FLOWCONTROL}) ; let them make another selection ; ; somehow we got back with an invalid ; selection loop back and let them ; try again ; ; INVALID = invalid key while making confirmation ; exten => s-INVALID,1,SetGlobalVar(NM=${DEFCIDNAME}) ; set vars back to default setting exten => s-INVALID,2,SetGlobalVar(VM=${DEFVM}) exten => s-INVALID,3,SetGlobalVar(ID=${DEFCID}) exten => s-INVALID,4,SetGlobalVar(EXT=${DEFEXTEN}) exten => s-INVALID,5,SetGlobalVar(REM1=${DEFREM1}) exten => s-INVALID,6,SetGlobalVar(REM2=${DEFREM2}) exten => s-INVALID,7,SetGlobalVar(NMFILE=${DEFNMFILE}) exten => s-INVALID,8,SetGlobalVar(FLOWCONFIRM=foo) exten => s-INVALID,9,Background(custom/select-invalid-try-again) exten => s-INVALID,10,Goto(${FLOWCONTROL}) ; ; ; foo = something odd happend during the selection process ; exten => s-foo,1,SetGlobalVar(NM=${DEFCIDNAME}) ; set vars back to default setting exten => s-foo,2,SetGlobalVar(VM=${DEFVM}) exten => s-foo,3,SetGlobalVar(ID=${DEFCID}) exten => s-foo,4,SetGlobalVar(EXT=${DEFEXTEN}) exten => s-foo,5,SetGlobalVar(REM1=${DEFREM1}) exten => s-foo,6,SetGlobalVar(REM2=${DEFREM2}) exten => s-foo,7,SetGlobalVar(NMFILE=${DEFNMFILE}) exten => s-foo,8,Background(something-Usr2bly-wrong) exten => s-foo,9,Goto({FLOWCONTROL}) ; loop back to selections ; ; TIMEOUT = timed out making confirmation ; exten => s-TIMEOUT,1,SetGlobalVar(NM=${DEFCIDNAME}) ; set vars back to default setting exten => s-TIMEOUT,2,SetGlobalVar(VM=${DEFVM}) exten => s-TIMEOUT,3,SetGlobalVar(ID=${DEFCID}) exten => s-TIMEOUT,4,SetGlobalVar(EXT=${DEFEXTEN}) exten => s-TIMEOUT,5,SetGlobalVar(REM1=${DEFREM1}) exten => s-TIMEOUT,6,SetGlobalVar(REM2=${DEFREM2}) exten => s-TIMEOUT,7,SetGlobalVar(NMFILE=${DEFNMFILE}) exten => s-TIMEOUT,8,SetGlobalVar(FLOWCONFIRM=foo) exten => s-TIMEOUT,9,Background(custom/select-invalid-try-again) exten => s-TIMEOUT,10,Goto(${FLOWCONTROL}) ; exten => s-CLEANEXIT,1,SetGlobalVar(FLOWCONFIRM=foo) ; set vars back to default setting exten => s-CLEANEXIT,2,SetGlobalVar(ReturnTo=foo) exten => s-CLEANEXIT,3,SetGlobalVar(NM=${DEFCIDNAME}) exten => s-CLEANEXIT,4,SetGlobalVar(VM=${DEFVM}) exten => s-CLEANEXIT,5,SetGlobalVar(ID=${DEFCID}) exten => s-CLEANEXIT,6,SetGlobalVar(EXT=${DEFEXTEN}) exten => s-CLEANEXIT,7,SetGlobalVar(REM1=${DEFREM1}) exten => s-CLEANEXIT,8,SetGlobalVar(REM2=${DEFREM2}) exten => s-CLEANEXIT,9,SetGlobalVar(NMFILE=${DEFNMFILE}) exten => s-CLEANEXIT,10,SetGlobalVar(FOUNDME=foo) exten => s-CLEANEXIT,11,SetGlobalVar(FLOWCONTROL=${ReturnTo}) exten => s-CLEANEXIT,12,SetGlobalVar(ReturnTo=) exten => s-CLEANEXIT,13,Goto(${FLOWCONTROL}) ; exten => s-,1,Goto(s-foo,1) ; ; Repeat the previous menu exten => *,1,Goto(${FLOWCONTROL}) exten => *,2,Goto(s-CLEANEXIT,1) ; ; # = hangup/abort return to calling process exten => #,1,SetGlobalVar(FLOWCONTROL=${ReturnTo}) exten => #,2,SetGlobalVar(ReturnTo= ) exten => #,3,Goto(${FLOWCONTROL}) exten => #,4,Goto(s-CLEANEXIT,1) ; exten => t,1,Goto(i,1) ; If they take too long, give up ; exten => i,1,Background(custom/is-invalid) ; "That's not valid, try again" exten => i,2,NoOp exten => i,3,Goto(${FLOWCONTROL}) exten => i,4,Goto(s-CLEANEXIT,1) ; ; [confirmation] ; ; simple yes/no, go/no-go decision routine ; ; enter with ; ; ARG1 = sound file name describing the item selected that ; requires confirmation ; ; returns with FLOWCONFIRM set to ; PROCEED - selection confirmed ; ABORT - want to make another selection ; TIMEOUT - took to much time with a simple decision ; exten => s,1,Background(custom/you-selected) exten => s,2,Background(${CONFIRM}) exten => s,3,Background(silence/1) exten => s,4,Background(custom/confirm-about-selection) ; exten => s,5,DigitTimeout,1 ; give them 1 seconds between digits exten => s,6,ResponseTimeout,5 ; give them 5 seconds to make a choice ; ; * = Confirm selection exten => *,1,SetGlobalVar(FLOWCONFIRM=PROCEED) exten => *,2,NoOp(${FLOWCONFIRM}) exten => *,3,Goto(${FLOWCONTROL}) ; # = Reject selection exten => #,1,SetGlobalVar(FLOWCONFIRM=ABORT) exten => #,2,NoOp(${FLOWCONFIRM}) exten => #,3,Goto(${FLOWCONTROL}) ; ; t=timeout exten => t,1,SetGlobalVar(FLOWCONFIRM=TIMEOUT) exten => t,2,NoOp(${FLOWCONFIRM}) exten => t,3,Goto(${FLOWCONTROL}) ; ; i=invalid selection exten => i,1,Background(custom/select-invalid-try-again) exten => i,2,Goto(s,1) ; invalid choice, loop them back ; ;------------------------------------------------------------- ; END - Route by user name contexts ;------------------------------------------------------------- ; ;-------------------------------------------------------- ;- System Macro's area ;-------------------------------------------------------- [addcallerid] exten => s,1,Answer() exten => s,2,Read(EXTENSION|enter-extension-num|4) exten => s,3,Read(DIALCID|enter-new-outbound-cid|10) exten => s,4,Set(${DB(CID/${EXTENSION}=${DIALCID}) exten => s,5,Saydigits(${EXTENSION}) exten => s,6,Playback(has-been-set-to) exten => s,7,Saydigits(${DIALCID}) exten => s,8,Playback(auth-thankyou) exten => s,9,SetVar(AGAIN=0) exten => s,10,Read(AGAIN|enter-another-value|1) ; one for yes, any other num; exten => s,11,GotoIf($[${AGAIN} = 1]?2:12) exten => s,12,Playback(goodbye) exten => s,13,Hangup() ; ;fax exten => s,1,Macro(faxreceive) exten => h,1,System(/usr/local/share/asterisk/scripts/fax,sh "${CALLERIDNUM}" "${CALLEDFAX}" "${EXTNAME}" "${EXTEMAIL}" "${FAXFILE}" "${EXTCOMPANY}") ; [macro-festival] exten => s,1,Answer exten => s,2,Festival('Hello asterisk user, how are you today?') exten => s,3,Hangup ; [macro-qualityassure] exten => s,1,Answer exten => s,2,Macro(record-on) exten => s,3,BackGround(for-quality-purposes) exten => s,4,BackGround(this-call-may-be) exten => s,5,BackGround(recorded) exten => s,6,Dial(SIP/${EXTEN:1},120,tm) exten => s,7,Macro(rg-inbound,10,tr) exten => s,8,Hangup ; [macro-record-on] exten => s,1,AGI(set-timestampagi) exten => s,2,SetVar(CALLFILENAME=${timestamp}-${ARG2}-${ARG1}) exten => s,3,Monitor(gsm,${CALLFILENAME}) ; [macro-record-cleanup] exten => s,1,GotoIf($[${CALLFILENAME} = ${NULL}]?6:2) exten => s,2,SetVar(CFBASE=/var/spool/asterisk/monitor/${CALLFILENAME}) ; wmix takes the two seperate wavs and mixes them into a single stream ; It is available in my wavetools rpm exten => s,3,System(/usr/bin/wmix ${CFBASE}-inwav ${CFBASE}-outwav > ${CFBASE}) exten => s,4,System(/bin/rm ${CFBASE}-inwav ${CFBASE}-outwav) ; toast compresses the wav files into a gsm file ; It is available in my gsm rpm exten => s,5,System(/usr/bin/toast -F ${CFBASE}) exten => s,6,NoOp ; [macro-privacy] exten => s,1,PrivacyManager exten => s,2,Macro(record-on,${MYHOMEPHONE},${CALLERIDNUM}) ;exten => s,3,Monitor(wav|call-${EPOCH}-${CALLERIDNUM}) ;${DATETIME} Current date time in the format: YYYY-MM-DD_HH:MM:SS ;${UNIQUEID} Current call unique identifier exten => s,3,Dial(SIP/${EXTEN},20,tr) exten => s,103,Goto,s|6 exten => s,104,Goto,s|6 exten => s,4,Answer exten => s,5,Wait(1) exten => s,6,Voicemail2(u0) exten => s,7,Playback,vm-goodbye exten => s,8,Hangup ; [macro-fastbusy] ; I use this to send people I dont want to deal with exten => s,1,Answer exten => s,2,Wait 1 exten => s,3,Playback(all-circuits-busy) exten => s,4,Wait(30) exten => s,5,Hangup ; [macro-call-intercom] exten => s,1,AGI(callall|${CALLERIDNUM}|${CALLERIDNUM}|${ARG1}|${ARG1}) exten => s,2,Hangup exten => h,1,Hangup ; [add-to-intercom] exten => start,1,Playback(beep) exten => start,2,MeetMe(${iConf},${iConfParm}) exten => start,3,Macro(hangupcall) exten => h,1,Hangup ; [macro-system-page] ; Still developing exten => s,1,AbsoluteTimeout(11) exten => s,2,NoOp,${ARG1} exten => s,3,AGI,allcallagi|SIP/${ARG1} ${EX-DESIGN} ${EX-SALES1} [macro-rollover] ; Rollover macro one call per line ; This will limite the calls to one ; per line (No call waiting) ; exten => s,1,NoOp exten => s,2,Ringing exten => s,3,Wait(2) exten => s,4,SetGroup(${CALLWAIT1}) exten => s,5,CheckGroup(1) exten => s,6,Dial(${ARG1}) exten => s,7,SetGroup(${CALLWAIT2}) exten => s,8,CheckGroup(1) exten => s,9,Dial(${ARG2}) exten => s,10,SetGroup(${CALLWAIT3}) exten => s,11,CheckGroup(1) exten => s,12,Dial($ARG3}) exten => s,13,SetGroup(${CALLWAIT4}) exten => s,14,CheckGroup(1) exten => s,15,Dial(${ARG4}) exten => s,16,Congestion exten => s,107,SetGroup(${CALLWAIT2}) exten => s,108,CheckGroup(1) exten => s,109,Dial(${ARG2}) exten => s,110,Dial(${ARG3}) exten => s,111,Dial(${ARG4}) exten => s,112,Congestion exten => s,210,SetGroup(${CALLWAIT3}) exten => s,211,CheckGroup(1) exten => s,212,Dial(${ARG3}) exten => s,213,Dial(${ARG4}) exten => s,214,Dial(${ARG1}) exten => s,215,Congestion exten => s,313,SetGroup(${CALLWAIT4}) exten => s,314,CheckGroup(1) exten => s,315,Dial(${ARG4}) exten => s,316,Dial(${ARG1}) exten => s,317,Dial(${ARG2}) exten => s,318,Dial(${ARG3}) exten => s,319,Congestion ; ;------------------------------------------------------ ;- User Permissions/Privilages ;------------------------------------------------------ [Default] ; [Admin] ; [Internal-Users] ; [External-users] ; [Special-Users] ; ;------------------------------------------------ ;End Of extensionsconf File ;------------------------------------------------