3 # Dialplans (extensions.conf)
5 # Implicit: ast_add_conf dialplan
7 ast_enable_type dialplangeneral
8 ast_enable_type dialplan
9 ast_enable_type dialplanexten
10 ast_enable_type dialplangoto
11 ast_enable_type dialplansaytime
12 ast_enable_type dialzone
13 ast_enable_type inzone
14 ast_enable_type incominggeneral
15 ast_enable_type incoming
17 dialplan_allowtransfer=no
18 dialplan_dialtimeout=30
19 dialplan_answerfirst=no
21 dialplan_writeprotect=no
22 dialplan_canreinvite=no
28 dialplangeneral_list="static writeprotect canreinvite clearglobalvars"
29 dialplangeneral_list_ex="lastdialed lastdialedtype voiceboxext answerfirst dialtimeout allowtransfer international internationalout"
31 valid_dialplangeneral() {
32 for i in ${dialplangeneral_list} ${dialplangeneral_list_ex} ; do
33 [ "$i" == "$1" ] && return 0
41 local check="${context#macro-}"
42 [ "${context}" == ${check} ] || check="macro__${check}"
43 eval "local isadded=\"\${dialplan_add_context_${check}-0}\""
44 if [ "$isadded" != "1" ] ; then
45 eval "dialplan_add_context_${check}=1"
46 append dialplan_contexts "$context"
52 append_dialplan_context() {
54 local check="${context#macro-}"
55 [ "${context}" == ${check} ] || check="macro__${check}"
56 append dialplan_context_${check} "${2}" "${N}"
59 reload_dialplan() astcmd "dialplan reload"
64 enable_module res_adsi
65 enable_module app_voicemail
69 add_dialplan_exten() {
71 logdebug 3 "Exten: $2"
72 local ext="exten => $2,"
74 local timeout=${dialplan_dialtimeout}
75 # Answer extensions first.
76 local answerfirst=${dialplan_answerfirst}
78 [ -z "$5" ] || timeout=$5
79 [ -z "$6" ] || answerfirst=$6
81 check_add_context "$context"
83 if [ "$dialplan_allowtransfer" == "yes" ] ; then
86 if [ ! -z "${planopt}" ] ; then
87 planopt=",${timeout},${planopt}"
88 elif [ ! -z "${timeout}" ] ; then
91 local dial="Dial($3$planopt)"
93 if [ "$answerfirst" == "yes" ] ; then
94 append_dialplan_context ${context} "${ext}1,Answer"
97 append_dialplan_context ${context} "${ext}${item}${dial}"
98 if [ ! -z "${mailbox}" ] ; then
100 append_dialplan_context ${context} "${ext}n,VoiceMail(${mailbox})"
103 append_dialplan_context ${context} "${ext}n,Congestion"
106 add_dialplan_include() {
108 logdebug 1 "Adding Dialplan Include $1 $2"
109 check_add_context "$context"
111 split_append dialplan_context_${context} "include => " "$2" "${N}"
114 add_dialplan_saytime() {
116 logdebug 1 "Adding Dialplan saytime $1 $2"
117 check_add_context "$context"
118 local ext="exten => $2,"
119 if [ "$dialplan_add_context_saytime" != 1 ] ; then
120 append dialplan_contexts saytime " "
121 dialplan_add_context_saytime=1
123 enable_module app_sayunixtime
124 local zone=${asterisk_zone}
125 [ ! -z "$3" ] && zone="$3"
126 local format="IMp AdbY"
127 [ ! -z "$4" ] && format="$4"
128 append dialplan_context_saytime "exten => s,1,SayUnixTime(,${zone},${format})" "${N}"
130 append_dialplan_context ${context} "${ext}1,Goto(saytime,s,1)"
133 add_dialplan_goto() {
135 logdebug 1 "Adding Dialplan goto $1 $2 $3"
136 check_add_context "$context"
137 append dialplan_context_${context} "exten => $2,1,Goto($3,\${EXTEN},1)" "${N}"
141 # TODO - Incoming zones.
147 #exten => _X.,1,Ringing()
148 #exten => _X.,n,Dial(SIP/Nokia,5)
149 #exten => _X.,n,Answer
150 #exten => _X.,n,wait(1)
151 #exten => _X.,n,Set(EXITCONTEXT=xyzzy)
152 #exten => _X.,n,Dial(SIP/Nokia,15,rd)
153 #exten => _X.,n,Hangup
155 #exten => 1,1,Noop(xyzzy)
156 #exten => 1,n,SayAlpha(b)
160 append_dialplan_dialzone() {
163 # Add the dialzone contexts
164 logdebug 1 "Dialplan: Add the dialzone contexts"
165 for zonename in ${dzones_match} ; do
166 eval "local diallist=\${dzone_${zonename}_match-}"
167 echo "${N}[${zonename}]" >> $file
168 eval "dialz=\${dzone_match_use_${zonename}-}"
170 for v in prefix internationalprefix alwaysinternational countrycode ; do
171 eval "local $v=\${target_${v}_${dialz}:-}"
172 eval logdebug 3 "\"${v} = '\${$v}'\""
175 for v in localzone addprefix localprefix; do
176 eval "local $v=\${dzone_${zonename}_${v}:-}"
178 while [ ! -z "$diallist" ] ; do
181 if [ "${alwaysinternational}" = "yes" ] ; then
182 # Always dial international number with this target
183 # remove 'localprefix' (usually 0) from 'addprefix'
184 logdebug 3 "Removing ${localprefix} from ${addprefix}"
185 addprefix=${addprefix#$localprefix}
186 local curlen=`expr length "${localprefix}"`
187 if [ $curlen != 0 ] ; then
188 # remove 0 (or local prefix)
189 echo "exten => _${localprefix}${cur},1,Goto(${dialz}_dial,${countrycode}${addprefix}\${EXTEN:$curlen},1)" >> $file
191 echo "exten => _${cur},1,Goto(${dialz}_dial,${countrycode}${addprefix}\${EXTEN},1)" >> $file
193 echo "exten => _${cur},1,Goto(${dialz}_dial,${addprefix}\${EXTEN},1)" >> $file
195 [ "$nvar" == "$diallist" ] && break
198 eval "local diallist=\${dzone_${zonename}_international-}"
199 if [ ! -z "${diallist}" ] ; then
200 logdebug 2 "International: ${diallist}"
201 while [ ! -z "$diallist" ] ; do
205 local curlen=`expr length ${cur}`
206 if [ "$alwaysinternational" = "yes" ] ; then
207 echo "exten => _${cur},1,Goto(${dialz}_dial,${addprefix}\${EXTEN:${curlen}},1)" >> $file
209 echo "exten => _${cur}.,1,Goto(${zonename}_check,${addprefix}\${EXTEN:${curlen}},1)" >> $file
211 [ "$nvar" == "$diallist" ] && break
215 if [ "$alwaysinternational" != "yes" ] ; then
216 # Check for local country code
217 echo "[${zonename}_check]" >> $file
219 local locallen=`expr length ${countrycode}`
220 echo "exten => _${countrycode}X.,1,Goto(${localzone-default},${localprefix-0}\${EXTEN:${locallen}},1)" >> $file
221 echo "exten => _X.,1,Goto(${dialz}_dial,${internationalprefix}\${EXTEN},1)" >> $file
225 logdebug 1 "Dialplan: Finish the dialzone contexts"
229 append_dialplan_dialzone_out(){
232 # Add the dialzone target contexts (dialing out)
233 logdebug 1 "Dialplan: Add the dialzone target contexts"
234 for contype in SIP IAX ; do
235 eval local conlist=\${dzones_${contype}-}
236 logdebug 1 "Adding ${contype} targets: ${conlist}"
237 for conname in $conlist ; do
238 echo "${N}[${contype}_${conname}_dial]" >> $file
239 for v in prefix internationalprefix alwaysinternational countrycode timeout lastdialed lastdialedtype ; do
240 eval "local $v=\${target_${v}_${contype}_${conname}:-}"
243 if [ -z "${lastdialed}" ] ; then
244 lastdialed=${dialplan_lastdialed}
245 lastdialedtype=${dialplan_lastdialedtype}
248 # [ -z "${lastcallout}" ] && lastcallout=${feature_lastcall_outqueue}
249 # if [ ! -z "${lastcalloutexten}" ] ; then
250 # eval "local added=\${lastcallout_outqueue_extension_${lastcalloutexten}}"
251 # if [ ! "${added}" == 1 ] ; then
252 # add_dialplan_lastcall extensions "${lastcalloutexten}" "${lastcallout}" "${feature_lastcall_outcount}"
253 # eval "local lastcallout_outqueue_extension_${lastcalloutexten}=1"
256 local ext="exten => _X.,"
258 # Do not use prefix unles 'alwaysinternational' is yes
259 [ "$alwaysinternational" != "yes" ] && internationalprefix=
261 # if [ ! -z "${lastcallout}" ] ; then # Add lastcall out
263 # echo "${ext}${en}Macro(lastcallstore,${internationalprefix}\${EXTEN},${lastcallout},${feature_lastcall_outcount})" >> $file
267 if [ ! -z "${lastdialed}" ] ; then
268 enable_module func_callerid
269 local lastparam="\${EXTEN}"
270 local lastmacro=${lastdialed}
271 local lastmacrotype=${lastdialedtype}
272 [ -z ${lastdialedtype} ] && lastdialedtype=goto
275 gen_jumpmacro jumpmacroline "${ext}${en}" "" "${lastmacrotype}" "${lastmacro}" "${lastparam}"
276 echo ${jumpmacroline} >> $file
279 echo "${ext}${en}Dial(${contype}/${prefix}${internationalprefix}\${EXTEN}@${conname},$timeout)" >> $file
280 echo "exten => _X.,n,Congestion" >> $file
287 logdebug 3 "Gen JumpMacro /$1/=/$2/$3/$4/$5/$6/"
294 if [ -z "${condition}" ] ; then
297 local cond="If(${condition}?"
301 enable_module app_stack # for gosub
302 logdebug 1 "${1}=\"\${leader}Gosub\${cond}\${name},\${param},1)\""
303 eval "${1}=\"\${leader}Gosub\${cond}\${name},\${param},1)\"" ;;
305 enable_module app_stack # for gosub
306 logdebug 1 "${1}=\"\${leader}Gosub\${cond}\${name},s,1(\${param}))\""
307 eval "${1}=\"\${leader}Gosub\${cond}\${name},s,1(\${param}))\"" ;;
309 enable_module app_macro
310 logdebug 1 "${1}=\"\${leader}Macro\${cond}\${name},\${param})\""
311 eval "${1}=\"\${leader}Macro\${cond}\${name},\${param})\"" ;;
314 enable_module app_goto
315 logdebug 1 "${1}=\"\${leader}Goto(\${iz_target},s,1)\""
316 eval "${1}=\"\${leader}Goto(\${iz_target},s,1)\"" ;;
318 enable_module app_goto
319 logdebug 1 "${1}=\"\${leader}Goto\${cond}\${name},\${param},1)\""
320 eval "${1}=\"\${leader}Goto\${cond}\${name},\${param},1)\"" ;;
326 local jumpmacroline=""
327 gen_jumpmacro "jumpmacroline" "$2" "$3" "$4" "$5" "$6"
328 append_dialplan_context ${context} "${jumpmacroline}"
331 append_dialplan_incoming(){
333 # Evaluate the incoming ringing dialplans
334 logdebug 1 "Add the 'incoming' dialplans: ${dialplan_extensions_incoming}"
335 for context in ${dialplan_extensions_incoming} ; do
336 eval "local curext=\"\${dialplan_incoming_$context}\""
337 logdebug 2 "Adding incoming ${curext}"
339 check_add_context "$context"
340 # lastcall lastcallexten lastmissed lastmissedexten
341 for i in answerfirst beforeanswer timeout menucontext \
342 lastcall lastcalltype missed missedtype allowtransfer mailbox match matchcaller aftertimeout aftertimeouttype; do
343 eval "local iz_$i=\"\${incoming_${context}_$i}\""
344 eval "logdebug 1 \"Incoming \$context: iz_\$i=\${iz_$i}\""
346 [ ! -z ${iz_menucontext} ] && iz_answerfirst=yes
348 if [ ! -z ${curext} ] ; then
349 [ -z ${iz_answerfirst} ] && iz_answerfirst=${incoming_answerfirst}
350 # [ -z ${iz_lastcall} ] && iz_lastcall=${feature_lastcall_inqueue}
351 if [ -z ${iz_lastcall} ] ; then
352 iz_lastcall=${incoming_lastcall}
353 iz_lastcalltype=${incoming_lastcalltype}
355 if [ -z ${iz_missed} ] ; then
356 iz_missed=${incoming_missed}
357 iz_missedtype=${incoming_missedtype}
359 [ -z ${iz_mailbox} ] && iz_mailbox=${incoming_mailbox}
360 [ -z ${iz_timeout} ] && iz_timeout=${incoming_timeout}
361 [ -z ${iz_allowtransfer} ] && iz_allowtransfer=${incoming_allowtransfer}
364 [ -z ${iz_match} ] && iz_match=_X.
365 [ ! -z ${iz_matchcaller} ] && iz_match=${iz_match}/${iz_matchcaller}
367 local ext="exten => ${iz_match},"
369 [ "${iz_allowtransfer}" == "yes" ] && planopt=${planopt}t
372 #append_dialplan_context ${context} "${ext}${item}Ringing()"
373 if [ ! -z "${iz_lastcall}" ] ; then
375 enable_module func_callerid
376 local lastparam="\${CALLERID(num)}"
377 local lastmacrotype="${iz_lastcalltype}"
378 [ -z "${iz_lastcalltype}" ] && lastmacrotype=goto
379 local lastmacro=${iz_lastcall}
380 append_jumpmacro "${context}" "${ext}${item}" "" "${lastmacrotype}" "${lastmacro}" "${lastparam}"
383 if [ ! -z "${iz_missed}" ] ; then
384 enable_module func_callerid
385 local missedparam="\${CALLERID(num)}"
386 [ -z "${iz_missedtype}" ] && iz_missedtype=goto
388 append_dialplan_context ${context} "${ext}${item}Set(lcsMissed=\${CALLERID(num)})"
391 # Ring before answering
392 if [ ! -z "${iz_beforeanswer}" -a ! -z "${curext}" ] ; then
393 append_dialplan_context ${context} "${ext}${item}Dial(${curext},${iz_beforeanswer},${planopt})"
398 if [ "$iz_answerfirst" == "yes" ] ; then
399 append_dialplan_context ${context} "${ext}${item}Answer"
402 # if [ ! -z ${iz_lastcallexten} ] ; then
404 # add_dialplan_lastcall extensions "${iz_lastcallexten}" "${iz_lastcall}" "${feature_lastcall_incount}"
407 if [ ! -z ${curext} ] ; then
408 if [ ! -z ${iz_menucontext} ] ; then
410 enable_module res_indications
411 # wait so the next ring connects.
412 append_dialplan_context ${context} "${ext}${item}Wait(1)"
413 append_dialplan_context ${context} "${ext}n,Set(EXITCONTEXT=${iz_menucontext})"
416 if [ ! -z ${planopt} ] ; then
417 planopt=",${iz_timeout-},${planopt}"
418 elif [ ! -z ${iz_timeout-} ] ; then
419 planopt=",${iz_timeout-}"
421 local dial="Dial(${curext}${planopt})"
423 append_dialplan_context ${context} "${ext}n,${dial})"
425 if [ ! -z ${iz_missed} ] ; then
426 # It went to voicemail or was hung up - consider missed
427 append_jumpmacro ${context} "${ext}${item}" "" "${iz_missedtype}" "${iz_missed}" "\${lcsMissed}"
432 # Add a goto or macro at the end
433 if [ ! -z ${iz_target} ] ; then
434 case ${iz_aftertimeouttype} in
435 macro) append_dialplan_context ${context} "${ext}${item}Macro(${iz_target})";;
436 s|start) append_dialplan_context ${context} "${ext}${item}Goto(${iz_target},s,1)"
438 *) append_dialplan_context ${context} "${ext}${item}Goto(${iz_target},\${EXTEN},1)"
443 if [ ! -z ${iz_mailbox} ] ; then
445 append_dialplan_context ${context} "${ext}n,VoiceMail(${iz_mailbox})"
448 [ "${need_hangup}" = "1" ] && append_dialplan_context ${context} "${ext}n,Hangup"
450 if [ ! -z ${iz_missed} ] ; then
451 # Check for missed call
453 append_jumpmacro ${context} "exten => h,1," "\$[\"\${DIALSTATUS}\" = \"CANCEL\"]" "${iz_missedtype}" "${iz_missed}" "\${lcsMissed}"
454 #append dialplan_context_${context} \
455 # "exten => h,1,MacroIf(\$[\"\${DIALSTATUS}\" = \"CANCEL\"]?lastcallstore,\${lcsMissed},${iz_lastmissed},${feature_lastcall_incount})" "${N}"
456 # [ ! -z ${iz_lastmissedexten} ] && \
457 # add_dialplan_lastcall extensions "${iz_lastmissedexten}" "${iz_lastmissed}" "${feature_lastcall_incount}"
462 append_dialplan_extensions(){
464 # Evaluate the 'extension' dialplans
465 logdebug 1 "Add the 'extension' dialplans: ${dialplan_exts}"
466 for i in ${dialplan_exts} ; do
467 eval "local curext=\"\${dialplan_ext_$i}\""
468 add_dialplan_exten extensions $i $curext
473 append dialplan_includes "#include <$1>" "$N"
477 create_dialplanconf() {
478 # Add general section
479 logdebug 1 "Dialplan: Add general section"
480 local file=${DEST_DIR}/extensions.conf
481 get_checksum dialplan_conf $file
483 echo "${asteriskuci_gen}" > $file
485 [ -z "${dialplan_includes}" ] || (echo "${dialplan_includes}${N}" >> $file)
487 if [ ! -z "${dialplan_globals}" ] ; then
488 echo "[globals]${N}${dialplan_globals}${N}" >> $file
491 echo "[general]" >> $file
492 for i in ${dialplangeneral_list} ; do
493 eval "local val=\"\$dialplan_$i\""
494 if [ ! -z "$val" ] ; then
495 echo "$i=$val" >> $file
499 append_dialplan_dialzone "$file"
501 append_dialplan_dialzone_out "$file"
503 append_dialplan_park "$file"
505 append_dialplan_extensions "$file"
507 append_dialplan_incoming "$file"
509 # append_dialplan_lastcall "$file"
511 # Add all the contexts
512 logdebug 1 "Dialplan: Add all the contexts"
513 for i in ${dialplan_contexts} ; do
514 echo "${N}[$i]" >> $file
515 [ "${i#macro-}" == "${i}" ] || i=macro__${i#macro-}
516 eval "local curcontext=\"\${dialplan_context_$i-}\""
517 echo "$curcontext">> $file
518 eval unset dialplan_context_$i
521 check_checksum "$dialplan_conf" "$file" || ast_dialplan_restart=1
526 handle_dialplangeneral() {
528 if valid_dialplangeneral $1 $2 ; then
529 eval "dialplan_$1=\"$2\""
531 logerror "Invalid Dialplan General option: $1"
539 if [ -z ${context_name} ] ; then
540 logerror "Context name required for dialplan"
544 logdebug 4 "dialplan ${context_name}: '$1' '$2'"
547 include|include_ITEM*) add_dialplan_include ${context_name} $2 ;;
550 logdebug 4 "Add extension $lhs"
551 if [ "$(expr $lhs : [0-9][0-9]\*)" != 0 ] ; then
553 if [ "${addtype}" == "$2" ]; then
560 add_dialplan_voice ${context_name} $1 $addparam ;;
561 meetme|conf|conference) add_dialplan_meetme ${context_name} $1 $addparam ;;
562 saytime|time) add_dialplan_saytime ${context_name} $1 $addparam ;;
563 clock) add_dialplan_talkclock ${context_name} $1 $addparam ;;
564 *) logerror "Unknown type '${addtype}' in dialplan ${context_name}, extension ${1}"
567 logerror "Invalid option: $1 for dialplan ${context_name}"
573 handle_dialplanexten() {
574 check_add dialplanexten
577 dialplan|extension|type|target|dialextension|voicebox|timeout|answerfirst)
578 eval "dial_exten_$1=\"$2\""
583 check_add_dialplanexten() {
584 if [ ! -z "${dial_exten_dialplan}" -a ! -z "${dial_exten_extension}" ] ; then
586 local dialtarget=${dial_exten_type}/${dial_exten_dialextension+@}${dial_exten_dialextension}${dial_exten_target}
588 check_add_context ${dial_exten_dialplan}
589 add_dialplan_exten "${dial_exten_dialplan}" "${dial_exten_extension}" \
590 "${dialtarget}" "${dial_exten_voicebox}" "${dial_exten_timeout}" \
591 "${dial_exten_answerfirst}"
593 for i in dialplan extension voicebox type target dialextension timeout answerfirst ; do
594 eval "unset dial_voice_$i"
598 handle_dialplansaytime() {
599 check_add dialplansaytime
602 dialplan|extension|zone|format)
603 eval "dial_saytime_$1=\"$2\""
608 check_add_dialplansaytime() {
609 logdebug 1 "Add Saytime to $1 / $2"
610 if [ ! -z "${dial_saytime_dialplan}" -a ! -z "${dial_saytime_extension}" ] ; then
611 # local ext="exten => ${dial_saytime_extension},"
612 [ -z "${dial_saytime_dialplan}" ] && dial_saytime_dialplan=default
614 add_dialplan_saytime "${dial_saytime_dialplan}" "${dial_saytime_extension}" \
615 "${dial_saytime_zone}" "${dial_saytime_format}"
617 for i in dialplan extension zone format; do
618 eval "unset dial_saytime_$i"
623 handle_dialzone_match() {
624 eval "local isadded=\"\${dzone_${zone_name}-0}\""
625 if [ "${isadded}" != "1" ] ; then
626 eval "dzone_${zone_name}=1"
627 append dzones_match ${zone_name} " "
629 append dzone_${zone_name}_match $1 ","
632 # Set up outgoing zones (match patterns)
635 logdebug 2 "Loading dialzone: $zone_name"
637 logdebug 2 "Dialzone $1/$2"
640 local areatype=${2%[-/]*}
641 local areaname=${2#*[-/]}
642 logdebug 3 "Added: $areatype $areaname"
643 eval "local isadded=\"\${dzone_${areatype}_${areaname}-0}\""
644 if [ "${isadded}" != "1" ] ; then
645 eval dzone_${areatype}_${areaname}=1
646 append dzones_${areatype} "${areaname}" " "
648 eval "dzone_match_use_${zone_name}=${areatype}_${areaname}"
649 logdebug 3 "Finished uses"
653 handle_dialzone_match "$2"
655 international_LENGTH) ;;
656 international|international_ITEM*)
657 eval "local isadded=\"$dzone_${zone_name}\""
658 if [ "${isadded}" != "1" ] ; then
659 eval "dzone_${zone_name}=1"
660 append dzones_match ${zone_name} " "
662 append dzone_${zone_name}_international $2 ","
664 countrycode|localzone|addprefix|localprefix)
665 eval "dzone_${zone_name}_${1}=\"$2\""
666 eval "y=\${dzone_${zone_name}_${1}}"
669 logerror "Invalid Dialzone option: $1 in zone '${zone_name}'" ;;
674 check_add_dialplangoto() {
675 logdebug 1 "Add Goto to $1 / $2"
676 if [ ! -z "${dial_goto_dialplan}" -a ! -z "${dial_goto_extension}" ] ; then
677 local ext="exten => ${dial_goto_extension},"
678 check_add_context ${dial_goto_dialplan}
679 append_dialplan_context ${dial_goto_dialplan} "${ext}1,Goto(${dial_goto_target})"
681 for i in dialplan extension room ; do
682 eval "unset dial_goto_$i"
686 handle_dialplangoto(){
687 check_add dialplangoto
690 dialplan|extension|target)
691 eval "dial_goto_$1=\"$2\"" ;;
692 *) logerror "Invalid dialplangoto option: $1"
697 # Options for incoming calls.
699 valid_incoming_list="allowtransfer timeout answerfirst mailbox lastcall lastcalltype missed missedtype"
701 valid_incoming_option() {
702 is_in_list $1 ${valid_incoming_list}
706 handle_incominggeneral() {
708 if valid_incoming_option $1 ; then
709 logdebug 3 "Add Incoming General option $1=$2"
710 eval "incoming_${1}=\"$2\""
712 logerror "Invalid incominggeneral option $1"
720 add_incoming_context "${incoming_context}"
723 logdebug 1 "Incoming ${incoming_context} $1=$2"
725 lastcall|lastcalltype|missed|missedtype) eval "incoming_${incoming_context}_${1}=\"$2\"" ;;
726 # lastcall|lastcallexten|lastmissed|lastmissedexten)
728 # eval "incoming_${incoming_context}_${1}=\"$2\""
730 mailbox|allowtransfer|answerfirst|beforeanswer|timeout|menucontext|match|matchcaller|aftertimeout|aftertimeouttype)
731 eval "incoming_${incoming_context}_${1}=\"$2\""
734 append dialplan_incoming_${incoming_context} "$2" "&"
737 *) logerror "Invalid option $1 in incoming" ;;
742 # vim: ts=2 sw=2 noet foldmethod=indent