[general] autofallthrough=yes [macro-dialout-trunk] include => macro-dialout-trunk-custom ; fixme anton - modified to support outbound calls restriction based on time ;exten => s,1,AGI(bypass-outbound.php) ;exten => s,n,NoOp(office hours: ${OFFICE_HOURS} - bypass: ${BYPASS_OUTBOUND}) ;exten => s,n,GotoIfTime(${OFFICE_HOURS}?open) ;exten => s,n,GotoIf($["${BYPASS_OUTBOUND}" = "1"]?open) ;exten => s,n,PlayBack(silence/1) ;exten => s,n,PlayBack(all-outgoing-lines-unavailable) ;exten => s,n,PlayBack(vm-goodbye) ;exten => s,n,Hangup ;exten => s,n(open),NoOp(Outbound call allowed) ;exten => s,n,Set(DIAL_TRUNK=${ARG1}) ; fixme anton - pinlock ; exten => s,1,Set(ENTEREDEXT=${CUT(ARG2,*,2)}) ; exten => s,1,Answer exten => s,1,Set(ENTEREDEXT=${CUT(ARG2,*,2)}) ; fixme anton - keylock exten => s,n,NoOp(DEBUG: BT = ${BLINDTRANSFER} CH = ${CHANNEL} CHANNELACCOUNTCODE = ${CHANNEL(accountcode)} CDRACCOUNTCODE = ${CDR(accountcode)}) exten => s,n,Set(BT=${CUT(BLINDTRANSFER,"-",1)}) exten => s,n,Set(BT=${CUT(BT,"/",2)}) exten => s,n,NoOp(DEBUG: BT = ${BT} CID = ${CALLERID(num)}) exten => s,n,GotoIf($[$["x${BT}" = "x"]]?authkeylock) exten => s,n,GotoIf($[$["${BT}" != "${CALLERID(num)}"]]?nokeylock) exten => s,n,GotoIf($[$["${ENTEREDEXT}" != ""]]?nokeylock) exten => s,n(authkeylock),Set(KEYLOCK=${DB(AMPUSER/${CALLERID(num)}/KEYLOCK)}) exten => s,n,GotoIf($[$["${KEYLOCK}" != ""]]?askpin:pinok) exten => s,n(askpin),Answer exten => s,n,AGI(vm-password.php,${CALLERID(num)}@default) exten => s,n(pinok),NoOp(OK) ; exten => s,1,Set(DIAL_TRUNK=${ARG1}) exten => s,n(nokeylock),Set(DIAL_TRUNK=${ARG1}) ; fixme anton - ZAP2DAHDI hack exten => s,n,Set(ZAP2DAHDI=${OUT_${DIAL_TRUNK}}) exten => s,n,Set(VAR1=${ZAP2DAHDI:0:4}) exten => s,n,Set(VAR2=${ZAP2DAHDI:4}) exten => s,n,ExecIf($[$["${VAR1}" = "ZAP/"]]?Set(OUT_${DIAL_TRUNK}=DAHDI/${VAR2})) exten => s,n,ExecIf($[$["${VAR1}" = "Zap/"]]?Set(OUT_${DIAL_TRUNK}=DAHDI/${VAR2})) exten => s,n,ExecIf($[$["${VAR1}" = "zap/"]]?Set(OUT_${DIAL_TRUNK}=DAHDI/${VAR2})) exten => s,n,ExecIf($[$["${ARG3}" != ""] & $["${DB(AMPUSER/${AMPUSER}/pinless)}" != "NOPASSWD"]]?Authenticate(${ARG3})) exten => s,n,GotoIf($["x${OUTDISABLE_${DIAL_TRUNK}}" = "xon"]?disabletrunk,1) exten => s,n,Set(DIAL_NUMBER=${ARG2}) exten => s,n,Set(DIAL_TRUNK_OPTIONS=${DIAL_OPTIONS}) exten => s,n,Set(GROUP()=OUT_${DIAL_TRUNK}) exten => s,n,GotoIf($["${OUTMAXCHANS_${DIAL_TRUNK}}foo" = "foo"]?nomax) exten => s,n,GotoIf($[ ${GROUP_COUNT(OUT_${DIAL_TRUNK})} > ${OUTMAXCHANS_${DIAL_TRUNK}} ]?chanfull) exten => s,n(nomax),GotoIf($["${INTRACOMPANYROUTE}" = "YES"]?skipoutcid) exten => s,n,Set(DIAL_TRUNK_OPTIONS=${TRUNK_OPTIONS}) exten => s,n,Macro(outbound-callerid,${DIAL_TRUNK}) exten => s,n(skipoutcid),AGI(fixlocalprefix) exten => s,n,Set(OUTNUM=${OUTPREFIX_${DIAL_TRUNK}}${DIAL_NUMBER}) ; fixme anton - modified to support ask for PIN first exten => s,n,Set(REALOUTNUM=${CUT(OUTNUM,*,1)}) ; exten => s,n,Set(ENTEREDEXT=${CUT(OUTNUM,*,2)}) ; if ENTEREDEXT exists, but CPIN not exists then Hangup exten => s,n,GotoIf($[$["${ENTEREDEXT}" != ""]]?askpin1:pinok1) exten => s,n(askpin1),Answer exten => s,n,AGI(vm-password.php,${ENTEREDEXT}@default) exten => s,n,AGI(get-context.php,${ENTEREDEXT}) exten => s,n,Goto(${CTX},${REALOUTNUM},1) exten => s,n(pinok1),NoOp(OK) ; caller ID, accountcode and real PIN exten => s,n,Set(OUTNUM=${REALOUTNUM}) exten => s,n,Set(DEVICENUM=${IF($[ "x${ENTEREDEXT}" = "x" ]?${AMPUSER}:${DB(DEVICE/${ENTEREDEXT}/user)})}) ; exten => s,n,Set(CIDNAME=${DB(AMPUSER/${DEVICENUM}/cidname)}) exten => s,n,Set(CIDNAME=) exten => s,n,Set(CIDNUM=${DB(AMPUSER/${DEVICENUM}/outboundcid)}) exten => s,n,ExecIf($["x${CIDNUM}" = "x"]?Set(CIDNUM=${DB(AMPUSER/${DEVICENUM}/cidnum)})) exten => s,n,ExecIf($["${CDRPINSET}" = ""]?Set(CHANNEL(accountcode)=${DB(AMPUSER/${DEVICENUM}/accountcode)})) ; fixme asoka, fix CF from outside exten => s,n,GotoIf($["x${CDR(accountcode)}" = "x"]?ACCOUNTCODECFOK) ; but if INTRACOMPANYROUTE then accountcode is CALLERID(number) exten => s,n,ExecIf($[$["${INTRACOMPANYROUTE}" = "YES"]]?Set(CDR(accountcode)=${CALLERID(number)})) exten => s,n,Goto(ACCOUNTCODECFNOTOK) ; but if no accountcode then accountcode is ACCOUNTCODECF (use for callforward from outside and then callout via a2billing) ;exten => s,n(ACCOUNTCODECFOK),Set,CALLERID(all)="${ACCOUNTCODECF}" <${ACCOUNTCODECF}>) ;exten => s,n(ACCOUNTCODECFOK),Set(CIDNAME=) ;exten => s,n,Set(CIDNUM=${ACCOUNTCODECF}) exten => s,n(ACCOUNTCODECFOK),ExecIf($["x${CDR(accountcode)}" = "x"],Set,CDR(accountcode)=${ACCOUNTCODECF}) exten => s,n,ExecIf($["x${CALLERID(name)}" = "x"],Set,CALLERID(name)=${ACCOUNTCODECF}) exten => s,n,ExecIf($["x${CALLERID(number)}" = "x"],Set,CALLERID(number)=${ACCOUNTCODECF}) ; final set of caller ID exten => s,n,Set(CALLERID(name)=${CIDNAME}) exten => s,n,Set(CALLERID(number)=${CIDNUM}) ; end of modified additions exten => s,n(ACCOUNTCODECFNOTOK),Set(custom=${CUT(OUT_${DIAL_TRUNK},:,1)}) exten => s,n,GotoIf($[$["${MOHCLASS}" = "default"] | $["foo${MOHCLASS}" = "foo"]]?gocall) exten => s,n,Set(DIAL_TRUNK_OPTIONS=M(setmusic^${MOHCLASS})${DIAL_TRUNK_OPTIONS}) exten => s,n(gocall),Macro(dialout-trunk-predial-hook,) exten => s,n,GotoIf($["${PREDIAL_HOOK_RET}" = "BYPASS"]?bypass,1) exten => s,n,GotoIf($["${custom}" = "AMP"]?customtrunk) exten => s,n,Dial(${OUT_${DIAL_TRUNK}}/${OUTNUM},300,${DIAL_TRUNK_OPTIONS}) exten => s,n,Goto(s-${DIALSTATUS},1) exten => s,n(customtrunk),Set(pre_num=${CUT(OUT_${DIAL_TRUNK},$,1)}) exten => s,n,Set(the_num=${CUT(OUT_${DIAL_TRUNK},$,2)}) exten => s,n,Set(post_num=${CUT(OUT_${DIAL_TRUNK},$,3)}) exten => s,n,GotoIf($["${the_num}" = "OUTNUM"]?outnum:skipoutnum) exten => s,n(outnum),Set(the_num=${OUTNUM}) ; fixme anton - modified to support outbound calling for A2B ; original line: exten => s,n(skipoutnum),Dial(${pre_num:4}${the_num}${post_num},300,${DIAL_TRUNK_OPTIONS}) ; added function ; Checks for A2B custom trunk and dials it. exten => s,n(skipoutnum),GotoIf($["${pre_num}" = "AMP:BILLING/"]?a2bdial:skipoutnumnormal) ; Dials out via the a2billing.php script. exten => s,n(a2bdial),DeadAGI(a2billing.php,1,standard,${the_num}) exten => s,n,Goto(s-${DIALSTATUS},1) exten => s,n(skipoutnumnormal),Dial(${pre_num:4}${the_num}${post_num},300,${DIAL_TRUNK_OPTIONS}) ; end of modified additions exten => s,n,Goto(s-${DIALSTATUS},1) exten => s,n(chanfull),Noop(max channels used up) exten => s-BUSY,1,Noop(Dial failed due to trunk reporting BUSY - giving up) exten => s-BUSY,n,Playtones(busy) exten => s-BUSY,n,Busy(20) exten => s-NOANSWER,1,Noop(Dial failed due to trunk reporting NOANSWER - giving up) exten => s-NOANSWER,n,Playtones(congestion) exten => s-NOANSWER,n,Congestion(20) exten => s-CANCEL,1,Noop(Dial failed due to trunk reporting CANCEL - giving up) exten => s-CANCEL,n,Playtones(congestion) exten => s-CANCEL,n,Congestion(20) exten => _s-.,1,GotoIf($["x${OUTFAIL_${ARG1}}" = "x"]?noreport) exten => _s-.,n,AGI(${OUTFAIL_${ARG1}}) exten => _s-.,n(noreport),Noop(TRUNK Dial failed due to ${DIALSTATUS} - failing through to other trunks) exten => disabletrunk,1,Noop(TRUNK: ${OUT_${DIAL_TRUNK}} DISABLED - falling through to next trunk) exten => bypass,1,Noop(TRUNK: ${OUT_${DIAL_TRUNK}} BYPASSING because dialout-trunk-predial-hook) exten => h,1,Macro(hangupcall,) ; end of [macro-dialout-trunk] [app-pickup] include => app-pickup-custom exten => _**.,1,Noop(Attempt to Pickup ${EXTEN:2} by ${CALLERID(num)}) exten => _**.,n,Pickup(${EXTEN:2}) exten => _**.,n,Pickup(${EXTEN:2}@from-internal) exten => _**.,n,Pickup(${EXTEN:2}@from-did-direct) exten => _**.,n,Pickup(${EXTEN:2}@from-trunk) exten => _**.,n,Pickup(${EXTEN:2}@ext-group) exten => _**.,n,AGI(get-context.php,${EXTEN:2}) exten => _**.,n,ExecIf($[$["x${CTX}" != "x"]]?Pickup(${EXTEN:2}@${CTX})) ; end of [app-pickup] [from-zaptel] exten => _X.,1,Set(DID=${EXTEN}) exten => _X.,n,Goto(s,1) exten => s,1,NoOp(Entering from-zaptel with DID == ${DID}) ; Some trunks _require_ a RINGING be sent before an Answer. exten => s,n,Ringing() ; If ($did == "") { $did = "s"; } exten => s,n,Set(DID=${IF($["${DID}"= ""]?s:${DID})}) exten => s,n,NoOp(DID is now ${DID}) ; fixme anton - ZAP2DAHDI hack ;exten => s,n,GotoIf($["${CHANNEL:0:3}"="Zap"]?zapok:notzap) exten => s,n,GotoIf($["${CHANNEL:0:5}"="DAHDI"]?zapok:notzap) exten => s,n(notzap),Goto(from-pstn,${DID},1) ; If there's no ext-did,s,1, that means there's not a no did/no cid route. Hangup. exten => s,n,Macro(hangup) exten => s,n(zapok),NoOp(Is a Zaptel Channel) ; fixme anton - ZAP2DAHDI hack ;exten => s,n,Set(CHAN=${CHANNEL:4}) exten => s,n,Set(CHAN=${CHANNEL:6}) exten => s,n,Set(CHAN=${CUT(CHAN,-,1)}) exten => s,n,Macro(from-zaptel-${CHAN},${DID},1) ; If nothing there, then treat it as a DID exten => s,n,NoOp(Returned from Macro from-zaptel-${CHAN}) exten => s,n,Goto(from-pstn,${DID},1) exten => fax,1,Goto(ext-fax,in_fax,1) ; end of [from-zaptel] [findmefollow-ringallv2] exten => _FMPR-.,1,Noop(In FMPR ${FMGRP} with ${EXTEN:5}) ; fixme anton - forwarding party must pay exten => _FMPR-.,n,Noop(BRIKER: Caller ID set to ${FMGRP}) exten => _FMPR-.,n,Set(CALLERID(number)=${FMGRP}) exten => _FMPR-.,n,Set(RingGroupMethod=) exten => _FMPR-.,n,Set(USE_CONFIRMATION=) exten => _FMPR-.,n,Set(RINGGROUP_INDEX=) exten => _FMPR-.,n,Macro(simple-dial,${EXTEN:5},${FMREALPRERING}) exten => _FMPR-.,n,GotoIf($["${DIALSTATUS}" != "BUSY"]?nodnd) exten => _FMPR-.,n,Set(DB(FM/DND/${FMGRP}/${FMUNIQUE})=DND) exten => _FMPR-.,n(nodnd),Noop(Ending FMPR ${FMGRP} with ${EXTEN:5} and dialstatus ${DIALSTATUS}) exten => _FMPR-.,n,Hangup() exten => _FMGL-.,1,Noop(In FMGL ${FMGRP} with ${EXTEN:5}) ; fixme anton - forwarding party must pay exten => _FMGL-.,n,Noop(BRIKER: Caller ID set to ${FMGRP}) exten => _FMGL-.,n,Set(CALLERID(number)=${FMGRP}) exten => _FMGL-.,n,GotoIf($["${DB(FM/DND/${FMGRP}/${FMUNIQUE})}" = "DND"]?dodnd) exten => _FMGL-.,n,Wait(1) exten => _FMGL-.,n,GotoIf($["${DB(FM/DND/${FMGRP}/${FMUNIQUE})}" = "DND"]?dodnd) exten => _FMGL-.,n,Wait(1) exten => _FMGL-.,n,GotoIf($["${DB(FM/DND/${FMGRP}/${FMUNIQUE})}" = "DND"]?dodnd) exten => _FMGL-.,n,Wait(${FMPRERING}) exten => _FMGL-.,n,GotoIf($["${DB(FM/DND/${FMGRP}/${FMUNIQUE})}" = "DND"]?dodnd) exten => _FMGL-.,n,DBDel(FM/DND/${FMGRP}/${FMUNIQUE}) exten => _FMGL-.,n(dodial),Macro(dial,${FMGRPTIME},${DIAL_OPTIONS},${EXTEN:5}) exten => _FMGL-.,n,Noop(Ending FMGL ${FMGRP} with ${EXTEN:5} and dialstatus ${DIALSTATUS}) exten => _FMGL-.,n,Hangup() exten => _FMGL-.,n+10(dodnd),DBDel(FM/DND/${FMGRP}/${FMUNIQUE}) exten => _FMGL-.,n,GotoIf($["${FMPRIME}" = "FALSE"]?dodial) exten => _FMGL-.,n,Noop(Got DND in FMGL ${FMGRP} with ${EXTEN:5} in ${RingGroupMethod} mode, aborting) exten => _FMGL-.,n,Hangup() ; end of [findmefollow-ringallv2] [macro-hangupcall] ;exten => s,1,ResetCDR(w) ;exten => s,n,NoCDR() ; Cleanup any remaining RG flag ; exten => s,1,GotoIf($[ "x${USE_CONFIRMATION}" = "x" | "x${RINGGROUP_INDEX}" = "x" | "${CHANNEL}" != "${UNIQCHAN}"]?skiprg) exten => s,n,Noop(Cleaning Up Confirmation Flag: RG/${RINGGROUP_INDEX}/${CHANNEL}) exten => s,n,DBDel(RG/${RINGGROUP_INDEX}/${CHANNEL}) ; Cleanup any remaining BLKVM flag ; exten => s,n(skiprg),GotoIf($[ "x${BLKVM_BASE}" = "x" | "BLKVM/${BLKVM_BASE}/${CHANNEL}" != "${BLKVM_OVERRIDE}" ]?skipblkvm) exten => s,n,Noop(Cleaning Up Block VM Flag: ${BLKVM_OVERRIDE}) exten => s,n,DBDel(${BLKVM_OVERRIDE}) ; Cleanup any remaining FollowMe DND flags ; exten => s,n(skipblkvm),GotoIf($[ "x${FMGRP}" = "x" | "x${FMUNIQUE}" = "x" | "${CHANNEL}" != "${FMUNIQUE}" ]?theend) exten => s,n,DBDel(FM/DND/${FMGRP}/${CHANNEL}) ; fixme anton - campon ; exten => s,n(theend),Noop(BRIKER: check if we have to do campon) ; exten => s,n,Set(CAMPON=${DB(AMPUSER/${AMPUSER}/campon)}) ; exten => s,n,Set(DB(AMPUSER/${AMPUSER}/campon)=) ; exten => s,n,Noop(BRIKER: Callback to ${CAMPON}) ; exten => s,n,Macro(simple-dial,${CAMPON},20) exten => s,n(theend),Hangup ; end of [macro-hangupcall] [macro-record-enable] exten => s,1,GotoIf($[${LEN(${BLINDTRANSFER})} > 0]?2:4) exten => s,2,ResetCDR(w) exten => s,3,StopMonitor() exten => s,4,AGI(recordingcheck,${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},${UNIQUEID}) exten => s,5,Noop(No recording needed) ; fixme anton - change .wav to .WAV (format wav49) exten => s,999,MixMonitor(${CALLFILENAME}.WAV) ;exten => s,3,BackGround(for-quality-purposes) ;exten => s,4,BackGround(this-call-may-be) ;exten => s,5,BackGround(recorded) ; end of [macro-record-enable] ;[from-did-direct-custom] ;exten => _X.,1,NoOp(IVR_CONTEXT = ${IVR_CONTEXT}) ;exten => _X.,n,GotoIf($["x${IVR_CONTEXT}" == "x"]?godial) ;exten => _X.,n,PlayBack(silence/1) ;; exten => _X.,n,PlayBack(you-have-dialed) ;; exten => _X.,n,SayDigits(${EXTEN}) ;exten => _X.,n,PlayBack(transfer) ;exten => _X.,n(godial),Dial(Local/${EXTEN}@from-internal) ;; end of [from-did-direct-custom] ;[from-did-direct] ;; fixme anton ;include => from-did-direct-custom ;include => ext-findmefollow ;include => ext-local ;; end of [from-did-direct] [app-dialvm] include => app-dialvm-custom exten => *98,1,Answer exten => *98,n,Wait(1) ; fixme anton ;exten => *98,n,Macro(user-callerid,) ;exten => *98,n,VoiceMailMain() exten => *98,n,Background(please-enter-the&extension) exten => *98,n,Read(EXT) exten => *98,n,Macro(get-vmcontext,${EXT}) exten => *98,n,VoiceMailMain(${EXT}@${VMCONTEXT}) exten => *98,n,Macro(hangupcall,) exten => _*98.,1,Answer exten => _*98.,n,Wait(1) exten => _*98.,n,Macro(get-vmcontext,${EXTEN:3}) exten => _*98.,n,VoiceMailMain(${EXTEN:3}@${VMCONTEXT}) exten => _*98.,n,Macro(hangupcall,) ; end of [app-dialvm] [from-sip-external] exten => _+X.,1,Set(IP=${CHANNEL(peerip)}) exten => _+X.,n,Verbose(Received incoming SIP connection from unknown peer ${IP} to ${EXTEN}) exten => _+X.,n,Set(DID=${IF($["${EXTEN:1:2}"=""]?s:${EXTEN})}) exten => _+X.,n,GotoIf($["${ALLOW_SIP_ANON}"="yes"]?from-trunk,${DID},1) exten => _+X.,n,Hangup exten => _X.,1,Set(IP=${CHANNEL(peerip)}) exten => _X.,n,Verbose(Received incoming SIP connection from unknown peer ${IP} to ${EXTEN}) exten => _X.,n,Set(DID=${IF($["${EXTEN:1:2}"=""]?s:${EXTEN})}) exten => _X.,n,GotoIf($["${ALLOW_SIP_ANON}"="yes"]?from-trunk,${DID},1) exten => _X.,n,Hangup ; end of [from-sip-external] [macro-pinsets] include => macro-pinsets-custom exten => s,1,GotoIf(${ARG2} = 1?cdr,1) exten => s,n,ExecIf($["${DB(AMPUSER/${AMPUSER}/pinless)}" != "NOPASSWD"]?Authenticate(/etc/asterisk/pinset_${ARG1})) exten => cdr,1,ExecIf($["${DB(AMPUSER/${AMPUSER}/pinless)}" != "NOPASSWD"]?Authenticate(/etc/asterisk/pinset_${ARG1},a)) exten => cdr,n,Set(__CDRPINSET=1) ; end of [macro-pinsets]