; ; Extension Configuration for Asterisk ; [general] static = yes writeprotect = yes ;;; ; Global Extension Information ;;; [globals] ; Global variables to simulate macro return values macro_ReplaceAll_return = macro_groupcall_return = john_office = SIP/?_john_office david_office = SIP/?_david_office adam_office = SIP/?_adam_office cindy_office = SIP/?_cindy_office family_room = Zap/2 kitchen = SIP/?_kitchen john_bedroom1 = SIP/?_john_bedroom john_bedroom2 = Zap/5 john_bedroom = ${john_bedroom1}&${john_bedroom2} adam_bedroom = SIP/?_adam_bedroom cindy_bedroom1 = SIP/?_cindy_bedroom cindy_bedroom2 = Zap/3 cindy_bedroom = ${cindy_bedroom1}&${cindy_bedroom2} cell_20X3 = 1234567890 cell_21X3 = 1234567890 cell_22X3 = 1234567890 cell_23X3 = 1234567890 company_0 = home company_1 = cpc company_2 = cpts person_10 = main person_11 = support person_20 = cindy person_21 = john person_22 = adam person_23 = david function_0 = group function_1 = office function_2 = bedroom home_group = john_group&cindy_group&family_room&kitchen main_group = john_office&david_office&adam_office&cindy_office&family_room&kitchen&john_bedroom&adam_bedroom&cindy_bedroom support_group = ${main_group} cindy_group = cindy_office&cindy_bedroom john_group = john_office&john_bedroom adam_group = adam_office&adam_bedroom david_group = david_office cpc_main_queue = ${cindy_group} cpc_support_queue = ${john_group}&${adam_group}&${david_group} cpts_main_queue = ${cindy_group} cpts_support_queue = ${john_group}&${adam_group}&${david_group} [extensions] ; Change to internal context exten => _#.,1,Goto(internal,${EXTEN:1},1) ; Change to an outgoing context exten => _X.,1,GotoIf($[_${CHANNEL:0:3} = _SIP]?4:2) exten => _X.,2,SetVar(NewChannel=home) exten => _X.,3,Goto(5) exten => _X.,4,Cut(NewChannel=CHANNEL:4,_,1) exten => _X.,5,Goto(outgoing-${NewChannel},${EXTEN},1) [internal] ; Change to extensions context exten => _9.,1,Goto(extensions,${EXTEN:1},1) ; Internal Extensions exten => _XXXX,1,Macro(ProcessInternal,${EXTEN},${CHANNEL}) ; Global Voicemail exten => 8000/_XX0X,1,VoiceMailMain(s1000) exten => 8000/_1[0-1][1-2]X,1,VoiceMailMain(s${CALLERIDNUM:0:3}0) exten => 8000/_2[0-3][1-2]X,1,VoiceMailMain(s${CALLERIDNUM:0:3}0) ; Conference Bridge exten => _82[0-1]X,1,Meetme(${EXTEN}|Ms) ; Time exten => 8800,1,Goto(incoming-did,4989,1) ; Recording exten => 8810,1,Macro(Record,/tmp/asterisk-recording) ; Invalid Handler exten => i,1,Playback(tt-weasels) exten => i,2,Playback(vm-goodbye) exten => i,3,Hangup() ;;; ; Incoming Calls ;;; [incoming-fxo] exten => s,1,Dial(Zap/6) [incoming-t1] ; Handle DID Numbers exten => _99912345[6-8]X,1,Goto(incoming-did,${EXTEN:6},1) ; Handle the main numbers exten => 9991234567,1,Macro(SetupDID,${home_group},home,1000) exten => 9991234568,1,Dial(Zap/6) exten => 9991234569,1,Goto(incoming-did,4961,1) exten => 9991234570,1,Goto(incoming-did,4962,1) [incoming-did] ; Cobalt Pointe Consulting exten => 4960,1,Macro(SetupDID,${cpc_main_queue},cpc,1010) exten => 4961,1,Macro(SetupDID,${cindy_group},cpc,2010) exten => 4962,1,Macro(SetupDID,${john_group},cpc,2110) exten => 4963,1,Macro(SetupDID,${adam_group},cpc,2210) exten => 4964,1,Macro(SetupDID,${david_group},cpc,2310) exten => 4966,1,Macro(SetupDID,${cpc_support_queue},cpc,1110) exten => 4969,1,Dial(Zap/6) ; Cobalt Pointe Technical Services exten => 4970,1,Macro(SetupDID,${cpts_main_queue},cpts,1020) exten => 4971,1,Macro(SetupDID,${cindy_group},cpts,2020) exten => 4972,1,Macro(SetupDID,${john_group},cpts,2120) exten => 4973,1,Macro(SetupDID,${adam_group},cpts,2220) exten => 4974,1,Macro(SetupDID,${david_group},cpts,2320) exten => 4976,1,Macro(SetupDID,${cpts_support_queue},cpts,1120) exten => 4979,1,Dial(Zap/6) ; Time Service exten => 4989,1,Wait(2) exten => 4989,2,SayUnixTime(||\'beep\' IMp \'vm-for\' ABd) exten => 4989,3,Wait(5) exten => 4989,4,Goto(2) ; Voice Mail Access exten => 4988,1,Wait(2) exten => 4988,2,VoiceMailMain() exten => 4988,3,Hangup ;;; ; Outgoing Calls ;;; [outgoing-home] exten => _X.,1,SetCIDNum(999-123-4571) exten => _X.,2,SetCIDName(Preston Residence) exten => _X.,3,Goto(outgoing,${EXTEN},1) [outgoing-cpc] exten => _X.,1,SetCIDNum(999-123-4572) exten => _X.,2,SetCIDName(Cobalt Pointe Consulting) exten => _X.,3,Goto(outgoing,${EXTEN},1) [outgoing-cpts] exten => _X.,1,SetCIDNum(999-123-4573) exten => _X.,2,SetCIDName(Cobalt Pointe Technical Services) exten => _X.,3,Goto(outgoing,${EXTEN},1) [outgoing] include => outgoing-local include => outgoing-longdistance ; DID Numbers stay in the system exten => _99912345[6-8]X,1,Goto(incoming-did,${EXTEN:6},1) ; Easter Egg exten => 8675309,1,Mp3Player(/var/lib/asterisk/sounds/jenny.mp3) [outgoing-local] exten => _N11,1,Dial(Zap/1/${EXTEN}) exten => _404XXXXXXX,1,Dial(Zap/1/${EXTEN}||d) exten => _770XXXXXXX,1,Dial(Zap/1/${EXTEN}|d) exten => _678XXXXXXX,1,Dial(Zap/1/${EXTEN}||d) exten => _1404XXXXXXX,1,Dial(Zap/1/${EXTEN:1}||d) exten => _1770XXXXXXX,1,Dial(Zap/1/${EXTEN:1}||d) exten => _1678XXXXXXX,1,Dial(Zap/1/${EXTEN:1}||d) [outgoing-longdistance] exten => _1NXXXXXXXXX,1,Dial(Zap/1/${EXTEN}) exten => _NXXXXXXXXX,1,Dial(Zap/1/1${EXTEN}) ;;; ; Macros ;;; [macro-SetupDID] exten => s,1,Macro(GroupCall,${ARG1},${CHANNEL}) exten => s,2,Macro(ReplaceAll,${macro_GroupCall_return},?,${ARG2}) exten => s,3,Dial(${macro_ReplaceAll_return}|15|Tt) exten => s,4,VoiceMail(u${ARG3}) exten => s,5,Goto(200) exten => s,104,VoiceMail(b${ARG3}) exten => s,105,Goto(200) exten => s,200,Playback(vm-goodbye) exten => s,201,Hangup() [macro-ReplaceAll] ; Initialize variables exten => s,1,SetVar(source=${ARG1}) exten => s,2,SetVar(dest=) exten => s,3,SetVar(a=${ARG2}) exten => s,4,SetVar(b=${ARG3}) exten => s,5,Goto(10) ; While string a is in source, replace a with b (dumping it into dest) exten => s,10,Cut(tmp=source,${a},1) exten => s,11,Cut(source=source,${a},2-) exten => s,12,GotoIf($["${source}" = ""]?90) exten => s,13,SetVar(dest=${dest}${tmp}${b}) exten => s,14,Goto(10) exten => s,90,SetVar(dest=${dest}${tmp}) exten => s,91,Goto(100) exten => s,100,SetVar(macro_ReplaceAll_return=${dest}) [macro-Record] exten => s,1,Wait(2) exten => s,2,Record(${ARG1}:gsm) exten => s,3,Wait(1) exten => s,4,Playback(${ARG1}) exten => s,6,Hangup [macro-ProcessInternal] ; Setup variables exten => s,1,SetVar(extension=${ARG1}) exten => s,2,SetVar(channel=${ARG2}) exten => s,3,Goto(20) ; Handle Call Types exten => s,20,GotoIf($[${extension:-1} >= 0 & ${extension:-1} <= 5]?21:3000) exten => s,21,Goto(1${extension:-1}00) ; Group Call exten => s,1000,Goto(2000) ; Office Call exten => s,1100,Goto(2000) ; Bedroom Call exten => s,1200,Goto(2000) ; Cell Call exten => s,1300,Goto(extensions,${cell_${extension:0:2}X${extension:-1}},1) ; Leave Voicemail exten => s,1400,VoiceMail(${extension:0:3}0) exten => s,1401,Playback(vm-goodbye) exten => s,1402,Hangup() ; Check Voicemail exten => s,1500,Wait(2) exten => s,1501,Playback(voicemail/default/${extension:1}0/greet) exten => s,1502,VoiceMailMain(${extension:0:3}0) exten => s,1503,Hangup() ; Handle Group, Office and Bedroom calls. exten => s,2000,SetVar(front=${person_${extension:0:2}}) exten => s,2001,SetVar(back=${function_${extension:3:1}}) exten => s,2002,GotoIf($["${front}" = "" | "${back}" = ""]?3000) exten => s,2003,GotoIf($["${back}" = "group"]?2010:2020) exten => s,2010,Macro(GroupCall,${${front}_${back}},${CHANNEL}) exten => s,2011,Goto(2030) exten => s,2020,Macro(GroupCall,${front}_${back},${CHANNEL}) exten => s,2021,Goto(2030) exten => s,2030,Macro(ReplaceAll,${macro_groupcall_return},?,${company_${extension:2:1}}) exten => s,2031,GotoIf($["${macro_ReplaceAll_return}" = ""]?3000) exten => s,2032,Dial(${macro_ReplaceAll_return}||Tt) exten => s,3000,Goto(internal,i,1) [macro-GroupCall] ; Initialize variables exten => s, 1, SetVar(final_channel_list=) exten => s, 2, SetVar(possible_names_list=${ARG1}) exten => s, 3, SetVar(channel_to_remove=${ARG2}) exten => s, 4, Cut(channel_to_remove=channel_to_remove,-,1) exten => s, 5, Cut(tmp_channel=channel_to_remove,_,2-) exten => s, 6, GotoIf($[_${tmp_channel} = _]?8) exten => s, 7, SetVar(channel_to_remove=${tmp_channel}) exten => s, 8, Goto(13) ; Start outer loop ; Pop next name exten => s,13, Cut(this_name=possible_names_list,&,1) exten => s,14, Cut(possible_names_list=possible_names_list,&,2-) exten => s,15, NoOp();this_name=${this_name}) exten => s,16, NoOp();possible_names_list=${possible_names_list}) exten => s,17, SetVar(channel_list=${${this_name}}) exten => s,18, SetVar(a_channel_match=0) ; Start inner loop ; Pop next channel exten => s,19, Cut(this_channel=channel_list,&,1) exten => s,20, Cut(channel_list=channel_list,&,2-) exten => s,21, Cut(tmp_channel=this_channel,_,2-) exten => s,22, GotoIf($[_${tmp_channel} = _]?24) exten => s,23, GotoIf($[_${tmp_channel} = _${channel_to_remove}]?30:32) exten => s,24, GotoIf($[_${this_channel} = _${channel_to_remove}]?30:32) exten => s,30, SetVar(a_channel_match=1) exten => s,31, Goto(33) exten => s,32, GotoIf($[_${channel_list} = _]?33:19) exten => s,33, GotoIf($[${a_channel_match}]?13:34) exten => s,34, SetVar(final_channel_list=${final_channel_list}&${${this_name}}) exten => s,35, GotoIf($[_${possible_names_list} = _]?46:13) exten => s,46, NoOp();final_channel_list=${final_channel_list}) exten => s,47, SetVar(macro_GroupCall_return=${final_channel_list:1})