;****************************************************************************************** ; Start Call Forwarding ;****************************************************************************************** ; ;; Here's a snippet from my extensions.conf which allows a particular user to activate/deactivate his VM & CF ;; The code should be pretty straight-forward ;; send suggestions/improvements to [mstan AT asesoft.ro] ;; ;; NOTE; some asterisk users might note that my dialvmcf macro only works on one extension type (SIP here) ;; I'm still looking for a way to re-route the CF number; eg if the number becins with 0, route it to ZAP etc ;Default Voicemail status ;DEFAULTVMSTATUS=0 ; 0 - inactive, 1 - active ;Default call Forwarding status: ;DEFAULTCFSTATUS=0 ; 0 - no CF, any other number - redirect to it ;Default password for extensions setup ;DEFAULTPASSWORD=1234 ;[macro-goodbye] ;exten => s,1,Playback(vm-goodbye) ;exten => s,2,Hangup() ;; This is my own adaptation of macro-stdexten, taking into account the new VM&CF statuses: ;[macro-dialvmcf] ; ; Dialing routine for our SIP extensions, with CF & VM ; ${ARG1} - Calling Extension ; ${ARG2} - Called Extension ; ;exten => s,1,DBGet(cfstatus=cfstatus/${ARG2}) ;exten => s,2,NoOp(${cfstatus}) ;exten => s,3,DBGet(vmstatus=vmstatus/${ARG2}) ;exten => s,4,NoOp(${vmstatus}) ;exten => s,5,SetVar(where=${ARG2}) ; by default, dial to ARG2; assembly-style ;exten => s,6,GotoIf($[${cfstatus} = 0]?s,8) ; No CF, will ring locally ;exten => s,7,SetVar(where=${cfstatus}) ; We have CF, follow ;exten => s,8,NoOp($[${vmstatus} = 0]) ;exten => s,9,GotoIf($[${vmstatus} = 0]?s,120) ; No VM either ;exten => s,10,Dial(SIP/${where},20,rt) ; Ring the interface, 20 seconds maximum ;exten => s,11,Goto(s-${DIALSTATUS},1) ; Jump based on status (NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER) ;exten => s-NOANSWER,1,Voicemail(u${ARG2}) ; If unavailable, send to voicemail w/ unavail announce ; ;exten => s-BUSY,1,Voicemail(b${ARG2}) ; If busy, send to voicemail w/ busy announce ; ;exten => _s-.,1,Goto(s-NOANSWER,1) ; Treat anything else as no answer ; ;exten => a,1,VoicemailMain(${ARG2}) ; If they press *, send the user into VoicemailMain ; ;exten => s,102,SetVar(cfstatus=${DEFAULTCFSTATUS}) ;exten => s,103,Goto(s,2) ;exten => s,104,SetVar(vmstatus=${DEFAULTVMSTATUS}) ;exten => s,105,Goto(s,4) ; ;exten => s,120,Dial(SIP/${where},20,rt) ; Ring the interface, 20 seconds maximum ;exten => s,121,Playback(vm-isunavail) ; Your calling party is unavailable. ;exten => s,122,Hangup ; ;; ;; User Call forwarding setup ;; ; ;[user-setup] ;exten => i,1,Playback(invalid) ;exten => i,2,Goto(s,4) ; ;exten => t,1,Goto(#,1) ; ;exten => s,1,Answer ;exten => s,2,Playback(optdata/vm-welcome) ; Welcome to extension setup ;exten => s,3,Macro(authenticate,${CALLERIDNUM}) ; ;exten => s,4,Background(optdata/vm-menu1) ; To setup voice mail, press 1. ;exten => s,5,Background(optdata/vm-menu2) ; To setup call forwarding, press 2. ;exten => s,6,Background(optdata/vm-menu8) ; To change your password, press 8. ;exten => s,7,Background(optdata/vm-help-or-exit) ; Press Star for help or pound to exit ; ;exten => *,1,Goto(s,4) ;exten => 1,1,Goto(setup-vm,s,1) ;exten => 2,1,Goto(setup-cf,s,1) ;exten => 8,1,Macro(setup-pass,${CALLERIDNUM}) ;exten => 8,2,Goto(s,4) ;exten => #,1,Macro(goodbye) ;; ; ;; ;; Setup Voice Mail ;; ;[setup-vm] ;exten => t,1,Goto(#,1) ; ;exten => s,1,DBGet(status=vmstatus/${CALLERIDNUM}) ;exten => s,2,Playback(optdata/vm-vmstatus) ; Your voice mail status is currently... ; ;exten => s,3,GotoIf(${status} = "1"?s,6) ;exten => s,4,Playback(optdata/vm-inactive) ; inactive ;exten => s,5,Goto(s,7) ;exten => s,6,Playback(optdata/vm-active) ; active ;exten => s,7,Wait,1 ; ; ;exten => s,8,Background(optdata/vm-activate) ; To activate voice mail, press 1. ;exten => s,9,Background(optdata/vm-deactivate) ; To deactivate voice mail, press 2. ;exten => s,10,Background(optdata/vm-menu9) ; To return to main menu, press 9. ; ;exten => s,11,Background(optdata/vm-help-or-exit) ; Press star for help or pound to exit ;exten => s,12,Wait(1) ; ;;exten => s,13,SayDigits(${CALLERIDNUM}) ; ;exten => 1,1,DBPut(vmstatus/${CALLERIDNUM}=1) ;exten => 1,2,Goto(setup-vm,s,1) ; ;exten => 2,1,DBPut(vmstatus/${CALLERIDNUM}=0) ;;exten => 2,2,Goto(setup-vm,s,1) ; ;exten => 9,1,Goto(user-setup,s,4) ;exten => *,1,Goto(setup-vm,s,2) ;exten => #,1,Macro(goodbye) ; ; ;; ;; Setup Call Forwarding ;; ; ;[setup-cf] ;exten => t,1,Goto(#,1) ; ;exten => s,1,Macro(cfstatus,${CALLERIDNUM}) ;exten => s,2,Background(optdata/vm-cf-activate) ; To activate voice mail, press 1. ;exten => s,3,Background(optdata/vm-cf-deactivate) ; To deactivate voice mail, press 2. ;exten => s,4,Background(optdata/vm-menu9) ; To return to main menu, press 9. ; ;exten => s,5,Background(help-or-exit) ; Press star for help or pound to exit ;exten => s,6,Wait(1) ; ; ;exten => 1,1,SetVar(numTries=1) ;exten => 1,2,Read(cf,optdata/vm-enter-number) ;exten => 1,3,GotoIf($[${LEN(${cf})} = 0]?1,120) ;exten => 1,4,DBPut(cfstatus/${CALLERIDNUM}=${cf}) ;exten => 1,5,Goto(s,1) ; ;exten => 1,120,SetVar(numTries=$[${numTries} + 1]) ;;exten => 1,121,GotoIf($[${numTries} < 3]?1,2) ;exten => 1,122,Playback(optdata/vm-cf-failed) ; Failed to activate call forwarding. ;exten => 1,123,Macro(goodbye) ; ;exten => 2,1,DBPut(cfstatus/${CALLERIDNUM}=0) ;exten => 2,2,Goto(s,1) ; ;exten => 9,1,Goto(user-setup,s,4) ;exten => *,1,Goto(s,2) ;exten => #,1,Macro(goodbye) ;;; ; ; ;[macro-setup-pass] ; ;exten => s,1,SetVar(numTries=0) ; ;exten => s,2,Read(secret1,optdata/vm-enter-new-password,4) ;Please enter your new password ;exten => s,3,NoOp(${LEN(${secret1})}) ;exten => s,4,GotoIf($[${LEN(${secret1})} != 4]?s,120) ; ;exten => s,5,Read(secret2,optdata/vm-again,4) ;Again ;exten => s,6,GotoIf($[${LEN(${secret2})} != 4]?s,120) ; ;exten => s,7,GotoIf($["${secret1}" != "${secret2}"]?s,130) ; ;exten => s,8,DBPut(PASS/${ARG1}=${secret1}) ;exten => s,9,Playback(optdata/vm-password-updated) ;Password successfully updated. ;;exten => s,10,Goto(user-setup,s,4) ;Return to extension menu ; ;exten => s,120,Playback(optdata/vm-password-invalid) ;exten => s,121,Goto(s,150) ; ;exten => s,130,Playback(optdata/vm-password-mismatch) ;exten => s,131,Goto(s,150) ; ;exten => s,150,SetVar(numTries=$[${numTries} + 1]) ;exten => s,151,GotoIf($[${numTries} < 3]?s,2) ;exten => s,152,Playback(optdata/vm-failed-change) ;Failed to change your password. ;exten => s,153,Macro(goodbye) ; ;;; ; ;[macro-authenticate] ;; ;; ${ARG1} CALLERIDNUM ;; ; ;exten => s,1,SetVar(numTries=0) ; ;exten => s,2,DBGet(password=PASS/${ARG1}) ; ;exten => s,3,Read(secret,as-enter-password,4) ;Please enter your password ; ;exten => s,4,GotoIf($["${secret}" != "${password}"]?s,150) ;exten => s,5,Playback(as-password-accepted) ;Password accepted ;exten => s,6,Goto(s,160) ; ;exten => s,103,DBPut(PASS/${ARG1}=${DEFAULTPASSWORD}) ;exten => s,104,Goto(s,2) ; ;exten => s,150,Playback(as-password-invalid) ;exten => s,151,SetVar(numTries=$[${numTries} + 1]) ;exten => s,152,NoOp(${numTries}) ;exten => s,153,GotoIf($[${numTries} < 3]?s,3) ;exten => s,154,Macro(goodbye) ; ;exten => s,160,NoOp() ; ;[macro-cfstatus] ;; ;; ARG1 - extension ;; ;exten => s,1,DBGet(status=cfstatus/${ARG1}) ;exten => s,2,Playback(optdata/vm-cfstatus) ; Your call forwarding status is currently... ; ;exten => s,3,NoOp($[${status} != 0]); ; ;exten => s,4,GotoIf($[${status} != 0]?s,7) ;exten => s,5,Playback(optdata/vm-inactive) ; inactive ;exten => s,6,Goto(s,10) ;exten => s,7,Playback(optdata/vm-active) ; active ;exten => s,8,Playback(optdata/vm-forwarded) ; All calls are forwarded to... ;exten => s,9,SayDigits(${status}) ;exten => s,10,Wait,1 ; ; ;exten => s,102,DBPut(cfstatus/${ARG1}=${DEFAULTCFSTATUS}) ;exten => s,103,Goto(s,1) ;;; ;; ;;****************************************************************************************** ;; Stop Call Forwarding ;;******************************************************************************************