Advertisement
Guest User

Untitled

a guest
May 29th, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 38.81 KB | None | 0 0
  1. [from-trunk] ; just an alias since VoIP shouldn't be called PSTN
  2. include => from-pstn
  3.  
  4. [from-pstn]
  5. include => from-pstn-custom ; create this context in extensions_custom.conf to include customizations
  6. include => ext-did
  7. include => ext-did-post-custom
  8. include => from-did-direct ; MODIFICATOIN (PL) for findmefollow if enabled, should be bofore ext-local
  9. include => ext-did-catchall ; THIS MUST COME AFTER ext-did
  10. exten => fax,1,Goto(ext-fax,in_fax,1)
  11.  
  12. ; MODIFICATION (PL)
  13. ;
  14. ; Required to assure that direct dids go to personal ring group before local extension.
  15. ; This could be auto-generated however I it is prefered to be put here and hard coded
  16. ; so that it can be modified if ext-local should take precedence in certain situations.
  17. ; will have to decide what to do later.
  18. ;
  19. [from-did-direct]
  20. include => ext-findmefollow
  21. include => ext-local
  22.  
  23.  
  24.  
  25. ; ############################################################################
  26. ; Macros [macro]
  27. ; ############################################################################
  28.  
  29. ; Rings one or more extensions. Handles things like call forwarding and DND
  30. ; We don't call dial directly for anything internal anymore.
  31. ; ARGS: $TIMER, $OPTIONS, $EXT1, $EXT2, $EXT3, ...
  32. ; Use a Macro call such as the following:
  33. ; Macro(dial,$DIAL_TIMER,$DIAL_OPTIONS,$EXT1,$EXT2,$EXT3,...)
  34. [macro-dial]
  35. exten => s,1,GotoIf($["${MOHCLASS}" = ""]?dial)
  36. exten => s,n,SetMusicOnHold(${MOHCLASS})
  37. exten => s,n(dial),AGI(dialparties.agi)
  38. exten => s,n,NoOp(Returned from dialparties with no extensions to call and DIALSTATUS: ${DIALSTATUS})
  39.  
  40. exten => s,n+2(normdial),Dial(${ds}) ; dialparties will set the priority to 10 if $ds is not null
  41. exten => s,n,Set(DIALSTATUS=${IF($["${DIALSTATUS_CW}"!="" ]?${DIALSTATUS_CW}:${DIALSTATUS})})
  42. exten => s,n,GosubIf($["${SCREEN}" != ""]?${DIALSTATUS},1)
  43.  
  44. exten => s,20(huntdial),NoOp(Returned from dialparties with hunt groups to dial )
  45. exten => s,n,Set(HuntLoop=0)
  46. exten => s,n(a22),GotoIf($[${HuntMembers} >= 1]?a30) ; if this is from rg-group, don't strip prefix
  47. exten => s,n,NoOp(Returning there are no members left in the hunt group to ring)
  48.  
  49. ; dialparties.agi has setup the dialstring for each hunt member in a variable labeled HuntMember0, HuntMember1 etc for each iteration
  50. ; and The total number in HuntMembers. So for each iteration, we will update the CALLTRACE Data.
  51. ;
  52. exten => s,n+2(a30),Set(HuntMember=HuntMember${HuntLoop})
  53. exten => s,n,GotoIf($[$["${CALLTRACE_HUNT}" != "" ] & $["${RingGroupMethod}" = "hunt" ]]?a32:a35)
  54. exten => s,n(a32),Set(CT_EXTEN=${CUT(FILTERED_DIAL,,$[${HuntLoop} + 1])})
  55. exten => s,n,Set(DB(CALLTRACE/${CT_EXTEN})=${CALLTRACE_HUNT})
  56. exten => s,n,Goto(s,a42)
  57.  
  58. ;Set Call Trace for each hunt member we are going to call "Memory groups have multiple members to set CALL TRACE For hence the loop
  59. ;
  60. exten => s,n(a35),GotoIf($[$["${CALLTRACE_HUNT}" != "" ] & $["${RingGroupMethod}" = "memoryhunt" ]]?a36:a50)
  61. exten => s,n(a36),Set(CTLoop=0)
  62. exten => s,n(a37),GotoIf($[${CTLoop} > ${HuntLoop}]?a42) ; if this is from rg-group, don't strip prefix
  63. exten => s,n,Set(CT_EXTEN=${CUT(FILTERED_DIAL,,$[${CTLoop} + 1])})
  64. exten => s,n,Set(DB(CALLTRACE/${CT_EXTEN})=${CALLTRACE_HUNT})
  65. exten => s,n,Set(CTLoop=$[1 + ${CTLoop}])
  66. exten => s,n,Goto(s,a37)
  67.  
  68. exten => s,n(a42),Dial(${${HuntMember}}${ds})
  69. exten => s,n,Set(HuntLoop=$[1 + ${HuntLoop}])
  70. exten => s,n,GotoIf($[$[$["foo${RingGroupMethod}" != "foofirstavailable"] & $["foo${RingGroupMethod}" != "foofirstnotonphone"]] | $["foo${DialStatus}" = "fooBUSY"]]?a46)
  71. exten => s,n,Set(HuntMembers=0)
  72. exten => s,n(a46),Set(HuntMembers=$[${HuntMembers} - 1])
  73. exten => s,n,Goto(s,a22)
  74.  
  75. exten => s,n(a50),DBdel(CALLTRACE/${CT_EXTEN})
  76. exten => s,n,Goto(s,a42)
  77.  
  78. ; For call screening
  79. exten => NOANSWER,1,Macro(vm,${SCREEN_EXTEN},BUSY,${IVR_RETVM})
  80. exten => NOANSWER,n,GotoIf($["${IVR_RETVM}" != "RETURN" | "${IVR_CONTEXT}" = ""]?bye)
  81. exten => NOANSWER,n,Return
  82. exten => NOANSWER,n(bye),Macro(hangupcall)
  83. exten => TORTURE,1,Goto(app-blackhole,musiconhold,1)
  84. exten => TORTURE,n,Macro(hangupcall)
  85. exten => DONTCALL,1,Answer
  86. exten => DONTCALL,n,Wait(1)
  87. exten => DONTCALL,n,Zapateller()
  88. exten => DONTCALL,n,Playback(ss-noservice)
  89. exten => DONTCALL,n,Macro(hangupcall)
  90.  
  91. ; make sure hungup calls go here so that proper cleanup occurs from call confirmed calls and the like
  92. ;
  93. exten => h,1,Macro(hangupcall)
  94.  
  95. ; Ring an extension, if the extension is busy or there is no answer send it
  96. ; to voicemail
  97. ; ARGS: $VMBOX, $EXT
  98. [macro-exten-vm]
  99. exten => s,1,Macro(user-callerid)
  100.  
  101. exten => s,n,Set(RingGroupMethod=none)
  102. exten => s,n,Set(VMBOX=${ARG1})
  103. exten => s,n,Set(EXTTOCALL=${ARG2})
  104. exten => s,n,Set(CFUEXT=${DB(CFU/${EXTTOCALL})})
  105. exten => s,n,Set(CFBEXT=${DB(CFB/${EXTTOCALL})})
  106. exten => s,n,Set(RT=${IF($[$["${VMBOX}"!="novm"] | $["foo${CFUEXT}"!="foo"]]?${RINGTIMER}:"")})
  107. exten => s,n,Macro(record-enable,${EXTTOCALL},IN)
  108. exten => s,n,Macro(dial,${RT},${DIAL_OPTIONS},${EXTTOCALL})
  109. exten => s,n,GotoIf($[ $["${VMBOX}" != "novm"] & $["${SCREEN}" != ""] & $["${DIALSTATUS}" = "NOANSWER"] ]?exit,return)
  110. exten => s,n,Set(SV_DIALSTATUS=${DIALSTATUS})
  111. exten => s,n,GosubIf($[$["${SV_DIALSTATUS}"="NOANSWER"] & $["${CFUEXT}"!=""] & $["${SCREEN}" = ""]]?docfu,1) ; check for CFU in use on no answer
  112. exten => s,n,GosubIf($[$["${SV_DIALSTATUS}"="BUSY"] & $["${CFBEXT}"!=""]]?docfb,1) ; check for CFB in use on busy
  113. exten => s,n,Set(DIALSTATUS=${SV_DIALSTATUS})
  114.  
  115. exten => s,n,NoOp(Voicemail is '${VMBOX}')
  116. exten => s,n,GotoIf($["${VMBOX}" = "novm"]?s-${DIALSTATUS},1) ; no voicemail in use for this extension
  117. exten => s,n,NoOp(Sending to Voicemail box ${EXTTOCALL})
  118. exten => s,n,Macro(vm,${VMBOX},${DIALSTATUS},${IVR_RETVM})
  119.  
  120. ; Try the Call Forward on No Answer / Unavailable number
  121. exten => docfu,1,Set(RTCFU=${IF($["${VMBOX}"!="novm"]?${RINGTIMER}:"")})
  122. exten => docfu,n,Dial(Local/${CFUEXT}@from-internal/n,${RTCFU},${DIAL_OPTIONS})
  123. exten => docfu,n,Return
  124.  
  125. ; Try the Call Forward on Busy number
  126. exten => docfb,1,Set(RTCFB=${IF($["${VMBOX}"!="novm"]?${RINGTIMER}:"")})
  127. exten => docfb,n,Dial(Local/${CFBEXT}@from-internal/n,${RTCFB},${DIAL_OPTIONS})
  128. exten => docfb,n,Return
  129.  
  130. ; Extensions with no Voicemail box reporting BUSY come here
  131. exten => s-BUSY,1,NoOp(Extension is reporting BUSY and not passing to Voicemail)
  132. exten => s-BUSY,n,GotoIf($["${IVR_RETVM}" = "RETURN" & "${IVR_CONTEXT}" != ""]?exit,1)
  133. exten => s-BUSY,n,Playtones(busy)
  134. exten => s-BUSY,n,Busy(20)
  135.  
  136. ; Anything but BUSY comes here
  137. exten => _s-.,1,Noop(IVR_RETVM: ${IVR_RETVM} IVR_CONTEXT: ${IVR_CONTEXT})
  138. exten => _s-.,n,GotoIf($["${IVR_RETVM}" = "RETURN" & "${IVR_CONTEXT}" != ""]?exit,1)
  139. exten => _s-.,n,Playtones(congestion)
  140. exten => _s-.,n,Congestion(10)
  141.  
  142. ; Short burst of tones then return
  143. exten => exit,1,Playback(beep&line-busy-transfer-menu&silence/1)
  144. exten => exit,n(return),MacroExit()
  145.  
  146. [macro-vm]
  147. ; ARG1 - extension
  148. ; ARG2 - DIRECTDIAL/BUSY
  149. ; ARG3 - RETURN makes macro return, otherwise hangup
  150. exten => s,1,Macro(user-callerid,SKIPTTL)
  151. exten => s,n,Set(VMGAIN=${IF($["foo${VM_GAIN}"!="foo"]?"g(${VM_GAIN})":"")})
  152. ;
  153. ; If BLKVM_OVERRIDE is set, then someone told us to block calls from going to
  154. ; voicemail. This variable is reset by the answering channel so subsequent
  155. ; transfers will properly function.
  156. ;
  157. exten => s,n,GotoIf($["foo${DB(${BLKVM_OVERRIDE})}" != "fooTRUE"]?vmx,1)
  158. ;
  159. ; we didn't branch so block this from voicemail
  160. ;
  161. exten => s,n,Noop(CAME FROM: ${NODEST} - Blocking VM cause of key: ${DB(BLKVM_OVERRIDE)})
  162.  
  163.  
  164. ; If vmx not enabled for the current mode,then jump to normal voicemail behavior
  165. ; also - if not message (no-msg) is requested, straight to voicemail
  166. ;
  167. exten => vmx,1,GotoIf($["${ARG2}"="NOMESSAGE"]?s-${ARG2},1)
  168. exten => vmx,n,Set(MODE=${IF($["${ARG2}"="BUSY"]?busy:unavail)})
  169.  
  170. exten => vmx,1,GotoIf($["${ARG2}"="NOMESSAGE"]?s-${ARG2},1)
  171. exten => vmx,n,Set(MODE=${IF($["${ARG2}"="BUSY"]?busy:unavail)})
  172. exten => vmx,n,GotoIf($["${ARG2}" != "DIRECTDIAL"]?notdirect)
  173. exten => vmx,n,Set(MODE=${IF($["${REGEX("[b]" ${VM_DDTYPE})}" = "1"]?busy:${MODE})})
  174. exten => vmx,n(notdirect),Noop(Checking if ext ${ARG1} is enabled: ${DB(AMPUSER/${ARG1}/vmx/${MODE}/state)})
  175. exten => vmx,n,GotoIf($["${DB(AMPUSER/${ARG1}/vmx/${MODE}/state)}" != "enabled"]?s-${ARG2},1)
  176.  
  177. ; If the required voicemail file does not exist, then abort and go to normal voicemail behavior
  178. ;
  179. ; TODO: there have been errors using System() with jump to 101 where asterisk works fine at the begining and
  180. ; then starts to jump to 101 even on success. This new mode is being tried with the SYSTEM Status which
  181. ; returns SUCCESS when the command returned succcessfully with a 0 app return code.
  182. ;
  183. exten => vmx,n,Macro(get-vmcontext,${ARG1})
  184. ;exten => vmx,n,TrySystem(/bin/ls ${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${ARG1}/${MODE}.[wW][aA][vV])
  185. exten => vmx,n,AGI(checksound.agi,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${ARG1}/temp)
  186. exten => vmx,n,GotoIf($["${SYSTEMSTATUS}" = "SUCCESS"]?tmpgreet)
  187. exten => vmx,n,AGI(checksound.agi,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${ARG1}/${MODE})
  188. exten => vmx,n,GotoIf($["${SYSTEMSTATUS}" != "SUCCESS"]?nofile)
  189.  
  190. ; Get the repeat, timeout and loop times to use if they are overriden form the global settings
  191. ;
  192. exten => vmx,n,Set(LOOPCOUNT=0)
  193. exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/repeat)}" = "0"]?vmxtime)
  194. exten => vmx,n,Set(VMX_REPEAT=${DB_RESULT})
  195. exten => vmx,n(vmxtime),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timeout)}" = "0"]?vmxloops)
  196. exten => vmx,n,Set(VMX_TIMEOUT=${DB_RESULT})
  197. exten => vmx,n(vmxloops),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loops)}" = "0"]?vmxanswer)
  198. exten => vmx,n,Set(VMX_LOOPS=${DB_RESULT})
  199. exten => vmx,n(vmxanswer),Answer()
  200.  
  201. ; Now play the users voicemail recording as the basis for their ivr, the Read command will repeat as needed and if it timesout
  202. ; then we go to the timeout. Otherwise handle invalid options by looping until the limit until a valid option is played.
  203. ;
  204. exten => vmx,n(loopstart),Read(ACTION,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${ARG1}/${MODE},1,skip,${VMX_REPEAT},${VMX_TIMEOUT})
  205. exten => vmx,n,GotoIf($["${EXISTS(${ACTION})}" = "1"]?checkopt)
  206.  
  207. ; If we are here we timed out, go to the required destination
  208. ;
  209. exten => vmx,n(noopt),Noop(Timeout: going to timeout dest)
  210. exten => vmx,n,Set(VMX_OPTS=${VMX_OPTS_TIMEOUT})
  211. exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/vmxopts/timeout)}" = "0"]?chktime)
  212. exten => vmx,n,Set(VMX_OPTS=${DB_RESULT})
  213. exten => vmx,n(chktime),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timedest/ext)}" = "0"]?dotime)
  214. exten => vmx,n,Set(VMX_TIMEDEST_EXT=${DB_RESULT})
  215. exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timedest/context)}" = "0"]?timepri)
  216. exten => vmx,n,Set(VMX_TIMEDEST_CONTEXT=${DB_RESULT})
  217. exten => vmx,n(timepri),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timedest/pri)}" = "0"]?dotime)
  218. exten => vmx,n,Set(VMX_TIMEDEST_PRI=${DB_RESULT})
  219. exten => vmx,n(dotime),Goto(${VMX_TIMEDEST_CONTEXT},${VMX_TIMEDEST_EXT},${VMX_TIMEDEST_PRI})
  220.  
  221. ; We got an option, check if the option is defined, or one of the system defaults
  222. ;
  223. exten => vmx,n(checkopt),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/${ACTION}/ext)}" = "1"]?doopt)
  224. exten => vmx,n,GotoIf($["${ACTION}" = "0"]?o,1)
  225. exten => vmx,n,GotoIf($["${ACTION}" = "*"]?adef,1)
  226.  
  227. ; Got invalid option loop until the max
  228. ;
  229. exten => vmx,n,Set(LOOPCOUNT=$[${LOOPCOUNT} + 1])
  230. exten => vmx,n,GotoIf($[${LOOPCOUNT} > ${VMX_LOOPS}]?toomany)
  231. exten => vmx,n,Playback(pm-invalid-option&please-try-again)
  232. exten => vmx,n,Goto(loopstart)
  233.  
  234. ; tomany: to many invalid options, go to the specified destination
  235. ;
  236. exten => vmx,n(toomany),Noop(Too Many invalid entries, got to invalid dest)
  237. exten => vmx,n,Set(VMX_OPTS=${VMX_OPTS_LOOPS})
  238. exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/vmxopts/loops)}" = "0"]?chkloop)
  239. exten => vmx,n,Set(VMX_OPTS=${DB_RESULT})
  240. exten => vmx,n(chkloop),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loopdest/ext)}" = "0"]?doloop)
  241. exten => vmx,n,Set(VMX_LOOPDEST_EXT=${DB_RESULT})
  242. exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loopdest/context)}" = "0"]?looppri)
  243. exten => vmx,n,Set(VMX_LOOPDEST_CONTEXT=${DB_RESULT}) ;TODO make configurable per above
  244. exten => vmx,n(looppri),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loopdest/pri)}" = "0"]?doloop)
  245. exten => vmx,n,Set(VMX_LOOPDEST_PRI=${DB_RESULT}) ;TODO make configurable per above
  246. exten => vmx,n(doloop),Goto(${VMX_LOOPDEST_CONTEXT},${VMX_LOOPDEST_EXT},${VMX_LOOPDEST_PRI})
  247.  
  248. ; doopt: execute the valid option that was chosen
  249. ;
  250. exten => vmx,n(doopt),Noop(Got a valid option: ${DB_RESULT})
  251. exten => vmx,n,Set(VMX_EXT=${DB_RESULT})
  252. ;
  253. ; Special case, if this option was to go to voicemail, set options and go
  254. ;
  255. exten => vmx,n,GotoIf($["${VMX_EXT}" != "dovm"]?getdest)
  256. exten => vmx,n(vmxopts),Set(VMX_OPTS=${VMX_OPTS_DOVM})
  257. exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/vmxopts/dovm)}" = "0"]?vmxdovm)
  258. exten => vmx,n(vmxopts),Set(VMX_OPTS=${DB_RESULT})
  259. exten => vmx,n(vmxdovm),goto(dovm,1)
  260. ;
  261. ; General case, setup the goto destination and go there (no error checking, its up to the GUI's to assure
  262. ; reasonable values
  263. ;
  264. exten => vmx,n(getdest),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/${ACTION}/context)}" = "0"]?vmxpri)
  265. exten => vmx,n,Set(VMX_CONTEXT=${DB_RESULT})
  266. exten => vmx,n(vmxpri),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/${ACTION}/pri)}" = "0"]?vmxgoto)
  267. exten => vmx,n,Set(VMX_PRI=${DB_RESULT})
  268. exten => vmx,n(vmxgoto),Goto(${VMX_CONTEXT},${VMX_EXT},${VMX_PRI})
  269.  
  270. ; If the required voicemail file is not present, then revert to normal voicemail
  271. ; behavior treating as if it was not set
  272. ;
  273. exten => vmx,n(nofile),Noop(File for mode: ${MODE} does not exist, SYSTEMSTATUS: ${SYSTEMSTATUS}, going to normal voicemail)
  274. exten => vmx,n,Goto(s-${ARG2},1)
  275. exten => vmx,n(tmpgreet),Noop(Temporary Greeting Detected, going to normal voicemail)
  276. exten => vmx,n,Goto(s-${ARG2},1)
  277.  
  278. ; Drop into voicemail either as a direct destination (in which case VMX_OPTS might be set to something) or
  279. ; if the user timed out or broke out of the loop then VMX_OPTS is always cleared such that an Allison
  280. ; message is played and the caller know's what is going on.
  281. ;
  282. exten => dovm,1,Noop(VMX Timeout - go to voicemail)
  283. exten => dovm,n,Voicemail(${ARG1}@${VMCONTEXT},${VMX_OPTS}${VMGAIN}) ; no flags, so allison plays please leave ...
  284. exten => dovm,n,Goto(exit-${VMSTATUS},1)
  285.  
  286. exten => s-BUSY,1,NoOp(BUSY voicemail)
  287. exten => s-BUSY,n,Macro(get-vmcontext,${ARG1})
  288. exten => s-BUSY,n,Voicemail(${ARG1}@${VMCONTEXT},${VM_OPTS}b${VMGAIN}) ; Voicemail Busy message
  289. exten => s-BUSY,n,Goto(exit-${VMSTATUS},1)
  290.  
  291. exten => s-NOMESSAGE,1,NoOp(NOMESSAGE (beeb only) voicemail)
  292. exten => s-NOMESSAGE,n,Macro(get-vmcontext,${ARG1})
  293. exten => s-NOMESSAGE,n,Voicemail(${ARG1}@${VMCONTEXT},s${VM_OPTS}${VMGAIN})
  294. exten => s-NOMESSAGE,n,Goto(exit-${VMSTATUS},1)
  295.  
  296. exten => s-DIRECTDIAL,1,NoOp(DIRECTDIAL voicemail)
  297. exten => s-DIRECTDIAL,n,Macro(get-vmcontext,${ARG1})
  298. exten => s-DIRECTDIAL,n,Voicemail(${ARG1}@${VMCONTEXT},${VM_OPTS}${VM_DDTYPE}${VMGAIN})
  299. exten => s-DIRECTDIAL,n,Goto(exit-${VMSTATUS},1)
  300.  
  301. exten => _s-.,1,Macro(get-vmcontext,${ARG1})
  302. exten => _s-.,n,Voicemail(${ARG1}@${VMCONTEXT},${VM_OPTS}u${VMGAIN}) ; Voicemail Unavailable message
  303. exten => _s-.,n,Goto(exit-${VMSTATUS},1)
  304.  
  305. ; If the user has a 0 option defined, use that for operator zero-out from within voicemail
  306. ; as well to keep it consistant with the menu structure
  307. ;
  308. exten => o,1,Background(one-moment-please) ; 0 during vm message will hangup
  309. exten => o,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/0/ext)}" = "0"]?doopdef)
  310.  
  311. exten => o,n,Set(VMX_OPDEST_EXT=${DB_RESULT})
  312. exten => o,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/0/context)}" = "1"]?opcontext)
  313. exten => o,n,Set(DB_RESULT=${VMX_CONTEXT})
  314. exten => o,n(opcontext),Set(VMX_OPDEST_CONTEXT=${DB_RESULT})
  315. exten => o,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/0/pri)}" = "1"]?oppri)
  316. exten => o,n,Set(DB_RESULT=${VMX_PRI})
  317. exten => o,n(oppri),Set(VMX_OPDEST_PRI=${DB_RESULT})
  318.  
  319. exten => o,n,Goto(${VMX_OPDEST_CONTEXT},${VMX_OPDEST_EXT},${VMX_OPDEST_PRI})
  320. exten => o,n(doopdef),GotoIf($["x${OPERATOR_XTN}"="x"]?nooper:from-internal,${OPERATOR_XTN},1)
  321. exten => o,n(nooper),GotoIf($["x${FROM_DID}"="x"]?nodid)
  322. exten => o,n,Dial(Local/${FROM_DID}@from-pstn)
  323. exten => o,n,Macro(hangup)
  324. exten => o,n(nodid),Dial(Local/s@from-pstn)
  325. exten => o,n,Macro(hangup)
  326.  
  327. ; If the user has a * option defined, use that for the * out from within voicemail
  328. ; as well to keep it consistant with the menu structure
  329. ;
  330. exten => a,1,Macro(get-vmcontext,${ARG1})
  331. exten => a,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/*/ext)}" = "0"]?adef,1)
  332.  
  333. exten => a,n,Set(VMX_ADEST_EXT=${DB_RESULT})
  334. exten => a,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/*/context)}" = "1"]?acontext)
  335. exten => a,n,Set(DB_RESULT=${VMX_CONTEXT})
  336. exten => a,n(acontext),Set(VMX_ADEST_CONTEXT=${DB_RESULT})
  337. exten => a,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/*/pri)}" = "1"]?apri)
  338. exten => a,n,Set(DB_RESULT=${VMX_PRI})
  339. exten => a,n(apri),Set(VMX_ADEST_PRI=${DB_RESULT})
  340. exten => a,n,Goto(${VMX_ADEST_CONTEXT},${VMX_ADEST_EXT},${VMX_ADEST_PRI})
  341.  
  342. exten => adef,1,VoiceMailMain(${ARG1}@${VMCONTEXT})
  343. exten => adef,n,GotoIf($["${ARG3}" = "RETURN"]?exit-RETURN,1)
  344. exten => adef,n,Hangup
  345.  
  346. exten => exit-FAILED,1,Playback(im-sorry&an-error-has-occured)
  347. exten => exit-FAILED,n,GotoIf($["${ARG3}" = "RETURN"]?exit-RETURN,1)
  348. exten => exit-FAILED,n,Hangup()
  349.  
  350. exten => exit-SUCCESS,1,GotoIf($["${ARG3}" = "RETURN"]?exit-RETURN,1)
  351. exten => exit-SUCCESS,n,Playback(goodbye)
  352. exten => exit-SUCCESS,n,Hangup()
  353.  
  354. exten => exit-USEREXIT,1,GotoIf($["${ARG3}" = "RETURN"]?exit-RETURN,1)
  355. exten => exit-USEREXIT,n,Playback(goodbye)
  356. exten => exit-USEREXIT,n,Hangup()
  357.  
  358. exten => exit-RETURN,1,Noop(Returning From Voicemail because macro)
  359.  
  360. exten => t,1,Hangup()
  361. ;------------------------------------------------------------------------
  362.  
  363. ;------------------------------------------------------------------------
  364. ; [macro-simple-dial]
  365. ;------------------------------------------------------------------------
  366. ; This macro was derived from macro-exten-vm, which is what is normally used to
  367. ; ring an extension. It has been simplified and designed to never go to voicemail
  368. ; and always return regardless of the DIALSTATUS for any incomplete call.
  369. ;
  370. ; It's current primary purpose is to allow findmefollow ring an extension prior
  371. ; to trying the follow-me ringgroup that is provided.
  372. ;
  373. ; Ring an extension, if the extension is busy or there is no answer, return
  374. ; ARGS: $EXTENSION, $RINGTIME
  375. ;------------------------------------------------------------------------
  376. [macro-simple-dial]
  377. exten => s,1,Set(EXTTOCALL=${ARG1})
  378. exten => s,n,Set(RT=${ARG2})
  379. exten => s,n,Set(CFUEXT=${DB(CFU/${EXTTOCALL})})
  380. exten => s,n,Set(CFBEXT=${DB(CFB/${EXTTOCALL})})
  381.  
  382. exten => s,n,Macro(dial,${RT},${DIAL_OPTIONS},${EXTTOCALL})
  383.  
  384. exten => s,n,Set(PR_DIALSTATUS=${DIALSTATUS})
  385.  
  386. ; if we return, thus no answer, and they have a CFU setting, then we try that next
  387. ;
  388. exten => s,n,GosubIf($[$["${PR_DIALSTATUS}"="NOANSWER"] & $["foo${CFUEXT}"!="foo"]]?docfu,1) ; check for CFU in use on no answer
  389. exten => s,n,GosubIf($[$["${PR_DIALSTATUS}"="BUSY"] & $["foo${CFBEXT}"!="foo"]]?docfb,1) ; check for CFB in use on busy
  390. exten => s,n,Set(DIALSTATUS=${PR_DIALSTATUS})
  391.  
  392. ; Nothing yet, then go to the end (which will just return, but in case we decide to do something with certain
  393. ; return situations, this is left in.
  394. ;
  395. exten => s,n,Goto(s-${DIALSTATUS},1)
  396.  
  397. ; Try the Call Forward on No Answer / Unavailable number.
  398. ; We want to try CFU if set, but we want the same ring timer as was set to our call (or do we want the
  399. ; system ringtimer? - probably not). Then if no answer there (assuming it doesn't drop into their vm or
  400. ; something we return, which will have the net effect of returning to the followme setup.)
  401. ;
  402. ; want to avoid going to other follow-me settings here. So check if the CFUEXT is a user and if it is
  403. ; then direct it straight to ext-local (to avoid getting intercepted by findmefollow) otherwise send it
  404. ; to from-internal since it may be an outside line.
  405. ;
  406. exten => docfu,1,GotoIf( $[ "foo${DB(AMPUSER/${CFUEXT}/device)}" = "foo" ]?chlocal)
  407. exten => docfu,n,Dial(Local/${CFUEXT}@ext-local,${RT},${DIAL_OPTIONS})
  408. exten => docfu,n,Return
  409. exten => docfu,n(chlocal),Dial(Local/${CFUEXT}@from-internal/n,${RT},${DIAL_OPTIONS})
  410. exten => docfu,n,Return
  411.  
  412. ; Try the Call Forward on Busy number
  413. exten => docfb,1,GotoIf( $[ "foo${DB(AMPUSER/${CFBEXT}/device)}" = "foo" ]?chlocal)
  414. exten => docfb,n,Dial(Local/${CFBEXT}@ext-local,${RT},${DIAL_OPTIONS})
  415. exten => docfb,n,Return
  416. exten => docfb,n(chlocal),Dial(Local/${CFBEXT}@from-internal/n,${RT},${DIAL_OPTIONS})
  417. exten => docfb,n,Return
  418.  
  419. ; In all cases of no connection, come here and simply return, since the calling dialplan will
  420. ; decide what to do next
  421. exten => _s-.,1,NoOp(Extension is reporting ${EXTEN})
  422. ;------------------------------------------------------------------------
  423.  
  424.  
  425. ; get the voicemail context for the user in ARG1
  426. [macro-get-vmcontext]
  427. exten => s,1,Set(VMCONTEXT=${DB(AMPUSER/${ARG1}/voicemail)})
  428. exten => s,2,GotoIf($["foo${VMCONTEXT}" = "foo"]?200:300)
  429. exten => s,200,Set(VMCONTEXT=default)
  430. exten => s,300,NoOp()
  431.  
  432. ; For some reason, if I don't run setCIDname, CALLERID(name) will be blank in my AGI
  433. ; ARGS: none
  434. [macro-fixcid]
  435. exten => s,1,Set(CALLERID(name)=${CALLERID(name)})
  436.  
  437. ; Ring groups of phones
  438. ; ARGS: comma separated extension list
  439. ; 1 - Ring Group Strategy
  440. ; 2 - ringtimer
  441. ; 3 - prefix
  442. ; 4 - extension list
  443. [macro-rg-group]
  444. exten => s,1,Macro(user-callerid,SKIPTTL) ; already called from ringgroup
  445. exten => s,2,GotoIf($["${CALLERID(name):0:${LEN(${RGPREFIX})}}" != "${RGPREFIX}"]?4:3) ; check for old prefix
  446. exten => s,3,Set(CALLERID(name)=${CALLERID(name):${LEN(${RGPREFIX})}}) ; strip off old prefix
  447. exten => s,4,Set(RGPREFIX=${ARG3}) ; set new prefix
  448. exten => s,5,Set(CALLERID(name)=${RGPREFIX}${CALLERID(name)}) ; add prefix to callerid name
  449. exten => s,6,Set(RecordMethod=Group) ; set new prefix
  450. exten => s,7,Macro(record-enable,${MACRO_EXTEN},${RecordMethod})
  451. exten => s,8,Set(RingGroupMethod=${ARG1}) ;
  452. exten => s,9,Macro(dial,${ARG2},${DIAL_OPTIONS},${ARG4})
  453. exten => s,10,Set(RingGroupMethod='') ;
  454.  
  455.  
  456. ;
  457. ; Outgoing channel(s) are busy ... inform the client
  458. ; but use noanswer features like ringgroups don't break by being answered
  459. ; just to play the message.
  460. ;
  461. [macro-outisbusy]
  462. exten => s,1,Playback(all-circuits-busy-now,noanswer)
  463. exten => s,n,Playback(pls-try-call-later,noanswer)
  464. exten => s,n,Macro(hangupcall)
  465.  
  466. ; What to do on hangup.
  467. [macro-hangupcall]
  468. exten => s,1,ResetCDR(w)
  469. exten => s,n,NoCDR()
  470.  
  471. ; Cleanup any remaining RG flag
  472. ;
  473. exten => s,n,GotoIf($[ "x${USE_CONFIRMATION}" = "x" | "x${RINGGROUP_INDEX}" = "x" | "${CHANNEL}" != "${UNIQCHAN}"]?skiprg)
  474. exten => s,n,Noop(Cleaning Up Confirmation Flag: RG/${RINGGROUP_INDEX}/${CHANNEL})
  475. exten => s,n,DBDel(RG/${RINGGROUP_INDEX}/${CHANNEL})
  476.  
  477. ; Cleanup any remaining BLKVM flag
  478. ;
  479. exten => s,n(skiprg),GotoIf($[ "x${BLKVM_BASE}" = "x" | "BLKVM/${BLKVM_BASE}/${CHANNEL}" != "${BLKVM_OVERRIDE}" ]?skipblkvm)
  480. exten => s,n,Noop(Cleaning Up Block VM Flag: ${BLKVM_OVERRIDE})
  481. exten => s,n,DBDel(${BLKVM_OVERRIDE})
  482.  
  483. ; Cleanup any remaining FollowMe DND flags
  484. ;
  485. exten => s,n(skipblkvm),GotoIf($[ "x${FMGRP}" = "x" | "x${FMUNIQUE}" = "x" | "${CHANNEL}" != "${FMUNIQUE}" ]?theend)
  486. exten => s,n,DBDel(FM/DND/${FMGRP}/${CHANNEL})
  487.  
  488. exten => s,n(theend),Hangup
  489.  
  490. [macro-faxreceive]
  491. exten => s,1,Set(FAXFILE=${ASTSPOOLDIR}/fax/${UNIQUEID}.tif)
  492. exten => s,2,Set(EMAILADDR=${FAX_RX_EMAIL})
  493. exten => s,3,rxfax(${FAXFILE})
  494. exten => s,103,Set(EMAILADDR=${FAX_RX_EMAIL})
  495. exten => s,104,Goto(3)
  496.  
  497. ; dialout and strip the prefix
  498. [macro-dialout]
  499. exten => s,1,Macro(user-callerid,SKIPTTL)
  500. exten => s,2,GotoIf($["${ECID${CALLERID(number)}}" = ""]?5) ;check for CID override for exten
  501. exten => s,3,Set(CALLERID(all)=${ECID${CALLERID(number)}})
  502. exten => s,4,Goto(7)
  503. exten => s,5,GotoIf($["${OUTCID_${ARG1}}" = ""]?7) ;check for CID override for trunk
  504. exten => s,6,Set(CALLERID(all)=${OUTCID_${ARG1}})
  505. exten => s,7,Set(length=${LEN(${DIAL_OUT_${ARG1}})})
  506. exten => s,8,Dial(${OUT_${ARG1}}/${ARG2:${length}})
  507. exten => s,9,Playtones(congestion)
  508. exten => s,10,Congestion(5)
  509. exten => s,109,Macro(outisbusy)
  510.  
  511.  
  512. ; dialout using default OUT trunk - no prefix
  513. [macro-dialout-default]
  514. exten => s,1,Macro(user-callerid,SKIPTTL)
  515. exten => s,2,Macro(record-enable,${CALLERID(number)},OUT)
  516. exten => s,3,Macro(outbound-callerid,${ARG1})
  517. exten => s,4,Dial(${OUT}/${ARG1})
  518. exten => s,5,Playtones(congestion)
  519. exten => s,6,Congestion(5)
  520. exten => s,105,Macro(outisbusy)
  521.  
  522. [macro-dialout-trunk-predial-hook]
  523. ; this macro intentially left blank so it may be safely overwritten for any custom
  524. ; requirements that an installation may have.
  525. ;
  526. ; MACRO RETURN CODE: ${PREDIAL_HOOK_RET}
  527. ; if set to "BYPASS" then this trunk will be skipped
  528. ;
  529. exten => s,1,MacroExit()
  530.  
  531. ; This macro is for dev purposes and just dumps channel/app variables. Useful when designing new contexts.
  532. [macro-dumpvars]
  533. exten => s,1,Noop(ACCOUNTCODE=${ACCOUNTCODE})
  534. exten => s,2,Noop(ANSWEREDTIME=${ANSWEREDTIME})
  535. exten => s,3,Noop(BLINDTRANSFER=${BLINDTRANSFER})
  536. exten => s,4,Noop(CALLERID=${CALLERID(all)})
  537. exten => s,5,Noop(CALLERID(name)=${CALLERID(name)})
  538. exten => s,6,Noop(CALLERID(number)=${CALLERID(number)})
  539. exten => s,7,Noop(CALLINGPRES=${CALLINGPRES})
  540. exten => s,8,Noop(CHANNEL=${CHANNEL})
  541. exten => s,9,Noop(CONTEXT=${CONTEXT})
  542. exten => s,10,Noop(DATETIME=${DATETIME})
  543. exten => s,11,Noop(DIALEDPEERNAME=${DIALEDPEERNAME})
  544. exten => s,12,Noop(DIALEDPEERNUMBER=${DIALEDPEERNUMBER})
  545. exten => s,13,Noop(DIALEDTIME=${DIALEDTIME})
  546. exten => s,14,Noop(DIALSTATUS=${DIALSTATUS})
  547. exten => s,15,Noop(DNID=${DNID})
  548. exten => s,16,Noop(EPOCH=${EPOCH})
  549. exten => s,17,Noop(EXTEN=${EXTEN})
  550. exten => s,18,Noop(HANGUPCAUSE=${HANGUPCAUSE})
  551. exten => s,19,Noop(INVALID_EXTEN=${INVALID_EXTEN})
  552. exten => s,20,Noop(LANGUAGE=${LANGUAGE})
  553. exten => s,21,Noop(MEETMESECS=${MEETMESECS})
  554. exten => s,22,Noop(PRIORITY=${PRIORITY})
  555. exten => s,23,Noop(RDNIS=${RDNIS})
  556. exten => s,24,Noop(SIPDOMAIN=${SIPDOMAIN})
  557. exten => s,25,Noop(SIP_CODEC=${SIP_CODEC})
  558. exten => s,26,Noop(SIPCALLID=${SIPCALLID})
  559. exten => s,27,Noop(SIPUSERAGENT=${SIPUSERAGENT})
  560. exten => s,29,Noop(TXTCIDNAME=${TXTCIDNAME})
  561. exten => s,30,Noop(UNIQUEID=${UNIQUEID})
  562. exten => s,31,Noop(TOUCH_MONITOR=${TOUCH_MONITOR})
  563. exten => s,32,Noop(MACRO_CONTEXT=${MACRO_CONTEXT})
  564. exten => s,33,Noop(MACRO_EXTEN=${MACRO_EXTEN})
  565. exten => s,34,Noop(MACRO_PRIORITY=${MACRO_PRIORITY})
  566.  
  567. [macro-user-logon]
  568. ; check device type
  569. ;
  570. exten => s,1,Set(DEVICETYPE=${DB(DEVICE/${CALLERID(number)}/type)})
  571. exten => s,n,Answer()
  572. exten => s,n,Wait(1)
  573. exten => s,n,GotoIf($["${DEVICETYPE}" = "fixed"]?s-FIXED,1)
  574. ; get user's extension
  575. ;
  576. exten => s,n,Set(AMPUSER=${ARG1})
  577. exten => s,n,GotoIf($["${AMPUSER}" != ""]?gotpass)
  578. exten => s,n(playagain),Read(AMPUSER,please-enter-your-extension-then-press-pound,,,4)
  579. ; get user's password and authenticate
  580. ;
  581. exten => s,n,GotoIf($["${AMPUSER}" = ""]?s-MAXATTEMPTS,1)
  582. exten => s,n(gotpass),GotoIf($["${DB_EXISTS(AMPUSER/${AMPUSER}/password)}" = "0"]?s-NOUSER,1)
  583. exten => s,n,Set(AMPUSERPASS=${DB_RESULT})
  584. exten => s,n,GotoIf($[${LEN(${AMPUSERPASS})} = 0]?s-NOPASSWORD,1)
  585. ; do not continue if the user has already logged onto this device
  586. ;
  587. exten => s,n,Set(DEVICEUSER=${DB(DEVICE/${CALLERID(number)}/user)})
  588. exten => s,n,GotoIf($["${DEVICEUSER}" = "${AMPUSER}"]?s-ALREADYLOGGEDON,1)
  589. exten => s,n,Authenticate(${AMPUSERPASS})
  590. exten => s,n,DeadAGI(user_login_out.agi,login,${CALLERID(number)},${AMPUSER})
  591. exten => s,n,Playback(vm-goodbye)
  592.  
  593. exten => s-FIXED,1,NoOp(Device is FIXED and cannot be logged into)
  594. exten => s-FIXED,n,Playback(ha/phone)
  595. exten => s-FIXED,n,SayDigits(${CALLERID(number)})
  596. exten => s-FIXED,n,Playback(is-curntly-unavail&vm-goodbye)
  597. exten => s-FIXED,n,Hangup ;TODO should play msg indicated device cannot be logged into
  598.  
  599. exten => s-ALREADYLOGGEDON,1,NoOp(This device has already been logged into by this user)
  600. exten => s-ALREADYLOGGEDON,n,Playback(vm-goodbye)
  601. exten => s-ALREADYLOGGEDON,n,Hangup ;TODO should play msg indicated device is already logged into
  602.  
  603. exten => s-NOPASSWORD,1,NoOp(This extension does not exist or no password is set)
  604. exten => s-NOPASSWORD,n,Playback(pbx-invalid)
  605. exten => s-NOPASSWORD,n,Goto(s,playagain)
  606.  
  607. exten => s-MAXATTEMPTS,1,NoOp(Too many login attempts)
  608. exten => s-MAXATTEMPTS,n,Playback(vm-goodbye)
  609. exten => s-MAXATTEMPTS,n,Hangup
  610.  
  611. exten => s-NOUSER,1,NoOp(Invalid extension ${AMPUSER} entered)
  612. exten => s-NOUSER,n,Playback(pbx-invalid)
  613. exten => s-NOUSER,n,Goto(s,playagain)
  614.  
  615. [macro-user-logoff]
  616. ; check device type
  617. ;
  618. exten => s,1,Set(DEVICETYPE=${DB(DEVICE/${CALLERID(number)}/type)})
  619. exten => s,n,GotoIf($["${DEVICETYPE}" = "fixed"]?s-FIXED,1)
  620. exten => s,n,DeadAGI(user_login_out.agi,logout,${CALLERID(number)})
  621. exten => s,n(done),Playback(vm-goodbye)
  622.  
  623. exten => s-FIXED,1,NoOp(Device is FIXED and cannot be logged out of)
  624. exten => s-FIXED,n,Playback(an-error-has-occured&vm-goodbye)
  625. exten => s-FIXED,n,Hangup ;TODO should play msg indicated device cannot be logged into
  626.  
  627.  
  628. ;
  629. ; ############################################################################
  630. ; Inbound Contexts [from]
  631. ; ############################################################################
  632.  
  633. [from-sip-external]
  634. ;give external sip users congestion and hangup
  635. ; Yes. This is _really_ meant to be _. - I know asterisk whinges about it, but
  636. ; I do know what I'm doing. This is correct.
  637. exten => _.,1,NoOp(Received incoming SIP connection from unknown peer to ${EXTEN})
  638. exten => _.,n,Set(DID=${IF($["${EXTEN:1:2}"=""]?s:${EXTEN})})
  639. exten => _.,n,Goto(s,1)
  640. exten => s,1,GotoIf($["${ALLOW_SIP_ANON}"="yes"]?from-trunk,${DID},1)
  641. exten => s,n,Set(TIMEOUT(absolute)=15)
  642. exten => s,n,Answer
  643. exten => s,n,Wait(2)
  644. exten => s,n,Playback(ss-noservice)
  645. exten => s,n,Playtones(congestion)
  646. exten => s,n,Congestion(5)
  647. exten => h,1,NoOp(Hangup)
  648. exten => i,1,NoOp(Invalid)
  649. exten => t,1,NoOp(Timeout)
  650.  
  651. [from-internal-xfer]
  652. ; applications are now mostly all found in from-internal-additional in _custom.conf
  653. include => parkedcalls
  654. include => from-internal-custom
  655. ;allow phones to dial other extensions
  656. include => ext-fax
  657. ;allow phones to access generated contexts
  658. ;
  659. ; MODIFIED (PL)
  660. ;
  661. ; Currently the include for findmefollow is being auto-generated before ext-local which is the desired behavior.
  662. ; However, I haven't been able to do anything that I know of to force this. We need to determine if it should
  663. ; be hardcoded into here to make sure it doesn't change with some configuration. For now I will leave it out
  664. ; until we can discuss this.
  665. ;
  666. include => ext-local-confirm
  667. include => findmefollow-ringallv2
  668. include => from-internal-additional
  669. ; This causes grief with '#' transfers, commenting out for the moment.
  670. ; include => bad-number
  671. exten => s,1,Macro(hangupcall)
  672. exten => h,1,Macro(hangupcall)
  673.  
  674. [from-internal]
  675. include => from-internal-xfer
  676. include => bad-number
  677.  
  678. ;------------------------------------------------------------------------
  679. ; [macro-setmusic]
  680. ;------------------------------------------------------------------------
  681. ; CONTEXT: macro-setmusic
  682. ; PURPOSE: to turn off moh on routes where it is not desired
  683. ;
  684. ;------------------------------------------------------------------------
  685. [macro-setmusic]
  686. exten => s,1,NoOp(Setting Outbound Route MoH To: ${ARG1})
  687. exten => s,2,SetMusicOnHold(${ARG1})
  688. ;------------------------------------------------------------------------
  689.  
  690. ; ##########################################
  691. ; ## Ring Groups with Confirmation macros ##
  692. ; ##########################################
  693. ; Used by followme and ringgroups
  694.  
  695. ;------------------------------------------------------------------------
  696. ; [macro-dial-confirm]
  697. ;------------------------------------------------------------------------
  698. ; This has now been incorporated into dialparties. It still only works with ringall
  699. ; and ringall-prim strategies. Have not investigated why it doesn't work with
  700. ; hunt and memory hunt.
  701. ;
  702. ;------------------------------------------------------------------------
  703. [macro-dial-confirm]
  704. ; This was written to make it easy to use macro-dial-confirm instead of macro-dial in generated dialplans.
  705. ; This takes the same paramaters, with an additional paramater of the ring group Number
  706. ; ARG1 is the timeout
  707. ; ARG2 is the DIAL_OPTIONS
  708. ; ARG3 is a list of xtns to call - 203-222-240-123123123#-211
  709. ; ARG4 is the ring group number
  710.  
  711. ; This sets a unique value to indicate that the channel is ringing. This is used for warning slow
  712. ; users that the call has already been picked up.
  713. ;
  714. exten => s,1,Set(DB(RG/${ARG4}/${CHANNEL})=RINGING)
  715.  
  716. ; We need to keep that channel variable, because it'll change when we do this dial, so set it to
  717. ; fallthrough to every sibling.
  718. ;
  719. exten => s,n,Set(__UNIQCHAN=${CHANNEL})
  720.  
  721. ; The calling ringgroup should have set RingGroupMethod appropriately. We need to set two
  722. ; additional parameters:
  723. ;
  724. ; USE_CONFIRMATION, RINGGROUP_INDEX
  725. ;
  726.  
  727. ; Thse are passed to inform dialparties to place external calls through the [grps] context
  728. ;
  729. exten => s,n,Set(USE_CONFIRMATION=TRUE)
  730. exten => s,n,Set(RINGGROUP_INDEX=${ARG4})
  731. exten => s,n,Set(ARG4=) ; otherwise it gets passed to dialparties.agi which processes it (prob bug)
  732.  
  733. exten => s,n,Macro(dial,${ARG1},${ARG2},${ARG3})
  734.  
  735. ; delete the variable, if we are here, we are done trying to dial and it may have been left around
  736. ;
  737. exten => s,n,DBDel(RG/${RINGGROUP_INDEX}/${CHANNEL})
  738. exten => s,n,Set(USE_CONFIRMATION=)
  739. exten => s,n,Set(RINGGROUP_INDEX=)
  740. ;------------------------------------------------------------------------
  741.  
  742.  
  743. ;------------------------------------------------------------------------
  744. ; [ext-local-confirm]
  745. ;------------------------------------------------------------------------
  746. ; If call confirm is being used in a ringgroup, then calls that do not require confirmation are sent
  747. ; to this extension instead of straight to the device.
  748. ;
  749. ; The sole purpose of sending them here is to make sure we run Macro(auto-confirm) if this
  750. ; extension answers the line. This takes care of clearing the database key that is used to inform
  751. ; other potential late comers that the extension has been answered by someone else.
  752. ;
  753. ; ALERT_INFO is deprecated in Asterisk 1.4 but still used throughout the FreePBX dialplan and
  754. ; usually set by dialparties.agi. This allows ineritance. Since no dialparties.agi here, set the
  755. ; header if it is set.
  756. ;
  757. ;------------------------------------------------------------------------
  758. [ext-local-confirm]
  759. exten => _LC-.,1,Noop(IN ext-local-confirm with - RT: ${RT}, RG_IDX: ${RG_IDX})
  760. exten => _LC-.,n,GotoIf($["x${ALERT_INFO}"="x"]?godial)
  761. exten => _LC-.,n,SIPAddHeader(Alert-Info: ${ALERT_INFO})
  762. exten => _LC-.,n(godial),dial(${DB(DEVICE/${EXTEN:3}/dial)},${RT},M(auto-confirm^${RG_IDX})${DIAL_OPTIONS})
  763.  
  764. ;------------------------------------------------------------------------
  765. ; [findmefollow-ringallv2]
  766. ;------------------------------------------------------------------------
  767. ; This context, to be included in from-internal, implements the PreRing part of findmefollow
  768. ; as well as the GroupRing part. It also communicates between the two so that if DND is set
  769. ; on the primary extension, and mastermode is enabled, then the other extensions will not ring
  770. ;
  771. ;------------------------------------------------------------------------
  772. [findmefollow-ringallv2]
  773. exten => _FMPR-.,1,Noop(In FMPR ${FMGRP} with ${EXTEN:5})
  774. exten => _FMPR-.,n,Set(RingGroupMethod=)
  775. exten => _FMPR-.,n,Set(USE_CONFIRMATION=)
  776. exten => _FMPR-.,n,Set(RINGGROUP_INDEX=)
  777. exten => _FMPR-.,n,Macro(simple-dial,${EXTEN:5},${FMREALPRERING})
  778. exten => _FMPR-.,n,GotoIf($["${DIALSTATUS}" != "BUSY"]?nodnd)
  779. exten => _FMPR-.,n,Set(DB(FM/DND/${FMGRP}/${FMUNIQUE})=DND)
  780. exten => _FMPR-.,n(nodnd),Noop(Ending FMPR ${FMGRP} with ${EXTEN:5} and dialstatus ${DIALSTATUS})
  781. exten => _FMPR-.,n,Hangup()
  782.  
  783. exten => _FMGL-.,1,Noop(In FMGL ${FMGRP} with ${EXTEN:5})
  784. exten => _FMGL-.,n,GotoIf($["${DB(FM/DND/${FMGRP}/${FMUNIQUE})}" = "DND"]?dodnd)
  785. exten => _FMGL-.,n,Wait(1)
  786. exten => _FMGL-.,n,GotoIf($["${DB(FM/DND/${FMGRP}/${FMUNIQUE})}" = "DND"]?dodnd)
  787. exten => _FMGL-.,n,Wait(1)
  788. exten => _FMGL-.,n,GotoIf($["${DB(FM/DND/${FMGRP}/${FMUNIQUE})}" = "DND"]?dodnd)
  789. exten => _FMGL-.,n,Wait(${FMPRERING})
  790. exten => _FMGL-.,n,GotoIf($["${DB(FM/DND/${FMGRP}/${FMUNIQUE})}" = "DND"]?dodnd)
  791. exten => _FMGL-.,n,DBDel(FM/DND/${FMGRP}/${FMUNIQUE})
  792. exten => _FMGL-.,n(dodial),Macro(dial,${FMGRPTIME},${DIAL_OPTIONS},${EXTEN:5})
  793. exten => _FMGL-.,n,Noop(Ending FMGL ${FMGRP} with ${EXTEN:5} and dialstatus ${DIALSTATUS})
  794. exten => _FMGL-.,n,Hangup()
  795. exten => _FMGL-.,n+10(dodnd),DBDel(FM/DND/${FMGRP}/${FMUNIQUE})
  796. exten => _FMGL-.,n,GotoIf($["${FMPRIME}" = "FALSE"]?dodial)
  797. exten => _FMGL-.,n,Noop(Got DND in FMGL ${FMGRP} with ${EXTEN:5} in ${RingGroupMethod} mode, aborting)
  798. exten => _FMGL-.,n,Hangup()
  799.  
  800. ;------------------------------------------------------------------------
  801. ; [block-cf]
  802. ;------------------------------------------------------------------------
  803. ; This context is set as a target with FORWARD_CONTEXT when Call Forwarding is set to be
  804. ; ignored in a ringgoup or other features that may take advantage of this. Server side
  805. ; CF is done in dialparties.agi but if a client device forwards a call, it will be caught
  806. ; and blocked here.
  807. ;------------------------------------------------------------------------
  808. [block-cf]
  809. exten => _X.,1,Noop(Blocking callforward to ${EXTEN} because CF is blocked)
  810. exten => _X.,n,Hangup()
  811.  
  812. ;------------------------------------------------------------------------
  813.  
  814. ; ############################################################################
  815. ; Extension Contexts [ext]
  816. ; ############################################################################
  817.  
  818. [ext-fax]
  819. exten => s,1,Answer
  820. exten => s,2,Goto(in_fax,1)
  821. exten => in_fax,1,StopPlayTones
  822. exten => in_fax,2,GotoIf($["${FAX_RX}" = "system"]?3:analog_fax,1)
  823. exten => in_fax,3,Macro(faxreceive)
  824. exten => in_fax,4,Hangup
  825. exten => analog_fax,1,GotoIf($["${FAX_RX}" = "disabled"]?4:2) ;if fax is disabled, just hang up
  826. exten => analog_fax,2,Set(DIAL=${DB(DEVICE/${FAX_RX}/dial)});
  827. exten => analog_fax,3,Dial(${DIAL},20,d)
  828. exten => analog_fax,4,Hangup
  829. ;exten => out_fax,1,wait(7)
  830. exten => out_fax,1,txfax(${TXFAX_NAME},caller)
  831. exten => out_fax,2,Hangup
  832. exten => h,1,system(/var/lib/asterisk/bin/fax-process.pl --to ${EMAILADDR} --from ${FAX_RX_FROM} --dest "${FROM_DID}" --subject "Fax from ${URIENCODE(${CALLERID(number)})} ${URIENCODE(${CALLERID(name)})}" --attachment fax_${URIENCODE(${CALLERID(number)})}.pdf --type application/pdf --file ${FAXFILE});
  833. exten => h,2,Hangup()
  834.  
  835. ;this is where parked calls go if they time-out. Should probably re-ring
  836. [default]
  837. include => ext-local
  838. exten => s,1,Playback(vm-goodbye)
  839. exten => s,2,Macro(hangupcall)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement