Asterisk (FreePBX) Kein Raustelefonieren möglich "Busy"
Hallo alle zusammen,
und zwar harbe ich ein Problem. Ich habe einen VOIP-Telekom-Anschluss und möchte jetzt Asterisk als VOIP-Server nutzen.
Als Router wird Pfsense genutzt, Ports werden zu dem Asterisk-Server weitergeleitet.
Rein telefonieren kann ich.
Pfsense Nat Port-Forward:
Wenn ich jetzt raus telefonieren möchte, bekomme ich die Ansage das der Anruf "busy" ist.
Errorlog:
extensions.con:
extensions_additional.conf
pjsip.aor.conf:
pjsip.auth.conf
pjsip.conf
pjsip.endpoint.conf
pjsip.identify.conf
pjsip.registration.conf
pjsip.transports.conf
pjsip_notify.conf
Vor diesem Versuch hatte ich Asterisk über Debian 8 installiert und konnte da nur max 1min telefonieren, rein und raus!!!
Es muss irgendetwas an der Config sein, ich habe auch keine Ahnung was.
und zwar harbe ich ein Problem. Ich habe einen VOIP-Telekom-Anschluss und möchte jetzt Asterisk als VOIP-Server nutzen.
Als Router wird Pfsense genutzt, Ports werden zu dem Asterisk-Server weitergeleitet.
Rein telefonieren kann ich.
Pfsense Nat Port-Forward:
Wenn ich jetzt raus telefonieren möchte, bekomme ich die Ansage das der Anruf "busy" ist.
Errorlog:
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [+49{Telefonnummer Extern}@from-internal:1] Macro("PJSIP/300-00000012", "user-callerid,LIMIT,EXTERNAL,") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:1] Set("PJSIP/300-00000012", "TOUCH_MONITOR=1477514006.92") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:2] Set("PJSIP/300-00000012", "AMPUSER=300") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:3] GotoIf("PJSIP/300-00000012", "0?report") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:4] ExecIf("PJSIP/300-00000012", "1?Set(REALCALLERIDNUM=300)") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:5] Set("PJSIP/300-00000012", "AMPUSER=300") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:6] GotoIf("PJSIP/300-00000012", "0?limit") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:7] Set("PJSIP/300-00000012", "AMPUSERCIDNAME=User") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:8] GotoIf("PJSIP/300-00000012", "0?report") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:9] Set("PJSIP/300-00000012", "AMPUSERCID=300") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:10] Set("PJSIP/300-00000012", "__DIAL_OPTIONS=Ttr") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:11] Set("PJSIP/300-00000012", "CALLERID(all)="User" <300>") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:12] GotoIf("PJSIP/300-00000012", "0?limit") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:13] ExecIf("PJSIP/300-00000012", "1?Set(GROUP(concurrency_limit)=300)") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:14] GosubIf("PJSIP/300-00000012", "7?sub-ccss,s,1(from-internal,)") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@sub-ccss:1] ExecIf("PJSIP/300-00000012", "0?Return()") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@sub-ccss:2] Set("PJSIP/300-00000012", "CCSS_SETUP=TRUE") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@sub-ccss:3] GosubIf("PJSIP/300-00000012", "0?monitor_config,1(from-internal,):monitor_default,1(from-internal,)") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [monitor_default@sub-ccss:1] GotoIf("PJSIP/300-00000012", "0?is_exten") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [monitor_default@sub-ccss:2] StackPop("PJSIP/300-00000012", "") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [monitor_default@sub-ccss:3] Return("PJSIP/300-00000012", "FALSE") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:15] ExecIf("PJSIP/300-00000012", "0?Set(CHANNEL(language)=)") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:16] GotoIf("PJSIP/300-00000012", "1?continue") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx_builtins.c: Goto (macro-user-callerid,s,30)
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:30] Set("PJSIP/300-00000012", "CALLERID(number)=300") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:31] Set("PJSIP/300-00000012", "CALLERID(name)=User") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:32] Set("PJSIP/300-00000012", "CDR(cnum)=300") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:33] Set("PJSIP/300-00000012", "CDR(cnam)=User") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-user-callerid:34] Set("PJSIP/300-00000012", "CHANNEL(language)=en") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [+49{Telefonnummer Extern}@from-internal:2] Gosub("PJSIP/300-00000012", "sub-record-check,s,1(out,+49{Telefonnummer Extern},dontcare)") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@sub-record-check:1] GotoIf("PJSIP/300-00000012", "0?initialized") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@sub-record-check:2] Set("PJSIP/300-00000012", "__REC_STATUS=INITIALIZED") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@sub-record-check:3] Set("PJSIP/300-00000012", "NOW=1477514006") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@sub-record-check:4] Set("PJSIP/300-00000012", "__DAY=26") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@sub-record-check:5] Set("PJSIP/300-00000012", "__MONTH=10") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@sub-record-check:6] Set("PJSIP/300-00000012", "__YEAR=2016") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@sub-record-check:7] Set("PJSIP/300-00000012", "__TIMESTR=20161026-223326") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@sub-record-check:8] Set("PJSIP/300-00000012", "__FROMEXTEN=300") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@sub-record-check:9] Set("PJSIP/300-00000012", "__MON_FMT=wav") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@sub-record-check:10] NoOp("PJSIP/300-00000012", "Recordings initialized") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@sub-record-check:11] ExecIf("PJSIP/300-00000012", "0?Set(ARG3=dontcare)") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@sub-record-check:12] Set("PJSIP/300-00000012", "REC_POLICY_MODE_SAVE=") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@sub-record-check:13] ExecIf("PJSIP/300-00000012", "0?Set(REC_STATUS=NO)") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@sub-record-check:14] GotoIf("PJSIP/300-00000012", "3?checkaction") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx_builtins.c: Goto (sub-record-check,s,17)
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@sub-record-check:17] GotoIf("PJSIP/300-00000012", "1?sub-record-check,out,1") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx_builtins.c: Goto (sub-record-check,out,1)
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [out@sub-record-check:1] NoOp("PJSIP/300-00000012", "Outbound Recording Check from 300 to +49{Telefonnummer Extern}") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [out@sub-record-check:2] Set("PJSIP/300-00000012", "RECMODE=dontcare") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [out@sub-record-check:3] ExecIf("PJSIP/300-00000012", "1?Goto(routewins)") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx_builtins.c: Goto (sub-record-check,out,7)
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [out@sub-record-check:7] Gosub("PJSIP/300-00000012", "recordcheck,1(dontcare,out,+49{Telefonnummer Extern})") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [recordcheck@sub-record-check:1] NoOp("PJSIP/300-00000012", "Starting recording check against dontcare") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [recordcheck@sub-record-check:2] Goto("PJSIP/300-00000012", "dontcare") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx_builtins.c: Goto (sub-record-check,recordcheck,3)
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [recordcheck@sub-record-check:3] Return("PJSIP/300-00000012", "") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [out@sub-record-check:8] Return("PJSIP/300-00000012", "") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [+49{Telefonnummer Extern}@from-internal:3] ExecIf("PJSIP/300-00000012", "0 ?Set(CDR(accountcode)=)") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [+49{Telefonnummer Extern}@from-internal:4] Set("PJSIP/300-00000012", "MOHCLASS=default") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [+49{Telefonnummer Extern}@from-internal:5] ExecIf("PJSIP/300-00000012", "1?Set(TRUNKCIDOVERRIDE="User" <0{Telefonnummer Intern}>)") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [+49{Telefonnummer Extern}@from-internal:6] Set("PJSIP/300-00000012", "_NODEST=") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [+49{Telefonnummer Extern}@from-internal:7] Macro("PJSIP/300-00000012", "dialout-trunk,2,+49{Telefonnummer Extern},,off") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:1] Set("PJSIP/300-00000012", "DIAL_TRUNK=2") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:2] GosubIf("PJSIP/300-00000012", "0?sub-pincheck,s,1()") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:3] GotoIf("PJSIP/300-00000012", "0?disabletrunk,1") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:4] Set("PJSIP/300-00000012", "DIAL_NUMBER=+49{Telefonnummer Extern}") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:5] Set("PJSIP/300-00000012", "DIAL_TRUNK_OPTIONS=Ttr") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:6] Set("PJSIP/300-00000012", "OUTBOUND_GROUP=OUT_2") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:7] GotoIf("PJSIP/300-00000012", "0?nomax") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:8] GotoIf("PJSIP/300-00000012", "0?chanfull") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:9] GotoIf("PJSIP/300-00000012", "0?skipoutcid") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:10] Set("PJSIP/300-00000012", "DIAL_TRUNK_OPTIONS=Tt") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:11] Macro("PJSIP/300-00000012", "outbound-callerid,2") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-outbound-callerid:1] ExecIf("PJSIP/300-00000012", "0?Set(CALLERPRES()=)") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-outbound-callerid:2] ExecIf("PJSIP/300-00000012", "0?Set(REALCALLERIDNUM=300)") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-outbound-callerid:3] GotoIf("PJSIP/300-00000012", "1?normcid") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx_builtins.c: Goto (macro-outbound-callerid,s,6)
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-outbound-callerid:6] Set("PJSIP/300-00000012", "USEROUTCID=") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-outbound-callerid:7] Set("PJSIP/300-00000012", "EMERGENCYCID=") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-outbound-callerid:8] Set("PJSIP/300-00000012", "TRUNKOUTCID=0{Telefonnummer Intern}") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-outbound-callerid:9] GotoIf("PJSIP/300-00000012", "1?trunkcid") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx_builtins.c: Goto (macro-outbound-callerid,s,14)
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-outbound-callerid:14] ExecIf("PJSIP/300-00000012", "1?Set(CALLERID(all)=0{Telefonnummer Intern})") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-outbound-callerid:15] ExecIf("PJSIP/300-00000012", "0?Set(CALLERID(all)=)") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-outbound-callerid:16] ExecIf("PJSIP/300-00000012", "1?Set(CALLERID(all)=User <0{Telefonnummer Intern}>)") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-outbound-callerid:17] ExecIf("PJSIP/300-00000012", "0?Set(CALLERPRES()=prohib_passed_screen)") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-outbound-callerid:18] Set("PJSIP/300-00000012", "CDR(outbound_cnum)=0{Telefonnummer Intern}") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-outbound-callerid:19] Set("PJSIP/300-00000012", "CDR(outbound_cnam)=User") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:12] GosubIf("PJSIP/300-00000012", "0?sub-flp-2,s,1()") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:13] Set("PJSIP/300-00000012", "OUTNUM=+49{Telefonnummer Extern}") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:14] Set("PJSIP/300-00000012", "custom=PJSIP") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:15] ExecIf("PJSIP/300-00000012", "0?Set(DIAL_TRUNK_OPTIONS=M(setmusic^default)Tt)") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:16] ExecIf("PJSIP/300-00000012", "0?Set(DIAL_TRUNK_OPTIONS=TtM(confirm))") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:17] Macro("PJSIP/300-00000012", "dialout-trunk-predial-hook,") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk-predial-hook:1] MacroExit("PJSIP/300-00000012", "") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:18] GotoIf("PJSIP/300-00000012", "0?bypass,1") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:19] ExecIf("PJSIP/300-00000012", "1?Set(CONNECTEDLINE(num,i)=+49{Telefonnummer Extern})") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:20] ExecIf("PJSIP/300-00000012", "1?Set(CONNECTEDLINE(name,i)=CID:0{Telefonnummer Intern})") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:21] GotoIf("PJSIP/300-00000012", "0?customtrunk") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:22] Dial("PJSIP/300-00000012", "PJSIP/+49{Telefonnummer Extern}@Telekom,300,Tt") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] app_dial.c: Called PJSIP/+49{Telefonnummer Extern}@Telekom
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] app_dial.c: Everyone is busy/congested at this time (1:0/0/1)
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:23] NoOp("PJSIP/300-00000012", "Dial failed for some reason with DIALSTATUS = CHANUNAVAIL and HANGUPCAUSE = 21") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-dialout-trunk:24] GotoIf("PJSIP/300-00000012", "0?continue,1:s-CHANUNAVAIL,1") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx_builtins.c: Goto (macro-dialout-trunk,s-CHANUNAVAIL,1)
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s-CHANUNAVAIL@macro-dialout-trunk:1] Set("PJSIP/300-00000012", "RC=21") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s-CHANUNAVAIL@macro-dialout-trunk:2] Goto("PJSIP/300-00000012", "21,1") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx_builtins.c: Goto (macro-dialout-trunk,21,1)
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [21@macro-dialout-trunk:1] Goto("PJSIP/300-00000012", "continue,1") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx_builtins.c: Goto (macro-dialout-trunk,continue,1)
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [continue@macro-dialout-trunk:1] NoOp("PJSIP/300-00000012", "TRUNK Dial failed due to CHANUNAVAIL HANGUPCAUSE: 21 - failing through to other trunks") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [continue@macro-dialout-trunk:2] Set("PJSIP/300-00000012", "CALLERID(number)=300") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [+49{Telefonnummer Extern}@from-internal:8] Macro("PJSIP/300-00000012", "outisbusy,") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-outisbusy:1] Progress("PJSIP/300-00000012", "") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-outisbusy:2] GotoIf("PJSIP/300-00000012", "0?emergency,1") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-outisbusy:3] GotoIf("PJSIP/300-00000012", "0?intracompany,1") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-outisbusy:4] Playback("PJSIP/300-00000012", "all-circuits-busy-now&pls-try-call-later, noanswer") in new stack
[2016-10-26 22:33:26] VERBOSE[22441][C-00000009] file.c: <PJSIP/300-00000012> Playing 'all-circuits-busy-now.ulaw' (language 'en')
[2016-10-26 22:33:28] VERBOSE[22441][C-00000009] file.c: <PJSIP/300-00000012> Playing 'pls-try-call-later.ulaw' (language 'en')
[2016-10-26 22:33:30] VERBOSE[22441][C-00000009] pbx.c: Executing [s@macro-outisbusy:5] Congestion("PJSIP/300-00000012", "20") in new stack
[2016-10-26 22:33:30] WARNING[22441][C-00000009] channel.c: Prodding channel 'PJSIP/300-00000012' failed
[2016-10-26 22:33:30] VERBOSE[22441][C-00000009] app_macro.c: Spawn extension (macro-outisbusy, s, 5) exited non-zero on 'PJSIP/300-00000012' in macro 'outisbusy'
[2016-10-26 22:33:30] VERBOSE[22441][C-00000009] pbx.c: Spawn extension (from-internal, +49{Telefonnummer Extern}, 8) exited non-zero on 'PJSIP/300-00000012'
[2016-10-26 22:33:30] VERBOSE[22441][C-00000009] pbx.c: Executing [h@from-internal:1] Hangup("PJSIP/300-00000012", "") in new stack
[2016-10-26 22:33:30] VERBOSE[22441][C-00000009] pbx.c: Spawn extension (from-internal, h, 1) exited non-zero on 'PJSIP/300-00000012'
[2016-10-26 22:33:32] WARNING[13227] res_pjsip_pubsub.c: No registered publish handler for event presence
[2016-10-26 22:33:32] WARNING[13227] res_pjsip_pubsub.c: No registered subscribe handler for event presence.winfo
extensions.con:
;--------------------------------------------------------------------------------;
; Do NOT edit this file as it is auto-generated by FreePBX. All modifications to ;
; this file must be done via the web gui. There are alternative files to make ;
; custom modifications, details at: http://freepbx.org/configuration_files ;
;--------------------------------------------------------------------------------;
;*******************************************************************************
; AUTO-GENERATED AND CUSOTM USER DIALPLAN INCLUDED HERE *
;*******************************************************************************
;--------------------------------------------------------------------------------;
; Customizations to this dialplan should be made in extensions_custom.conf
; See extensions_custom.conf.sample for an example.
;
; If you need to use [macro-dialout-trunk-predial-hook], [ext-did-custom], or
; [from-internal-custom] for example, place these in this file or they will get overwritten.
;
; WARNING ABOUT: #include extensions_override_freepbx.conf
;
; This include file is put first to allow the auto-generated dialplan in FreePBX
; to be overwritten if necessary. Overriding auto-generated dialplan should be done
; with extreme caution. In almost all cases any custom dialplan SHOULD be put in
; extensions_custom.conf which will not hurt a FreePBX generated dialplan. In some
; very rare and custom situations users may have a need to override what FreePBX
; automatically generates. If so anything in this file will do that. If you come up
; with situations where you need to modify the existing dialplan or macros, put it
; here.
;
#include extensions_override_freepbx.conf
#include extensions_additional.conf
#include extensions_custom.conf
;--------------------------------------------------------------------------------;
;*******************************************************************************
; DIALPLAN OPEN TO THE PUBLIC, USING INBOUND DIDS AND SIMILAR *
;*******************************************************************************
;
;-------------------------------------------------------------------------------
; from-digital:
;
; Context to set for PRI's and equivalent
;
[from-digital]
include => from-pstn
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; from-analog:
;
; Context to set for analog DAHDi cards and equivalent
;
[from-analog]
include => from-dahdi
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; from-trunk:
;
; Context is really just an aliax of from-pstn
;
[from-trunk]
include => from-pstn
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; from-pstn:
;
; Entry context for calls from the outside world to hit FreePBX
[from-pstn]
include => from-pstn-custom ; create this context in extensions_custom.conf to include customizations
include => ext-did
include => ext-did-post-custom
include => from-did-direct
include => ext-did-catchall ; THIS MUST COME AFTER ext-did
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; from-pstn-e164-us:
;
; The context is designed for providers who send calls in e164 format and is
; biased towards NPA calls, callerid and dialing rules. It will do the following:
;
; DIDs in an NPA e164 format of +1NXXNXXXXXX will be converted to 10 digit DIDs
;
; DIDs in any other format will be delivered as they are, including e164 non NPA
; DIDs which means they will need the full format including the + in the inbound
; route.
;
; CallerID(number) presented in e164 NPA format will be trimmed to a 10 digit CID
;
; CallerID(number) presented in e164 non-NPA (country code other than 1) will be
; reformated from: +<CountryCode><Number> to 011<CountryCode><Number>
;
[from-pstn-e164-us]
exten => _+1NXXNXXXXXX/_+1NXXNXXXXXX,1,Set(CALLERID(number)=${CALLERID(number):2})
exten => _+1NXXNXXXXXX/_NXXNXXXXXX,2,Goto(from-pstn,${EXTEN:2},1)
exten => _+1NXXNXXXXXX/_+NX.,1,Set(CALLERID(number)=011${CALLERID(number):1})
exten => _+1NXXNXXXXXX/_011NX.,n,Goto(from-pstn,${EXTEN:2},1)
exten => _+1NXXNXXXXXX,1,Goto(from-pstn,${EXTEN:2},1)
exten => _[0-9+]./_+1NXXNXXXXXX,1,Set(CALLERID(number)=${CALLERID(number):2})
exten => _[0-9+]./_1NXXNXXXXXX,1,Set(CALLERID(number)=${CALLERID(number):1})
exten => _[0-9+]./_NXXNXXXXXX,n,Goto(from-pstn,${EXTEN},1)
exten => _[0-9+]./_+NX.,1,Set(CALLERID(number)=011${CALLERID(number):1})
exten => _[0-9+]./_011NX.,n,Goto(from-pstn,${EXTEN},1)
exten => _[0-9+].,1,Goto(from-pstn,${EXTEN},1)
exten => s/_+1NXXNXXXXXX,1,Set(CALLERID(number)=${CALLERID(number):2})
exten => s/_NXXNXXXXXX,n,Goto(from-pstn,${EXTEN},1)
exten => s/_+NX.,1,Set(CALLERID(number)=011${CALLERID(number):1})
exten => s/_011NX.,n,Goto(from-pstn,${EXTEN},1)
exten => s,1,Goto(from-pstn,${EXTEN},1)
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; from-pstn-to-did:
;
; The context is designed for providers who send the DID in the TO: SIP header
; only. The format of this header is:
;
; To: <sip:2125551212@172.31.74.25>
;
; So the DID must be extracted between the sip: and the @, which this does
;
[from-pstn-toheader]
exten => _.,1,Goto(from-pstn,${CUT(CUT(SIP_HEADER(To),@,1),:,2)},1)
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; from-sip-external
;
; This context is the default SIP context unless otherwise changed in the SIP
; Settings module or other sip configuration locations. This context is hit by
; either anonymous SIP calls or mis-configured SIP trunks when the incoming call
; can not be matched with a SIP section.
;
[from-sip-external]
exten => _.,1,NoOp(Received incoming SIP connection from unknown peer to ${EXTEN})
exten => _.,n,Set(DID=${IF($["${EXTEN:1:2}"=""]?s:${EXTEN})})
exten => _.,n,Goto(s,1)
exten => s,1,GotoIf($["${ALLOW_SIP_ANON}"="yes"]?checklang:noanonymous)
exten => s,n(checklang),GotoIf($["${SIPLANG}"!=""]?setlanguage:from-trunk,${DID},1)
exten => s,n(setlanguage),Set(CHANNEL(language)=${SIPLANG})
exten => s,n,Goto(from-trunk,${DID},1)
exten => s,n(noanonymous),Set(TIMEOUT(absolute)=15)
exten => s,n,Log(WARNING,"Rejecting unknown SIP connection from ${CHANNEL(recvip)}")
exten => s,n,Answer
exten => s,n,Wait(2)
exten => s,n,Playback(ss-noservice)
exten => s,n,Playtones(congestion)
exten => s,n,Congestion(5)
exten => h,1,Hangup
exten => i,1,Hangup
exten => t,1,Hangup
;-------------------------------------------------------------------------------
;*******************************************************************************
; INTERNAL DIALPLAN, NOT OPEN TO THE PUBLIC WORLD *
;*******************************************************************************
;
;-------------------------------------------------------------------------------
; from-internal:
;
; Internal dialplan that most internal phones have access to
;
[from-internal]
include => from-internal-noxfer
include => from-internal-xfer
include => bad-number ; auto-generated
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; from-internal-noxfer:
;
; Place to put internal dialplan that should not be accessible during a blind
; transfer, this context will not be visible during such.
;
[from-internal-noxfer]
include => from-internal-noxfer-custom
include => from-internal-noxfer-additional ; auto-generated
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; from-internal-xfer:
;
; Place to put most internal dialplan, will be visible during normal calls and
; blind transfers.
;
[from-internal-xfer]
include => from-internal-custom
include => from-internal-additional ; auto-generated
exten => s,1,Macro(hangupcall)
exten => h,1,Macro(hangupcall)
;-------------------------------------------------------------------------------
;*******************************************************************************
; INTERNAL MACROS & SPECIAL CONTEXTS *
;*******************************************************************************
;
;-------------------------------------------------------------------------------
; from-did-direct:
;
; forces ext-findmefollow to take precedence over ext-local. Also exposed to
; the public side to allow an extension number to be used as an external DID
; without requiring inbound routes to be created, common in many PRI installations
; where the last 4 digits are used as the extnension and DIDs are delivered in
; 4 digit formats.
;
[from-did-direct]
include => ext-findmefollow
include => ext-local
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; macro-dial:
;
; Rings one or more extensions. Handles things like call forwarding and DND
; We don't call dial directly for anything internal anymore.
; ARGS: $TIMER, $OPTIONS, $EXT1, $EXT2, $EXT3, ...
; Use a Macro call such as the following:
;
; Macro(dial,$DIAL_TIMER,$DIAL_OPTIONS,$EXT1,$EXT2,$EXT3,...)
;
[macro-dial]
exten => s,1,GotoIf($["${MOHCLASS}" = ""]?dial)
exten => s,n,Set(CHANNEL(musicclass)=${MOHCLASS})
exten => s,n(dial),AGI(dialparties.agi)
exten => s,n,NoOp(Returned from dialparties with no extensions to call and DIALSTATUS: ${DIALSTATUS})
exten => s,n+2(normdial),Dial(${ds}) ; dialparties will set the priority to 10 if $ds is not null
exten => s,n,Set(DIALSTATUS=${IF($["${DIALSTATUS_CW}"!="" ]?${DIALSTATUS_CW}:${DIALSTATUS})})
exten => s,n,GosubIf($[("${SCREEN}" != "" & ("${DIALSTATUS}" = "TORTURE" | "${DIALSTATUS}" = "DONTCALL")) | "${DIALSTATUS}" = "ANSWER"]?${DIALSTATUS},1)
exten => s,20(huntdial),NoOp(Returned from dialparties with hunt groups to dial )
exten => s,n,Set(HuntLoop=0)
exten => s,n(a22),GotoIf($[${HuntMembers} >= 1]?a30) ; if this is from rg-group, don't strip prefix
exten => s,n,NoOp(Returning there are no members left in the hunt group to ring)
; dialparties.agi has setup the dialstring for each hunt member in a variable labeled HuntMember0, HuntMember1 etc for each iteration
; and The total number in HuntMembers. So for each iteration, we will update the CALLTRACE Data.
;
exten => s,n+2(a30),Set(HuntMember=HuntMember${HuntLoop})
exten => s,n,GotoIf($[$["${CALLTRACE_HUNT}" != "" ] & $[$["${RingGroupMethod}" = "hunt" ] | $["${RingGroupMethod}" = "firstavailable"] | $["${RingGroupMethod}" = "firstnotonphone"]]]?a32:a35)
exten => s,n(a32),Set(CT_EXTEN=${CUT(FILTERED_DIAL,,$[${HuntLoop} + 1])})
exten => s,n,Set(DB(CALLTRACE/${CT_EXTEN})=${CALLTRACE_HUNT})
exten => s,n,Goto(s,a42)
;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
;
exten => s,n(a35),GotoIf($[$["${CALLTRACE_HUNT}" != "" ] & $["${RingGroupMethod}" = "memoryhunt" ]]?a36:a50)
exten => s,n(a36),Set(CTLoop=0)
exten => s,n(a37),GotoIf($[${CTLoop} > ${HuntLoop}]?a42) ; if this is from rg-group, don't strip prefix
exten => s,n,Set(CT_EXTEN=${CUT(FILTERED_DIAL,,$[${CTLoop} + 1])})
exten => s,n,Set(DB(CALLTRACE/${CT_EXTEN})=${CALLTRACE_HUNT})
exten => s,n,Set(CTLoop=$[1 + ${CTLoop}])
exten => s,n,Goto(s,a37)
exten => s,n(a42),Dial(${${HuntMember}}${ds})
exten => s,n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?ANSWER,1)
exten => s,n,Set(HuntLoop=$[1 + ${HuntLoop}])
exten => s,n,GotoIf($[$[$["foo${RingGroupMethod}" != "foofirstavailable"] & $["foo${RingGroupMethod}" != "foofirstnotonphone"]] | $["foo${DialStatus}" = "fooBUSY"]]?a46)
exten => s,n,Set(HuntMembers=0)
exten => s,n(a46),Set(HuntMembers=$[${HuntMembers} - 1])
exten => s,n,Goto(s,a22)
exten => s,n(a50),Noop(Deleting: CALLTRACE/${CT_EXTEN} ${DB_DELETE(CALLTRACE/${CT_EXTEN})})
exten => s,n,Goto(s,a42)
; For call screening
exten => NOANSWER,1,Macro(vm,${SCREEN_EXTEN},BUSY,${IVR_RETVM})
exten => NOANSWER,n,GotoIf($["${IVR_RETVM}" != "RETURN" | "${IVR_CONTEXT}" = ""]?bye)
exten => NOANSWER,n,Return
exten => NOANSWER,n(bye),Macro(hangupcall)
exten => TORTURE,1,Goto(app-blackhole,musiconhold,1)
exten => TORTURE,n,Macro(hangupcall)
exten => DONTCALL,1,Answer
exten => DONTCALL,n,Wait(1)
exten => DONTCALL,n,Zapateller()
exten => DONTCALL,n,Playback(ss-noservice)
exten => DONTCALL,n,Macro(hangupcall)
exten => ANSWER,1,Noop(Call successfully answered - Hanging up now)
exten => ANSWER,n,Macro(hangupcall,)
; make sure hungup calls go here so that proper cleanup occurs from call confirmed calls and the like
;
exten => h,1,Macro(hangupcall)
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; macro-get-vmcontext:
;
; returns the user's voicemail context
;
[macro-get-vmcontext]
exten => s,1,Set(VMCONTEXT=${DB(AMPUSER/${ARG1}/voicemail)})
exten => s,2,GotoIf($["foo${VMCONTEXT}" = "foo"]?200:300)
exten => s,200,Set(VMCONTEXT=default)
exten => s,300,NoOp()
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; macro-outisbusy:
;
; called if all trunks are busy. This macro is overwridden by the
; Outbound Route Messages module if installed and configured to provide
; better messages or choices of tones.
;
[macro-outisbusy]
exten => s,1,Progress
exten => s,n,Playback(all-circuits-busy-now,noanswer)
exten => s,n,Playback(pls-try-call-later,noanswer)
exten => s,n,Macro(hangupcall)
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; macro-dialout-trunk-predial-hook:
;
; this macro intentionally left blank so it may be safely overwritten for any custom
; requirements that an installation may have.
;
; the macro is called by macro-dialout-trunk just prior to making a Dial() attempt
; to a trunk.
;
; MACRO RETURN CODE: ${PREDIAL_HOOK_RET}
; if set to "BYPASS" then this trunk will be skipped
;
;
[macro-dialout-trunk-predial-hook]
exten => s,1,MacroExit()
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; macro-dialout-one-predial-hook
;
; this macro intentionally left blank so it may be safely overwritten for any custom
; requirements that an installation may have.
;
; the macro is called by macro-dialout-trunk just prior to making a Dial() attempt
; to an individual extension.
;
[macro-dialout-one-predial-hook]
exten => s,1,MacroExit()
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; macro-dialout-dundi-predial-hook:
;
; this macro intentionally left blank so it may be safely overwritten for any custom
; requirements that an installation may have.
;
; the macro is called by macro-dialout-dundi just prior to making a Dial() attempt
; to a trunk.
;
; MACRO RETURN CODE: ${PREDIAL_HOOK_RET}
; if set to "BYPASS" then this trunk will be skipped
;
;
[macro-dialout-dundi-predial-hook]
exten => s,1,MacroExit()
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; macro-user-logon:
;
; Used to log a user onto an adhoc device. Most of the work is done by
; user_login_out.agi AGI script
;
[macro-user-logon]
exten => s,1,Set(DEVICETYPE=${DB(DEVICE/${CALLERID(number)}/type)})
exten => s,n,Answer()
exten => s,n,Wait(1)
exten => s,n,GotoIf($["${DEVICETYPE}" = "fixed"]?s-FIXED,1)
; get user's extension
;
exten => s,n,Set(AMPUSER=${ARG1})
exten => s,n,GotoIf($["${AMPUSER}" != ""]?gotpass)
exten => s,n(playagain),Read(AMPUSER,please-enter-your-extension-then-press-pound,,,4)
; get user's password and authenticate
;
exten => s,n,GotoIf($["${AMPUSER}" = ""]?s-MAXATTEMPTS,1)
exten => s,n(gotpass),GotoIf($["${DB_EXISTS(AMPUSER/${AMPUSER}/password)}" = "0"]?s-NOUSER,1)
exten => s,n,Set(AMPUSERPASS=${DB_RESULT})
exten => s,n,GotoIf($[${LEN(${AMPUSERPASS})} = 0]?s-NOPASSWORD,1)
; do not continue if the user has already logged onto this device
;
exten => s,n,Set(DEVICEUSER=${DB(DEVICE/${CALLERID(number)}/user)})
exten => s,n,GotoIf($["${DEVICEUSER}" = "${AMPUSER}"]?s-ALREADYLOGGEDON,1)
exten => s,n,Authenticate(${AMPUSERPASS})
exten => s,n,AGI(user_login_out.agi,login,${CALLERID(number)},${AMPUSER})
exten => s,n,Playback(agent-loginok)
exten => s-FIXED,1,NoOp(Device is FIXED and cannot be logged into)
exten => s-FIXED,n,Playback(ha/phone)
exten => s-FIXED,n,SayDigits(${CALLERID(number)})
exten => s-FIXED,n,Playback(is-curntly-unavail&vm-goodbye)
exten => s-FIXED,n,Hangup ;TODO should play msg indicated device cannot be logged into
exten => s-ALREADYLOGGEDON,1,NoOp(This device has already been logged into by this user)
exten => s-ALREADYLOGGEDON,n,Playback(vm-goodbye)
exten => s-ALREADYLOGGEDON,n,Hangup ;TODO should play msg indicated device is already logged into
exten => s-NOPASSWORD,1,NoOp(This extension does not exist or no password is set)
exten => s-NOPASSWORD,n,Playback(pbx-invalid)
exten => s-NOPASSWORD,n,Goto(s,playagain)
exten => s-MAXATTEMPTS,1,NoOp(Too many login attempts)
exten => s-MAXATTEMPTS,n,Playback(vm-goodbye)
exten => s-MAXATTEMPTS,n,Hangup
exten => s-NOUSER,1,NoOp(Invalid extension ${AMPUSER} entered)
exten => s-NOUSER,n,Playback(pbx-invalid)
exten => s-NOUSER,n,Goto(s,playagain)
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; macro-user-logoff:
;
; Used to log a user off of an adhoc device. Most of the work is done by
; user_login_out.agi AGI script
;
[macro-user-logoff]
exten => s,1,Set(DEVICETYPE=${DB(DEVICE/${CALLERID(number)}/type)})
exten => s,n,GotoIf($["${DEVICETYPE}" = "fixed"]?s-FIXED,1)
exten => s,n,AGI(user_login_out.agi,logout,${CALLERID(number)})
exten => s,n(done),Playback(agent-loggedoff)
exten => s-FIXED,1,NoOp(Device is FIXED and cannot be logged out of)
exten => s-FIXED,n,Playback(an-error-has-occured&vm-goodbye)
exten => s-FIXED,n,Hangup ;TODO should play msg indicated device cannot be logged into
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; default
;
; FreePBX does not use the default context. This context is used by asterisk when
; it has no other information provided and needs to deliver a call. Hitting this means
; there has been some sort of configuration error, or a potential bug somehwere.
; This context can be reached from either internal or external sources.
;
[default]
include => ext-local
exten => s,1,Playback(vm-goodbye)
exten => s,n,Noop(ERROR: FreePBX Does not use the [default] context, confguration error)
exten => s,n,Macro(hangupcall)
;-------------------------------------------------------------------------------
;*******************************************************************************
; DEPRECATED DIALPLAN - THESE WILL BE REMOVED, NOT USED BY FREEPBX *
;*******************************************************************************
;
;-------------------------------------------------------------------------------
; macro-fixcid: [DEPRECATED]
;
; For some reason, if I don't run setCIDname, CALLERID(name) will be blank in my AGI
;
[macro-fixcid]
exten => s,1,Set(CALLERID(name)=${CALLERID(name)})
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; macro-sayXXXX: [DEPRECATED]
;
; Text-To-Speech related macros
; These all follow common actions. First try to playback a file "tts/custom-md5"
; where "md5" is the md5() of whatever is going to be played. If that doesn't exist,
; try to playback using macro-tts-sayXXXXX (where XXXXX is text/digits/etc, same as
; the macro below). If that macro exits with MACRO_OFFSET=100, then it's done,
; otherwise, fallback to the default asterisk method.
;
;-------------------------------------------------------------------------------
; macro-saytext: [DEPRECATED]
;
; say text is purely for text-to-speech, there is no fallback
;
[macro-saytext]
exten => s,1,Noop(Trying custom SayText playback for "${ARG1}")
exten => s,n,Playback(tts/custom-${MD5(${ARG1})})
exten => s,n,GotoIf($["${PLAYBACKSTATUS}"="SUCCESS"]?done)
; call tts-saytext. This should set MACRO_OFFSET=101 if it was successful
exten => s,n(tts),Macro(tts-saytext,${ARG1},${ARG2},${ARG3})
exten => s,n,Noop(No text-to-speech handler for SayText, cannot say "${ARG1}")
exten => s,n,Goto(done)
exten => s,tts+101,Noop(tts handled saytext)
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; macro-sayname: [DEPRECATED]
;
; say name is for saying names typically, but fallsback to using SayAlpha
; (saying the word letter-by-letter)
;
[macro-sayname]
exten => s,1,Noop(Trying custom SayName playback for "${ARG1}")
exten => s,n,Playback(tts/custom-${MD5(${ARG1})})
exten => s,n,GotoIf($["${PLAYBACKSTATUS}"="SUCCESS"]?done)
; call tts-sayalpha. This should set MACRO_OFFSET=101 if it was successful
exten => s,n(tts),Macro(tts-sayalpha,${ARG1},${ARG2},${ARG3})
exten => s,n,SayAlpha(${ARG1})
exten => s,n,Goto(done)
exten => s,tts+101,Noop(tts handled sayname)
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; macro-saynumber: [DEPRECATED]
;
; Say number is for saying numbers (eg "one thousand forty six")
;
[macro-saynumber]
exten => s,1,Noop(Trying custom SayNumber playback for "${ARG1}")
exten => s,n,Playback(tts/custom-${MD5(${ARG1})})
exten => s,n,GotoIf($["${PLAYBACKSTATUS}"="SUCCESS"]?done)
; call tts-saynumber. This should set MACRO_OFFSET=101 if it was successful
exten => s,n(tts),Macro(tts-saynumber,${ARG1},${ARG2},${ARG3})
exten => s,n,SayNumber(${ARG1})
exten => s,n,Goto(done)
exten => s,tts+101,Noop(tts handled saynumber)
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; macro-saydigits: [DEPRECATED]
;
; Say digits is for saying digits one-by-one (eg, "one zero four six")
;
[macro-saydigits]
exten => s,1,Noop(Trying custom SayDigits playback for "${ARG1}")
exten => s,n,Playback(tts/custom-${MD5(${ARG1})})
exten => s,n,GotoIf($["${PLAYBACKSTATUS}"="SUCCESS"]?done)
; call tts-saydigits. This should set MACRO_OFFSET=101 if it was successful
exten => s,n(tts),Macro(tts-saydigits,${ARG1},${ARG2},${ARG3})
exten => s,n,SayDigits(${ARG1})
exten => s,n,Goto(done)
;-------------------------------------------------------------------------------
extensions_additional.conf
;--------------------------------------------------------------------------------;
; Do NOT edit this file as it is auto-generated by FreePBX. ;
;--------------------------------------------------------------------------------;
; For information on adding additional paramaters to this file, please visit the ;
; FreePBX.org wiki page, or ask on IRC. This file was created by the new FreePBX ;
; BMO - Big Module Object. Any similarity in naming with BMO from Adventure Time ;
; is totally deliberate. ;
;--------------------------------------------------------------------------------;
[globals]
CFDEVSTATE = TRUE
CAMPONTOGGLE = *84
DNDDEVSTATE = TRUE
FMDEVSTATE = TRUE
QUEDEVSTATE = TRUE
DYNAMIC_FEATURES = apprecord
INTERCOMCODE = *80
ASTETCDIR = /etc/asterisk
ASTMODDIR = /usr/lib/asterisk/modules
ASTVARLIBDIR = /var/lib/asterisk
ASTAGIDIR = /var/lib/asterisk/agi-bin
ASTSPOOLDIR = /var/spool/asterisk
ASTRUNDIR = /var/run/asterisk
ASTLOGDIR = /var/log/asterisk
CWINUSEBUSY = true
AMPMGRUSER = admin
AMPMGRPASS = amp111
AMPDBENGINE = mysql
AMPDBHOST = localhost
AMPDBNAME = asterisk
AMPDBUSER = freepbxuser
AMPDBPASS = 4afed5a03531
VMX_CONTEXT = from-internal
VMX_PRI = 1
VMX_TIMEDEST_CONTEXT =
VMX_TIMEDEST_EXT = dovm
VMX_TIMEDEST_PRI = 1
VMX_LOOPDEST_CONTEXT =
VMX_LOOPDEST_EXT = dovm
VMX_LOOPDEST_PRI = 1
MIXMON_DIR =
MIXMON_POST =
DIAL_OPTIONS = Ttr
TRUNK_OPTIONS = Tt
TRUNK_RING_TIMER = 300
MIXMON_FORMAT = wav
REC_POLICY = caller
RINGTIMER_DEFAULT = 15
TRANSFER_CONTEXT = from-internal-xfer
ASTVERSION = 13.9.1
ASTCHANDAHDI = 1
NULL = ""
OUT_2 = PJSIP
OUT_2_SUFFIX = @Telekom
OUTCID_2 = 04074041501
OUTMAXCHANS_2 = 2
OUTFAIL_2 =
OUTPREFIX_2 =
OUTDISABLE_2 = off
OUTKEEPCID_2 = off
FORCEDOUTCID_2 =
PREFIX_TRUNK_2 =
ALLOW_SIP_ANON = no
SIPLANG =
#include globals_custom.conf
;end of [globals]
[app-blacklist]
exten => s,1,Macro(user-callerid,)
exten => *32,1,Goto(app-blacklist-last,s,1)
exten => *31,1,Goto(app-blacklist-remove,s,1)
exten => *30,1,Goto(app-blacklist-add,s,1)
;--== end of [app-blacklist] ==--;
[app-blacklist-check]
exten => s,1(check),GotoIf($["${BLACKLIST()}"="1"]?blacklisted)
exten => s,n,Set(CALLED_BLACKLIST=1)
exten => s,n,Return()
exten => s,n(blacklisted),Answer
exten => s,n,Wait(1)
exten => s,n,Zapateller()
exten => s,n,Playback(ss-noservice)
exten => s,n,Hangup
;--== end of [app-blacklist-check] ==--;
[app-blacklist-last]
exten => s,1,Answer
exten => s,n,Macro(user-callerid,)
exten => s,n,Wait(1)
exten => s,n,Set(lastcaller=${DB(CALLTRACE/${AMPUSER})})
exten => s,n,GotoIf($[ $[ "${lastcaller}" = "" ] | $[ "${lastcaller}" = "unknown" ] ]?noinfo)
exten => s,n,Playback(privacy-to-blacklist-last-caller&telephone-number)
exten => s,n,SayDigits(${lastcaller})
exten => s,n,Set(TIMEOUT(digit)=3)
exten => s,n,Set(TIMEOUT(response)=7)
exten => s,n,Playback(if-correct-press&digits/1)
exten => s,n,Goto(end)
exten => s,n(noinfo),Playback(unidentified-no-callback)
exten => s,n,Hangup
exten => s,n,Noop(Waiting for input)
exten => s,n(end),WaitExten(60,)
exten => s,n,Playback(sorry-youre-having-problems&goodbye)
exten => 1,1,Set(DB(blacklist/${lastcaller})=1)
exten => 1,n,Playback(num-was-successfully)
exten => 1,n,Playback(added)
exten => 1,n,Wait(1)
exten => 1,n,Hangup
;--== end of [app-blacklist-last] ==--;
[app-blacklist-remove]
exten => s,1,Answer
exten => s,n,Macro(user-callerid,)
exten => s,n,Wait(1)
exten => s,n,Playback(entr-num-rmv-blklist)
exten => s,n,Set(TIMEOUT(digit)=5)
exten => s,n,Set(TIMEOUT(response)=60)
exten => s,n,Read(blacknr,then-press-pound,,,,)
exten => s,n,SayDigits(${blacknr})
exten => s,n,Playback(if-correct-press&digits/1)
exten => s,n,Noop(Waiting for input)
exten => s,n(end),WaitExten(60,)
exten => s,n,Playback(sorry-youre-having-problems&goodbye)
exten => 1,1,Noop(Deleting: blacklist/${blacknr} ${DB_DELETE(blacklist/${blacknr})})
exten => 1,n,Playback(num-was-successfully&removed)
exten => 1,n,Wait(1)
exten => 1,n,Hangup
;--== end of [app-blacklist-remove] ==--;
[app-blacklist-add]
exten => s,1,Answer
exten => s,n,Macro(user-callerid,)
exten => s,n,Wait(1)
exten => s,n,Set(NumLoops=0)
exten => s,n(start),Playback(enter-num-blacklist)
exten => s,n,Set(TIMEOUT(digit)=5)
exten => s,n,Set(TIMEOUT(response)=60)
exten => s,n,Read(blacknr,then-press-pound,,,,)
exten => s,n,SayDigits(${blacknr})
exten => s,n,Playback(if-correct-press&digits/1)
exten => s,n,Noop(Waiting for input)
exten => s,n(end),WaitExten(60,)
exten => s,n,Playback(sorry-youre-having-problems&goodbye)
exten => 1,1,GotoIf($[ "${blacknr}" != ""]?:app-blacklist-add-invalid,s,1)
exten => 1,n,Set(DB(blacklist/${blacknr})=1)
exten => 1,n,Playback(num-was-successfully&added)
exten => 1,n,Wait(1)
exten => 1,n,Hangup
;--== end of [app-blacklist-add] ==--;
[app-blacklist-add-invalid]
exten => s,1,Set(NumLoops=$[${NumLoops} + 1])
exten => s,n,Playback(pm-invalid-option)
exten => s,n,GotoIf($[${NumLoops} < 3]?app-blacklist-add,s,start)
exten => s,n,Playback(goodbye)
exten => s,n,Hangup
;--== end of [app-blacklist-add-invalid] ==--;
[app-cf-toggle]
exten => *96,1,Answer
exten => *96,n,Wait(1)
exten => *96,n,Macro(user-callerid,)
exten => *96,n,Set(fromext=${AMPUSER})
exten => *96,n,GotoIf($["${DB(CF/${fromext})}" = ""]?activate:deactivate)
exten => *96,n(activate),Read(toext,ent-target-attendant&then-press-pound,,,,)
exten => *96,n,GotoIf($["${toext}"=""]?activate)
exten => *96,n,Wait(1)
exten => *96,n(toext),Set(DB(CF/${fromext})=${toext})
exten => *96,n,Set(STATE=BUSY)
exten => *96,n,Gosub(app-cf-toggle,sstate,1())
exten => *96,n(hook_on),Playback(call-fwd-unconditional&for&extension)
exten => *96,n,SayDigits(${fromext})
exten => *96,n,Playback(is-set-to)
exten => *96,n,SayDigits(${toext})
exten => *96,n,Macro(hangupcall,)
exten => *96,n(setdirect),Answer
exten => *96,n,Wait(1)
exten => *96,n,Macro(user-callerid,)
exten => *96,n,Goto(toext)
exten => *96,n(deactivate),Noop(Deleting: CF/${fromext} ${DB_DELETE(CF/${fromext})})
exten => *96,n,Set(STATE=NOT_INUSE)
exten => *96,n,Gosub(app-cf-toggle,sstate,1())
exten => *96,n(hook_off),Playback(call-fwd-unconditional&de-activated)
exten => *96,n,Macro(hangupcall,)
exten => sstate,1,Set(DEVICE_STATE(Custom:CF${fromext})=${STATE})
exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${fromext}/device)})
exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => sstate,n,Set(ITER=1)
exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVCF${CUT(DEVICES,&,${ITER})})=${STATE})
exten => sstate,n,Set(ITER=$[${ITER} + 1])
exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
exten => sstate,n(return),Return()
;--== end of [app-cf-toggle] ==--;
[app-cf-unavailable-prompt-on]
exten => *95,1,Answer
exten => *95,n,Wait(1)
exten => *95,n,Macro(user-callerid,)
exten => *95,n,Read(fromext,call-fwd-no-ans&please-enter-your&extension&then-press-pound,,,,)
exten => *95,n,Set(fromext=${IF($["${fromext}"=""]?${AMPUSER}:${fromext})})
exten => *95,n,Wait(1)
exten => *95,n(startread),Read(toext,ent-target-attendant&then-press-pound,,,,)
exten => *95,n,GotoIf($["${toext}"=""]?startread)
exten => *95,n,Wait(1)
exten => *95,n,Set(DB(CFU/${fromext})=${toext})
exten => *95,n(hook_1),Playback(call-fwd-no-ans&for&extension)
exten => *95,n,SayDigits(${fromext})
exten => *95,n,Playback(is-set-to)
exten => *95,n,SayDigits(${toext})
exten => *95,n,Macro(hangupcall,)
exten => _*95.,1,Answer
exten => _*95.,n,Wait(1)
exten => _*95.,n,Macro(user-callerid,)
exten => _*95.,n,Set(fromext=${AMPUSER})
exten => _*95.,n,Set(toext=${EXTEN:3})
exten => _*95.,n,Set(DB(CFU/${fromext})=${toext})
exten => _*95.,n(hook_2),Playback(call-fwd-no-ans&for&extension)
exten => _*95.,n,SayDigits(${fromext})
exten => _*95.,n,Playback(is-set-to)
exten => _*95.,n,SayDigits(${toext})
exten => _*95.,n,Macro(hangupcall,)
;--== end of [app-cf-unavailable-prompt-on] ==--;
[app-cf-busy-prompting-on]
exten => *94,1,Answer
exten => *94,n,Wait(1)
exten => *94,n,Macro(user-callerid,)
exten => *94,n,Read(fromext,call-fwd-on-busy&please-enter-your&extension&then-press-pound,,,,)
exten => *94,n,Set(fromext=${IF($["${fromext}"=""]?${AMPUSER}:${fromext})})
exten => *94,n,Wait(1)
exten => *94,n(startread),Read(toext,ent-target-attendant&then-press-pound,,,,)
exten => *94,n,GotoIf($["${toext}"=""]?startread)
exten => *94,n,Wait(1)
exten => *94,n,Set(DB(CFB/${fromext})=${toext})
exten => *94,n(hook_1),Playback(call-fwd-on-busy&for&extension)
exten => *94,n,SayDigits(${fromext})
exten => *94,n,Playback(is-set-to)
exten => *94,n,SayDigits(${toext})
exten => *94,n,Macro(hangupcall,)
exten => _*94.,1,Answer
exten => _*94.,n,Wait(1)
exten => _*94.,n,Macro(user-callerid,)
exten => _*94.,n,Set(fromext=${AMPUSER})
exten => _*94.,n,Set(toext=${EXTEN:3})
exten => _*94.,n,Set(DB(CFB/${fromext})=${toext})
exten => _*94.,n(hook_2),Playback(call-fwd-on-busy&for&extension)
exten => _*94.,n,SayDigits(${fromext})
exten => _*94.,n,Playback(is-set-to)
exten => _*94.,n,SayDigits(${toext})
exten => _*94.,n,Macro(hangupcall,)
;--== end of [app-cf-busy-prompting-on] ==--;
[app-cf-prompting-on]
exten => *93,1,Answer
exten => *93,n,Wait(1)
exten => *93,n,Macro(user-callerid,)
exten => *93,n,Read(fromext,call-fwd-unconditional&please-enter-your&extension&then-press-pound,,,,)
exten => *93,n,Set(fromext=${IF($["foo${fromext}"="foo"]?${AMPUSER}:${fromext})})
exten => *93,n,Wait(1)
exten => *93,n(startread),Read(toext,ent-target-attendant&then-press-pound,,,,)
exten => *93,n,GotoIf($["foo${toext}"="foo"]?startread)
exten => *93,n,Wait(1)
exten => *93,n,Set(DB(CF/${fromext})=${toext})
exten => *93,n,Set(STATE=BUSY)
exten => *93,n,Gosub(app-cf-prompting-on,sstate,1())
exten => *93,n(hook_1),Playback(call-fwd-unconditional&for&extension)
exten => *93,n,SayDigits(${fromext})
exten => *93,n,Playback(is-set-to)
exten => *93,n,SayDigits(${toext})
exten => *93,n,Macro(hangupcall,)
exten => _*93.,1,Answer
exten => _*93.,n,Wait(1)
exten => _*93.,n,Macro(user-callerid,)
exten => _*93.,n,Set(fromext=${AMPUSER})
exten => _*93.,n,Set(toext=${EXTEN:3})
exten => _*93.,n,Set(DB(CF/${fromext})=${toext})
exten => _*93.,n,Set(STATE=BUSY)
exten => _*93.,n,Gosub(app-cf-prompting-on,sstate,1())
exten => _*93.,n(hook_2),Playback(call-fwd-unconditional&for&extension)
exten => _*93.,n,SayDigits(${fromext})
exten => _*93.,n,Playback(is-set-to)
exten => _*93.,n,SayDigits(${toext})
exten => _*93.,n,Macro(hangupcall,)
exten => sstate,1,Set(DEVICE_STATE(Custom:CF${fromext})=${STATE})
exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${fromext}/device)})
exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => sstate,n,Set(ITER=1)
exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVCF${CUT(DEVICES,&,${ITER})})=${STATE})
exten => sstate,n,Set(ITER=$[${ITER} + 1])
exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
exten => sstate,n(return),Return()
;--== end of [app-cf-prompting-on] ==--;
[app-cf-busy-off-any]
exten => *92,1,Answer
exten => *92,n,Macro(user-callerid,)
exten => *92,n,Wait(1)
exten => *92,n,Read(fromext,please-enter-your&extension&then-press-pound,,,,)
exten => *92,n,Set(fromext=${IF($["foo${fromext}"="foo"]?${AMPUSER}:${fromext})})
exten => *92,n,Wait(1)
exten => *92,n,Noop(Deleting: CFB/${fromext} ${DB_DELETE(CFB/${fromext})})
exten => *92,n(hook_1),Playback(call-fwd-on-busy&for&extension)
exten => *92,n,SayDigits(${fromext})
exten => *92,n,Playback(cancelled)
exten => *92,n,Macro(hangupcall,)
;--== end of [app-cf-busy-off-any] ==--;
[app-cf-busy-off]
exten => *91,1,Answer
exten => *91,n,Wait(1)
exten => *91,n,Macro(user-callerid,)
exten => *91,n,Set(fromext=${AMPUSER})
exten => *91,n,Noop(Deleting: CFB/${fromext} ${DB_DELETE(CFB/${fromext})})
exten => *91,n(hook_1),Playback(call-fwd-on-busy&de-activated)
exten => *91,n,Macro(hangupcall,)
exten => _*91.,1,Answer
exten => _*91.,n,Wait(1)
exten => _*91.,n,Set(fromext=${EXTEN:3})
exten => _*91.,n,Noop(Deleting: CFB/${fromext} ${DB_DELETE(CFB/${fromext})})
exten => _*91.,n(hook_2),Playback(call-fwd-on-busy&for&extension)
exten => _*91.,n,SayDigits(${fromext})
exten => _*91.,n,Playback(cancelled)
exten => _*91.,n,Macro(hangupcall,)
;--== end of [app-cf-busy-off] ==--;
[app-cf-busy-on]
exten => *90,1,Answer
exten => *90,n,Wait(1)
exten => *90,n,Macro(user-callerid,)
exten => *90,n,Set(fromext=${AMPUSER})
exten => *90,n,GotoIf($["${fromext}"!=""]?startread)
exten => *90,n,Playback(agent-loggedoff)
exten => *90,n,Macro(hangupcall,)
exten => *90,n(startread),Read(toext,ent-target-attendant&then-press-pound,,,,)
exten => *90,n,GotoIf($["${toext}"=""]?startread)
exten => *90,n,Wait(1)
exten => *90,n,Set(DB(CFB/${fromext})=${toext})
exten => *90,n(hook_1),Playback(call-fwd-on-busy&for&extension)
exten => *90,n,SayDigits(${fromext})
exten => *90,n,Playback(is-set-to)
exten => *90,n,SayDigits(${toext})
exten => *90,n,Macro(hangupcall,)
exten => _*90.,1,Answer
exten => _*90.,n,Wait(1)
exten => _*90.,n,Macro(user-callerid,)
exten => _*90.,n,Set(fromext=${AMPUSER})
exten => _*90.,n,Set(toext=${EXTEN:3})
exten => _*90.,n,Set(DB(CFB/${fromext})=${toext})
exten => _*90.,n(hook_2),Playback(call-fwd-on-busy&for&extension)
exten => _*90.,n,SayDigits(${fromext})
exten => _*90.,n,Playback(is-set-to)
exten => _*90.,n,SayDigits(${toext})
exten => _*90.,n,Macro(hangupcall,)
;--== end of [app-cf-busy-on] ==--;
[app-cf-off-any]
exten => *74,1,Answer
exten => *74,n,Macro(user-callerid,)
exten => *74,n,Wait(1)
exten => *74,n,Read(fromext,please-enter-your&extension&then-press-pound,,,,)
exten => *74,n,Set(fromext=${IF($["foo${fromext}"="foo"]?${AMPUSER}:${fromext})})
exten => *74,n,Wait(1)
exten => *74,n,Noop(Deleting: CF/${fromext} ${DB_DELETE(CF/${fromext})})
exten => *74,n,Set(STATE=NOT_INUSE)
exten => *74,n,Gosub(app-cf-off-any,sstate,1())
exten => *74,n(hook_1),Playback(call-fwd-unconditional&for&extension)
exten => *74,n,SayDigits(${fromext})
exten => *74,n,Playback(cancelled)
exten => *74,n,Macro(hangupcall,)
exten => sstate,1,Set(DEVICE_STATE(Custom:CF${fromext})=${STATE})
exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${fromext}/device)})
exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => sstate,n,Set(ITER=1)
exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVCF${CUT(DEVICES,&,${ITER})})=${STATE})
exten => sstate,n,Set(ITER=$[${ITER} + 1])
exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
exten => sstate,n(return),Return()
;--== end of [app-cf-off-any] ==--;
[app-cf-off]
exten => *73,1,Answer
exten => *73,n,Wait(1)
exten => *73,n,Macro(user-callerid,)
exten => *73,n,Set(fromext=${AMPUSER})
exten => *73,n,Noop(Deleting: CF/${fromext} ${DB_DELETE(CF/${fromext})})
exten => *73,n,Set(STATE=NOT_INUSE)
exten => *73,n,Gosub(app-cf-off,sstate,1())
exten => *73,n(hook_1),Playback(call-fwd-unconditional&de-activated)
exten => *73,n,Macro(hangupcall,)
exten => _*73.,1,Answer
exten => _*73.,n,Wait(1)
exten => _*73.,n,Set(fromext=${EXTEN:3})
exten => _*73.,n,Noop(Deleting: CF/${fromext} ${DB_DELETE(CF/${fromext})})
exten => _*73.,n,Set(STATE=NOT_INUSE)
exten => _*73.,n,Gosub(app-cf-off,sstate,1())
exten => _*73.,n(hook_2),Playback(call-fwd-unconditional&for&extension)
exten => _*73.,n,SayDigits(${fromext})
exten => _*73.,n,Playback(cancelled)
exten => _*73.,n,Macro(hangupcall,)
exten => sstate,1,Set(DEVICE_STATE(Custom:CF${fromext})=${STATE})
exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${fromext}/device)})
exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => sstate,n,Set(ITER=1)
exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVCF${CUT(DEVICES,&,${ITER})})=${STATE})
exten => sstate,n,Set(ITER=$[${ITER} + 1])
exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
exten => sstate,n(return),Return()
;--== end of [app-cf-off] ==--;
[app-cf-on]
exten => *72,1,Answer
exten => *72,n,Wait(1)
exten => *72,n,Macro(user-callerid,)
exten => *72,n,Set(fromext=${AMPUSER})
exten => *72,n,GotoIf($["${fromext}"!=""]?startread)
exten => *72,n,Playback(agent-loggedoff)
exten => *72,n,Macro(hangupcall,)
exten => *72,n(startread),Read(toext,ent-target-attendant&then-press-pound,,,,)
exten => *72,n,GotoIf($["foo${toext}"="foo"]?startread)
exten => *72,n,Wait(1)
exten => *72,n,Set(DB(CF/${fromext})=${toext})
exten => *72,n,Set(STATE=BUSY)
exten => *72,n,Gosub(app-cf-on,sstate,1())
exten => *72,n(hook_1),Playback(call-fwd-unconditional&for&extension)
exten => *72,n,SayDigits(${fromext})
exten => *72,n,Playback(is-set-to)
exten => *72,n,SayDigits(${toext})
exten => *72,n,Macro(hangupcall,)
exten => _*72.,1,Answer
exten => _*72.,n,Wait(1)
exten => _*72.,n,Macro(user-callerid,)
exten => _*72.,n,Set(fromext=${AMPUSER})
exten => _*72.,n,Set(toext=${EXTEN:3})
exten => _*72.,n,Set(DB(CF/${fromext})=${toext})
exten => _*72.,n,Set(STATE=BUSY)
exten => _*72.,n,Gosub(app-cf-on,sstate,1())
exten => _*72.,n(hook_2),Playback(call-fwd-unconditional&for&extension)
exten => _*72.,n,SayDigits(${fromext})
exten => _*72.,n,Playback(is-set-to)
exten => _*72.,n,SayDigits(${toext})
exten => _*72.,n,Macro(hangupcall,)
exten => sstate,1,Set(DEVICE_STATE(Custom:CF${fromext})=${STATE})
exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${fromext}/device)})
exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => sstate,n,Set(ITER=1)
exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVCF${CUT(DEVICES,&,${ITER})})=${STATE})
exten => sstate,n,Set(ITER=$[${ITER} + 1])
exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
exten => sstate,n(return),Return()
;--== end of [app-cf-on] ==--;
[app-cf-unavailable-off]
exten => *53,1,Answer
exten => *53,n,Wait(1)
exten => *53,n,Macro(user-callerid,)
exten => *53,n,Set(fromext=${AMPUSER})
exten => *53,n,Noop(Deleting: CFU/${fromext} ${DB_DELETE(CFU/${fromext})})
exten => *53,n(hook_1),Playback(call-fwd-no-ans&de-activated)
exten => *53,n,Macro(hangupcall,)
exten => _*53.,1,Answer
exten => _*53.,n,Wait(1)
exten => _*53.,n,Set(fromext=${EXTEN:3})
exten => _*53.,n,Noop(Deleting: CFU/${fromext} ${DB_DELETE(CFU/${fromext})})
exten => _*53.,n(hook_2),Playback(call-fwd-no-ans&for&extension)
exten => _*53.,n,SayDigits(${fromext})
exten => _*53.,n,Playback(cancelled)
exten => _*53.,n,Macro(hangupcall,)
;--== end of [app-cf-unavailable-off] ==--;
[app-cf-unavailable-on]
exten => *52,1,Answer
exten => *52,n,Wait(1)
exten => *52,n,Macro(user-callerid,)
exten => *52,n,Set(fromext=${AMPUSER})
exten => *52,n,GotoIf($["${fromext}"!=""]?startread)
exten => *52,n,Playback(agent-loggedoff)
exten => *52,n,Macro(hangupcall,)
exten => *52,n(startread),Read(toext,ent-target-attendant&then-press-pound,,,,)
exten => *52,n,GotoIf($["${toext}"=""]?startread)
exten => *52,n,Wait(1)
exten => *52,n,Set(DB(CFU/${fromext})=${toext})
exten => *52,n(hook_1),Playback(call-fwd-no-ans&for&extension)
exten => *52,n,SayDigits(${fromext})
exten => *52,n,Playback(is-set-to)
exten => *52,n,SayDigits(${toext})
exten => *52,n,Macro(hangupcall,)
exten => _*52.,1,Answer
exten => _*52.,n,Wait(1)
exten => _*52.,n,Macro(user-callerid,)
exten => _*52.,n,Set(fromext=${AMPUSER})
exten => _*52.,n,Set(toext=${EXTEN:3})
exten => _*52.,n,Set(DB(CFU/${fromext})=${toext})
exten => _*52.,n(hook_2),Playback(call-fwd-no-ans&for&extension)
exten => _*52.,n,SayDigits(${fromext})
exten => _*52.,n,Playback(is-set-to)
exten => _*52.,n,SayDigits(${toext})
exten => _*52.,n,Macro(hangupcall,)
;--== end of [app-cf-unavailable-on] ==--;
[sub-record-cancel]
exten => s,1,Return()
;--== end of [sub-record-cancel] ==--;
[sub-record-check]
exten => s,1,GotoIf($[${LEN(${FROMEXTEN})}]?initialized)
exten => s,n,Set(__REC_STATUS=INITIALIZED)
exten => s,n,Set(NOW=${EPOCH})
exten => s,n,Set(__DAY=${STRFTIME(${NOW},,%d)})
exten => s,n,Set(__MONTH=${STRFTIME(${NOW},,%m)})
exten => s,n,Set(__YEAR=${STRFTIME(${NOW},,%Y)})
exten => s,n,Set(__TIMESTR=${YEAR}${MONTH}${DAY}-${STRFTIME(${NOW},,%H%M%S)})
exten => s,n,Set(__FROMEXTEN=${IF($[${LEN(${AMPUSER})}]?${AMPUSER}:${IF($[${LEN(${REALCALLERIDNUM})}]?${REALCALLERIDNUM}:unknown)})})
exten => s,n,Set(__MON_FMT=${IF($["${MIXMON_FORMAT}"="wav49"]?WAV:${MIXMON_FORMAT})})
exten => s,n(initialized),Noop(Recordings initialized)
exten => s,n,ExecIf($[!${LEN(${ARG3})}]?Set(ARG3=dontcare))
exten => s,n,Set(REC_POLICY_MODE_SAVE=${REC_POLICY_MODE})
exten => s,n,ExecIf($["${BLINDTRANSFER}${ATTENDEDTRANSFER}" != ""]?Set(REC_STATUS=NO))
exten => s,n(next),GotoIf($[${LEN(${ARG1})}]?checkaction)
exten => s,n(recorderror),Playback(something-terribly-wrong,error)
exten => s,n,Hangup
exten => s,n(checkaction),GotoIf($[${DIALPLAN_EXISTS(sub-record-check,${ARG1})}]?sub-record-check,${ARG1},1)
exten => s,n,Noop(Generic ${ARG1} Recording Check - ${FROMEXTEN} ${ARG2})
exten => s,n,Gosub(recordcheck,1(${ARG3},${ARG1},${ARG2}))
exten => s,n,Return()
exten => recordcheck,1,Noop(Starting recording check against ${ARG1})
exten => recordcheck,n,Goto(${ARG1})
exten => recordcheck,n(dontcare),Return()
exten => recordcheck,n(always),Noop(Detected legacy "always" entry. Mapping to "force")
exten => recordcheck,n(force),Set(__REC_POLICY_MODE=FORCE)
exten => recordcheck,n,GotoIf($["${REC_STATUS}"!="RECORDING"]?startrec)
exten => recordcheck,n,Return()
exten => recordcheck,n(delayed),Noop(Detected legacy "delayed" entry. Mapping to "yes")
exten => recordcheck,n(yes),ExecIf($["${REC_POLICY_MODE}" = "NEVER" | "${REC_POLICY_MODE}" = "NO" | "${REC_STATUS}" = "RECORDING"]?Return())
exten => recordcheck,n,Set(__REC_POLICY_MODE=YES)
exten => recordcheck,n,Goto(startrec)
exten => recordcheck,n(no),Set(__REC_POLICY_MODE=NO)
exten => recordcheck,n,Return()
exten => recordcheck,n(never),Set(__REC_POLICY_MODE=NEVER)
exten => recordcheck,n,Goto(stoprec)
exten => recordcheck,n(startrec),Noop(Starting recording: ${ARG2}, ${ARG3})
exten => recordcheck,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
exten => recordcheck,n,Set(__CALLFILENAME=${ARG2}-${ARG3}-${FROMEXTEN}-${TIMESTR}-${UNIQUEID})
exten => recordcheck,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT},ai(LOCAL_MIXMON_ID),${MIXMON_POST})
exten => recordcheck,n,Set(__MIXMON_ID=${LOCAL_MIXMON_ID})
exten => recordcheck,n,Set(__RECORD_ID=${CHANNEL(name)})
exten => recordcheck,n,Set(__REC_STATUS=RECORDING)
exten => recordcheck,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT})
exten => recordcheck,n,Return()
exten => recordcheck,n(stoprec),Noop(Stopping recording: ${ARG2}, ${ARG3})
exten => recordcheck,n,Set(__REC_STATUS=STOPPED)
exten => recordcheck,n,System(/var/lib/asterisk/bin/stoprecording.php "${CHANNEL(name)}")
exten => recordcheck,n,Return()
exten => out,1,Noop(Outbound Recording Check from ${FROMEXTEN} to ${ARG2})
exten => out,n,Set(RECMODE=${DB(AMPUSER/${FROMEXTEN}/recording/out/external)})
exten => out,n,ExecIf($[!${LEN(${RECMODE})} | "${RECMODE}" = "dontcare"]?Goto(routewins))
exten => out,n,ExecIf($["${ARG3}" = "never" | "${ARG3}" = "force"]?Goto(routewins))
exten => out,n(extenwins),Gosub(recordcheck,1(${RECMODE},out,${ARG2}))
exten => out,n,Return()
exten => out,n(routewins),Gosub(recordcheck,1(${ARG3},out,${ARG2}))
exten => out,n,Return()
exten => in,1,Noop(Inbound Recording Check to ${ARG2})
exten => in,n,Set(FROMEXTEN=unknown)
exten => in,n,ExecIf($[${LEN(${CALLERID(num)})}]?Set(FROMEXTEN=${CALLERID(num)}))
exten => in,n,Gosub(recordcheck,1(${ARG3},in,${ARG2}))
exten => in,n,Return()
exten => exten,1,Noop(Exten Recording Check between ${FROMEXTEN} and ${ARG2})
exten => exten,n,Set(CALLTYPE=${IF($[${LEN(${FROM_DID})}]?external:internal)})
exten => exten,n,ExecIf(${LEN(${CALLTYPE_OVERRIDE})}?Set(CALLTYPE=${CALLTYPE_OVERRIDE}))
exten => exten,n,Set(CALLEE=${DB(AMPUSER/${ARG2}/recording/in/${CALLTYPE})})
exten => exten,n,ExecIf($[!${LEN(${CALLEE})}]?Set(CALLEE=dontcare))
exten => exten,n,GotoIf($["${CALLTYPE}"="external"]?callee)
exten => exten,n,GotoIf($["${CALLEE}"="dontcare"]?caller)
exten => exten,n,ExecIf($[${LEN(${DB(AMPUSER/${FROMEXTEN}/recording/priority)})}]?Set(CALLER_PRI=${DB(AMPUSER/${FROMEXTEN}/recording/priority)}):Set(CALLER_PRI=0))
exten => exten,n,ExecIf($[${LEN(${DB(AMPUSER/${ARG2}/recording/priority)})}]?Set(CALLEE_PRI=${DB(AMPUSER/${ARG2}/recording/priority)}):Set(CALLEE_PRI=0))
exten => exten,n,GotoIf($["${CALLER_PRI}"="${CALLEE_PRI}"]?${REC_POLICY}:${IF($[${CALLER_PRI}>${CALLEE_PRI}]?caller:callee)})
exten => exten,n(callee),Gosub(recordcheck,1(${CALLEE},${CALLTYPE},${ARG2}))
exten => exten,n,Return()
exten => exten,n(caller),Set(RECMODE=${DB(AMPUSER/${FROMEXTEN}/recording/out/internal)})
exten => exten,n,ExecIf($[!${LEN(${RECMODE})}]?Set(RECMODE=dontcare))
exten => exten,n,ExecIf($["${RECMODE}"="dontcare"]?Set(RECMODE=${CALLEE}))
exten => exten,n,Gosub(recordcheck,1(${RECMODE},${CALLTYPE},${ARG2}))
exten => exten,n,Return()
exten => conf,1,Noop(Conference Recording Check ${FROMEXTEN} to ${ARG2})
exten => conf,n,Gosub(recconf,1(${ARG2},${ARG2},${ARG3}))
exten => conf,n,Return()
exten => page,1,Noop(Paging Recording Check ${FROMEXTEN} to ${ARG2})
exten => page,n,GosubIf($["${REC_POLICY_MODE}"="always"]?recconf,1(${ARG2},${FROMEXTEN},${ARG3}))
exten => page,n,Return()
exten => recconf,1,Noop(Setting up recording: ${ARG1}, ${ARG2}, ${ARG3})
exten => recconf,n,Set(__CALLFILENAME=${IF($[${CONFBRIDGE_INFO(parties,${ARG2})}]?${DB(RECCONF/${ARG2})}:${ARG1}-${ARG2}-${ARG3}-${TIMESTR}-${UNIQUEID})})
exten => recconf,n,ExecIf($[!${CONFBRIDGE_INFO(parties,${ARG2})}]?Set(DB(RECCONF/${ARG2})=${CALLFILENAME}))
exten => recconf,n,Set(CONFBRIDGE(bridge,record_file)=${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT})
exten => recconf,n,ExecIf($["${ARG3}"!="always"]?Return())
exten => recconf,n,Set(CONFBRIDGE(bridge,record_conference)=yes)
exten => recconf,n,Set(__REC_STATUS=RECORDING)
exten => recconf,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT})
exten => recconf,n,Return()
exten => recq,1,Noop(Setting up recording: ${ARG1}, ${ARG2}, ${ARG3})
exten => recq,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
exten => recq,n,Set(MONITOR_FILENAME=${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME})
exten => recq,n,MixMonitor(${MONITOR_FILENAME}.${MON_FMT},${MONITOR_OPTIONS},${MIXMON_POST})
exten => recq,n,Set(__REC_STATUS=RECORDING)
exten => recq,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT})
exten => recq,n,Return()
exten => parking,1,Noop(User ${ARG2} picked up a parked call)
exten => parking,n,Set(USER=${ARG2})
exten => parking,n,ExecIf($[!${LEN(${ARG2})}]?Set(USER=unknown))
exten => parking,n,Set(RECMODE=${DB(AMPUSER/${ARG2}/recording/out/internal)})
exten => parking,n,ExecIf($[!${LEN(${RECMODE})}]?Set(RECMODE=dontcare))
exten => parking,n,Gosub(recordcheck,1(${RECMODE},parked,${USER}))
exten => parking,n,Return()
;--== end of [sub-record-check] ==--;
[macro-one-touch-record]
exten => s,1,Set(ONETOUCH_REC_SCRIPT_STATUS=)
exten => s,n,System(/var/lib/asterisk/bin/one_touch_record.php "${CHANNEL(name)}")
exten => s,n,Noop(ONETOUCH_REC_SCRIPT_STATUS: [${ONETOUCH_REC_SCRIPT_STATUS}])
exten => s,n,ExecIf($["${REC_STATUS}"="RECORDING"]?Playback(beep))
exten => s,n,ExecIf($["${REC_STATUS}"="STOPPED"]?Playback(beep&beep))
exten => s,n,ExecIf($["${ONETOUCH_REC_SCRIPT_STATUS:0:6}"="DENIED"]?Playback(access-denied))
exten => s,n,MacroExit()
;--== end of [macro-one-touch-record] ==--;
[app-callwaiting-cwoff]
exten => *71,1,Answer
exten => *71,n,Wait(1)
exten => *71,n,Macro(user-callerid,)
exten => *71,n,Noop(Deleting: CW/${AMPUSER} ${DB_DELETE(CW/${AMPUSER})})
exten => *71,n(hook_1),Playback(call-waiting&de-activated)
exten => *71,n,Macro(hangupcall,)
;--== end of [app-callwaiting-cwoff] ==--;
[app-callwaiting-cwon]
exten => *70,1,Answer
exten => *70,n,Wait(1)
exten => *70,n,Macro(user-callerid,)
exten => *70,n,Set(DB(CW/${AMPUSER})=ENABLED)
exten => *70,n(hook_1),Playback(call-waiting&activated)
exten => *70,n,Macro(hangupcall,)
;--== end of [app-callwaiting-cwon] ==--;
[app-campon-toggle]
exten => *84,1,Answer
exten => *84,n,Set(CCSS_SETUP=TRUE)
exten => *84,n,Macro(user-callerid,)
exten => *84,n,ExecIf($["${EXTENSION_STATE(*84${AMPUSER}@ext-local)}" = "INUSE"]?CallCompletionCancel():CallCompletionRequest())
exten => *84,n,Playback(beep)
exten => *84,n,Macro(hangupcall,)
;--== end of [app-campon-toggle] ==--;
[ext-local]
exten => *84300,1,Goto(app-campon-toggle,*84,1)
exten => *84300,hint,ccss:PJSIP/300
exten => *300,1,Macro(vm,300,DIRECTDIAL,${IVR_RETVM})
exten => *300,n,Goto(vmret,1)
exten => 300,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/300/ringtimer)}" > "0"]?${DB(AMPUSER/300/ringtimer)}:${RINGTIMER_DEFAULT})})
exten => 300,n,Macro(exten-vm,300,300,0,0,0)
exten => 300,n(dest),Set(__PICKUPMARK=)
exten => 300,n,Macro(vm,300,${DIALSTATUS},${IVR_RETVM})
exten => 300,n,Goto(vmret,1)
exten => 300,hint,PJSIP/300&Custom:DND300,CustomPresence:300
exten => vmb300,1,Macro(vm,300,BUSY,${IVR_RETVM})
exten => vmb300,n,Goto(vmret,1)
exten => vmu300,1,Macro(vm,300,NOANSWER,${IVR_RETVM})
exten => vmu300,n,Goto(vmret,1)
exten => vms300,1,Macro(vm,300,NOMESSAGE,${IVR_RETVM})
exten => vms300,n,Goto(vmret,1)
exten => vmi300,1,Macro(vm,300,INSTRUCT,${IVR_RETVM})
exten => vmi300,n,Goto(vmret,1)
exten => vmret,1,GotoIf($["${IVR_RETVM}" = "RETURN" & "${IVR_CONTEXT}" != ""]?playret)
exten => vmret,n,Hangup
exten => vmret,n(playret),Playback(exited-vm-will-be-transfered&silence/1)
exten => vmret,n,Goto(${IVR_CONTEXT},return,1)
exten => h,1,Macro(hangupcall,)
;--== end of [ext-local] ==--;
[app-campon-cancel]
exten => *83,1,Answer
exten => *83,n,Set(CCSS_SETUP=TRUE)
exten => *83,n,Macro(user-callerid,)
exten => *83,n,CallCompletionCancel()
exten => *83,n,Playback(beep)
exten => *83,n,Macro(hangupcall,)
;--== end of [app-campon-cancel] ==--;
[app-campon-request]
exten => *82,1,Answer
exten => *82,n,Set(CCSS_SETUP=TRUE)
exten => *82,n,Macro(user-callerid,)
exten => *82,n,CallCompletionRequest()
exten => *82,n,Playback(beep)
exten => *82,n,Macro(hangupcall,)
;--== end of [app-campon-request] ==--;
[sub-ccss]
exten => s,1,ExecIf($[${LEN(${CCSS_SETUP})}]?Return())
exten => s,n,Set(CCSS_SETUP=TRUE)
exten => s,n(monitor),GosubIf($[${LEN(${DB(AMPUSER/${ARG2}/ccss/cc_monitor_policy)})}]?monitor_config,1(${ARG1},${ARG2}):monitor_default,1(${ARG1},${ARG2}))
exten => s,n(agent),GosubIf($[${LEN(${DB(AMPUSER/${AMPUSER}/ccss/cc_agent_policy)})}]?agent_config,1():agent_default,1())
exten => s,n,Set(DB(AMPUSER/${AMPUSER}/ccss/last_number)=${ARG2})
exten => s,n,Return(${GOSUB_RETVAL})
exten => monitor_config,1,Set(CALLCOMPLETION(cc_monitor_policy)=${DB(AMPUSER/${ARG2}/ccss/cc_monitor_policy)})
exten => monitor_config,n,GotoIf($["CALLCOMPLETION(cc_monitor_policy)" != "never"]?set_monitor)
exten => monitor_config,n,StackPop()
exten => monitor_config,n,Return(FALSE)
exten => monitor_config,n(set_monitor),Set(CALLCOMPLETION(cc_max_monitors)=${DB(AMPUSER/${ARG2}/ccss/max_monitors)})
exten => monitor_config,n,Return(TRUE)
exten => monitor_default,1,GotoIf($["${DB(AMPUSER/${ARG2}/cidname)}" != ""]?is_exten)
exten => monitor_default,n,StackPop()
exten => monitor_default,n,Return(FALSE)
exten => monitor_default,n(is_exten),Set(CALLCOMPLETION(cc_monitor_policy)=generic)
exten => monitor_default,n,Set(CALLCOMPLETION(cc_max_monitors)=5)
exten => monitor_default,n,Return(TRUE)
exten => agent_config,1,Set(CALLCOMPLETION(cc_agent_policy)=${DB(AMPUSER/${AMPUSER}/ccss/cc_agent_policy)})
exten => agent_config,n,Set(CALLCOMPLETION(cc_offer_timer)=${DB(AMPUSER/${AMPUSER}/ccss/cc_offer_timer)})
exten => agent_config,n,Set(CALLCOMPLETION(ccbs_available_timer)=${DB(AMPUSER/${AMPUSER}/ccss/ccbs_available_timer)})
exten => agent_config,n,Set(CALLCOMPLETION(ccnr_available_timer)=${DB(AMPUSER/${AMPUSER}/ccss/ccnr_available_timer)})
exten => agent_config,n,Set(CALLCOMPLETION(cc_callback_macro)=ccss-default)
exten => agent_config,n,ExecIf($["${CALLCOMPLETION(cc_agent_policy)}" = "generic"]?Set(CALLCOMPLETION(cc_recall_timer)=${DB(AMPUSER/${AMPUSER}/ccss/cc_recall_timer)}))
exten => agent_config,n,ExecIf($["${CALLCOMPLETION(cc_agent_policy)}" = "generic"]?Set(CALLCOMPLETION(cc_max_agents)=${DB(AMPUSER/${AMPUSER}/ccss/cc_max_agents)}))
exten => agent_config,n,ExecIf($["${DB(AMPUSER/${AMPUSER}/ccss/cc_agent_dialstring)}" != ""]?Set(CALLCOMPLETION(cc_agent_dialstring)=Local/${AMPUSER}_${CALLERID(dnid)}@from-ccss-${DB(AMPUSER/${AMPUSER}/ccss/cc_agent_dialstring)}))
exten => agent_config,n,Set(CALLCOMPLETION(cc_callback_macro)=ccss-default)
exten => agent_config,n,Return()
exten => agent_default,1,Set(CALLCOMPLETION(cc_agent_policy)=generic)
exten => agent_default,n,Set(CALLCOMPLETION(cc_offer_timer)=30)
exten => agent_default,n,Set(CALLCOMPLETION(ccbs_available_timer)=4800)
exten => agent_default,n,Set(CALLCOMPLETION(ccnr_available_timer)=7200)
exten => agent_default,n,Set(CALLCOMPLETION(cc_callback_macro)=ccss-default)
exten => agent_default,n,Set(CALLCOMPLETION(cc_recall_timer)=15)
exten => agent_default,n,Set(CALLCOMPLETION(cc_agent_dialstring)=Local/${AMPUSER}_${CALLERID(dnid)}@from-ccss-extension)
exten => agent_default,n,Return(TRUE)
;--== end of [sub-ccss] ==--;
[macro-ccss-default]
exten => s,1,Playback(beep&calling&extension)
exten => s,n,SayDigits(${CC_EXTEN})
exten => s,n(siprm),SIPRemoveHeader(${CC_HEADER})
exten => s,n,Set(CALLERID(dnid)=${CC_EXTEN})
exten => s,n,Set(CALLERID(name)=${CALLERID(name)})
exten => s,n,MacroExit()
;--== end of [macro-ccss-default] ==--;
[from-ccss-internal]
exten => _X._X.,1,Gosub(sub-from-ccss,s,1(${CUT(EXTEN,_,2)}))
exten => _X._X.,n(no_alert),Goto(from-internal,${CUT(EXTEN,_,1)},1)
;--== end of [from-ccss-internal] ==--;
[from-ccss-extension]
exten => _X._X.,1,Gosub(sub-from-ccss,s,1(${CUT(EXTEN,_,2)}))
exten => _X._X.,n,Goto(ext-local,${CUT(EXTEN,_,1)},1)
;--== end of [from-ccss-extension] ==--;
[sub-from-ccss]
exten => s,1,Macro(blkvm-set,)
exten => s,n,Set(__CC_RECALL=1)
exten => s,n,Set(CALLERID(name)=${IF($[${LEN(${DB(AMPUSER/${ARG1}/cidname)})}]?${DB(AMPUSER/${ARG1}/cidname)}:CALLBACK)})
exten => s,n,Set(CALLERID(number)=${ARG1})
exten => s,n,Return()
exten => s,n,SIPAddHeader(Alert-Info: ${CC_HEADER})
exten => s,n,Return()
;--== end of [sub-from-ccss] ==--;
[cidlookup]
exten => cidlookup_2,1,Set(CURLOPT(httptimeout)=7)
exten => cidlookup_2,n,Set(CALLERID(name)=${CURL(https://api.opencnam.com/v2/phone/${CALLERID(num)}?format=pbx&ref=freepbx)})
exten => cidlookup_2,n,Set(current_hour=${STRFTIME(,,%Y-%m-%d %H)})
exten => cidlookup_2,n,Set(last_query_hour=${DB(cidlookup/opencnam_last_query_hour)})
exten => cidlookup_2,n,Set(total_hourly_queries=${DB(cidlookup/opencnam_total_hourly_queries)})
exten => cidlookup_2,n,ExecIf($["${last_query_hour}" != "${current_hour}"]?Set(DB(cidlookup/opencnam_total_hourly_queries)=0))
exten => cidlookup_2,n,ExecIf($["${total_hourly_queries}" = ""]?Set(DB(cidlookup/opencnam_total_hourly_queries)=0))
exten => cidlookup_2,n,Set(DB(cidlookup/opencnam_total_hourly_queries)=${MATH(${DB(cidlookup/opencnam_total_hourly_queries)}+1,i)})
exten => cidlookup_2,n,ExecIf($[${DB(cidlookup/opencnam_total_hourly_queries)} >= 60]?System(${ASTVARLIBDIR}/bin/opencnam-alert.php))
exten => cidlookup_2,n,Set(DB(cidlookup/opencnam_last_query_hour)=${current_hour})
exten => cidlookup_2,n,Return()
exten => cidlookup_return,1,ExecIf($["${DB(cidname/${CALLERID(num)})}" != ""]?Set(CALLERID(name)=${DB(cidname/${CALLERID(num)})}))
exten => cidlookup_return,n,Return()
;--== end of [cidlookup] ==--;
[c-x-3-operator-panel-hold]
exten => 432111,1,MusicOnHold(${XMLNamespaceMusicOnHoldClass})
exten => 432111,n,Hangup
;--== end of [c-x-3-operator-panel-hold] ==--;
[c-x-3-operator-panel-voice-mail]
exten => 432112,1,VoiceMail(${XMLNamespaceVoiceMailBox}@${XMLNamespaceVoiceMailBoxContext},u)
exten => 432112,n,Hangup
;--== end of [c-x-3-operator-panel-voice-mail] ==--;
[c-x-3-operator-panel-meetme]
exten => 432113,1,ConfBridge(${XMLNamespaceMeetMeRoomNumber},${XMLNamespaceMeetMeRoomOptions},,)
exten => 432113,n,Hangup
;--== end of [c-x-3-operator-panel-meetme] ==--;
[c-x-3-operator-panel-confbridge]
exten => 432113,1,ConfBridge(${XMLNamespaceMeetMeRoomNumber},,,)
exten => 432113,n,Hangup
;--== end of [c-x-3-operator-panel-confbridge] ==--;
[c-x-3-operator-panel-park]
exten => 432114,1,ParkAndAnnounce(pbx-transfer:PARKED,200,Local/432116@c-x-3-operator-panel-park-announce-answer,${XMLNamespaceParkContext},${XMLNamespaceParkExtension},1)
exten => 432114,n,Hangup
;--== end of [c-x-3-operator-panel-park] ==--;
[c-x-3-operator-panel-park-announce-answer]
exten => 432116,1,Answer
exten => 432116,n,Hangup
;--== end of [c-x-3-operator-panel-park-announce-answer] ==--;
[c-x-3-operator-panel-listen-to-voice-mail]
exten => 432115,1,ControlPlayback(${XMLNamespaceVoiceMailPath},1000,*,#,7,8,9)
exten => 432115,n,Hangup
;--== end of [c-x-3-operator-panel-listen-to-voice-mail] ==--;
[c-x-3-operator-panel-listen-to-recording]
exten => 432118,1,ControlPlayback(${XMLNamespaceRecordingPath},1000,*,#,7,8,9)
exten => 432118,n,Hangup
;--== end of [c-x-3-operator-panel-listen-to-recording] ==--;
[c-x-3-operator-panel-spy]
exten => 432117,1,ChanSpy(${XMLNamespaceChanSpyChannel},${XMLNamespaceChanSpyOptions})
exten => 432117,n,Hangup
;--== end of [c-x-3-operator-panel-spy] ==--;
[c-x-3-operator-panel-pjsip-auto-answer-headers]
exten => addheader,1,Set(PJSIP_HEADER(add,Alert-Info)=<http://www.notused.com>\;info=alert-autoanswer\;delay=0)
exten => addheader,n,Set(PJSIP_HEADER(add,Alert-Info)=Ring Answer)
exten => addheader,n,Set(PJSIP_HEADER(add,Alert-Info)=ring-answer)
exten => addheader,n,Set(PJSIP_HEADER(add,Call-Info)=\;answer-after=0)
;--== end of [c-x-3-operator-panel-pjsip-auto-answer-headers] ==--;
[c-x-3-operator-panel-pjsip-auto-answer-redirect]
exten => _X!,1,ExecIf($["${D_OPTIONS}"==""]?Set(D_OPTIONS=TtrI))
exten => _X!,n,Dial(${CX_AUTOANSWER_REDIRECT_PEER},,${D_OPTIONS}b(c-x-3-operator-panel-pjsip-auto-answer-headers^addheader^1))
;--== end of [c-x-3-operator-panel-pjsip-auto-answer-redirect] ==--;
[app-dictate-send]
exten => *35,1,Answer
exten => *35,n,Macro(user-callerid,)
exten => *35,n,Noop(CallerID is ${AMPUSER})
exten => *35,n,Set(DICTENABLED=${DB(AMPUSER/${AMPUSER}/dictate/enabled)})
exten => *35,n,GotoIf($[$["x${DICTENABLED}"="x"]|$["x${DICTENABLED}"="xdisabled"]]?nodict:dictok)
exten => *35,n(nodict),Playback(feature-not-avail-line)
exten => *35,n,Hangup
exten => *35,n(dictok),Read(DICTFILE,enter-filename-short,,,,)
exten => *35,n,Set(DICTEMAIL=${DB(AMPUSER/${AMPUSER}/dictate/email)})
exten => *35,n,Set(DICTFMT=${DB(AMPUSER/${AMPUSER}/dictate/format)})
exten => *35,n,Set(NAME=${DB(AMPUSER/${AMPUSER}/cidname)})
exten => *35,n,Playback(dictation-being-processed)
exten => *35,n,System(/var/lib/asterisk/bin/audio-email.pl --file /var/lib/asterisk/sounds/dictate/${AMPUSER}/${DICTFILE}.raw --attachment dict-${DICTFILE} --format ${DICTFMT} --to ${DICTEMAIL} --subject "Dictation from ${NAME} Attached")
exten => *35,n,Playback(dictation-sent)
exten => *35,n,Macro(hangupcall,)
;--== end of [app-dictate-send] ==--;
[app-dictate-record]
exten => *34,1,Answer
exten => *34,n,Macro(user-callerid,)
exten => *34,n,Noop(CallerID is ${AMPUSER})
exten => *34,n,Set(DICTENABLED=${DB(AMPUSER/${AMPUSER}/dictate/enabled)})
exten => *34,n,GotoIf($[$["x${DICTENABLED}"="x"]|$["x${DICTENABLED}"="xdisabled"]]?nodict:dictok)
exten => *34,n(nodict),Playback(feature-not-avail-line)
exten => *34,n,Hangup
exten => *34,n(dictok),Dictate(/var/lib/asterisk/sounds/dictate/${AMPUSER})
exten => *34,n,Macro(hangupcall,)
;--== end of [app-dictate-record] ==--;
[app-dnd-off]
exten => *79,1,Answer
exten => *79,n,Wait(1)
exten => *79,n,Macro(user-callerid,)
exten => *79,n,Noop(Deleting: DND/${AMPUSER} ${DB_DELETE(DND/${AMPUSER})})
exten => *79,n,Set(STATE=NOT_INUSE)
exten => *79,n,Gosub(app-dnd-off,sstate,1())
exten => *79,n(hook_1),Playback(do-not-disturb&de-activated)
exten => *79,n,Macro(hangupcall,)
exten => sstate,1,Set(DEVICE_STATE(Custom:DND${AMPUSER})=${STATE})
exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${AMPUSER}/device)})
exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => sstate,n,Set(ITER=1)
exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVDND${CUT(DEVICES,&,${ITER})})=${STATE})
exten => sstate,n,Set(ITER=$[${ITER} + 1])
exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
exten => sstate,n(return),Return()
;--== end of [app-dnd-off] ==--;
[app-dnd-on]
exten => *78,1,Answer
exten => *78,n,Wait(1)
exten => *78,n,Macro(user-callerid,)
exten => *78,n,Set(DB(DND/${AMPUSER})=YES)
exten => *78,n,Set(STATE=BUSY)
exten => *78,n,Gosub(app-dnd-on,sstate,1())
exten => *78,n(hook_1),Playback(do-not-disturb&activated)
exten => *78,n,Macro(hangupcall,)
exten => sstate,1,Set(DEVICE_STATE(Custom:DND${AMPUSER})=${STATE})
exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${AMPUSER}/device)})
exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => sstate,n,Set(ITER=1)
exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVDND${CUT(DEVICES,&,${ITER})})=${STATE})
exten => sstate,n,Set(ITER=$[${ITER} + 1])
exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
exten => sstate,n(return),Return()
;--== end of [app-dnd-on] ==--;
[app-dnd-toggle]
exten => *76,1,Answer
exten => *76,n,Wait(1)
exten => *76,n,Macro(user-callerid,)
exten => *76,n,GotoIf($["${DB(DND/${AMPUSER})}" = ""]?activate:deactivate)
exten => *76,n(activate),Set(DB(DND/${AMPUSER})=YES)
exten => *76,n,Set(STATE=BUSY)
exten => *76,n,Gosub(app-dnd-toggle,sstate,1())
exten => *76,n(hook_on),Playback(do-not-disturb&activated)
exten => *76,n,Macro(hangupcall,)
exten => *76,n(deactivate),Noop(Deleting: DND/${AMPUSER} ${DB_DELETE(DND/${AMPUSER})})
exten => *76,n,Set(STATE=NOT_INUSE)
exten => *76,n,Gosub(app-dnd-toggle,sstate,1())
exten => *76,n(hook_off),Playback(do-not-disturb&de-activated)
exten => *76,n,Macro(hangupcall,)
exten => sstate,1,Set(DEVICE_STATE(Custom:DND${AMPUSER})=${STATE})
exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${AMPUSER}/device)})
exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => sstate,n,Set(ITER=1)
exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVDND${CUT(DEVICES,&,${ITER})})=${STATE})
exten => sstate,n,Set(ITER=$[${ITER} + 1])
exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
exten => sstate,n(return),Return()
;--== end of [app-dnd-toggle] ==--;
[ext-dnd-hints]
exten => *76300,1,Goto(app-dnd-toggle,*76,1)
exten => *76300,hint,Custom:DEVDND300
;--== end of [ext-dnd-hints] ==--;
[ext-fax]
exten => s,1,Macro(user-callerid,)
exten => s,n,Noop(Receiving Fax for: ${FAX_RX_EMAIL} , From: ${CALLERID(all)})
exten => s,n(receivefax),StopPlaytones
exten => s,n,ReceiveFAX(${ASTSPOOLDIR}/fax/${UNIQUEID}.tif,f)
exten => s,n,ExecIf($["${FAXSTATUS:0:6}"="FAILED" && "${FAXERROR}"!="INIT_ERROR"]?Set(FAXSTATUS="FAILED: error: ${FAXERROR} statusstr: ${FAXOPT(statusstr)}"))
exten => s,n,Hangup
exten => h,1,GotoIf($[${STAT(e,${ASTSPOOLDIR}/fax/${UNIQUEID}.tif)} = 0]?failed)
exten => h,n(process),GotoIf($[${LEN(${FAX_RX_EMAIL})} = 0]?noemail)
exten => h,n(delete_opt),Set(DELETE_AFTER_SEND=true)
exten => h,n,System(${ASTVARLIBDIR}/bin/fax2mail.php --to "${FAX_RX_EMAIL}" --dest "${FROM_DID}" --callerid '${STRREPLACE(CALLERID(all),',\\')}' --file ${ASTSPOOLDIR}/fax/${UNIQUEID}.tif --exten "${FAX_FOR}" --delete "${DELETE_AFTER_SEND}" --attachformat "${FAX_ATTACH_FORMAT}")
exten => h,n(end),Macro(hangupcall,)
exten => h,n(noemail),Noop(ERROR: No Email Address to send FAX: status: [${FAXSTATUS}], From: [${CALLERID(all)}])
exten => h,n,Macro(hangupcall,)
exten => h,process+101(failed),Noop(FAX ${FAXSTATUS} for: ${FAX_RX_EMAIL} , From: ${CALLERID(all)})
exten => h,n,Macro(hangupcall,)
;--== end of [ext-fax] ==--;
[app-fax]
exten => 666,1,Set(FAX_RX_EMAIL=)
exten => 666,n,Goto(ext-fax,s,1)
exten => h,1,Macro(hangupcall,)
;--== end of [app-fax] ==--;
[ext-did-0001]
exten => fax,1,Goto(${CUT(FAX_DEST,^,1)},${CUT(FAX_DEST,^,2)},${CUT(FAX_DEST,^,3)})
;--== end of [ext-did-0001] ==--;
[ext-did-0002]
exten => fax,1,Goto(${CUT(FAX_DEST,^,1)},${CUT(FAX_DEST,^,2)},${CUT(FAX_DEST,^,3)})
exten => 04074041501,1,Set(__DIRECTION=INBOUND)
exten => 04074041501,n,Gosub(sub-record-check,s,1(in,${EXTEN},dontcare))
exten => 04074041501,n,Gosub(app-blacklist-check,s,1())
exten => 04074041501,n,Set(__FROM_DID=${EXTEN})
exten => 04074041501,n,Set(CDR(did)=${FROM_DID})
exten => 04074041501,n,ExecIf($[ "${CALLERID(name)}" = "" ] ?Set(CALLERID(name)=${CALLERID(num)}))
exten => 04074041501,n,Set(CHANNEL(musicclass)=default)
exten => 04074041501,n,Set(__MOHCLASS=default)
exten => 04074041501,n,GotoIf($["${__REVERSAL_REJECT}"="TRUE" & "${CHANNEL(reversecharge)}"="1" ]?macro-hangupcall)
exten => 04074041501,n,Set(__CALLINGPRES_SV=${CALLERPRES()})
exten => 04074041501,n,Set(CALLERPRES()=allowed_not_screened)
exten => 04074041501,n(dest-ext),Goto(from-did-direct,300,1)
;--== end of [ext-did-0002] ==--;
[ext-featurecodes]
exten => *30,1,Goto(from-internal,*30,1)
exten => *31,1,Goto(from-internal,*31,1)
exten => 555,1,Goto(from-internal,555,1)
exten => 7777,1,Goto(from-internal,7777,1)
exten => 888,1,Goto(from-internal,888,1)
exten => 666,1,Goto(from-internal,666,1)
exten => *43,1,Goto(from-internal,*43,1)
exten => *60,1,Goto(from-internal,*60,1)
exten => *85,1,Goto(from-internal,*85,1)
exten => *86,1,Goto(from-internal,*86,1)
exten => 411,1,Goto(from-internal,411,1)
exten => *98,1,Goto(from-internal,*98,1)
;--== end of [ext-featurecodes] ==--;
[app-fmf-toggle]
exten => *21,1,Goto(app-fmf-toggle,s,start)
exten => s,1(start),Answer
exten => s,n,Wait(1)
exten => s,n,Macro(user-callerid,)
exten => s,n,GotoIf($["${DB(AMPUSER/${AMPUSER}/followme/ddial)}" = "EXTENSION"]?activate)
exten => s,n,GotoIf($["${DB(AMPUSER/${AMPUSER}/followme/ddial)}" = "DIRECT"]?deactivate:end)
exten => s,n(deactivate),Set(DB(AMPUSER/${AMPUSER}/followme/ddial)=EXTENSION)
exten => s,n,Set(STATE=NOT_INUSE)
exten => s,n,Gosub(app-fmf-toggle,sstate,1())
exten => s,n(hook_off),Playback(followme&de-activated)
exten => s,n(end),Macro(hangupcall,)
exten => s,n(activate),Set(DB(AMPUSER/${AMPUSER}/followme/ddial)=DIRECT)
exten => s,n,Set(STATE=INUSE)
exten => s,n,Gosub(app-fmf-toggle,sstate,1())
exten => s,n(hook_on),Playback(followme&activated)
exten => s,n,Macro(hangupcall,)
exten => sstate,1,Set(DEVICES=${DB(AMPUSER/${AMPUSER}/device)})
exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => sstate,n,Set(ITER=1)
exten => sstate,n(begin),Set(DEVICE_STATE(Custom:FOLLOWME${CUT(DEVICES,&,${ITER})})=${STATE})
exten => sstate,n,Set(ITER=$[${ITER} + 1])
exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
exten => sstate,n(return),Return()
;--== end of [app-fmf-toggle] ==--;
[ext-findmefollow]
exten => FM300,1,Goto(300,FM300)
exten => 300,1,GotoIf($[ "${DB(AMPUSER/300/followme/ddial)}" = "EXTENSION" ]?ext-local,300,1)
exten => 300,n(FM300),Macro(user-callerid,)
exten => 300,n,Set(DIAL_OPTIONS=${DIAL_OPTIONS}I)
exten => 300,n,Set(CONNECTEDLINE(num,i)=300)
exten => 300,n,Gosub(sub-presencestate-display,s,1(300))
exten => 300,n,Set(CONNECTEDLINE(name)=${DB(AMPUSER/300/cidname)}${PRESENCESTATE_DISPLAY})
exten => 300,n,Set(FM_DIALSTATUS=${EXTENSION_STATE(300@ext-local)})
exten => 300,n,Set(__EXTTOCALL=${EXTEN})
exten => 300,n,Set(__PICKUPMARK=${EXTEN})
exten => 300,n,Macro(blkvm-setifempty,)
exten => 300,n,GotoIf($["${GOSUB_RETVAL}" = "TRUE"]?skipov)
exten => 300,n,Macro(blkvm-set,reset)
exten => 300,n,Set(__NODEST=)
exten => 300,n(skipov),Set(RRNODEST=${NODEST})
exten => 300,n(skipvmblk),Set(__NODEST=${EXTEN})
exten => 300,n,GosubIf($[${DB_EXISTS(AMPUSER/300/followme/changecid)} = 1 & "${DB(AMPUSER/300/followme/changecid)}" != "default" & "${DB(AMPUSER/300/followme/changecid)}" != ""]?sub-fmsetcid,s,1())
exten => 300,n,Set(RecordMethod=Group)
exten => 300,n(checkrecord),Gosub(sub-record-check,s,1(exten,300,))
exten => 300,n(skipsimple),Set(RingGroupMethod=ringallv2-prim)
exten => 300,n,Set(_FMGRP=300)
exten => 300,n(DIALGRP),GotoIf($[("${DB(AMPUSER/300/followme/grpconf)}"="ENABLED") | ("${FORCE_CONFIRM}"!="") ]?doconfirm)
exten => 300,n,Macro(dial,$[ ${DB(AMPUSER/300/followme/grptime)} + ${DB(AMPUSER/300/followme/prering)} ],${DIAL_OPTIONS},${DB(AMPUSER/300/followme/grplist)})
exten => 300,n,Goto(nextstep)
exten => 300,n(doconfirm),Macro(dial-confirm,$[ ${DB(AMPUSER/300/followme/grptime)} + ${DB(AMPUSER/300/followme/prering)} ],${DIAL_OPTIONS},${DB(AMPUSER/300/followme/grplist)},300)
exten => 300,n(nextstep),Set(RingGroupMethod=)
exten => 300,n,GotoIf($["foo${RRNODEST}" != "foo"]?nodest)
exten => 300,n,Set(__NODEST=)
exten => 300,n,Set(__PICKUPMARK=)
exten => 300,n,Macro(blkvm-clr,)
exten => 300,n,Set(DIALSTATUS=${IF($["${FM_DIALSTATUS}"="NOT_INUSE"&"${DIALSTATUS}"!="CHANUNAVAIL"]?NOANSWER:${IF($["${DIALSTATUS}"="CHANUNAVAIL"|"${FM_DIALSTATUS}"="UNAVAILABLE"|"${FM_DIALSTATUS}"="UNKNOWN"|"${FM_DIALSTATUS}"="INVALID"]?CHANUNAVAIL:BUSY)})})
exten => 300,n,Goto(ext-local,300,dest)
exten => 300,n(nodest),Noop(SKIPPING DEST, CALL CAME FROM Q/RG: ${RRNODEST})
;--== end of [ext-findmefollow] ==--;
[fmgrps]
exten => _RG-300.,1,NoCDR()
exten => _RG-300.,n,Macro(dial,${DB(AMPUSER/300/followme/grptime)},${DIAL_OPTIONS}M(confirm^^^300),${EXTEN:7})
;--== end of [fmgrps] ==--;
[sub-fmsetcid]
exten => s,1,Goto(s-${DB(AMPUSER/${EXTTOCALL}/followme/changecid)},1)
exten => s-fixed,1,ExecIf($["${REGEX("^[\+]?[0-9]+$" ${DB(AMPUSER/${EXTTOCALL}/followme/fixedcid)})}" = "1"]?Set(__TRUNKCIDOVERRIDE=${DB(AMPUSER/${EXTTOCALL}/followme/fixedcid)}))
exten => s-fixed,n,Return()
exten => s-extern,1,ExecIf($["${REGEX("^[\+]?[0-9]+$" ${DB(AMPUSER/${EXTTOCALL}/followme/fixedcid)})}" == "1" & "${FROM_DID}" != ""]?Set(__TRUNKCIDOVERRIDE=${DB(AMPUSER/${EXTTOCALL}/followme/fixedcid)}))
exten => s-extern,n,Return()
exten => s-did,1,ExecIf($["${REGEX("^[\+]?[0-9]+$" ${FROM_DID})}" = "1"]?Set(__REALCALLERIDNUM=${FROM_DID}))
exten => s-did,n,Return()
exten => s-forcedid,1,ExecIf($["${REGEX("^[\+]?[0-9]+$" ${FROM_DID})}" = "1"]?Set(__TRUNKCIDOVERRIDE=${FROM_DID}))
exten => s-forcedid,n,Return()
exten => _s-.,1,Noop(Unknown value for AMPUSER/${EXTTOCALL}/followme/changecid of ${DB(AMPUSER/${EXTTOCALL}/followme/changecid)} set to "default")
exten => _s-.,n,Set(DB(AMPUSER/${EXTTOCALL}/followme/changecid)=default)
exten => _s-.,n,Return()
;--== end of [sub-fmsetcid] ==--;
[app-hotelwakeup]
exten => *68,1,Macro(user-callerid,)
exten => *68,n,Answer
exten => *68,n,Wait(1)
exten => *68,n,AGI(wakeupphp)
exten => *68,n,Hangup
;--== end of [app-hotelwakeup] ==--;
[app-calltrace]
exten => *69,1,Goto(app-calltrace-perform,s,1)
;--== end of [app-calltrace] ==--;
[app-calltrace-perform]
exten => s,1,Answer
exten => s,n,Wait(1)
exten => s,n,Macro(user-callerid,)
exten => s,n,Playback(info-about-last-call&telephone-number)
exten => s,n,Set(lastcaller=${DB(CALLTRACE/${AMPUSER})})
exten => s,n,GotoIf($[ $[ "${lastcaller}" = "" ] | $[ "${lastcaller}" = "unknown" ] ]?noinfo)
exten => s,n,SayDigits(${lastcaller})
exten => s,n,Set(TIMEOUT(digit)=3)
exten => s,n,Set(TIMEOUT(response)=7)
exten => s,n,Background(to-call-this-number&press-1)
exten => s,n,Goto(fin)
exten => s,n(noinfo),Playback(from-unknown-caller)
exten => s,n,Macro(hangupcall,)
exten => s,n(fin),Noop(Waiting for input)
exten => s,n,WaitExten(60,)
exten => s,n,Playback(sorry-youre-having-problems&goodbye)
exten => 1,1,Goto(from-internal,${lastcaller},1)
exten => i,1,Playback(vm-goodbye)
exten => i,n,Macro(hangupcall,)
exten => t,1,Playback(vm-goodbye)
exten => t,n,Macro(hangupcall,)
;--== end of [app-calltrace-perform] ==--;
[app-speakextennum]
exten => *65,1,Answer
exten => *65,n,Wait(1)
exten => *65,n,Macro(user-callerid,)
exten => *65,n,GotoIf($[${DIALPLAN_EXISTS(app-speakextennum,${CHANNEL(language)},1)}]?app-speakextennum,${CHANNEL(language)},1:app-speakextennum,en,1)
exten => en,1,Playback(your)
exten => en,n,Playback(extension)
exten => en,n,Playback(number)
exten => en,n,Playback(is)
exten => en,n,SayDigits(${AMPUSER})
exten => en,n,Wait(2)
exten => en,n,Hangup
exten => ja,1,Playback(your)
exten => ja,n,Playback(extension)
exten => ja,n,Playback(jp-wa)
exten => ja,n,SayDigits(${AMPUSER})
exten => ja,n,Wait(2)
exten => ja,n,Hangup
;--== end of [app-speakextennum] ==--;
[sub-hr12format]
exten => s,1,GotoIf($[${DIALPLAN_EXISTS(sub-hr12format,${CHANNEL(language)},1)}]?sub-hr12format,${CHANNEL(language)},1:sub-hr12format,en,1)
exten => s,n,GotoIf($[${DIALPLAN_EXISTS(sub-hr12format,${CHANNEL(language)},1)}]?${CHANNEL(language)},1:en,1)
exten => en,1,Playback(at-tone-time-exactly)
exten => en,n,SayUnixTime(${FutureTime},,IM 'and' S 'seconds' p)
exten => en,n,Return()
exten => en,n,Playback(at-tone-time-exactly)
exten => en,n,SayUnixTime(${FutureTime},,IM 'and' S 'seconds' p)
exten => en,n,Return()
exten => de,1,Playback(at-tone-time-exactly)
exten => de,n,SayUnixTime(${FutureTime},,IMSp)
exten => de,n,Return()
exten => de,n,Playback(at-tone-time-exactly)
exten => de,n,SayUnixTime(${FutureTime},,IMSp)
exten => de,n,Return()
exten => ja,1,Playback(at-tone-time-exactly)
exten => ja,n,SayUnixTime(${FutureTime},,pIMS)
exten => ja,n,Return()
exten => ja,n,Playback(at-tone-time-exactly)
exten => ja,n,SayUnixTime(${FutureTime},,pIMS)
exten => ja,n,Return()
;--== end of [sub-hr12format] ==--;
[app-speakingclock]
exten => *60,1,Macro(user-callerid,)
exten => *60,n,Answer
exten => *60,n,Wait(1)
exten => *60,n,Set(NumLoops=0)
exten => *60,n(start),Set(FutureTime=$[${EPOCH} + 11])
exten => *60,n,Gosub(sub-hr12format,s,1())
exten => *60,n(waitloop),Set(TimeLeft=$[${FutureTime} - ${EPOCH}])
exten => *60,n,GotoIf($[${TimeLeft} < 1]?playbeep)
exten => *60,n,Wait(1)
exten => *60,n,Goto(waitloop)
exten => *60,n(playbeep),Playback(beep)
exten => *60,n,Wait(5)
exten => *60,n,Set(NumLoops=$[${NumLoops} + 1])
exten => *60,n,GotoIf($[${NumLoops} < 5]?start)
exten => *60,n,Playback(goodbye)
exten => *60,n,Hangup
;--== end of [app-speakingclock] ==--;
[sub-hr24format]
exten => s,1,GotoIf($[${DIALPLAN_EXISTS(sub-hr24format,${CHANNEL(language)},1)}]?${CHANNEL(language)},1:en,1)
exten => en,1,Playback(at-tone-time-exactly)
exten => en,n,SayUnixTime(${FutureTime},,kM 'and' S 'seconds')
exten => en,n,Return()
exten => de,1,Playback(at-tone-time-exactly)
exten => de,n,SayUnixTime(${FutureTime},,kMS)
exten => de,n,Return()
exten => ja,1,Playback(at-tone-time-exactly)
exten => ja,n,SayUnixTime(${FutureTime},,kMS)
exten => ja,n,Return()
;--== end of [sub-hr24format] ==--;
[app-echo-test]
exten => *43,1,Answer
exten => *43,n,Macro(user-callerid,)
exten => *43,n,Wait(1)
exten => *43,n,Background(demo-echotest,,,app-echo-test-echo)
exten => *43,n,Goto(app-echo-test-echo,1,1)
;--== end of [app-echo-test] ==--;
[app-echo-test-echo]
exten => _[0-9#*],1,Echo()
exten => _[0-9#*],n,Playback(demo-echodone)
exten => _[0-9#*],n,Hangup
;--== end of [app-echo-test-echo] ==--;
[macro-outisbusy]
exten => s,1,Progress
exten => s,n,GotoIf($["${EMERGENCYROUTE}" = "YES"]?emergency,1)
exten => s,n,GotoIf($["${INTRACOMPANYROUTE}" = "YES"]?intracompany,1)
exten => s,n,Playback(all-circuits-busy-now&pls-try-call-later, noanswer)
exten => s,n,Congestion(20)
exten => s,n,Hangup
exten => intracompany,1,Playback(all-circuits-busy-now&pls-try-call-later, noanswer)
exten => intracompany,n,Congestion(20)
exten => intracompany,n,Hangup
exten => emergency,1,Playback(all-circuits-busy-now&pls-try-call-later)
exten => emergency,n,Congestion(20)
exten => emergency,n,Hangup
;--== end of [macro-outisbusy] ==--;
[ext-intercom]
exten => _*80.,1,Macro(user-callerid,)
exten => _*80.,n,Set(dialnumber=${EXTEN:3})
exten => _*80.,n,Set(INTERCOM_CALL=TRUE)
exten => _*80.,n,Gosub(sub-record-check,s,1(exten,${dialnumber}))
exten => _*80.,n,GotoIf($["${DB(AMPUSER/${AMPUSER}/intercom/block)}" = "blocked"]?end)
exten => _*80.,n,GotoIf($["${DB(DND/${dialnumber})}" = "YES"]?end)
exten => _*80.,n,GotoIf($["${DB(AMPUSER/${dialnumber}/intercom/${AMPUSER})}" = "allow" ]?allow)
exten => _*80.,n,GotoIf($["${DB(AMPUSER/${dialnumber}/intercom/${AMPUSER})}" = "deny" ]?nointercom)
exten => _*80.,n,GotoIf($["${DB(AMPUSER/${dialnumber}/intercom)}" = "disabled" ]?nointercom)
exten => _*80.,n(allow),Set(DEVICES=${DB(AMPUSER/${dialnumber}/device)})
exten => _*80.,n,GotoIf($["${DEVICES}" = "" ]?end)
exten => _*80.,n,Set(OVERRIDE=${DB(AMPUSER/${dialnumber}/intercom/override)})
exten => _*80.,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => _*80.,n,Set(_SIPURI=)
exten => _*80.,n,Set(_ALERTINFO=Ring Answer)
exten => _*80.,n,Set(_CALLINFO=<uri>\;answer-after=0)
exten => _*80.,n,Set(_SIPURI=intercom=true)
exten => _*80.,n,Set(_DTIME=5)
exten => _*80.,n,Set(_ANSWERMACRO=)
exten => _*80.,n,GotoIf($[${LOOPCNT} > 1 ]?pagemode)
exten => _*80.,n,Macro(autoanswer,${DEVICES})
exten => _*80.,n,Set(_DOPTIONS=A(beep)b(autoanswer^s^1(${ALERTINFO},${CALLINFO})))
exten => _*80.,n(check),ChanIsAvail(${DEVICE},s)
exten => _*80.,n,ExecIf($["${AVAILSTATUS}" = "6"]?Set(AVAILORIGCHAN=${DEVICE}))
exten => _*80.,n,GotoIf($["${AVAILORIGCHAN}" != ""]?continue)
exten => _*80.,n,ExecIf($["${OVERRIDE}" = ""]?Set(OVERRIDE=reject))
exten => _*80.,n,GotoIf($["${OVERRIDE}" = "reject"]?end)
exten => _*80.,n,Set(DTIME=30)
exten => _*80.,n,ExecIf($["${OVERRIDE}" = "ring"]?Set(DOPTIONS=A(beep)))
exten => _*80.,n(continue),Noop(Continuing with page)
exten => _*80.,n,GotoIf($["${DB(AMPUSER/${EXTEN:3}/cidname)}" = ""]?godial)
exten => _*80.,n,Set(CONNECTEDLINE(name,i)=${DB(AMPUSER/${EXTEN:3}/cidname)})
exten => _*80.,n,Set(CONNECTEDLINE(num)=${EXTEN:3})
exten => _*80.,n(godial),Dial(${DIAL},${DTIME},I${DOPTIONS}${INTERCOM_EXT_DOPTIONS})
exten => _*80.,n(end),ExecIf($[${INTERCOM_RETURN}]?Return())
exten => _*80.,n,Busy(20)
exten => _*80.,n,Macro(hangupcall,)
exten => _*80.,n(pagemode),Set(ITER=1)
exten => _*80.,n,Set(DIALSTR=)
exten => _*80.,n(begin),ChanIsAvail(${DB(DEVICE/${CUT(DEVICES,&,${ITER})}/dial)},s)
exten => _*80.,n,GotoIf($["${AVAILORIGCHAN}" = ""]?skip)
exten => _*80.,n,Set(DIALSTR=${DIALSTR}-${CUT(DEVICES,&,${ITER})})
exten => _*80.,n(skip),Set(ITER=$[${ITER} + 1])
exten => _*80.,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
exten => _*80.,n,Set(DIALSTR=${DIALSTR:1})
exten => _*80.,n,GotoIf($["${DIALSTR}" = ""]?end2)
exten => _*80.,n,Set(_AMPUSER=${AMPUSER})
exten => _*80.,n,Gosub(page,1(${DIALSTR}))
exten => _*80.,n(end2),ExecIf($[${INTERCOM_RETURN}]?Return())
exten => _*80.,n,Busy(20)
exten => _*80.,n,Macro(hangupcall,)
exten => _*80.,n(nointercom),Noop(Intercom disallowed by ${dialnumber})
exten => _*80.,n,ExecIf($[${INTERCOM_RETURN}]?Return())
exten => _*80.,n,Playback(intercom&for&extension)
exten => _*80.,n,SayDigits(${dialnumber})
exten => _*80.,n,Playback(is&disabled)
exten => _*80.,n,Congestion(20)
exten => page,1,Set(PAGE_CONF=${EPOCH}${RAND(100,999)})
exten => page,n,Set(PAGEMODE=PAGE)
exten => page,n,Set(PAGE_MEMBERS=${ARG1})
exten => page,n,Set(PAGE_CONF_OPTS=duplex)
exten => page,n,AGI(page.agi)
exten => page,n,Set(CONFBRIDGE(user,template)=page_user_duplex)
exten => page,n,Set(CONFBRIDGE(user,admin)=yes)
exten => page,n,Set(CONFBRIDGE(user,marked)=yes)
exten => page,n,ConfBridge(${PAGE_CONF},,,admin_menu)
exten => page,n,Hangup
;--== end of [ext-intercom] ==--;
[ext-intercom-users]
exten => *80300,1,Goto(ext-intercom,${EXTEN},1)
exten => *54,1,Answer
exten => *54,n,Wait(1)
exten => *54,n,Macro(user-callerid,)
exten => *54,n,Set(DB(AMPUSER/${AMPUSER}/intercom)=enabled)
exten => *54,n,Playback(intercom&enabled)
exten => *54,n,Macro(hangupcall,)
exten => _*54.,1,Answer
exten => _*54.,n,Wait(1)
exten => _*54.,n,Macro(user-callerid,)
exten => _*54.,n,GotoIf($["${DB(AMPUSER/${AMPUSER}/intercom/${EXTEN:3})}" = "allow" ]}?unset)
exten => _*54.,n,GotoIf($[${DB_EXISTS(AMPUSER/${EXTEN:3}/device)} != 1]?invaliduser)
exten => _*54.,n,Set(DB(AMPUSER/${AMPUSER}/intercom/${EXTEN:3})=allow)
exten => _*54.,n,Playback(intercom&enabled&for&extension&number)
exten => _*54.,n,SayDigits(${EXTEN:3})
exten => _*54.,n,Macro(hangupcall,)
exten => _*54.,n(unset),dbDeltree(AMPUSER/${AMPUSER}/intercom/${EXTEN:3})
exten => _*54.,n,Playback(intercom&enabled&cancelled&for&extension&number)
exten => _*54.,n,SayDigits(${EXTEN:3})
exten => _*54.,n,Macro(hangupcall,)
exten => _*54.,n(invaliduser),Playback(extension&number)
exten => _*54.,n,SayDigits(${EXTEN:3})
exten => _*54.,n,Playback(is&invalid)
exten => _*54.,n,Macro(hangupcall,)
exten => *55,1,Answer
exten => *55,n,Wait(1)
exten => *55,n,Macro(user-callerid,)
exten => *55,n,Set(DB(AMPUSER/${AMPUSER}/intercom)=disabled)
exten => *55,n,Playback(intercom&disabled)
exten => *55,n,Macro(hangupcall,)
exten => _*55.,1,Answer
exten => _*55.,n,Wait(1)
exten => _*55.,n,Macro(user-callerid,)
exten => _*55.,n,GotoIf($["${DB(AMPUSER/${AMPUSER}/intercom/${EXTEN:3})}" = "deny" ]}?unset2)
exten => _*55.,n,GotoIf($[${DB_EXISTS(AMPUSER/${EXTEN:3}/device)} != 1]?invaliduser2)
exten => _*55.,n,Set(DB(AMPUSER/${AMPUSER}/intercom/${EXTEN:3})=deny)
exten => _*55.,n,Playback(intercom&disabled&for&extension&number)
exten => _*55.,n,SayDigits(${EXTEN:3})
exten => _*55.,n,Macro(hangupcall,)
exten => _*55.,n(unset2),dbDeltree(AMPUSER/${AMPUSER}/intercom/${EXTEN:3})
exten => _*55.,n,Playback(intercom&disabled&cancelled&for&extension&number)
exten => _*55.,n,SayDigits(${EXTEN:3})
exten => _*55.,n,Macro(hangupcall,)
exten => _*55.,n(invaliduser2),Playback(extension&number)
exten => _*55.,n,SayDigits(${EXTEN:3})
exten => _*55.,n,Playback(is&invalid)
exten => _*55.,n,Macro(hangupcall,)
;--== end of [ext-intercom-users] ==--;
[macro-autoanswer]
exten => s,1,GotoIf($["${KNOWNDIAL}" != ""]?knowndial)
exten => s,n,Set(DEVICE=${DB(DEVICE/${ARG1}/dial)})
exten => s,n,GotoIf($["${DEVICE:0:5}" == "PJSIP" ]?dopjsip)
exten => s,n,Set(KNOWNDIAL=${DEVICE})
exten => s,n,Goto(knowndial)
exten => s,n(dopjsip),Set(KNOWNDIAL=${PJSIP_DIAL_CONTACTS(${ARG1})})
exten => s,n,GotoIf($[${REGEX("&" ${KNOWNDIAL})} == 0]?knowndial)
exten => s,n,Gosub(app-paging,ssetup,1())
exten => s,n,Set(PAGEMODE=PAGE)
exten => s,n,Set(PAGE_CONF_OPTS=duplex)
exten => s,n,Set(STREAM=NONE)
exten => s,n,Set(PAGE_MEMBERS=${ARG1})
exten => s,n,AGI(page.agi)
exten => s,n,Set(CONFBRIDGE(user,template)=page_user_duplex)
exten => s,n,Set(CONFBRIDGE(user,admin)=yes)
exten => s,n,Set(CONFBRIDGE(user,marked)=yes)
exten => s,n,ConfBridge(${PAGE_CONF},,,admin_menu)
exten => s,n,Hangup
exten => s,n(knowndial),Set(DIAL=${KNOWNDIAL})
exten => s,n,ExecIf($["${DIAL:0:3}" = "ZAP"]?Set(DIAL=DAHDI${DIAL:3}))
exten => s,n,GotoIf($["${DB(DEVICE/${ARG1}/autoanswer/macro)}" != "" ]?macro)
exten => s,n,Set(USERAGENT=${SIPPEER(${CUT(DIAL,/,2)},useragent)})
exten => s,n,ExecIf($["${KNOWNAGENT}" != ""]?Set(USERAGENT=${KNOWNAGENT}))
exten => s,n,ExecIf($["${USERAGENT:0:5}" = "Mitel"]?Set(CALLINFO=<sip:broadworks.net>\;answer-after=0))
exten => s,n,ExecIf($["${USERAGENT:0:9}" = "Panasonic"]?Set(ALERTINFO=Intercom))
exten => s,n,ExecIf($["${USERAGENT:0:7}" = "Polycom"]?Set(ALERTINFO=info=Auto Answer))
exten => s,n,ExecIf($["${USERAGENT:0:6}" = "Digium"]?Set(ALERTINFO=ring-answer))
exten => s,n,ExecIf($["${SIPURI}" != ""]?Set(__SIP_URI_OPTIONS=${SIPURI}))
exten => s,n+2(macro),Macro(${DB(DEVICE/${ARG1}/autoanswer/macro)},${ARG1})
;--== end of [macro-autoanswer] ==--;
[autoanswer]
exten => s,1,GosubIf($["${ARG1}" != ""]?addheader,1(Alert-Info,${ARG1}))
exten => s,n,GosubIf($["${ARG2}" != ""]?addheader,1(Call-Info,${ARG2}))
exten => s,n,Return()
exten => addheader,1,SIPAddHeader(${ARG1}: ${ARG2})
exten => addheader,n,Set(PJSIP_HEADER(add,${ARG1})=${ARG2})
exten => addheader,n,Return()
;--== end of [autoanswer] ==--;
[app-paging]
exten => ssetup,1,Set(_SIPURI=)
exten => ssetup,n,Set(_ALERTINFO=Ring Answer)
exten => ssetup,n,Set(_CALLINFO=<uri>\;answer-after=0)
exten => ssetup,n,Set(_SIPURI=intercom=true)
exten => ssetup,n,Set(_DTIME=5)
exten => ssetup,n,Set(_ANSWERMACRO=)
exten => ssetup,n,Set(PAGE_CONF=${EPOCH}${RAND(100,999)})
exten => ssetup,n,Return()
exten => _PAGE.,1(SKIPCHECK),Macro(autoanswer,${EXTEN:4})
exten => _PAGE.,n,Set(_DOPTIONS=A(beep)b(autoanswer^s^1(${ALERTINFO},${CALLINFO})))
exten => _PAGE.,n,Dial(${DIAL},${DTIME},${DOPTIONS})
exten => _PAGE.,n(skipself),Hangup
exten => _SPAGE.,1(chanspy),ChanSpy(${SP_DEVICE}-,qW)
exten => _SPAGE.,n,Hangup
;--== end of [app-paging] ==--;
[app-page-stream]
exten => s,1,Wait(1)
exten => s,n,Answer
exten => s,n,Set(CONFBRIDGE(user,template)=page_user_duplex)
exten => s,n,Set(CONFBRIDGE(user,marked)=yes)
exten => s,n,ConfBridge(${PAGE_CONF},,,)
exten => s,n,Hangup
;--== end of [app-page-stream] ==--;
[macro-parked-call]
exten => s,1,Macro(user-callerid,)
exten => s,n,Gosub(sub-record-check,s,1(parking,${AMPUSER},${AMPUSER}))
exten => s,n,Noop(PARKRETURNTO: ${SHARED(PARKRETURNTO,${CHANNEL})})
exten => s,n,GotoIf($[${LEN(${SHARED(PARKRETURNTO,${CHANNEL})})} > 0]?backtosender)
exten => s,n,GotoIf($[${LEN(${BLINDTRANSFER})} > 0 | ${LEN(${ATTENDEDTRANSFER})} > 0]?attemptpark)
exten => s,n,AGI(parkfetch.agi,${ARG1},${ARG2})
exten => s,n,GotoIf($["${REC_STATUS}" != "RECORDING"]?next)
exten => s,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
exten => s,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT})
exten => s,n(next),Set(CCSS_SETUP=TRUE)
exten => s,n,GotoIf($["${ARG1}" = "" | ${DIALPLAN_EXISTS(${IF($["${ARG2}" = "default"]?parkedcalls:${ARG2})},${ARG1},1)} = 1]?pcall)
exten => s,n,ResetCDR()
exten => s,n,NoCDR()
exten => s,n,Wait(1)
exten => s,n,Playback(pbx-invalidpark)
exten => s,n,Wait(1)
exten => s,n,Hangup
exten => s,n(pcall),Noop(User: ${CALLERID(all)} attempting to pick up Parked Call Slot ${ARG1})
exten => s,n,Noop(PARKIE: ${PARKIE})
exten => s,n,Set(SHARED(PARKRETURNTO,${PARKIE})=)
exten => s,n,Set(PARKOWNER=1)
exten => s,n,ParkedCall(${ARG2},${ARG1})
exten => s,n(attemptpark),Noop(User: ${CALLERID(all)} attempting to Park into slot ${ARG1})
exten => s,n,Noop(Blind Transfer: ${BLINDTRANSFER}, Attended Transfer: ${ATTENDEDTRANSFER})
exten => s,n,Noop($[${LEN(${PARKOWNER})} = 0])
exten => s,n,GotoIf($[${LEN(${PARKOWNER})} = 0]?parkit)
exten => s,n,Macro(hangupcall,)
exten => s,n(parkit),Set(PARKINGEXTEN=${ARG1})
exten => s,n,ExecIf($[${LEN(${BLINDTRANSFER})} > 0]?Set(SHARED(PARKRETURNTO,${CHANNEL})=${CUT(BLINDTRANSFER,-,1)}):Set(SHARED(PARKRETURNTO,${CHANNEL})=${CUT(ATTENDEDTRANSFER,-,1)}))
exten => s,n,Noop(PARKRETURNTO: ${SHARED(PARKRETURNTO,${CHANNEL})})
exten => s,n,Park(${ARG2},sc(${CONTEXT},s,200))
exten => s,1+199(backtosender),Noop(Attempting to go back to sender)
exten => s,n,Set(PARKCALLBACK=${PARKER})
exten => s,n,Set(SHARED(PARKRETURNTO,${CHANNEL})=)
exten => s,n,Goto(park-return-routing,${PARKINGSLOT},1)
exten => h,1,Macro(hangupcall,)
;--== end of [macro-parked-call] ==--;
[parkedcallstimeout]
exten => _[0-9a-zA-Z*#].,1,Set(PARKCALLBACK=${REPLACE(EXTEN,_,/)})
exten => _[0-9a-zA-Z*#].,n,GotoIf($["${REC_STATUS}" != "RECORDING"]?next)
exten => _[0-9a-zA-Z*#].,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
exten => _[0-9a-zA-Z*#].,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MIXMON_FORMAT},a,${MIXMON_POST})
exten => _[0-9a-zA-Z*#].,n(next),Goto(park-return-routing,${PARKINGSLOT},1)
;--== end of [parkedcallstimeout] ==--;
[park-dial]
exten => t,1,Noop(WARNING: PARKRETURN to: [${EXTEN}] failed with: [${DIALSTATUS}]. Trying Alternate Dest On Parking Lot ${PARKINGSLOT})
exten => t,n,Goto(park-orphan-routing,70,1)
exten => _[0-9a-zA-Z*#].,1,Noop(WARNING: PARKRETURN to: [${EXTEN}] failed with: [${DIALSTATUS}]. Trying Alternate Dest On Parking Lot ${PARKINGSLOT})
exten => _[0-9a-zA-Z*#].,n,Goto(park-orphan-routing,70,1)
;--== end of [park-dial] ==--;
[park-orphan-routing]
exten => 70,1,Goto(app-blackhole,hangup,1)
;--== end of [park-orphan-routing] ==--;
[park-return-routing]
exten => 70,1,Set(PLOT=70)
exten => 70,n,Dial(${PARKCALLBACK},15,tr)
exten => 70,n,Set(PARKCALLBACK=)
exten => 70,n,Goto(app-blackhole,hangup,1)
exten => 71,1,Goto(70,1)
exten => 72,1,Goto(70,1)
exten => 73,1,Goto(70,1)
exten => 74,1,Goto(70,1)
exten => 75,1,Goto(70,1)
exten => 76,1,Goto(70,1)
exten => 77,1,Goto(70,1)
exten => 78,1,Goto(70,1)
;--== end of [park-return-routing] ==--;
[park-hints]
include => parkedcalls ; Default Lot
exten => 71,1,Macro(parked-call,71,default)
exten => 71,hint,park:71@parkedcalls
exten => 72,1,Macro(parked-call,72,default)
exten => 72,hint,park:72@parkedcalls
exten => 73,1,Macro(parked-call,73,default)
exten => 73,hint,park:73@parkedcalls
exten => 74,1,Macro(parked-call,74,default)
exten => 74,hint,park:74@parkedcalls
exten => 75,1,Macro(parked-call,75,default)
exten => 75,hint,park:75@parkedcalls
exten => 76,1,Macro(parked-call,76,default)
exten => 76,hint,park:76@parkedcalls
exten => 77,1,Macro(parked-call,77,default)
exten => 77,hint,park:77@parkedcalls
exten => 78,1,Macro(parked-call,78,default)
exten => 78,hint,park:78@parkedcalls
exten => *85,1,Macro(parked-call,,default)
exten => *85,hint,park:71@parkedcalls&park:72@parkedcalls&park:73@parkedcalls&park:74@parkedcalls&park:75@parkedcalls&park:76@parkedcalls&park:77@parkedcalls&park:78@parkedcalls
exten => *8570,1,Macro(parked-call,,default)
exten => *8570,hint,park:71@parkedcalls&park:72@parkedcalls&park:73@parkedcalls&park:74@parkedcalls&park:75@parkedcalls&park:76@parkedcalls&park:77@parkedcalls&park:78@parkedcalls
;--== end of [park-hints] ==--;
[app-pbdirectory]
exten => 411,1,Goto(pbdirectory,1)
exten => pbdirectory,1,Answer
exten => pbdirectory,n,Wait(1)
exten => pbdirectory,n,Macro(user-callerid,)
exten => pbdirectory,n,AGI(pbdirectory)
exten => pbdirectory,n,GotoIf($["${dialnumber}"=""]?hangup,1)
exten => pbdirectory,n,Noop(Got number to dial: ${dialnumber})
exten => pbdirectory,n,Dial(Local/${dialnumber}@from-internal/n,)
exten => hangup,1,Hangup
;--== end of [app-pbdirectory] ==--;
[app-recordings]
exten => *77,1,Macro(user-callerid,)
exten => *77,n,Wait(2)
exten => *77,n,Macro(systemrecording,dorecord)
exten => *99,1,Macro(user-callerid,)
exten => *99,n,Wait(2)
exten => *99,n,Macro(systemrecording,docheck)
;--== end of [app-recordings] ==--;
[macro-systemrecording]
exten => s,1,Set(RECFILE=${IF($["${ARG2}" = ""]?/var/spool/asterisk/tmp/${AMPUSER}-ivrrecording:${ARG2})})
exten => s,n,ExecIf($["${ARG3}" != ""]?Authenticate(${ARG3}))
exten => s,n,Goto(${ARG1},1)
exten => dorecord,1,GotoIf($["${ARG2}" = ""]?skipremove)
exten => dorecord,n,System(rm ${ASTVARLIBDIR}/sounds/${RECFILE}.*)
exten => dorecord,n(skipremove),Record(${RECFILE}.wav,,,k)
exten => dorecord,n,Wait(1)
exten => dorecord,n,Goto(confmenu,1)
exten => docheck,1,Playback(beep)
exten => docheck,n(dc_start),Background(${RECFILE},m,${CHANNEL(language)},macro-systemrecording)
exten => docheck,n,Wait(1)
exten => docheck,n,Goto(confmenu,1)
exten => confmenu,1,Background(to-listen-to-it&press-1&to-rerecord-it&press-star&astcc-followed-by-pound,m,${CHANNEL(language)},macro-systemrecording)
exten => confmenu,n,Read(RECRESULT,,1,,,4)
exten => confmenu,n,GotoIf($["x${RECRESULT}"="x*"]?dorecord,1)
exten => confmenu,n,GotoIf($["x${RECRESULT}"="x1"]?docheck,2)
exten => confmenu,n,Goto(1)
exten => 1,1,Goto(docheck,dc_start)
exten => *,1,Goto(dorecord,1)
exten => t,1,Playback(goodbye)
exten => t,n,Hangup
exten => i,1,Playback(pm-invalid-option)
exten => i,n,Goto(confmenu,1)
exten => h,1,Hangup
;--== end of [macro-systemrecording] ==--;
[ext-group]
exten => h,1,Macro(hangupcall,)
;--== end of [ext-group] ==--;
[macro-speeddial-lookup]
exten => s,1,GotoIf($["${ARG2}"=""]]?lookupsys)
exten => s,n,Set(SPEEDDIALNUMBER=)
exten => s,n(lookupuser),Set(SPEEDDIALNUMBER=${DB(AMPUSER/${ARG2}/speeddials/${ARG1})})
exten => s,n,GotoIf($["${SPEEDDIALNUMBER}"=""]?lookupsys)
exten => s,n,Noop(Found speeddial ${ARG1} for user ${ARG2}: ${SPEEDDIALNUMBER})
exten => s,n,Goto(end)
exten => s,lookupuser+101(lookupsys),Set(SPEEDDIALNUMBER=${DB(sysspeeddials/${ARG1})})
exten => s,n,GotoIf($["${SPEEDDIALNUMBER}"=""]?failed)
exten => s,n,Noop(Found system speeddial ${ARG1}: ${SPEEDDIALNUMBER})
exten => s,n,Goto(end)
exten => s,lookupsys+101(failed),Noop(No system or user speeddial found)
exten => s,n(end),Noop(End of Speeddial-lookup)
;--== end of [macro-speeddial-lookup] ==--;
[app-speeddial]
exten => _*0.,1,Macro(user-callerid,)
exten => _*0.,n,Set(SPEEDDIALLOCATION=${EXTEN:2})
exten => _*0.,n(lookup),Macro(speeddial-lookup,${SPEEDDIALLOCATION},${AMPUSER})
exten => _*0.,n,GotoIf($["${SPEEDDIALNUMBER}"=""]?failed)
exten => _*0.,n,Goto(from-internal,${SPEEDDIALNUMBER},1)
exten => _*0.,lookup+101(failed),Playback(speed-dial-empty)
exten => _*0.,n,Congestion()
exten => *75,1,Goto(app-speeddial-set,s,1)
;--== end of [app-speeddial] ==--;
[app-speeddial-set]
exten => lang-playback,1,GosubIf($[${DIALPLAN_EXISTS(app-speeddial-set,${CHANNEL(language)})}]?app-speeddial-set,${CHANNEL(language)},${ARG1}():app-speeddial-set,en,${ARG1}())
exten => lang-playback,n,Return()
exten => s,1,Macro(user-callerid,)
exten => s,n(setloc),Read(newlocation,speed-enterlocation,,,,)
exten => s,n(lookup),Macro(speeddial-lookup,${newlocation},${AMPUSER})
exten => s,n,GotoIf($["${SPEEDDIALNUMBER}"!=""]?conflicts)
exten => s,n(setnum),Read(newnum,speed-enternumber,,,,)
exten => s,n(success),Set(DB(AMPUSER/${AMPUSER}/speeddials/${newlocation})=${newnum})
exten => s,n,Gosub(app-speeddial-set,lang-playback,1(hook_0))
exten => s,n,Hangup
exten => s,n(conflicts),Gosub(app-speeddial-set,lang-playback,1(hook_1))
exten => s,n,WaitExten(60,)
exten => 1,1,Gosub(app-speeddial-set,lang-playback,1(hook_2))
exten => 1,n,Goto(s,conflicts)
exten => 2,1,Goto(s,setloc)
exten => 3,1,Goto(s,setnum)
exten => t,1,Congestion()
exten => en,1(hook_0),Playback(speed-dial)
exten => en,n,SayDigits(${newlocation})
exten => en,n,Playback(is-set-to)
exten => en,n,SayDigits(${newnum})
exten => en,n,Return()
exten => en,n(hook_1),Playback(speed-dial)
exten => en,n,SayDigits(${newlocation})
exten => en,n,Playback(is-in-use)
exten => en,n,Background(press-1&to-listen-to-it&press-2&to-enter-a-diff&location&press-3&to-change&telephone-number)
exten => en,n,Return()
exten => en,n(hook_2),Playback(speed-dial)
exten => en,n,SayDigits(${newlocation})
exten => en,n,Playback(is-set-to)
exten => en,n,SayDigits(${SPEEDDIALNUMBER})
exten => en,n,Return()
exten => ja,1(hook_0),Playback(speed-dial)
exten => ja,n,SayDigits(${newlocation})
exten => ja,n,Playback(jp-wo)
exten => ja,n,SayDigits(${newnum})
exten => ja,n,Playback(is-set-to)
exten => ja,n,Return()
exten => ja,n(hook_1),Playback(speed-dial)
exten => ja,n,SayDigits(${newlocation})
exten => ja,n,Playback(jp-wa&is-in-use)
exten => ja,n,Background(list&press-1&to-enter-a-diff&location&jp-wo&to-enter&press-2&telephone-number&jp-wo&to-change&press-3)
exten => ja,n,Return()
exten => ja,n(hook_2),Playback(speed-dial)
exten => ja,n,SayDigits(${newlocation})
exten => ja,n,Playback(jp-wa)
exten => ja,n,SayDigits(${SPEEDDIALNUMBER})
exten => ja,n,Playback(is-set-to-2)
exten => ja,n,Return()
;--== end of [app-speeddial-set] ==--;
[vm-callme]
exten => s,1,Answer
exten => s,n,Wait(1)
exten => s,n(repeat),Background(${MSG}&silence/2&vm-repeat&vm-starmain)
exten => s,n,WaitExten(15,)
exten => 5,1,Goto(s,repeat)
exten => #,1,Playback(vm-goodbye)
exten => #,n,Hangup
exten => *,1,Macro(get-vmcontext,${MBOX})
exten => *,n,VoiceMailMain(${MBOX}@${VMCONTEXT},s)
exten => i,1,Playback(pm-invalid-option)
exten => i,n,Goto(s,repeat)
exten => t,1,Playback(vm-goodbye)
exten => t,n,Hangup
exten => h,1,Hangup
;--== end of [vm-callme] ==--;
[app-dialvm]
exten => *98,1,Macro(user-callerid,)
exten => *98,n,Answer
exten => *98,n(start),Wait(1)
exten => *98,n,Noop(app-dialvm: Asking for mailbox)
exten => *98,n,Read(MAILBOX,vm-login,,,3,2)
exten => *98,n(check),Noop(app-dialvm: Got Mailbox ${MAILBOX})
exten => *98,n,Macro(get-vmcontext,${MAILBOX})
exten => *98,n,Set(VMBOXEXISTSSTATUS=${IF(${VM_INFO(${MAILBOX}@${VMCONTEXT},exists)}?SUCCESS:FAILED)})
exten => *98,n,GotoIf($["${VMBOXEXISTSSTATUS}" = "SUCCESS"]?good:bad)
exten => *98,n,Macro(hangupcall,)
exten => *98,n(good),Noop(app-dialvm: Good mailbox ${MAILBOX}@${VMCONTEXT})
exten => *98,n,VoiceMailMain(${MAILBOX}@${VMCONTEXT})
exten => *98,n,GotoIf($["${IVR_RETVM}" = "RETURN" & "${IVR_CONTEXT}" != ""]?playret)
exten => *98,n,Macro(hangupcall,)
exten => *98,n(bad),Noop(app-dialvm: BAD mailbox ${MAILBOX}@${VMCONTEXT})
exten => *98,n,Wait(1)
exten => *98,n,Noop(app-dialvm: Asking for password so people can't probe for existence of a mailbox)
exten => *98,n,Read(FAKEPW,vm-password,,,3,2)
exten => *98,n,Noop(app-dialvm: Asking for mailbox again)
exten => *98,n,Read(MAILBOX,vm-incorrect-mailbox,,,3,2)
exten => *98,n,Goto(check)
exten => *98,n,Macro(hangupcall,)
exten => *98,n(playret),Playback(beep&you-will-be-transfered-menu&silence/1)
exten => *98,n,Goto(${IVR_CONTEXT},return,1)
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,GotoIf($["${IVR_RETVM}" = "RETURN" & "${IVR_CONTEXT}" != ""]?${IVR_CONTEXT},return,1)
exten => _*98.,n,Macro(hangupcall,)
;--== end of [app-dialvm] ==--;
[app-vmmain]
exten => *97,1,Answer
exten => *97,n,Wait(1)
exten => *97,n,Macro(user-callerid,)
exten => *97,n,Macro(get-vmcontext,${AMPUSER})
exten => *97,n(check),Set(VMBOXEXISTSSTATUS=${IF(${VM_INFO(${AMPUSER}@${VMCONTEXT},exists)}?SUCCESS:FAILED)})
exten => *97,n,GotoIf($["${VMBOXEXISTSSTATUS}" = "SUCCESS"]?mbexist)
exten => *97,n,VoiceMailMain()
exten => *97,n,GotoIf($["${IVR_RETVM}" = "RETURN" & "${IVR_CONTEXT}" != ""]?playret)
exten => *97,n,Macro(hangupcall,)
exten => *97,check+101(mbexist),GotoIf($["${DB(AMPUSER/${AMPUSER}/novmpw)}"!=""]?novmpw:vmpw)
exten => *97,n(novmpw),Noop(Verifying channel ${CHANNEL} is actually ${AMPUSER})
exten => *97,n,GotoIf($["${REGEX("^${DB(DEVICE/${AMPUSER}/dial)}-[0-9a-fx]+$" ${CHANNEL})}"!="1"]?vmpws)
exten => *97,n,VoiceMailMain(${AMPUSER}@${VMCONTEXT},s)
exten => *97,n,Goto(vmend)
exten => *97,n(vmpws),Noop(Channel ${CHANNEL} is NOT ${AMPUSER} forcing VM Password)
exten => *97,n(vmpw),VoiceMailMain(${AMPUSER}@${VMCONTEXT})
exten => *97,n,Goto(vmend)
exten => *97,n(vmend),GotoIf($["${IVR_RETVM}" = "RETURN" & "${IVR_CONTEXT}" != ""]?playret)
exten => *97,n,Macro(hangupcall,)
exten => *97,n(playret),Playback(beep&you-will-be-transfered-menu&silence/1)
exten => *97,n,Goto(${IVR_CONTEXT},return,1)
;--== end of [app-vmmain] ==--;
[from-did-direct-ivr]
exten => *300,1,Macro(blkvm-clr,)
exten => *300,n,Set(__NODEST=)
exten => *300,n,Macro(vm,300,DIRECTDIAL,${IVR_RETVM})
exten => *300,n,GotoIf($["${IVR_RETVM}" = "RETURN" & "${IVR_CONTEXT}" != ""]?ext-local,vmret,playret)
exten => 300,1,Macro(blkvm-clr,)
exten => 300,n,Set(__NODEST=)
exten => 300,n,Goto(from-did-direct,300,1)
;--== end of [from-did-direct-ivr] ==--;
[app-userlogonoff]
exten => *12,1,Macro(user-logoff,)
exten => *12,n(hook_off),Hangup
exten => *11,1,Macro(user-logon,)
exten => *11,n(hook_on_1),Hangup
exten => _*11.,1,Macro(user-logon,${EXTEN:3},)
exten => _*11.,n(hook_on_2),Hangup
;--== end of [app-userlogonoff] ==--;
[ext-local-confirm]
exten => _LC-.,1,ExecIf($["${DIRECTION}" = "INBOUND"]?Set(DIAL_OPTIONS=${REPLACE(DIAL_OPTIONS,T)}I))
exten => _LC-.,n,ExecIf($["${ALERT_INFO}"!=""]?SIPAddHeader(Alert-Info: ${ALERT_INFO}))
exten => _LC-.,n,Dial(${DB(DEVICE/${EXTEN:3}/dial)},${RT},${DIAL_OPTIONS}M(auto-confirm^${RG_IDX}))
;--== end of [ext-local-confirm] ==--;
[findmefollow-ringallv2]
exten => _FMPR-.,1,NoCDR()
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,ExecIf($["${DIALSTATUS}" = "BUSY"]?Set(SHARED(FM_DND,${FMUNIQUE})=DND))
exten => _FMPR-.,n,Hangup
exten => _FMGL-.,1,NoCDR()
exten => _FMGL-.,n,Set(ENDLOOP=$[${EPOCH} + ${FMPRERING} + 2])
exten => _FMGL-.,n(start),GotoIf($["${SHARED(FM_DND,${FMUNIQUE})}" = "DND"]?dodnd)
exten => _FMGL-.,n,Wait(1)
exten => _FMGL-.,n,GotoIf($[${EPOCH} < ${ENDLOOP}]?start)
exten => _FMGL-.,n,Set(SHARED(FM_DND,${FMUNIQUE})=)
exten => _FMGL-.,n(dodial),Macro(dial,${FMGRPTIME},${DIAL_OPTIONS},${EXTEN:5})
exten => _FMGL-.,n,Hangup
exten => _FMGL-.,n+10(dodnd),Set(SHARED(FM_DND,${FMUNIQUE})=)
exten => _FMGL-.,n,GotoIf($["${FMPRIME}" = "FALSE"]?dodial)
exten => _FMGL-.,n,Hangup
;--== end of [findmefollow-ringallv2] ==--;
[app-pickup]
exten => _**.,1,Macro(user-callerid,)
exten => _**.,n,Set(PICKUP_EXTEN=${AMPUSER})
exten => _**.,n,Pickup(${EXTEN:2}&${EXTEN:2}@PICKUPMARK)
exten => _**.,n,Hangup
exten => _***80.,1,Macro(user-callerid,)
exten => _***80.,n,Set(PICKUP_EXTEN=${AMPUSER})
exten => _***80.,n,Pickup(${EXTEN:5}&${EXTEN:5}@PICKUPMARK)
exten => _***80.,n,Hangup
;--== end of [app-pickup] ==--;
[app-chanspy]
exten => 555,1,Macro(user-callerid,)
exten => 555,n,Answer
exten => 555,n,Wait(1)
exten => 555,n,ChanSpy()
exten => 555,n,Hangup
;--== end of [app-chanspy] ==--;
[ext-test]
exten => 7777,1,Macro(user-callerid,)
exten => 7777,n,Goto(from-pstn,${EXTEN},1)
exten => h,1,Macro(hangupcall,)
;--== end of [ext-test] ==--;
[ext-did]
include => ext-did-0001
include => ext-did-0002
exten => foo,1,Noop(bar)
;--== end of [ext-did] ==--;
[ext-did-catchall]
exten => s,1,Noop(No DID or CID Match)
exten => s,n(a2),Answer
exten => s,n,Log(WARNING,Friendly Scanner from ${CUT(CUT(SIP_HEADER(Via), ,2),:,1)})
exten => s,n,Wait(2)
exten => s,n,Playback(ss-noservice)
exten => s,n,SayAlpha(${FROM_DID})
exten => s,n,Hangup
exten => _.,1,Set(__FROM_DID=${EXTEN})
exten => _.,n,Noop(Received an unknown call with DID set to ${EXTEN})
exten => _.,n,Goto(s,a2)
exten => h,1,Hangup
;--== end of [ext-did-catchall] ==--;
[from-trunk-pjsip-Telekom]
exten => _.,1,Set(GROUP()=OUT_2)
exten => _.,n,Goto(from-trunk,${EXTEN},1)
;--== end of [from-trunk-pjsip-Telekom] ==--;
[ext-trunk]
exten => 2,1,Set(TDIAL_SUFFIX=@Telekom)
exten => 2,n,Set(TDIAL_STRING=PJSIP)
exten => 2,n,Set(DIAL_TRUNK=2)
exten => 2,n,Goto(ext-trunk,tdial,1)
exten => tdial,1,Set(OUTBOUND_GROUP=OUT_${DIAL_TRUNK})
exten => tdial,n,GotoIf($["${OUTMAXCHANS_${DIAL_TRUNK}}" = ""]?nomax)
exten => tdial,n,GotoIf($[${GROUP_COUNT(OUT_${DIAL_TRUNK})} >= ${OUTMAXCHANS_${DIAL_TRUNK}}]?hangit)
exten => tdial,n(nomax),ExecIf($["${CALLINGPRES_SV}" != ""]?Set(CALLERPRES()=${CALLINGPRES_SV}))
exten => tdial,n,Set(DIAL_NUMBER=${FROM_DID})
exten => tdial,n,GosubIf($["${PREFIX_TRUNK_${DIAL_TRUNK}}" != ""]?sub-flp-${DIAL_TRUNK},s,1())
exten => tdial,n,Set(OUTNUM=${OUTPREFIX_${DIAL_TRUNK}}${DIAL_NUMBER})
exten => tdial,n,Set(DIAL_TRUNK_OPTIONS=${IF($["${DB_EXISTS(TRUNK/${DIAL_TRUNK}/dialopts)}" = "1"]?${DB_RESULT}:${TRUNK_OPTIONS})})
exten => tdial,n,Dial(${TDIAL_STRING}/${OUTNUM}${TDIAL_SUFFIX},${TRUNK_RING_TIMER},${DIAL_TRUNK_OPTIONS})
exten => tdial,n,Set(CALLERID(number)=${CALLERID(number):0:40})
exten => tdial,n,Set(CALLERID(name)=${CALLERID(name):0:40})
exten => tdial,n(hangit),Hangup
;--== end of [ext-trunk] ==--;
[macro-prepend-cid]
exten => s,1,GotoIf($["${RGPREFIX}" = ""]?REPCID)
exten => s,n,GotoIf($["${RGPREFIX}" != "${CALLERID(name):0:${LEN(${RGPREFIX})}}"]?REPCID)
exten => s,n,Set(CALLERID(name)=${CALLERID(name):${LEN(${RGPREFIX})}})
exten => s,n,Set(_RGPREFIX=)
exten => s,n(REPCID),Set(_RGPREFIX=${ARG1})
exten => s,n,Set(CALLERID(name)=${RGPREFIX}${CALLERID(name)})
;--== end of [macro-prepend-cid] ==--;
[outbound-allroutes]
include => outrt-1 ; Normal
exten => foo,1,Noop(bar)
;--== end of [outbound-allroutes] ==--;
[outrt-1] ; Normal
exten => _+49X.,1,Macro(user-callerid,LIMIT,EXTERNAL,)
exten => _+49X.,n,Gosub(sub-record-check,s,1(out,${EXTEN},dontcare))
exten => _+49X.,n,ExecIf($[ "${CALLEE_ACCOUNCODE}" != "" ] ?Set(CDR(accountcode)=${CALLEE_ACCOUNCODE}))
exten => _+49X.,n,Set(MOHCLASS=${IF($["${MOHCLASS}"=""]?default:${MOHCLASS})})
exten => _+49X.,n,ExecIf($["${KEEPCID}"!="TRUE" & ${LEN(${DB(AMPUSER/${AMPUSER}/outboundcid)})}=0 & ${LEN(${TRUNKCIDOVERRIDE})}=0]?Set(TRUNKCIDOVERRIDE="Kay" <04074041501>))
exten => _+49X.,n,Set(_NODEST=)
exten => _+49X.,n,Macro(dialout-trunk,2,${EXTEN},,off)
exten => _+49X.,n,Macro(outisbusy,)
exten => _0Z.,1,Macro(user-callerid,LIMIT,EXTERNAL,)
exten => _0Z.,n,Gosub(sub-record-check,s,1(out,${EXTEN},dontcare))
exten => _0Z.,n,ExecIf($[ "${CALLEE_ACCOUNCODE}" != "" ] ?Set(CDR(accountcode)=${CALLEE_ACCOUNCODE}))
exten => _0Z.,n,Set(MOHCLASS=${IF($["${MOHCLASS}"=""]?default:${MOHCLASS})})
exten => _0Z.,n,ExecIf($["${KEEPCID}"!="TRUE" & ${LEN(${DB(AMPUSER/${AMPUSER}/outboundcid)})}=0 & ${LEN(${TRUNKCIDOVERRIDE})}=0]?Set(TRUNKCIDOVERRIDE="Kay" <04074041501>))
exten => _0Z.,n,Set(_NODEST=)
exten => _0Z.,n,Macro(dialout-trunk,2,${EXTEN},,off)
exten => _0Z.,n,Macro(outisbusy,)
exten => _Z.,1,Macro(user-callerid,LIMIT,EXTERNAL,)
exten => _Z.,n,Gosub(sub-record-check,s,1(out,${EXTEN},dontcare))
exten => _Z.,n,ExecIf($[ "${CALLEE_ACCOUNCODE}" != "" ] ?Set(CDR(accountcode)=${CALLEE_ACCOUNCODE}))
exten => _Z.,n,Set(MOHCLASS=${IF($["${MOHCLASS}"=""]?default:${MOHCLASS})})
exten => _Z.,n,ExecIf($["${KEEPCID}"!="TRUE" & ${LEN(${DB(AMPUSER/${AMPUSER}/outboundcid)})}=0 & ${LEN(${TRUNKCIDOVERRIDE})}=0]?Set(TRUNKCIDOVERRIDE="Kay" <04074041501>))
exten => _Z.,n,Set(_NODEST=)
exten => _Z.,n,Macro(dialout-trunk,2,${EXTEN},,off)
exten => _Z.,n,Macro(outisbusy,)
;--== end of [outrt-1] ==--;
[app-blackhole]
exten => hangup,1,Noop(Blackhole Dest: Hangup)
exten => hangup,n,Hangup
exten => zapateller,1,Noop(Blackhole Dest: Play SIT Tone)
exten => zapateller,n,Answer
exten => zapateller,n,Zapateller()
exten => musiconhold,1,Noop(Blackhole Dest: Put caller on hold forever)
exten => musiconhold,n,Answer
exten => musiconhold,n,MusicOnHold()
exten => congestion,1,Noop(Blackhole Dest: Congestion)
exten => congestion,n,Playtones(congestion)
exten => congestion,n,Congestion(20)
exten => congestion,n,Hangup
exten => busy,1,Noop(Blackhole Dest: Busy)
exten => busy,n,Busy(20)
exten => busy,n,Hangup
exten => ring,1,Noop(Blackhole Dest: Ring)
exten => ring,n,Answer
exten => ring,n,Playtones(ring)
exten => ring,n,Wait(300)
exten => ring,n,Hangup
;--== end of [app-blackhole] ==--;
[bad-number]
exten => _X.,1,ResetCDR()
exten => _X.,n,NoCDR()
exten => _X.,n,Progress
exten => _X.,n,Wait(1)
exten => _X.,n,Progress
exten => _X.,n,Playback(silence/1&cannot-complete-as-dialed&check-number-dial-again,noanswer)
exten => _X.,n,Wait(1)
exten => _X.,n,Congestion(20)
exten => _X.,n,Hangup
;--== end of [bad-number] ==--;
[sub-presencestate-display]
exten => s,1,Goto(state-${TOLOWER(${PRESENCE_STATE(CustomPresence:${ARG1},value)})},1)
exten => state-available,1,Set(PRESENCESTATE_DISPLAY=(Available))
exten => state-available,n,Return()
exten => state-chat,1,Set(PRESENCESTATE_DISPLAY=(Chatty))
exten => state-chat,n,Return()
exten => state-away,1,Set(PRESENCESTATE_DISPLAY=(Away))
exten => state-away,n,Return()
exten => state-dnd,1,Set(PRESENCESTATE_DISPLAY=(DND))
exten => state-dnd,n,Return()
exten => state-xa,1,Set(PRESENCESTATE_DISPLAY=(Extended Away))
exten => state-xa,n,Return()
exten => state-unavailable,1,Set(PRESENCESTATE_DISPLAY=(Unavailable))
exten => state-unavailable,n,Return()
exten => _state-.,1,Set(PRESENCESTATE_DISPLAY=)
exten => _state-.,n,Return()
exten => state-,1,Set(PRESENCESTATE_DISPLAY=)
exten => state-,n,Return()
;--== end of [sub-presencestate-display] ==--;
[macro-confirm]
exten => s,1,Set(LOOPCOUNT=0)
exten => s,n,Set(__MACRO_RESULT=ABORT)
exten => s,n,Set(MSG1=${IF($["${ARG1}${ALT_CONFIRM_MSG}"=""]?incoming-call-1-accept-2-decline:${IF($[${LEN(${ALT_CONFIRM_MSG})}>0]?${ALT_CONFIRM_MSG}:${ARG1})})})
exten => s,n(start),Background(${MSG1},m,${CHANNEL(language)},macro-confirm)
exten => s,n,Read(INPUT,,1,,,4)
exten => s,n,GotoIf($[${LEN(${INPUT})} > 0]?${INPUT},1:t,1)
exten => 1,1,GotoIf($["${DB_EXISTS(RG/${ARG3}/${UNIQCHAN})}"="0" & "${SHARED(ANSWER_STATUS,${FORCE_CONFIRM})}"=""]?toolate,1)
exten => 1,n,Noop(Deleting: RG/${ARG3}/${UNIQCHAN} ${DB_DELETE(RG/${ARG3}/${UNIQCHAN})})
exten => 1,n,Macro(blkvm-clr,)
exten => 1,n,Set(SHARED(ANSWER_STATUS,${FORCE_CONFIRM})=)
exten => 1,n(skip),Set(__MACRO_RESULT=)
exten => 1,n,ExecIf($[("${MOHCLASS}"!="default") & ("${MOHCLASS}"!="")]?Set(CHANNEL(musicclass)=${MOHCLASS}))
exten => 1,n(exitopt1),MacroExit()
exten => 2,1,Goto(noanswer,1)
exten => 3,1,SayDigits(${CALLCONFIRMCID})
exten => 3,n,GotoIf($["${DB_EXISTS(RG/${ARG3}/${UNIQCHAN})}"="0" & "${SHARED(ANSWER_STATUS,${FORCE_CONFIRM})}"=""]?toolate,1:s,start)
exten => t,1,GotoIf($["${DB_EXISTS(RG/${ARG3}/${UNIQCHAN})}"="0" & "${SHARED(ANSWER_STATUS,${FORCE_CONFIRM})}"=""]?toolate,1)
exten => t,n,Set(LOOPCOUNT=$[ ${LOOPCOUNT} + 1 ])
exten => t,n,GotoIf($[ ${LOOPCOUNT} < 5 ]?s,start:noanswer,1)
exten => _X,1,Background(invalid,m,${CHANNEL(language)},macro-confirm)
exten => _X,n,GotoIf($["${DB_EXISTS(RG/${ARG3}/${UNIQCHAN})}"="0" | "${SHARED(ANSWER_STATUS,${FORCE_CONFIRM})}"=""]?toolate,1)
exten => _X,n,Set(LOOPCOUNT=$[ ${LOOPCOUNT} + 1 ])
exten => _X,n,GotoIf($[ ${LOOPCOUNT} < 5 ]?s,start:noanswer,1)
exten => noanswer,1,Set(__MACRO_RESULT=ABORT)
exten => noanswer,n(exitnoanswer),MacroExit()
exten => toolate,1,Set(MSG2=${IF($["foo${ARG2}" != "foo"]?${ARG2}:"incoming-call-no-longer-avail")})
exten => toolate,n,Playback(${MSG2})
exten => toolate,n,Set(__MACRO_RESULT=ABORT)
exten => toolate,n(exittoolate),MacroExit()
exten => h,1,Macro(hangupcall,)
;--== end of [macro-confirm] ==--;
[macro-auto-confirm]
exten => s,1,Set(__MACRO_RESULT=)
exten => s,n,Set(CFIGNORE=)
exten => s,n,Set(MASTER_CHANNEL(CFIGNORE)=)
exten => s,n,Set(FORWARD_CONTEXT=from-internal)
exten => s,n,Set(MASTER_CHANNEL(FORWARD_CONTEXT)=from-internal)
exten => s,n,Macro(blkvm-clr,)
exten => s,n,Noop(Deleting: RG/${ARG1}/${UNIQCHAN} ${DB_DELETE(RG/${ARG1}/${UNIQCHAN})})
exten => s,n,ExecIf($[!${REGEX("[^0-9]" ${DIALEDPEERNUMBER})} && "${DB(AMPUSER/${AMPUSER}/cidname)}" != ""]?Set(MASTER_CHANNEL(CONNECTEDLINE(num))=${DIALEDPEERNUMBER}))
exten => s,n,ExecIf($[!${REGEX("[^0-9]" ${DIALEDPEERNUMBER})} && "${DB(AMPUSER/${AMPUSER}/cidname)}" != ""]?Set(MASTER_CHANNEL(CONNECTEDLINE(name))=${DB(AMPUSER/${DIALEDPEERNUMBER}/cidname)}))
;--== end of [macro-auto-confirm] ==--;
[macro-auto-blkvm]
exten => s,1,Set(__MACRO_RESULT=)
exten => s,n,Set(CFIGNORE=)
exten => s,n,Set(MASTER_CHANNEL(CFIGNORE)=)
exten => s,n,Set(FORWARD_CONTEXT=from-internal)
exten => s,n,Set(MASTER_CHANNEL(FORWARD_CONTEXT)=from-internal)
exten => s,n,Macro(blkvm-clr,)
exten => s,n,ExecIf($[!${REGEX("[^0-9]" ${DIALEDPEERNUMBER})} && "${DB(AMPUSER/${AMPUSER}/cidname)}" != ""]?Set(MASTER_CHANNEL(CONNECTEDLINE(num))=${DIALEDPEERNUMBER}))
exten => s,n,ExecIf($[!${REGEX("[^0-9]" ${DIALEDPEERNUMBER})} && "${DB(AMPUSER/${AMPUSER}/cidname)}" != ""]?Set(MASTER_CHANNEL(CONNECTEDLINE(name))=${DB(AMPUSER/${DIALEDPEERNUMBER}/cidname)}))
;--== end of [macro-auto-blkvm] ==--;
[sub-pincheck]
exten => s,1,Authenticate(${ARG3},)
exten => s,n,ResetCDR()
exten => s,n,Return()
;--== end of [sub-pincheck] ==--;
[macro-dialout-trunk]
exten => s,1,Set(DIAL_TRUNK=${ARG1})
exten => s,n,GosubIf($[$["${ARG3}" != ""] & $["${DB(AMPUSER/${AMPUSER}/pinless)}" != "NOPASSWD"]]?sub-pincheck,s,1())
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(OUTBOUND_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=${IF($["${DB_EXISTS(TRUNK/${DIAL_TRUNK}/dialopts)}" = "1"]?${DB_RESULT}:${TRUNK_OPTIONS})})
exten => s,n,Macro(outbound-callerid,${DIAL_TRUNK})
exten => s,n(skipoutcid),GosubIf($["${PREFIX_TRUNK_${DIAL_TRUNK}}" != ""]?sub-flp-${DIAL_TRUNK},s,1())
exten => s,n,Set(OUTNUM=${OUTPREFIX_${DIAL_TRUNK}}${DIAL_NUMBER})
exten => s,n,Set(custom=${CUT(OUT_${DIAL_TRUNK},:,1)})
exten => s,n,ExecIf($["${MOHCLASS}"!="default" & "${MOHCLASS}"!="" & "${FORCE_CONFIRM}"="" ]?Set(DIAL_TRUNK_OPTIONS=M(setmusic^${MOHCLASS})${DIAL_TRUNK_OPTIONS}))
exten => s,n,ExecIf($["${FORCE_CONFIRM}"!="" ]?Set(DIAL_TRUNK_OPTIONS=${DIAL_TRUNK_OPTIONS}M(confirm)))
exten => s,n(gocall),Macro(dialout-trunk-predial-hook,)
exten => s,n,GotoIf($["${PREDIAL_HOOK_RET}" = "BYPASS"]?bypass,1)
exten => s,n,ExecIf($["${DB(AMPUSER/${AMPUSER}/cidname)}" != ""]?Set(CONNECTEDLINE(num,i)=${DIAL_NUMBER}))
exten => s,n,ExecIf($["${DB(AMPUSER/${AMPUSER}/cidname)}" != ""]?Set(CONNECTEDLINE(name,i)=CID:${CALLERID(number)}))
exten => s,n,GotoIf($["${custom}" = "AMP"]?customtrunk)
exten => s,n,Dial(${OUT_${DIAL_TRUNK}}/${OUTNUM}${OUT_${DIAL_TRUNK}_SUFFIX},${TRUNK_RING_TIMER},${DIAL_TRUNK_OPTIONS})
exten => s,n,Noop(Dial failed for some reason with DIALSTATUS = ${DIALSTATUS} and HANGUPCAUSE = ${HANGUPCAUSE})
exten => s,n,GotoIf($["${ARG4}" = "on"]?continue,1: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})
exten => s,n(skipoutnum),Dial(${pre_num:4}${the_num}${post_num},${TRUNK_RING_TIMER},${DIAL_TRUNK_OPTIONS})
exten => s,n,Noop(Dial failed for some reason with DIALSTATUS = ${DIALSTATUS} and HANGUPCAUSE = ${HANGUPCAUSE})
exten => s,n,GotoIf($["${ARG4}" = "on"]?continue,1: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-ANSWER,1,Noop(Call successfully answered - Hanging up now)
exten => s-ANSWER,n,Macro(hangupcall,)
exten => s-NOANSWER,1,Noop(Dial failed due to trunk reporting NOANSWER - giving up)
exten => s-NOANSWER,n,Progress
exten => s-NOANSWER,n,Playback(number-not-answering,noanswer)
exten => s-NOANSWER,n,Congestion(20)
exten => s-INVALIDNMBR,1,Noop(Dial failed due to trunk reporting Address Incomplete - giving up)
exten => s-INVALIDNMBR,n,Progress
exten => s-INVALIDNMBR,n,Playback(ss-noservice,noanswer)
exten => s-INVALIDNMBR,n,Busy(20)
exten => s-CHANGED,1,Noop(Dial failed due to trunk reporting Number Changed - giving up)
exten => s-CHANGED,n,Playtones(busy)
exten => s-CHANGED,n,Busy(20)
exten => _s-.,1,Set(RC=${IF($[${ISNULL(${HANGUPCAUSE})}]?0:${HANGUPCAUSE})})
exten => _s-.,n,Goto(${RC},1)
exten => 17,1,Goto(s-BUSY,1)
exten => 18,1,Goto(s-NOANSWER,1)
exten => 22,1,Goto(s-CHANGED,1)
exten => 23,1,Goto(s-CHANGED,1)
exten => 1,1,Goto(s-INVALIDNMBR,1)
exten => 28,1,Goto(s-INVALIDNMBR,1)
exten => _X,1,Goto(continue,1)
exten => _X.,1,Goto(continue,1)
exten => continue,1(noreport),Noop(TRUNK Dial failed due to ${DIALSTATUS} HANGUPCAUSE: ${HANGUPCAUSE} - failing through to other trunks)
exten => continue,n,Set(CALLERID(number)=${AMPUSER})
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] ==--;
[macro-privacy-mgr]
exten => s,1,Set(KEEPCID=${CALLERID(num)})
exten => s,n,Set(TESTCID=${IF($["${CALLERID(num):0:1}"="+"]?${MATH(1+${CALLERID(num):1})}:${MATH(1+${CALLERID(num)})})})
exten => s,n,ExecIf($[${LEN(${TESTCID})}=0]?Set(CALLERID(num)=))
exten => s,n,PrivacyManager(${ARG1},${ARG2})
exten => s,n,GotoIf($["${PRIVACYMGRSTATUS}"="FAILED"]?fail)
exten => s,n,GosubIf($["${CALLED_BLACKLIST}"="1"]?app-blacklist-check,s,1())
exten => s,n,Set(CALLERID(num-pres)=allowed_passed_screen)
exten => s,n,MacroExit()
exten => s,n(fail),Noop(STATUS: ${PRIVACYMGRSTATUS} CID: ${CALLERID(num)} ${CALLERID(name)} CALLPRES: ${CALLLINGPRES})
exten => s,n,Playback(sorry-youre-having-problems&goodbye)
exten => s,n,Playtones(congestion)
exten => s,n,Congestion(20)
exten => h,1,Hangup
;--== end of [macro-privacy-mgr] ==--;
[macro-user-callerid]
exten => s,1,Set(TOUCH_MONITOR=${UNIQUEID})
exten => s,n,Set(AMPUSER=${IF($["${AMPUSER}" = ""]?${CALLERID(number)}:${AMPUSER})})
exten => s,n,GotoIf($["${CUT(CHANNEL,@,2):5:5}"="queue" | ${LEN(${AMPUSERCIDNAME})}]?report)
exten => s,n,ExecIf($["${REALCALLERIDNUM:1:2}" = ""]?Set(REALCALLERIDNUM=${CALLERID(number)}))
exten => s,n,Set(AMPUSER=${DB(DEVICE/${REALCALLERIDNUM}/user)})
exten => s,n,GotoIf($["${AMPUSER}" = "none"]?limit)
exten => s,n,Set(AMPUSERCIDNAME=${DB(AMPUSER/${AMPUSER}/cidname)})
exten => s,n,GotoIf($["${AMPUSERCIDNAME:1:2}" = ""]?report)
exten => s,n,Set(AMPUSERCID=${IF($["${ARG2}" != "EXTERNAL" & "${DB_EXISTS(AMPUSER/${AMPUSER}/cidnum)}" = "1"]?${DB_RESULT}:${AMPUSER})})
exten => s,n,Set(__DIAL_OPTIONS=${IF($["${DB_EXISTS(AMPUSER/${AMPUSER}/dialopts)}" = "1"]?${DB_RESULT}:${DIAL_OPTIONS})})
exten => s,n,Set(CALLERID(all)="${AMPUSERCIDNAME}" <${AMPUSERCID}>)
exten => s,n,GotoIf($["${ARG1}"="LIMIT" & ${LEN(${AMPUSER})} & ${DB_EXISTS(AMPUSER/${AMPUSER}/concurrency_limit)} & ${DB(AMPUSER/${AMPUSER}/concurrency_limit)}>0 & ${GROUP_COUNT(${AMPUSER}@concurrency_limit)}>=${DB(AMPUSER/${AMPUSER}/concurrency_limit)}]?limit)
exten => s,n,ExecIf($["${ARG1}"="LIMIT" & ${LEN(${AMPUSER})}]?Set(GROUP(concurrency_limit)=${AMPUSER}))
exten => s,n,GosubIf($[${LEN(${DB(AMPUSER/${AMPUSER}/ccss/cc_agent_policy)})} & "${DB(AMPUSER/${AMPUSER}/ccss/cc_agent_policy)}" != "never"]?sub-ccss,s,1(${MACRO_CONTEXT},${CALLERID(dnid)}))
exten => s,n,ExecIf($["${DB(AMPUSER/${AMPUSER}/language)}" != ""]?Set(CHANNEL(language)=${DB(AMPUSER/${AMPUSER}/language)}))
exten => s,n(report),GotoIf($[ "${ARG1}" = "SKIPTTL" | "${ARG1}" = "LIMIT" ]?continue)
exten => s,n,ExecIf($["${CALLEE_ACCOUNCODE}" = ""]?Set(__CALLEE_ACCOUNCODE=${DB(AMPUSER/${IF($["${MACRO_CONTEXT}"="macro-exten-vm"]?${ARG2}:${MACRO_EXTEN})}/accountcode)}))
exten => s,n(report2),Set(__TTL=${IF($["foo${TTL}" = "foo"]?64:$[ ${TTL} - 1 ])})
exten => s,n,GotoIf($[ ${TTL} > 0 ]?continue)
exten => s,n,Wait(${RINGTIMER})
exten => s,n,Answer
exten => s,n,Wait(1)
exten => s,n,Playback(im-sorry&an-error-has-occurred&with&call-forwarding)
exten => s,n,Macro(hangupcall,)
exten => s,n(limit),Answer
exten => s,n,Wait(1)
exten => s,n,Playback(beep&im-sorry&your&simul-call-limit-reached&goodbye)
exten => s,n,Macro(hangupcall,)
exten => s,n,Congestion(20)
exten => s,n(continue),Set(CALLERID(number)=${CALLERID(number):0:40})
exten => s,n,Set(CALLERID(name)=${CALLERID(name):0:40})
exten => s,n,Set(CDR(cnum)=${CALLERID(num)})
exten => s,n,Set(CDR(cnam)=${CALLERID(name)})
exten => s,n,Set(CHANNEL(language)=${MASTER_CHANNEL(CHANNEL(language))})
exten => h,1,Macro(hangupcall,)
;--== end of [macro-user-callerid] ==--;
[macro-outbound-callerid]
exten => s,1,ExecIf($["${CALLINGPRES_SV}" != ""]?Set(CALLERPRES()=${CALLINGPRES_SV}))
exten => s,n,ExecIf($["${REALCALLERIDNUM:1:2}" = ""]?Set(REALCALLERIDNUM=${CALLERID(number)}))
exten => s,n(start),GotoIf($[ $["${REALCALLERIDNUM}" = ""] | $["${KEEPCID}" != "TRUE"] | $["${OUTKEEPCID_${ARG1}}" = "on"] ]?normcid)
exten => s,n,Set(USEROUTCID=${REALCALLERIDNUM})
exten => s,n,GotoIf($["foo${DB(AMPUSER/${REALCALLERIDNUM}/device)}" = "foo"]?bypass)
exten => s,n(normcid),Set(USEROUTCID=${DB(AMPUSER/${AMPUSER}/outboundcid)})
exten => s,n(bypass),Set(EMERGENCYCID=${DB(DEVICE/${REALCALLERIDNUM}/emergency_cid)})
exten => s,n,Set(TRUNKOUTCID=${OUTCID_${ARG1}})
exten => s,n,GotoIf($["${EMERGENCYROUTE:1:2}" = "" | "${EMERGENCYCID:1:2}" = ""]?trunkcid)
exten => s,n,Set(CALLERID(all)=${EMERGENCYCID})
exten => s,n,Set(CDR(outbound_cnum)=${CALLERID(num)})
exten => s,n,Set(CDR(outbound_cnam)=${CALLERID(name)})
exten => s,n(exit),MacroExit()
exten => s,n(trunkcid),ExecIf($[${LEN(${TRUNKOUTCID})} != 0]?Set(CALLERID(all)=${TRUNKOUTCID}))
exten => s,n(usercid),ExecIf($[${LEN(${USEROUTCID})} != 0]?Set(CALLERID(all)=${USEROUTCID}))
exten => s,n,ExecIf($[${LEN(${TRUNKCIDOVERRIDE})} != 0 | ${LEN(${FORCEDOUTCID_${ARG1}})} != 0]?Set(CALLERID(all)=${IF($[${LEN(${FORCEDOUTCID_${ARG1}})}=0]?${TRUNKCIDOVERRIDE}:${FORCEDOUTCID_${ARG1}})}))
exten => s,n(hidecid),ExecIf($["${CALLERID(name)}"="hidden"]?Set(CALLERPRES()=prohib_passed_screen))
exten => s,n,Set(CDR(outbound_cnum)=${CALLERID(num)})
exten => s,n,Set(CDR(outbound_cnam)=${CALLERID(name)})
;--== end of [macro-outbound-callerid] ==--;
[from-zaptel]
include => from-dahdi
exten => foo,1,Noop(bar)
;--== end of [from-zaptel] ==--;
[from-dahdi]
exten => _X.,1,Set(DID=${EXTEN})
exten => _X.,n,Goto(s,1)
exten => s,1,Noop(Entering from-dahdi with DID == ${DID})
exten => s,n,Ringing()
exten => s,n,Set(DID=${IF($["${DID}"= ""]?s:${DID})})
exten => s,n,Noop(DID is now ${DID})
exten => s,n,GotoIf($["${CHANNEL:0:5}"="DAHDI"]?dahdiok:checkzap)
exten => s,n(checkzap),GotoIf($["${CHANNEL:0:3}"="Zap"]?zapok:neither)
exten => s,n(neither),Goto(from-pstn,${DID},1)
exten => s,n,Macro(Hangupcall,dummy)
exten => s,n(dahdiok),Noop(Is a DAHDi Channel)
exten => s,n,Set(CHAN=${CHANNEL:6})
exten => s,n,Set(CHAN=${CUT(CHAN,-,1)})
exten => s,n,Macro(from-dahdi-${CHAN},${DID},1)
exten => s,n,Noop(Returned from Macro from-dahdi-${CHAN})
exten => s,n,Goto(from-pstn,${DID},1)
exten => s,n(zapok),Noop(Is a Zaptel Channel)
exten => s,n,Set(CHAN=${CHANNEL:4})
exten => s,n,Set(CHAN=${CUT(CHAN,-,1)})
exten => s,n,Macro(from-dahdi-${CHAN},${DID},1)
exten => s,n,Noop(Returned from Macro from-dahdi-${CHAN})
exten => s,n,Goto(from-pstn,${DID},1)
;--== end of [from-dahdi] ==--;
[macro-dial-confirm]
exten => s,1,Set(DB(RG/${ARG4}/${CHANNEL})=RINGING)
exten => s,n,Set(__UNIQCHAN=${CHANNEL})
exten => s,n,Set(USE_CONFIRMATION=TRUE)
exten => s,n,Set(RINGGROUP_INDEX=${ARG4})
exten => s,n,Set(FORCE_CONFIRM=)
exten => s,n,Set(ARG4=)
exten => s,n,Macro(dial,${ARG1},${ARG2},${ARG3})
exten => s,n,Noop(Deleting: RG/${RINGGROUP_INDEX}/${CHANNEL} ${DB_DELETE(RG/${RINGGROUP_INDEX}/${CHANNEL})})
exten => s,n,Set(USE_CONFIRMATION=)
exten => s,n,Set(RINGGROUP_INDEX=)
;--== end of [macro-dial-confirm] ==--;
[macro-setmusic]
exten => s,1,Set(CHANNEL(musicclass)=${ARG1})
;--== end of [macro-setmusic] ==--;
[macro-block-cf]
exten => _X.,1,Hangup
exten => s-ANSWER,1,Noop(Call successfully answered - Hanging up now)
exten => s-ANSWER,n,Macro(hangupcall,)
;--== end of [macro-block-cf] ==--;
[macro-vm]
exten => s,1,Macro(user-callerid,SKIPTTL)
exten => s,n,Set(VMGAIN=${IF($["foo${VM_GAIN}"!="foo"]?"g(${VM_GAIN})": )})
exten => s,n,Macro(blkvm-check,)
exten => s,n,GotoIf($["${GOSUB_RETVAL}" != "TRUE"]?vmx,1)
exten => s,n,Hangup
exten => vmx,1,Set(MEXTEN=${ARG1})
exten => vmx,n,Set(MMODE=${ARG2})
exten => vmx,n,Set(RETVM=${ARG3})
exten => vmx,n,Set(MODE=${IF($["${MMODE}"="BUSY"]?busy:unavail)})
exten => vmx,n,Macro(get-vmcontext,${MEXTEN})
exten => vmx,n,Set(MODE=${IF($[(${STAT(f,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${MEXTEN}/temp.wav)} = 1) || (${STAT(f,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${MEXTEN}/temp.WAV)} = 1)]?temp:${MODE})})
exten => vmx,n,Noop(MODE IS: ${MODE})
exten => vmx,n,GotoIf($["${DB(AMPUSER/${MEXTEN}/vmx/${MODE}/state)}" != "enabled"]?chknomsg)
exten => vmx,n,Set(VM_OPTS=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/vmxopts/timeout)}" = "1"]?${DB_RESULT}:${VM_OPTS})})
exten => vmx,n(chknomsg),GotoIf($["${MMODE}"="NOMESSAGE"]?s-${MMODE},1)
exten => vmx,n,GotoIf($["${MMODE}" != "DIRECTDIAL"]?notdirect)
exten => vmx,n,Set(MODE=${IF($["${REGEX("[b]" ${VM_DDTYPE})}" = "1"]?busy:${MODE})})
exten => vmx,n(notdirect),Noop(Checking if ext ${MEXTEN} is enabled: ${DB(AMPUSER/${MEXTEN}/vmx/${MODE}/state)})
exten => vmx,n,GotoIf($["${DB(AMPUSER/${MEXTEN}/vmx/${MODE}/state)}" != "enabled"]?s-${MMODE},1)
exten => vmx,n,GotoIf($[(${STAT(f,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${MEXTEN}/${MODE}.wav)} = 0) && (${STAT(f,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${MEXTEN}/${MODE}.WAV)} = 0)]?nofile)
exten => vmx,n,Set(VMX_TIMEOUT=2)
exten => vmx,n,Set(VMX_REPEAT=1)
exten => vmx,n,Set(VMX_LOOPS=1)
exten => vmx,n,Set(LOOPCOUNT=0)
exten => vmx,n,Set(VMX_REPEAT=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/repeat)}" = "1"]?${DB_RESULT}:${VMX_REPEAT})})
exten => vmx,n(vmxtime),Set(VMX_TIMEOUT=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/timeout)}" = "1"]?${DB_RESULT}:${VMX_TIMEOUT})})
exten => vmx,n(vmxloops),Set(VMX_LOOPS=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/loops)}" = "1"]?${DB_RESULT}:${VMX_LOOPS})})
exten => vmx,n(vmxanswer),Answer
exten => vmx,n(loopstart),Read(ACTION,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${MEXTEN}/${MODE},1,skip,${VMX_REPEAT},${VMX_TIMEOUT})
exten => vmx,n,GotoIf($["${EXISTS(${ACTION})}" = "1"]?checkopt)
exten => vmx,n(noopt),Noop(Timeout: going to timeout dest)
exten => vmx,n,Set(VMX_OPTS=${DB(AMPUSER/${MEXTEN}/vmx/${MODE}/vmxopts/timeout)})
exten => vmx,n(chktime),GotoIf($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/timedest/ext)}" = "0"]?dotime)
exten => vmx,n,Set(VMX_TIMEDEST_EXT=${DB_RESULT})
exten => vmx,n,Set(VMX_TIMEDEST_CONTEXT=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/timedest/context)}" = "1"]?${DB_RESULT}:${VMX_TIMEDEST_CONTEXT})})
exten => vmx,n(timepri),Set(VMX_TIMEDEST_PRI=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/timedest/pri)}" = "1"]?${DB_RESULT}:${VMX_TIMEDEST_PRI})})
exten => vmx,n(dotime),Goto(${VMX_TIMEDEST_CONTEXT},${VMX_TIMEDEST_EXT},${VMX_TIMEDEST_PRI})
exten => vmx,n(checkopt),GotoIf($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/${ACTION}/ext)}" = "1"]?doopt)
exten => vmx,n,GotoIf($["${ACTION}" = "0"]?o,1)
exten => vmx,n,GotoIf($["${ACTION}" = "*"]?adef,1)
exten => vmx,n,Set(LOOPCOUNT=$[${LOOPCOUNT} + 1])
exten => vmx,n,GotoIf($["${LOOPCOUNT}" > "${VMX_LOOPS}"]?toomany)
exten => vmx,n,Playback(pm-invalid-option&please-try-again)
exten => vmx,n,Goto(loopstart)
exten => vmx,n(toomany),Noop(Too Many invalid entries, got to invalid dest)
exten => vmx,n,Set(VMX_OPTS=${VMX_OPTS_LOOP})
exten => vmx,n,Set(VMX_OPTS=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/vmxopts/loops)}" = "1"]?${DB_RESULT}:${VMX_OPTS})})
exten => vmx,n(chkloop),GotoIf($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/loopdest/ext)}" = "0"]?doloop)
exten => vmx,n,Set(VMX_LOOPDEST_EXT=${DB_RESULT})
exten => vmx,n,Set(VMX_LOOPDEST_CONTEXT=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/loopdest/context)}" = "1"]?${DB_RESULT}:${VMX_LOOPDEST_CONTEXT})})
exten => vmx,n(looppri),Set(VMX_LOOPDEST_PRI=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/loopdest/pri)}" = "1"]?${DB_RESULT}:${VMX_LOOPDEST_PRI})})
exten => vmx,n(doloop),Goto(${VMX_LOOPDEST_CONTEXT},${VMX_LOOPDEST_EXT},${VMX_LOOPDEST_PRI})
exten => vmx,n(doopt),Noop(Got a valid option: ${DB_RESULT})
exten => vmx,n,Set(VMX_EXT=${DB_RESULT})
exten => vmx,n,GotoIf($["${VMX_EXT}" != "dovm"]?getdest)
exten => vmx,n(vmxopts),Set(VMX_OPTS=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/vmxopts/dovm)}" = "1"]?${DB_RESULT}:${VMX_OPTS_DOVM})})
exten => vmx,n(vmxdovm),Goto(dovm,1)
exten => vmx,n(getdest),Set(VMX_CONTEXT=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/${ACTION}/context)}" = "1"]?${DB_RESULT}:${VMX_CONTEXT})})
exten => vmx,n(vmxpri),Set(VMX_PRI=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/${ACTION}/pri)}" = "1"]?${DB_RESULT}:${VMX_PRI})})
exten => vmx,n(vmxgoto),Goto(${VMX_CONTEXT},${VMX_EXT},${VMX_PRI})
exten => vmx,n(nofile),Noop(File for mode: ${MODE} does not exist, SYSTEMSTATUS: ${SYSTEMSTATUS}, going to normal voicemail)
exten => vmx,n,Goto(s-${MMODE},1)
exten => vmx,n(tmpgreet),Noop(Temporary Greeting Detected, going to normal voicemail)
exten => vmx,n,Goto(s-${MMODE},1)
exten => dovm,1,Noop(VMX Timeout - go to voicemail)
exten => dovm,n,VoiceMail(${MEXTEN}@${VMCONTEXT},${VMX_OPTS}${VMGAIN})
exten => dovm,n,Goto(exit-${VMSTATUS},1)
exten => s-BUSY,1,Noop(BUSY voicemail)
exten => s-BUSY,n,Macro(get-vmcontext,${MEXTEN})
exten => s-BUSY,n,VoiceMail(${MEXTEN}@${VMCONTEXT},${VM_OPTS}b${VMGAIN})
exten => s-BUSY,n,Goto(exit-${VMSTATUS},1)
exten => s-NOMESSAGE,1,Noop(NOMESSAGE (beep only) voicemail)
exten => s-NOMESSAGE,n,Macro(get-vmcontext,${MEXTEN})
exten => s-NOMESSAGE,n,VoiceMail(${MEXTEN}@${VMCONTEXT},s${VM_OPTS}${VMGAIN})
exten => s-NOMESSAGE,n,Goto(exit-${VMSTATUS},1)
exten => s-INSTRUCT,1,Noop(NOMESSAGE (beeb only) voicemail)
exten => s-INSTRUCT,n,Macro(get-vmcontext,${MEXTEN})
exten => s-INSTRUCT,n,VoiceMail(${MEXTEN}@${VMCONTEXT},${VM_OPTS}${VMGAIN})
exten => s-INSTRUCT,n,Goto(exit-${VMSTATUS},1)
exten => s-DIRECTDIAL,1,Noop(DIRECTDIAL voicemail)
exten => s-DIRECTDIAL,n,Macro(get-vmcontext,${MEXTEN})
exten => s-DIRECTDIAL,n,VoiceMail(${MEXTEN}@${VMCONTEXT},${VM_OPTS}${VM_DDTYPE}${VMGAIN})
exten => s-DIRECTDIAL,n,Goto(exit-${VMSTATUS},1)
exten => _s-.,1,Macro(get-vmcontext,${MEXTEN})
exten => _s-.,n,VoiceMail(${MEXTEN}@${VMCONTEXT},${VM_OPTS}u${VMGAIN})
exten => _s-.,n,Goto(exit-${VMSTATUS},1)
exten => o,1,Playback(one-moment-please)
exten => o,n,GotoIf($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/0/ext)}" = "0"]?doopdef)
exten => o,n,Set(VMX_OPDEST_EXT=${DB_RESULT})
exten => o,n(opcontext),Set(VMX_OPDEST_CONTEXT=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/0/context)}" = "1"]?${DB_RESULT}:${VMX_CONTEXT})})
exten => o,n(oppri),Set(VMX_OPDEST_PRI=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/0/pri)}" = "1"]?${DB_RESULT}:${VMX_PRI})})
exten => o,n,Goto(${VMX_OPDEST_CONTEXT},${VMX_OPDEST_EXT},${VMX_OPDEST_PRI})
exten => o,n(doopdef),GotoIf($["x${OPERATOR_XTN}"="x"]?nooper:from-internal,${OPERATOR_XTN},1)
exten => o,n(nooper),GotoIf($["x${FROM_DID}"="x"]?nodid)
exten => o,n,Dial(Local/${FROM_DID}@from-pstn,)
exten => o,n,Macro(hangup,)
exten => o,n(nodid),Dial(Local/s@from-pstn,)
exten => o,n,Macro(hangup,)
exten => a,1,Macro(get-vmcontext,${MEXTEN})
exten => a,n,GotoIf($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/*/ext)}" = "0"]?adef,1)
exten => a,n,Set(VMX_ADEST_EXT=${DB_RESULT})
exten => a,n(acontext),Set(VMX_ADEST_CONTEXT=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/*/context)}" = "1"]?${DB_RESULT}:${VMX_CONTEXT})})
exten => a,n(apri),Set(VMX_ADEST_PRI=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/*/pri)}" = "1"]?${DB_RESULT}:${VMX_PRI})})
exten => a,n,Goto(${VMX_ADEST_CONTEXT},${VMX_ADEST_EXT},${VMX_ADEST_PRI})
exten => adef,1,VoiceMailMain(${MEXTEN}@${VMCONTEXT})
exten => adef,n,GotoIf($["${RETVM}" = "RETURN"]?exit-RETURN,1)
exten => adef,n,Hangup
exten => exit-FAILED,1,Playback(im-sorry&an-error-has-occurred)
exten => exit-FAILED,n,GotoIf($["${RETVM}" = "RETURN"]?exit-RETURN,1)
exten => exit-FAILED,n,Hangup
exten => exit-SUCCESS,1,GotoIf($["${RETVM}" = "RETURN"]?exit-RETURN,1)
exten => exit-SUCCESS,n,Playback(goodbye)
exten => exit-SUCCESS,n,Hangup
exten => exit-USEREXIT,1,GotoIf($["${RETVM}" = "RETURN"]?exit-RETURN,1)
exten => exit-USEREXIT,n,Playback(goodbye)
exten => exit-USEREXIT,n,Hangup
exten => exit-RETURN,1,Noop(Returning From Voicemail because macro)
exten => t,1,Hangup
;--== end of [macro-vm] ==--;
[macro-exten-vm]
exten => s,1,Macro(user-callerid,)
exten => s,n,Set(RingGroupMethod=none)
exten => s,n,Set(__EXTTOCALL=${ARG2})
exten => s,n,Set(__PICKUPMARK=${ARG2})
exten => s,n,Set(RT=${IF($["${ARG1}"!="novm" | "${DB(CFU/${EXTTOCALL})}"!="" | "${DB(CFB/${EXTTOCALL})}"!="" | "${ARG3}"="1" | "${ARG4}"="1" | "${ARG5}"="1"]?${RINGTIMER}:)})
exten => s,n,ExecIf($[$["${REDIRECTING(reason)}" = "send_to_vm" | "${SIP_HEADER(X-Digium-Call-Feature)}" = "feature_send_to_vm"] & "${ARG1}" != "novm"]?Macro(vm,${ARG1},DIRECTDIAL,${IVR_RETVM}))
exten => s,n,ExecIf($[$["${REDIRECTING(reason)}" = "send_to_vm" | "${SIP_HEADER(X-Digium-Call-Feature)}" = "feature_send_to_vm"] & "${ARG1}" != "novm"]?MacroExit())
exten => s,n(checkrecord),Gosub(sub-record-check,s,1(exten,${EXTTOCALL},dontcare))
exten => s,n,GotoIf($["${AMPUSER}"=""|${LEN(${FROM_DID})}|"${DB(AMPUSER/${EXTTOCALL}/answermode)}"!="intercom"|${LEN(${BLINDTRANSFER})}|"${EXTENSION_STATE(${EXTTOCALL})}"!="NOT_INUSE"|"${CC_RECALL}"!=""]?macrodial)
exten => s,n,Set(INTERCOM_EXT_DOPTIONS=${DIAL_OPTIONS})
exten => s,n,Set(INTERCOM_RETURN=TRUE)
exten => s,n,Gosub(ext-intercom,*80${EXTTOCALL},1())
exten => s,n,Set(INTERCOM_RETURN=)
exten => s,n,Set(INTERCOM_EXT_DOPTIONS=)
exten => s,n(macrodial),GosubIf($["${INTERCOM_CALL}"="TRUE" & ${LEN(${BLINDTRANSFER})}]?clrheader,1())
exten => s,n,Macro(dial-one,${RT},${DIAL_OPTIONS},${EXTTOCALL})
exten => s,n,Set(SV_DIALSTATUS=${DIALSTATUS})
exten => s,n(calldocfu),GosubIf($[("${SV_DIALSTATUS}"="NOANSWER"|"${SV_DIALSTATUS}"="CHANUNAVAIL") & "${DB(CFU/${EXTTOCALL})}"!="" & "${SCREEN}"=""]?docfu,1())
exten => s,n(calldocfb),GosubIf($["${SV_DIALSTATUS}"="BUSY" & "${DB(CFB/${EXTTOCALL})}"!="" & "${SCREEN}"=""]?docfb,1())
exten => s,n,Set(DIALSTATUS=${SV_DIALSTATUS})
exten => s,n,ExecIf($[("${DIALSTATUS}"="NOANSWER"&"${ARG3}"="1")|("${DIALSTATUS}"="BUSY"&"${ARG4}"="1")|("${DIALSTATUS}"="CHANUNAVAIL"&"${ARG5}"="1")]?MacroExit())
exten => s,n,GotoIf($["${ARG1}"="novm"]?s-${DIALSTATUS},1)
exten => s,n,Macro(vm,${ARG1},${DIALSTATUS},${IVR_RETVM})
exten => docfu,1(docfu),ExecIf($["${DB(AMPUSER/${EXTTOCALL}/cfringtimer)}"="-1"|("${ARG1}"="novm"&"${ARG3}"="1")]?StackPop())
exten => docfu,n,GotoIf($["${DB(AMPUSER/${EXTTOCALL}/cfringtimer)}"="-1"|("${ARG1}"="novm"&"${ARG3}"="1")]?from-internal,${DB(CFU/${EXTTOCALL})},1)
exten => docfu,n,Set(RTCF=${IF($["${DB(AMPUSER/${EXTTOCALL}/cfringtimer)}"="0"]?${RT}:${DB(AMPUSER/${EXTTOCALL}/cfringtimer)})})
exten => docfu,n,ExecIf($["${DIRECTION}" = "INBOUND"]?Set(DIAL_OPTIONS=${REPLACE(DIAL_OPTIONS,T)}I))
exten => docfu,n,Dial(Local/${DB(CFU/${EXTTOCALL})}@from-internal/n,${RTCF},${DIAL_OPTIONS})
exten => docfu,n,Return()
exten => docfb,1(docfu),ExecIf($["${DB(AMPUSER/${EXTTOCALL}/cfringtimer)}"="-1"|("${ARG1}"="novm"&"${ARG4}"="1")]?StackPop())
exten => docfb,n,GotoIf($["${DB(AMPUSER/${EXTTOCALL}/cfringtimer)}"="-1"|("${ARG1}"="novm"&"${ARG4}"="1")]?from-internal,${DB(CFB/${EXTTOCALL})},1)
exten => docfb,n,Set(RTCF=${IF($["${DB(AMPUSER/${EXTTOCALL}/cfringtimer)}"="0"]?${RT}:${DB(AMPUSER/${EXTTOCALL}/cfringtimer)})})
exten => docfb,n,ExecIf($["${DIRECTION}" = "INBOUND"]?Set(DIAL_OPTIONS=${REPLACE(DIAL_OPTIONS,T)}I))
exten => docfb,n,Dial(Local/${DB(CFB/${EXTTOCALL})}@from-internal/n,${RTCF},${DIAL_OPTIONS})
exten => docfb,n,Return()
exten => clrheader,1,ExecIf($[${LEN(${SIPURI})}&"${SIPURI}"="${SIP_URI_OPTIONS}"]?Set(SIP_URI_OPTIONS=))
exten => clrheader,n,ExecIf($[${LEN(${ALERTINFO})}]?SIPRemoveHeader(${ALERTINFO}))
exten => clrheader,n,ExecIf($[${LEN(${CALLINFO})}]?SIPRemoveHeader(${CALLINFO}))
exten => clrheader,n,Return()
exten => s-BUSY,1,GotoIf($["${IVR_RETVM}"="RETURN" & "${IVR_CONTEXT}"!=""]?exit,1)
exten => s-BUSY,n,Playtones(busy)
exten => s-BUSY,n,Busy(20)
exten => _s-!,1,GotoIf($["${IVR_RETVM}"="RETURN" & "${IVR_CONTEXT}"!=""]?exit,1)
exten => _s-!,n,Playtones(congestion)
exten => _s-!,n,Congestion(10)
exten => exit,1,Playback(beep&line-busy-transfer-menu&silence/1)
exten => exit,n,MacroExit()
;--== end of [macro-exten-vm] ==--;
[macro-simple-dial]
exten => s,1,Set(__EXTTOCALL=${ARG1})
exten => s,n,Set(RT=${ARG2})
exten => s,n,Set(CFUEXT=${DB(CFU/${EXTTOCALL})})
exten => s,n,Set(CFBEXT=${DB(CFB/${EXTTOCALL})})
exten => s,n,Set(CWI_TMP=${CWIGNORE})
exten => s,n(macrodial),Macro(dial-one,${RT},${DIAL_OPTIONS},${EXTTOCALL})
exten => s,n,Set(__CWIGNORE=${CWI_TMP})
exten => s,n,Set(PR_DIALSTATUS=${DIALSTATUS})
exten => s,n(calldocfu),GosubIf($["${PR_DIALSTATUS}"="NOANSWER" & "${CFUEXT}"!=""]?docfu,1())
exten => s,n(calldocfb),GosubIf($["${PR_DIALSTATUS}"="BUSY" & "${CFBEXT}"!=""]?docfb,1())
exten => s,n,Set(DIALSTATUS=${PR_DIALSTATUS})
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => docfu,1,GotoIf($["${DB(AMPUSER/${CFUEXT}/device)}" = "" ]?chlocal)
exten => docfu,n,Dial(Local/${CFUEXT}@ext-local,${RT},${DIAL_OPTIONS})
exten => docfu,n,Return()
exten => docfu,n(chlocal),ExecIf($["${DIRECTION}" = "INBOUND"]?Set(DIAL_OPTIONS=${REPLACE(DIAL_OPTIONS,T)}I))
exten => docfu,n,Dial(Local/${CFUEXT}@from-internal/n,${RT},${DIAL_OPTIONS})
exten => docfu,n,Return()
exten => docfb,1,GotoIf($["${DB(AMPUSER/${CFBEXT}/device)}" = "" ]?chlocal)
exten => docfb,n,Dial(Local/${CFBEXT}@ext-local,${RT},${DIAL_OPTIONS})
exten => docfb,n,Return()
exten => docfb,n(chlocal),ExecIf($["${DIRECTION}" = "INBOUND"]?Set(DIAL_OPTIONS=${REPLACE(DIAL_OPTIONS,T)}I))
exten => docfb,n,Dial(Local/${CFBEXT}@from-internal/n,${RT},${DIAL_OPTIONS})
exten => docfb,n,Return()
exten => _s-.,1,Noop(Extension is reporting ${EXTEN})
;--== end of [macro-simple-dial] ==--;
[macro-blkvm-setifempty]
exten => s,1,GotoIf($[!${EXISTS(${BLKVM_CHANNEL})}]?init)
exten => s,n,Set(GOSUB_RETVAL=${SHARED(BLKVM,${BLKVM_CHANNEL})})
exten => s,n,MacroExit()
exten => s,n(init),Set(__BLKVM_CHANNEL=${CHANNEL})
exten => s,n,Set(SHARED(BLKVM,${BLKVM_CHANNEL})=TRUE)
exten => s,n,Set(GOSUB_RETVAL=TRUE)
exten => s,n,MacroExit()
;--== end of [macro-blkvm-setifempty] ==--;
[macro-blkvm-set]
exten => s,1,ExecIf($[!${EXISTS(${BLKVM_CHANNEL})} | "{ARG1}" = "reset"]?Set(__BLKVM_CHANNEL=${CHANNEL}))
exten => s,n,Set(SHARED(BLKVM,${BLKVM_CHANNEL})=TRUE)
exten => s,n,Set(GOSUB_RETVAL=TRUE)
exten => s,n,MacroExit()
;--== end of [macro-blkvm-set] ==--;
[macro-blkvm-clr]
exten => s,1,Set(SHARED(BLKVM,${BLKVM_CHANNEL})=)
exten => s,n,Set(GOSUB_RETVAL=)
exten => s,n,MacroExit()
;--== end of [macro-blkvm-clr] ==--;
[macro-blkvm-check]
exten => s,1,Set(GOSUB_RETVAL=${SHARED(BLKVM,${BLKVM_CHANNEL})})
exten => s,n,ExecIf($["${GOSUB_RETVAL}"="" & "${CC_RECALL}"="1"]?Set(GOSUB_RETVAL=TRUE))
exten => s,n,MacroExit()
;--== end of [macro-blkvm-check] ==--;
[macro-hangupcall]
exten => s,1(start),GotoIf($["${USE_CONFIRMATION}"="" | "${RINGGROUP_INDEX}"="" | "${CHANNEL}"!="${UNIQCHAN}"]?theend)
exten => s,n(delrgi),Noop(Deleting: RG/${RINGGROUP_INDEX}/${CHANNEL} ${DB_DELETE(RG/${RINGGROUP_INDEX}/${CHANNEL})})
exten => s,n(theend),Hangup
exten => s,n,MacroExit()
;--== end of [macro-hangupcall] ==--;
[macro-dial-one]
exten => s,1,Set(DEXTEN=${ARG3})
exten => s,n,Set(DIALSTATUS_CW=)
exten => s,n,GosubIf($["${FROM_DID}"!="" & "${SCREEN}"="" & "${DB(AMPUSER/${DEXTEN}/screen)}"!=""]?screen,1())
exten => s,n,GosubIf($["${DB(CF/${DEXTEN})}"!=""]?cf,1())
exten => s,n,GotoIf($["${DEXTEN:-1}"="#" | "${DB(DND/${DEXTEN})}"=""]?skip1)
exten => s,n,Set(DEXTEN=)
exten => s,n,Set(DIALSTATUS=BUSY)
exten => s,n(skip1),GotoIf($["${DEXTEN}"=""]?nodial)
exten => s,n,GotoIf($["${DEXTEN:-1}"="#"]?continue)
exten => s,n,Set(EXTHASCW=${IF($["${CWIGNORE}"!=""]? :${DB(CW/${DEXTEN})})})
exten => s,n,GotoIf($["${EXTHASCW}"="" | "${DB(CFB/${DEXTEN})}"!="" | "${DB(CFU/${DEXTEN})}"!=""]?next1:cwinusebusy)
exten => s,n(next1),GotoIf($["${DB(CFU/${DEXTEN})}"!="" & ("${EXTENSION_STATE(${DEXTEN})}"="UNAVAILABLE" | "${EXTENSION_STATE(${DEXTEN})}"="UNKNOWN")]?docfu:skip3)
exten => s,n(docfu),Set(DEXTEN=)
exten => s,n,Set(DIALSTATUS=NOANSWER)
exten => s,n,Goto(nodial)
exten => s,n(skip3),GotoIf($["${EXTHASCW}"="" | "${DB(CFB/${DEXTEN})}"!=""]?next2:continue)
exten => s,n(next2),GotoIf($["${EXTENSION_STATE(${DEXTEN})}"="NOT_INUSE" | "${EXTENSION_STATE(${DEXTEN})}"="UNAVAILABLE" | "${EXTENSION_STATE(${DEXTEN})}"="UNKNOWN"]?continue)
exten => s,n,ExecIf($["${DB(CFB/${DEXTEN})}"!="" & "${CFIGNORE}"=""]?Set(DIALSTATUS=BUSY))
exten => s,n,GotoIf($["${EXTHASCW}"!="" | "${DEXTEN:-1}"="#"]?cwinusebusy)
exten => s,n,Set(DEXTEN=)
exten => s,n,Set(DIALSTATUS=BUSY)
exten => s,n,Goto(nodial)
exten => s,n(cwinusebusy),GotoIf($["${EXTHASCW}"!="" & "${CWINUSEBUSY}"="true"]?next3:continue)
exten => s,n(next3),ExecIf($["${EXTENSION_STATE(${DEXTEN})}"!="UNAVAILABLE" & "${EXTENSION_STATE(${DEXTEN})}"!="NOT_INUSE" & "${EXTENSION_STATE(${DEXTEN})}"!="UNKNOWN"]?Set(DIALSTATUS_CW=BUSY))
exten => s,n(continue),GotoIf($["${DEXTEN}"=""]?nodial)
exten => s,n,GosubIf($["${DEXTEN:-1}"!="#"]?dstring,1():dlocal,1())
exten => s,n,GotoIf($[${LEN(${DSTRING})}=0]?nodial)
exten => s,n,GotoIf($["${DEXTEN:-1}"="#"]?skiptrace)
exten => s,n,GosubIf($[${REGEX("^[\+]?[0-9]+$" ${CALLERID(number)})} = 1]?ctset,1():ctclear,1())
exten => s,n(skiptrace),Set(D_OPTIONS=${IF($["${NODEST}"!="" & ${REGEX("(M[(]auto-blkvm[)])" ${ARG2})} != 1]?${ARG2}M(auto-blkvm):${ARG2})})
exten => s,n,ExecIf($["${ALERT_INFO}"!=""]?SIPAddHeader(Alert-Info: ${ALERT_INFO}))
exten => s,n,ExecIf($["${SIPADDHEADER}"!=""]?SIPAddHeader(${SIPADDHEADER}))
exten => s,n,ExecIf($["${MOHCLASS}"!=""]?Set(CHANNEL(musicclass)=${MOHCLASS}))
exten => s,n,GosubIf($["${QUEUEWAIT}"!=""]?qwait,1())
exten => s,n,Set(__CWIGNORE=${CWIGNORE})
exten => s,n,Set(__KEEPCID=TRUE)
exten => s,n,GotoIf($["${USEGOTO}"="1"]?usegoto,1)
exten => s,n,GotoIf($["${DB(AMPUSER/${EXTTOCALL}/cidname)}" = "" || "${DB(AMPUSER/${AMPUSER}/cidname)}" = ""]?godial)
exten => s,n,Gosub(sub-presencestate-display,s,1(${EXTTOCALL}))
exten => s,n,Set(CONNECTEDLINE(name,i)=${DB(AMPUSER/${EXTTOCALL}/cidname)}${PRESENCESTATE_DISPLAY})
exten => s,n,Set(CONNECTEDLINE(num)=${EXTTOCALL})
exten => s,n,Set(D_OPTIONS=${D_OPTIONS}I)
exten => s,n(godial),Macro(dialout-one-predial-hook,)
exten => s,n,ExecIf($["${DIRECTION}" = "INBOUND"]?Set(D_OPTIONS=${REPLACE(D_OPTIONS,T)}I))
exten => s,n,Dial(${DSTRING},${ARG1},${D_OPTIONS})
exten => s,n,ExecIf($["${DIALSTATUS}"="ANSWER" & "${CALLER_DEST}"!=""]?MacroExit())
exten => s,n,ExecIf($["${DIALSTATUS_CW}"!=""]?Set(DIALSTATUS=${DIALSTATUS_CW}))
exten => s,n,GosubIf($[("${SCREEN}"!=""&("${DIALSTATUS}"="TORTURE"|"${DIALSTATUS}"="DONTCALL"))|"${DIALSTATUS}"="ANSWER"]?s-${DIALSTATUS},1())
exten => s,n,MacroExit()
exten => s,n(nodial),ExecIf($["${DIALSTATUS}" = ""]?Set(DIALSTATUS=NOANSWER))
exten => s,n,Noop(Returned from dial-one with nothing to call and DIALSTATUS: ${DIALSTATUS})
exten => s,n,MacroExit()
exten => h,1,Macro(hangupcall,)
exten => usegoto,1,Set(USEGOTO=)
exten => usegoto,n,Goto(from-internal,${DSTRING},1)
exten => screen,1,GotoIf($["${DB(AMPUSER/${DEXTEN}/screen)}"!="nomemory" | "${CALLERID(number)}"=""]?memory)
exten => screen,n,ExecIf($[${REGEX("^[0-9a-zA-Z ]+$" ${CALLERID(number)})} = 1]?System(rm -f ${ASTVARLIBDIR}/sounds/priv-callerintros/${CALLERID(number)}.*))
exten => screen,n(memory),Set(__SCREEN=${DB(AMPUSER/${DEXTEN}/screen)})
exten => screen,n,Set(__SCREEN_EXTEN=${DEXTEN})
exten => screen,n,Set(ARG2=${ARG2}p)
exten => screen,n,Return()
exten => cf,1,Set(CFAMPUSER=${IF($["${AMPUSER}"=""]?${CALLERID(number)}:${AMPUSER})})
exten => cf,n,ExecIf($["${DB(CF/${DEXTEN})}"="${CFAMPUSER}" | "${DB(CF/${DEXTEN})}"="${REALCALLERIDNUM}" | "${CUT(CUT(BLINDTRANSFER,-,1),/,1)}" = "${DB(CF/${DEXTEN})}" | "${DEXTEN}"="${DB(CF/${DEXTEN})}"]?Return())
exten => cf,n,ExecIf($["${DB(AMPUSER/${DEXTEN}/cfringtimer)}" != "0" & "${DB(AMPUSER/${DEXTEN}/cfringtimer)}" != ""]?Set(ARG1=${IF($["${DB(AMPUSER/${DEXTEN}/cfringtimer)}"="-1"]? : ${DB(AMPUSER/${DEXTEN}/cfringtimer)})}))
exten => cf,n,Set(DEXTEN=${IF($["${CFIGNORE}"=""]?"${DB(CF/${DEXTEN})}#": )})
exten => cf,n,ExecIf($["${DEXTEN}"!=""]?Return())
exten => cf,n,Set(DIALSTATUS=NOANSWER)
exten => cf,n,Return()
exten => qwait,1,ExecIf($["${SAVEDCIDNAME}" = ""]?Set(__SAVEDCIDNAME=${CALLERID(name)}))
exten => qwait,n,Set(ELAPSED=${MATH($[${EPOCH}+30-${QUEUEWAIT}]/60,int)})
exten => qwait,n,Set(CALLERID(name)=M${ELAPSED}:${SAVEDCIDNAME})
exten => qwait,n,Return()
exten => ctset,1,Set(DB(CALLTRACE/${DEXTEN})=${CALLERID(number)})
exten => ctset,n,Return()
exten => ctclear,1,Noop(Deleting: CALLTRACE/${DEXTEN} ${DB_DELETE(CALLTRACE/${DEXTEN})})
exten => ctclear,n,Return()
exten => dstring,1,Set(DSTRING=)
exten => dstring,n,Set(DEVICES=${DB(AMPUSER/${DEXTEN}/device)})
exten => dstring,n,ExecIf($["${DEVICES}"=""]?Return())
exten => dstring,n,ExecIf($["${DEVICES:0:1}"="&"]?Set(DEVICES=${DEVICES:1}))
exten => dstring,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => dstring,n,Set(ITER=1)
exten => dstring,n(begin),Set(THISDIAL=${DB(DEVICE/${CUT(DEVICES,&,${ITER})}/dial)})
exten => dstring,n,GosubIf($["${ASTCHANDAHDI}" = "1"]?zap2dahdi,1())
exten => dstring,n,GotoIf($["${THISDIAL:0:5}"!="PJSIP"]?doset)
exten => dstring,n,Noop(Debug: Found PJSIP Destination ${THISDIAL}, updating with PJSIP_DIAL_CONTACTS)
exten => dstring,n,Set(THISDIAL=${PJSIP_DIAL_CONTACTS(${THISDIAL:6})})
exten => dstring,n,GotoIf($["${THISDIAL}"=""]?skipset)
exten => dstring,n(doset),Set(DSTRING=${DSTRING}${THISDIAL}&)
exten => dstring,n(skipset),Set(ITER=$[${ITER}+1])
exten => dstring,n,GotoIf($[${ITER}<=${LOOPCNT}]?begin)
exten => dstring,n,ExecIf($["${DSTRING:-1}"!="&"]?Return())
exten => dstring,n,Set(DSTRING=${DSTRING:0:$[${LEN(${DSTRING})}-1]})
exten => dstring,n,Return()
exten => dlocal,1,Set(DSTRING=${IF($["${ARG1}"=""]?${DEXTEN:0:${MATH(${LEN(${DEXTEN})}-1,int)}}:Local/${DEXTEN:0:${MATH(${LEN(${DEXTEN})}-1,int)}}@from-internal/n)})
exten => dlocal,n,Set(USEGOTO=${IF($["${ARG1}"=""]?1:0)})
exten => dlocal,n,Return()
exten => zap2dahdi,1,ExecIf($["${THISDIAL}" = ""]?Return())
exten => zap2dahdi,n,Set(NEWDIAL=)
exten => zap2dahdi,n,Set(LOOPCNT2=${FIELDQTY(THISDIAL,&)})
exten => zap2dahdi,n,Set(ITER2=1)
exten => zap2dahdi,n(begin2),Set(THISPART2=${CUT(THISDIAL,&,${ITER2})})
exten => zap2dahdi,n,ExecIf($["${THISPART2:0:3}" = "ZAP"]?Set(THISPART2=DAHDI${THISPART2:3}))
exten => zap2dahdi,n,Set(NEWDIAL=${NEWDIAL}${THISPART2}&)
exten => zap2dahdi,n,Set(ITER2=$[${ITER2} + 1])
exten => zap2dahdi,n,GotoIf($[${ITER2} <= ${LOOPCNT2}]?begin2)
exten => zap2dahdi,n,Set(THISDIAL=${NEWDIAL:0:$[${LEN(${NEWDIAL})}-1]})
exten => zap2dahdi,n,Return()
exten => s-TORTURE,1,Goto(app-blackhole,musiconhold,1)
exten => s-TORTURE,n,Macro(hangupcall,)
exten => s-DONTCALL,1,Answer
exten => s-DONTCALL,n,Wait(1)
exten => s-DONTCALL,n,Zapateller()
exten => s-DONTCALL,n,Playback(ss-noservice)
exten => s-DONTCALL,n,Macro(hangupcall,)
exten => s-CHANUNAVAIL,1,Macro(vm,${SCREEN_EXTEN},BUSY,${IVR_RETVM})
exten => s-CHANUNAVAIL,n,ExecIf($["${IVR_RETVM}"!="RETURN" | "${IVR_CONTEXT}"=""]?Hangup())
exten => s-CHANUNAVAIL,n,Return()
exten => s-NOANSWER,1,Macro(vm,${SCREEN_EXTEN},BUSY,${IVR_RETVM})
exten => s-NOANSWER,n,ExecIf($["${IVR_RETVM}"!="RETURN" | "${IVR_CONTEXT}"=""]?Hangup())
exten => s-NOANSWER,n,Return()
exten => s-BUSY,1,Macro(vm,${SCREEN_EXTEN},BUSY,${IVR_RETVM})
exten => s-BUSY,n,ExecIf($["${IVR_RETVM}"!="RETURN" | "${IVR_CONTEXT}"=""]?Hangup())
exten => s-BUSY,n,Return()
;--== end of [macro-dial-one] ==--;
[sipstation-welcome]
exten => _X.,1,Set(ISNUM=${REGEX("[0-9]" ${CALLERID(number)})})
exten => _X.,n,Set(DB(sipstation/${EXTEN}/lastcall/cnum)=${CALLERID(number)})
exten => _X.,n,Set(DB(sipstation/${EXTEN}/lastcall/cnam)=${CALLERID(name)})
exten => _X.,n,Set(DB(sipstation/${EXTEN}/lastcall/time)=${EPOCH})
exten => _X.,n,Answer
exten => _X.,n,Wait(1)
exten => _X.,n,Playback(you-have-reached-a-test-number&silence/1)
exten => _X.,n,SayDigits(${EXTEN})
exten => _X.,n,Playback(your&calling&from&silence/1)
exten => _X.,n,GotoIf($["${ISNUM}" = "1"]?valid:notvalid)
exten => _X.,n(valid),SayDigits(${CALLERID(number)})
exten => _X.,n,Hangup
exten => _X.,n(notvalid),Playback(unavailable&number)
exten => _X.,n,Hangup
;--== end of [sipstation-welcome] ==--;
[from-internal-additional]
include => app-blacklist
include => app-cf-toggle
include => app-cf-unavailable-prompt-on
include => app-cf-busy-prompting-on
include => app-cf-prompting-on
include => app-cf-busy-off-any
include => app-cf-busy-off
include => app-cf-busy-on
include => app-cf-off-any
include => app-cf-off
include => app-cf-on
include => app-cf-unavailable-off
include => app-cf-unavailable-on
include => ext-cf-hints
include => app-callwaiting-cwoff
include => app-callwaiting-cwon
include => app-campon-toggle
include => app-campon-cancel
include => app-campon-request
include => ext-meetme
include => app-dictate-send
include => app-dictate-record
include => app-dnd-off
include => app-dnd-on
include => app-dnd-toggle
include => ext-dnd-hints
include => app-fax
include => app-fmf-toggle
include => ext-findmefollow
include => fmgrps
include => app-hotelwakeup
include => app-calltrace
include => app-speakextennum
include => app-speakingclock
include => app-echo-test
include => ext-intercom-users
include => park-hints
include => app-pbdirectory
include => ext-queues
include => app-recordings
include => ext-group
include => grps
include => app-speeddial
include => vmblast-grp
include => app-dialvm
include => app-vmmain
include => app-userlogonoff
include => ext-local-confirm
include => findmefollow-ringallv2
include => app-pickup
include => app-chanspy
include => ext-test
include => ext-local
include => outbound-allroutes
exten => h,1,Hangup
;--== end of [from-internal-additional] ==--;
[from-internal-noxfer-additional]
exten => h,1,Hangup
;--== end of [from-internal-noxfer-additional] ==--;
pjsip.aor.conf:
;--------------------------------------------------------------------------------;
; Do NOT edit this file as it is auto-generated by FreePBX. ;
;--------------------------------------------------------------------------------;
; For information on adding additional paramaters to this file, please visit the ;
; FreePBX.org wiki page, or ask on IRC. This file was created by the new FreePBX ;
; BMO - Big Module Object. Any similarity in naming with BMO from Adventure Time ;
; is totally deliberate. ;
;--------------------------------------------------------------------------------;
#include pjsip.aor_custom.conf
[300]
type=aor
mailboxes=300@device
max_contacts=1
remove_existing=yes
qualify_frequency=60
[Telekom]
type=aor
qualify_frequency=60
contact=sip:+49{Telefonnummer Intern}@tel.t-online.de:5060
pjsip.auth.conf
;--------------------------------------------------------------------------------;
; Do NOT edit this file as it is auto-generated by FreePBX. ;
;--------------------------------------------------------------------------------;
; For information on adding additional paramaters to this file, please visit the ;
; FreePBX.org wiki page, or ask on IRC. This file was created by the new FreePBX ;
; BMO - Big Module Object. Any similarity in naming with BMO from Adventure Time ;
; is totally deliberate. ;
;--------------------------------------------------------------------------------;
#include pjsip.auth_custom.conf
[300-auth]
type=auth
auth_type=userpass
password={password}
username=300
[Telekom]
type=auth
auth_type=userpass
password={password}
username=0{Telefonnummer Intern}
pjsip.conf
;--------------------------------------------------------------------------------;
; Do NOT edit this file as it is auto-generated by FreePBX. ;
;--------------------------------------------------------------------------------;
; For information on adding additional paramaters to this file, please visit the ;
; FreePBX.org wiki page, or ask on IRC. This file was created by the new FreePBX ;
; BMO - Big Module Object. Any similarity in naming with BMO from Adventure Time ;
; is totally deliberate. ;
;--------------------------------------------------------------------------------;
#include pjsip_custom.conf
#include pjsip.transports.conf
#include pjsip.transports_custom_post.conf
#include pjsip.endpoint.conf
#include pjsip.endpoint_custom_post.conf
#include pjsip.aor.conf
#include pjsip.aor_custom_post.conf
#include pjsip.auth.conf
#include pjsip.auth_custom_post.conf
#include pjsip.registration.conf
#include pjsip.registration_custom_post.conf
#include pjsip.identify.conf
#include pjsip.identify_custom_post.conf
[global]
type=global
user_agent=FPBX-AsteriskNOW-12.0.76.4(13.9.1)
pjsip.endpoint.conf
;--------------------------------------------------------------------------------;
; Do NOT edit this file as it is auto-generated by FreePBX. ;
;--------------------------------------------------------------------------------;
; For information on adding additional paramaters to this file, please visit the ;
; FreePBX.org wiki page, or ask on IRC. This file was created by the new FreePBX ;
; BMO - Big Module Object. Any similarity in naming with BMO from Adventure Time ;
; is totally deliberate. ;
;--------------------------------------------------------------------------------;
#include pjsip.endpoint_custom.conf
[300]
type=endpoint
aors=300
auth=300-auth
allow=ulaw,alaw,gsm
context=from-internal
callerid=device <300>
dtmf_mode=rfc4733
use_avpf=no
ice_support=no
media_use_received_transport=no
trust_id_inbound=yes
media_encryption=no
send_pai=yes
rtp_symmetric=yes
rewrite_contact=yes
[Telekom]
type=endpoint
transport=0.0.0.0-udp
context=from-pstn
disallow=all
allow=ulaw,alaw,gsm
outbound_auth=Telekom
aors=Telekom
pjsip.identify.conf
;--------------------------------------------------------------------------------;
; Do NOT edit this file as it is auto-generated by FreePBX. ;
;--------------------------------------------------------------------------------;
; For information on adding additional paramaters to this file, please visit the ;
; FreePBX.org wiki page, or ask on IRC. This file was created by the new FreePBX ;
; BMO - Big Module Object. Any similarity in naming with BMO from Adventure Time ;
; is totally deliberate. ;
;--------------------------------------------------------------------------------;
#include pjsip.identify_custom.conf
[Telekom]
type=identify
endpoint=Telekom
match=tel.t-online.de
pjsip.registration.conf
;--------------------------------------------------------------------------------;
; Do NOT edit this file as it is auto-generated by FreePBX. ;
;--------------------------------------------------------------------------------;
; For information on adding additional paramaters to this file, please visit the ;
; FreePBX.org wiki page, or ask on IRC. This file was created by the new FreePBX ;
; BMO - Big Module Object. Any similarity in naming with BMO from Adventure Time ;
; is totally deliberate. ;
;--------------------------------------------------------------------------------;
#include pjsip.registration_custom.conf
[Telekom]
type=registration
transport=0.0.0.0-udp
outbound_auth=Telekom
retry_interval=60
max_retries=10
expiration=3600
auth_rejection_permanent=yes
contact_user=0{Telefonnummer Intern}
server_uri=sip:tel.t-online.de
client_uri=sip:+49{Telefonnummer Intern}@tel.t-online.de:5060
pjsip.transports.conf
;--------------------------------------------------------------------------------;
; Do NOT edit this file as it is auto-generated by FreePBX. ;
;--------------------------------------------------------------------------------;
; For information on adding additional paramaters to this file, please visit the ;
; FreePBX.org wiki page, or ask on IRC. This file was created by the new FreePBX ;
; BMO - Big Module Object. Any similarity in naming with BMO from Adventure Time ;
; is totally deliberate. ;
;--------------------------------------------------------------------------------;
#include pjsip.transports_custom.conf
[0.0.0.0-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
external_media_address={Extern Netz}
external_signaling_address={Extern Netz}
local_net={Localnetz}/24
pjsip_notify.conf
;--------------------------------------------------------------------------------;
; Do NOT edit this file as it is auto-generated by FreePBX. ;
;--------------------------------------------------------------------------------;
; For information on adding additional paramaters to this file, please visit the ;
; FreePBX.org wiki page, or ask on IRC. This file was created by the new FreePBX ;
; BMO - Big Module Object. Any similarity in naming with BMO from Adventure Time ;
; is totally deliberate. ;
;--------------------------------------------------------------------------------;
#include sip_notify_custom.conf
#include sip_notify_additional.conf
Vor diesem Versuch hatte ich Asterisk über Debian 8 installiert und konnte da nur max 1min telefonieren, rein und raus!!!
Es muss irgendetwas an der Config sein, ich habe auch keine Ahnung was.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 319197
Url: https://administrator.de/forum/asterisk-freepbx-kein-raustelefonieren-moeglich-busy-319197.html
Ausgedruckt am: 22.12.2024 um 11:12 Uhr
20 Kommentare
Neuester Kommentar
Die Telekom lehnt den Anruf mit Q.850-Cause 21 ab - das heißt, der Anruf wird abgewiesen.
Weshalb, geht da leider nicht draus hervor (evtl. mal SIP-Debugging für den Telekom-Peer aktivieren?).
Für mich scheint der Fehler aber in der SIP-Konfiguration zu liegen, unter der Prämisse dass du überall wirklich deine korrekte Rufnummer übermittelst. Der Benutzername (aus "pjsip.auth.conf") ist nicht deine Telefonnummer sondern dein T-Online-Zugangsname inkl. "@t-online.de"-Suffix.
Und normalerweise will die Telekom die Rufnummer bei den SIP-Registrierungen im nationalen Format, nicht in E.164 haben, wie es manchmal als "client_uri=sip:+49{Telefonnummer Intern}@tel.t-online.de:5060" auftaucht. Hier solltest du mal probieren ob die Telekom hier evtl. das nationale Rufnummernformat (so funktioniert es bei mir) haben will, also nicht mit +49 sondern 0.
Am Rande:
Deaktiviere bitte möglichst flächendeckend bei dir alle Codecs außer alaw (G.711a) und G.722.
Andere Codecs unterstützt die Telekom offiziell nicht und außerdem wäre es schwachsinnig, wenn bei dir extra eine Codec-Konvertierung stattfinden müsste.
Dein Problem mit der Asterisk unter Debian 8 könnte eventuell auch gelöst werden:
Du musst zwingend unter SIP die Session-Timers aktivieren, sonst trennt die Telekom die Verbindung.
Zudem muss der SIP-Port den du verwendest zwingend auch Verbindungen von anderen als den gerade verbundenen IP-Adressen zulassen, falls du da eine Firewall vor stehen hast. Wichtig ist dabei, dass du einen anderen Port als 5060 verwendest, wenn du durch einen Router hindurch musst, der selber VoIP beherrschen könnte - FritzBoxen oder Speedports zum Beispiel knuppern dir sonst Pakete weg, die sie nicht zuordnen können.
Weshalb, geht da leider nicht draus hervor (evtl. mal SIP-Debugging für den Telekom-Peer aktivieren?).
Für mich scheint der Fehler aber in der SIP-Konfiguration zu liegen, unter der Prämisse dass du überall wirklich deine korrekte Rufnummer übermittelst. Der Benutzername (aus "pjsip.auth.conf") ist nicht deine Telefonnummer sondern dein T-Online-Zugangsname inkl. "@t-online.de"-Suffix.
Und normalerweise will die Telekom die Rufnummer bei den SIP-Registrierungen im nationalen Format, nicht in E.164 haben, wie es manchmal als "client_uri=sip:+49{Telefonnummer Intern}@tel.t-online.de:5060" auftaucht. Hier solltest du mal probieren ob die Telekom hier evtl. das nationale Rufnummernformat (so funktioniert es bei mir) haben will, also nicht mit +49 sondern 0.
Am Rande:
Deaktiviere bitte möglichst flächendeckend bei dir alle Codecs außer alaw (G.711a) und G.722.
Andere Codecs unterstützt die Telekom offiziell nicht und außerdem wäre es schwachsinnig, wenn bei dir extra eine Codec-Konvertierung stattfinden müsste.
Dein Problem mit der Asterisk unter Debian 8 könnte eventuell auch gelöst werden:
Du musst zwingend unter SIP die Session-Timers aktivieren, sonst trennt die Telekom die Verbindung.
Zudem muss der SIP-Port den du verwendest zwingend auch Verbindungen von anderen als den gerade verbundenen IP-Adressen zulassen, falls du da eine Firewall vor stehen hast. Wichtig ist dabei, dass du einen anderen Port als 5060 verwendest, wenn du durch einen Router hindurch musst, der selber VoIP beherrschen könnte - FritzBoxen oder Speedports zum Beispiel knuppern dir sonst Pakete weg, die sie nicht zuordnen können.
Rein telefonieren kann kann ich.
Nur mal OT weil das hier immer wieder die Frage danach triggert...Dazu wäre mal deine inbound Firewall Regel auf dem WAN Port spannend zu wissen. Das könnte man dann hier mal posten damit andere das nicht immer und immer wieder nachfragen müssen weil sie daran scheitern SIP und RTP auf ein inbound VoIP Device zu forwarden.
Du hast scheinbar Problem in der Bedienung der Bilder Upload Funktion, denn dort steht leider nur der URL nicht aber das embeddete Bild
- Kamerasymbol links klicken
- Bild auswählen und hochladen
- Schreibmarke an die Position klicken wo das Bild hin soll
- + klicken.
- Im Text steht dann sowas wie image c09c702a3127d... in eckigen Klammern und NICHT der http URL !
Du forwardest ja wieder eine interne Nummer per SIP an den Provider: sip:300@[IP-Adresse-Server
Wie der Lord oben schon mehrfach gesagt hat kann das ja niemals funktionieren, denn die Telekomm wird nur einen SIP Request auf dir zugeteilte Nummern zulassen, niemals auf interne logischerweise.
Mit einem Wireshark Trace kannst du doch sofort sehen was da per SIP Richtung Provider geht und auch was genau der antwortet.
Das sagt doch eigentlich schon alles....
Wie der Lord oben schon mehrfach gesagt hat kann das ja niemals funktionieren, denn die Telekomm wird nur einen SIP Request auf dir zugeteilte Nummern zulassen, niemals auf interne logischerweise.
Mit einem Wireshark Trace kannst du doch sofort sehen was da per SIP Richtung Provider geht und auch was genau der antwortet.
Das sagt doch eigentlich schon alles....
Vermutlich versucht die Asterisk ein Direct Bridging mit dem Client hinter dem NAT.
Ich kenne jetzt pjsip nicht ganz auswendig (der Library bringe ich momentan noch großes Misstrauen entgegen).
Im klassischen SIP-Channeltreiber sollte als globale Konfiguration hinterlegt sein, dass die Asterisk immer NAT annimmt (nat=force_rport,comedia) und niemals versucht die Audiokanäle direkt zwischen den Teilnehmern zu bridgen:
Wie das in pjsip konfiguriert wird, kann ich dir jetzt leider aus dem Kopf nicht beantworten, vermutlich sind folgende Konfigurationen notwendig:
Mit "rtp_symmetric = yes" solltest du dir sämtliche Port-Forwardings sparen können, da hierbei für ein- und ausgehenden Traffic der gleiche Port verwendet wird und ein NAT-Router somit die eingehenden Pakete als "established connection" erkennt und durchlässt.
Natürlich unter der Prämisse, dass da keine Stateless-Firewall läuft, der explizit Portranges erlaubt werden müssen - das müsste dann weiterhin getan werden. An einem "Standard"-Heimnetz-Router ist das allerdings nicht notwendig.
Die Konfiguration im zweiten Code-Block gehört wie gesagt in einen globalen Teil der SIP-Config, weil diese Konfiguration allgemein so funktionieren dürfte. Und selbst ohne NAT tut es nicht weh, wenn der Server davon ausgeht dass er nicht einfach alle Ports benutzen kann
Ggf. ist es noch notwendig, der Telekom-Konfiguration ein " ice_support = yes " zu spendieren, um NAT-Traversal zu aktivieren und die öffentliche IP-Adresse in den SDP-Teil der INVITES zu schreiben.
Ich kenne jetzt pjsip nicht ganz auswendig (der Library bringe ich momentan noch großes Misstrauen entgegen).
Im klassischen SIP-Channeltreiber sollte als globale Konfiguration hinterlegt sein, dass die Asterisk immer NAT annimmt (nat=force_rport,comedia) und niemals versucht die Audiokanäle direkt zwischen den Teilnehmern zu bridgen:
nat=force_port,comedia
directmedia=no
directrtpsetup=no
canreinvite=no
Wie das in pjsip konfiguriert wird, kann ich dir jetzt leider aus dem Kopf nicht beantworten, vermutlich sind folgende Konfigurationen notwendig:
direct_media = no
disable_direct_media_on_nat = yes (wer da den Default "no" eingeführt hat, gehört mit einem NAT-Router verdroschen!)
rtp_symmetric = yes
Mit "rtp_symmetric = yes" solltest du dir sämtliche Port-Forwardings sparen können, da hierbei für ein- und ausgehenden Traffic der gleiche Port verwendet wird und ein NAT-Router somit die eingehenden Pakete als "established connection" erkennt und durchlässt.
Natürlich unter der Prämisse, dass da keine Stateless-Firewall läuft, der explizit Portranges erlaubt werden müssen - das müsste dann weiterhin getan werden. An einem "Standard"-Heimnetz-Router ist das allerdings nicht notwendig.
Die Konfiguration im zweiten Code-Block gehört wie gesagt in einen globalen Teil der SIP-Config, weil diese Konfiguration allgemein so funktionieren dürfte. Und selbst ohne NAT tut es nicht weh, wenn der Server davon ausgeht dass er nicht einfach alle Ports benutzen kann
Ggf. ist es noch notwendig, der Telekom-Konfiguration ein " ice_support = yes " zu spendieren, um NAT-Traversal zu aktivieren und die öffentliche IP-Adresse in den SDP-Teil der INVITES zu schreiben.