Use _[0-9*+#]. in place of _. to avoid warnings in the log. Fix some errors with quotes Change default call type to macro for lastdialedtype.
796 lines
23 KiB
Bash
Executable file
796 lines
23 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
# Dialplans (extensions.conf)
|
|
|
|
# Implicit: ast_add_conf dialplan
|
|
init_dialplanconf() {
|
|
ast_enable_type dialplangeneral
|
|
ast_enable_type dialplan
|
|
ast_enable_type dialplanexten
|
|
ast_enable_type dialplangoto
|
|
ast_enable_type dialplansaytime
|
|
ast_enable_type dialzone
|
|
ast_enable_type inzone
|
|
ast_enable_type incominggeneral
|
|
ast_enable_type incoming
|
|
|
|
dialplan_allowtransfer=no
|
|
dialplan_dialtimeout=30
|
|
dialplan_answerfirst=no
|
|
dialplan_static=yes
|
|
dialplan_writeprotect=no
|
|
dialplan_canreinvite=no
|
|
dialplan_includes=
|
|
dialplan_globals=
|
|
return 0
|
|
}
|
|
|
|
match_all="_[0-9*+#]."
|
|
|
|
dialplangeneral_list="static writeprotect canreinvite clearglobalvars"
|
|
dialplangeneral_list_ex="lastdialed lastdialedtype voiceboxext answerfirst dialtimeout allowtransfer international internationalout"
|
|
|
|
valid_dialplangeneral() {
|
|
for i in ${dialplangeneral_list} ${dialplangeneral_list_ex} ; do
|
|
[ "$i" == "$1" ] && return 0
|
|
done
|
|
return 1
|
|
}
|
|
|
|
|
|
check_add_context() {
|
|
local context="${1}"
|
|
local check="${context#macro-}"
|
|
[ "${context}" == ${check} ] || check="macro__${check}"
|
|
eval "local isadded=\"\${dialplan_add_context_${check}-0}\""
|
|
if [ "$isadded" != "1" ] ; then
|
|
eval "dialplan_add_context_${check}=1"
|
|
append dialplan_contexts "$context"
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
append_dialplan_context() {
|
|
local context="${1}"
|
|
local check="${context#macro-}"
|
|
[ "${context}" == ${check} ] || check="macro__${check}"
|
|
append dialplan_context_${check} "${2}" "${N}"
|
|
}
|
|
|
|
reload_dialplan() astcmd "dialplan reload"
|
|
|
|
# Voicemail
|
|
|
|
enable_voicemail() {
|
|
enable_module res_adsi
|
|
enable_module app_voicemail
|
|
enable_format gsm
|
|
}
|
|
|
|
add_dialplan_exten() {
|
|
local context=$1
|
|
logdebug 3 "Exten: $2"
|
|
local ext="exten => $2,"
|
|
local planopt=
|
|
local timeout=${dialplan_dialtimeout}
|
|
# Answer extensions first.
|
|
local answerfirst=${dialplan_answerfirst}
|
|
local mailbox=$4
|
|
[ -z "$5" ] || timeout=$5
|
|
[ -z "$6" ] || answerfirst=$6
|
|
|
|
check_add_context "$context"
|
|
|
|
if [ "$dialplan_allowtransfer" == "yes" ] ; then
|
|
planopt=${planopt}t
|
|
fi
|
|
if [ ! -z "${planopt}" ] ; then
|
|
planopt=",${timeout},${planopt}"
|
|
elif [ ! -z "${timeout}" ] ; then
|
|
planopt=",${timeout}"
|
|
fi
|
|
local dial="Dial($3$planopt)"
|
|
local item="1,"
|
|
if [ "$answerfirst" == "yes" ] ; then
|
|
append_dialplan_context ${context} "${ext}1,Answer"
|
|
item="n,"
|
|
fi
|
|
append_dialplan_context ${context} "${ext}${item}${dial}"
|
|
if [ ! -z "${mailbox}" ] ; then
|
|
enable_voicemail
|
|
append_dialplan_context ${context} "${ext}n,VoiceMail(${mailbox})"
|
|
fi
|
|
|
|
append_dialplan_context ${context} "${ext}n,Congestion"
|
|
}
|
|
|
|
add_dialplan_include() {
|
|
local context=$1
|
|
logdebug 1 "Adding Dialplan Include $1 $2"
|
|
check_add_context "$context"
|
|
|
|
split_append dialplan_context_${context} "include => " "$2" "${N}"
|
|
}
|
|
|
|
add_dialplan_saytime() {
|
|
local context=$1
|
|
logdebug 1 "Adding Dialplan saytime $1 $2"
|
|
check_add_context "$context"
|
|
local ext="exten => $2,"
|
|
if [ "$dialplan_add_context_saytime" != 1 ] ; then
|
|
append dialplan_contexts saytime " "
|
|
dialplan_add_context_saytime=1
|
|
enable_format gsm
|
|
enable_module app_sayunixtime
|
|
local zone=${asterisk_zone}
|
|
[ ! -z "$3" ] && zone="$3"
|
|
local format="IMp AdbY"
|
|
[ ! -z "$4" ] && format="$4"
|
|
append dialplan_context_saytime "exten => s,1,SayUnixTime(,${zone},${format})" "${N}"
|
|
fi
|
|
append_dialplan_context ${context} "${ext}1,Goto(saytime,s,1)"
|
|
}
|
|
|
|
add_dialplan_goto() {
|
|
local context=$1
|
|
logdebug 1 "Adding Dialplan goto $1 $2 $3"
|
|
check_add_context "$context"
|
|
append dialplan_context_${context} "exten => $2,1,Goto($3,\${EXTEN},1)" "${N}"
|
|
}
|
|
|
|
dialplan_inzone_list="match caller goto"
|
|
|
|
valid_dialplan_inzone() {
|
|
is_in_list $1 ${valid_inzone_list}
|
|
return $?
|
|
}
|
|
|
|
check_append_inzone() {
|
|
local context="${1}"
|
|
eval "local isadded=\"\${dialplan_add_inzone_${context}-0}\""
|
|
if [ "$isadded" != "1" ] ; then
|
|
eval "dialplan_add_inzone_${check}=1"
|
|
append inzone_contexts "$context"
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
handle_inzone() {
|
|
|
|
context_name=${1}
|
|
check_append_inzone ${context_name}
|
|
|
|
option_cb(){
|
|
case $1 in
|
|
goto) eval "inzone_${context_name}_goto=\"\$2\"" ;;
|
|
match_ITEM*|match) append inzone_${context_name}_match "$2" " " ;;
|
|
caller_ITEM*|caller) append inzone_${context_name}_caller "$2" " " ;;
|
|
include_ITEM*|include) append inzone_${context_name}_include "$2" " " ;;
|
|
match_LENGTH|caller_LENGTH|include_LENGTH) ;;
|
|
*) logerror "Invalid Dialplan inzone option: $1" ;;
|
|
esac
|
|
}
|
|
}
|
|
|
|
|
|
append_dialplan_inzone() {
|
|
local file=$1
|
|
for context in ${inzone_contexts} ; do
|
|
for i in goto match caller include ; do
|
|
eval "iz_$i=\"\${inzone_${context}_${i}}\""
|
|
done
|
|
if [ -z "${iz_goto}" ] ; then
|
|
logerror "Missing goto for inzone: ${context}"
|
|
elif [ -z "${iz_match}" -a -z "${iz_caller}" ] ; then
|
|
logerror "Missing match for inzone: ${context}"
|
|
else
|
|
echo "${N}[${context}]" >> ${file}
|
|
for curmatch in ${iz_include} ; do
|
|
echo "include => ${curmatch}" >> $file
|
|
done
|
|
|
|
local gotoline="Goto(${iz_goto},\${EXTEN},1)"
|
|
[ -z "${iz_match}" ] && iz_match=${match_all}
|
|
for curmatch in ${iz_match} ; do
|
|
if [ -z "${iz_caller}" ] ; then
|
|
echo "exten => ${curmatch},1,${gotoline}" >> $file
|
|
else
|
|
for curcaller in ${iz_caller} ; do
|
|
echo "exten => ${curmatch}/${curcaller},1,${gotoline}" >> $file
|
|
done
|
|
fi
|
|
done
|
|
fi
|
|
done
|
|
}
|
|
|
|
append_dialplan_dialzone() {
|
|
local file=$1
|
|
|
|
# Add the dialzone contexts
|
|
logdebug 1 "Dialplan: Add the dialzone contexts"
|
|
for zonename in ${dzones_match} ; do
|
|
eval "local diallist=\${dzone_${zonename}_match-}"
|
|
echo "${N}[${zonename}]" >> $file
|
|
eval "dialz=\${dzone_match_use_${zonename}-}"
|
|
|
|
for v in prefix internationalprefix alwaysinternational countrycode ; do
|
|
eval "local $v=\${target_${v}_${dialz}:-}"
|
|
eval logdebug 3 "\"${v} = '\${$v}'\""
|
|
done
|
|
|
|
for v in localzone addprefix localprefix; do
|
|
eval "local $v=\${dzone_${zonename}_${v}:-}"
|
|
done
|
|
while [ ! -z "$diallist" ] ; do
|
|
cur=${diallist%%,*}
|
|
nvar=${diallist#*,}
|
|
if [ "${alwaysinternational}" = "yes" ] ; then
|
|
# Always dial international number with this target
|
|
# remove 'localprefix' (usually 0) from 'addprefix'
|
|
logdebug 3 "Removing ${localprefix} from ${addprefix}"
|
|
addprefix=${addprefix#$localprefix}
|
|
local curlen=`expr length "${localprefix}"`
|
|
if [ $curlen != 0 ] ; then
|
|
# remove 0 (or local prefix)
|
|
echo "exten => _${localprefix}${cur},1,Goto(${dialz}_dial,${countrycode}${addprefix}\${EXTEN:$curlen},1)" >> $file
|
|
fi
|
|
echo "exten => _${cur},1,Goto(${dialz}_dial,${countrycode}${addprefix}\${EXTEN},1)" >> $file
|
|
else
|
|
echo "exten => _${cur},1,Goto(${dialz}_dial,${addprefix}\${EXTEN},1)" >> $file
|
|
fi
|
|
[ "$nvar" == "$diallist" ] && break
|
|
diallist=${nvar}
|
|
done
|
|
eval "local diallist=\${dzone_${zonename}_international-}"
|
|
if [ ! -z "${diallist}" ] ; then
|
|
logdebug 2 "International: ${diallist}"
|
|
while [ ! -z "$diallist" ] ; do
|
|
cur="${diallist%%,*}"
|
|
nvar="${diallist#*,}"
|
|
|
|
local curlen=`expr length "${cur}"`
|
|
if [ "$alwaysinternational" = "yes" ] ; then
|
|
echo "exten => _${cur},1,Goto(${dialz}_dial,${addprefix}\${EXTEN:${curlen}},1)" >> $file
|
|
else
|
|
echo "exten => _${cur}.,1,Goto(${zonename}_check,${addprefix}\${EXTEN:${curlen}},1)" >> $file
|
|
fi
|
|
[ "$nvar" == "$diallist" ] && break
|
|
diallist="${nvar}"
|
|
done
|
|
|
|
if [ "$alwaysinternational" != "yes" ] ; then
|
|
logdebug 2 "Not Always International:"
|
|
# Check for local country code
|
|
echo "[${zonename}_check]" >> $file
|
|
|
|
local locallen=`expr length "${countrycode}"`
|
|
echo "exten => _${countrycode}X.,1,Goto(${localzone-default},${localprefix-0}\${EXTEN:${locallen}},1)" >> $file
|
|
echo "exten => _X.,1,Goto(${dialz}_dial,${internationalprefix}\${EXTEN},1)" >> $file
|
|
fi
|
|
fi
|
|
done
|
|
logdebug 1 "Dialplan: Finish the dialzone contexts"
|
|
|
|
}
|
|
|
|
append_dialplan_dialzone_out(){
|
|
local file=$1
|
|
|
|
# Add the dialzone target contexts (dialing out)
|
|
logdebug 1 "Dialplan: Add the dialzone target contexts"
|
|
for contype in SIP IAX ; do
|
|
eval local conlist=\${dzones_${contype}-}
|
|
logdebug 1 "Adding ${contype} targets: ${conlist}"
|
|
for conname in $conlist ; do
|
|
echo "${N}[${contype}_${conname}_dial]" >> $file
|
|
for v in prefix internationalprefix alwaysinternational countrycode timeout lastdialed lastdialedtype ; do
|
|
eval "local $v=\${target_${v}_${contype}_${conname}:-}"
|
|
done
|
|
|
|
if [ -z "${lastdialed}" ] ; then
|
|
lastdialed=${dialplan_lastdialed}
|
|
lastdialedtype=${dialplan_lastdialedtype}
|
|
fi
|
|
|
|
# [ -z "${lastcallout}" ] && lastcallout=${feature_lastcall_outqueue}
|
|
# if [ ! -z "${lastcalloutexten}" ] ; then
|
|
# eval "local added=\${lastcallout_outqueue_extension_${lastcalloutexten}}"
|
|
# if [ ! "${added}" == 1 ] ; then
|
|
# add_dialplan_lastcall extensions "${lastcalloutexten}" "${lastcallout}" "${feature_lastcall_outcount}"
|
|
# eval "local lastcallout_outqueue_extension_${lastcalloutexten}=1"
|
|
# fi
|
|
# fi
|
|
local ext="exten => _X.,"
|
|
local en="1,"
|
|
# Do not use prefix unles 'alwaysinternational' is yes
|
|
[ "$alwaysinternational" != "yes" ] && internationalprefix=
|
|
|
|
# if [ ! -z "${lastcallout}" ] ; then # Add lastcall out
|
|
# enable_lastcall
|
|
# echo "${ext}${en}Macro(lastcallstore,${internationalprefix}\${EXTEN},${lastcallout},${feature_lastcall_outcount})" >> $file
|
|
# en="n,"
|
|
# fi
|
|
|
|
if [ ! -z "${lastdialed}" ] ; then
|
|
enable_module func_callerid
|
|
local lastparam="\${EXTEN}"
|
|
local lastmacro=${lastdialed}
|
|
local lastmacrotype=${lastdialedtype}
|
|
[ -z ${lastdialedtype} ] && lastdialedtype=macro
|
|
|
|
local jumpmacroline=
|
|
gen_jumpmacro jumpmacroline "${ext}${en}" "" "${lastmacrotype}" "${lastmacro}" "${lastparam}"
|
|
echo ${jumpmacroline} >> $file
|
|
en="n,"
|
|
fi
|
|
echo "${ext}${en}Dial(${contype}/${prefix}${internationalprefix}\${EXTEN}@${conname},$timeout)" >> $file
|
|
echo "exten => _X.,n,Congestion" >> $file
|
|
done
|
|
done
|
|
}
|
|
|
|
|
|
gen_jumpmacro() {
|
|
logdebug 3 "Gen JumpMacro /$1/=/$2/$3/$4/$5/$6/"
|
|
local leader=$2
|
|
local condition=$3
|
|
local macrotype=$4
|
|
local name=$5
|
|
local param=$6
|
|
|
|
if [ -z "${condition}" ] ; then
|
|
local cond="("
|
|
else
|
|
local cond="If(${condition}?"
|
|
fi
|
|
case ${macrotype} in
|
|
gosub)
|
|
enable_module app_stack # for gosub
|
|
logdebug 1 "${1}=\"\${leader}Gosub\${cond}\${name},\${param},1)\""
|
|
eval "${1}=\"\${leader}Gosub\${cond}\${name},\${param},1)\"" ;;
|
|
gosub_s)
|
|
enable_module app_stack # for gosub
|
|
logdebug 1 "${1}=\"\${leader}Gosub\${cond}\${name},s,1(\${param}))\""
|
|
eval "${1}=\"\${leader}Gosub\${cond}\${name},s,1(\${param}))\"" ;;
|
|
macro)
|
|
enable_module app_macro
|
|
logdebug 1 "${1}=\"\${leader}Macro\${cond}\${name},\${param})\""
|
|
eval "${1}=\"\${leader}Macro\${cond}\${name},\${param})\"" ;;
|
|
|
|
s|start)
|
|
enable_module app_goto
|
|
logdebug 1 "${1}=\"\${leader}Goto(\${iz_target},s,1)\""
|
|
eval "${1}=\"\${leader}Goto(\${iz_target},s,1)\"" ;;
|
|
*)
|
|
enable_module app_goto
|
|
logdebug 1 "${1}=\"\${leader}Goto\${cond}\${name},\${param},1)\""
|
|
eval "${1}=\"\${leader}Goto\${cond}\${name},\${param},1)\"" ;;
|
|
esac
|
|
}
|
|
|
|
append_jumpmacro(){
|
|
local context=$1
|
|
local jumpmacroline=""
|
|
gen_jumpmacro "jumpmacroline" "$2" "$3" "$4" "$5" "$6"
|
|
append_dialplan_context ${context} "${jumpmacroline}"
|
|
}
|
|
|
|
append_dialplan_incoming(){
|
|
local file=$1
|
|
# Evaluate the incoming ringing dialplans
|
|
logdebug 1 "Add the 'incoming' dialplans: ${dialplan_extensions_incoming}"
|
|
for context in ${dialplan_extensions_incoming} ; do
|
|
eval "local curext=\"\${dialplan_incoming_$context}\""
|
|
logdebug 2 "Adding incoming ${curext}"
|
|
|
|
check_add_context "$context"
|
|
# lastcall lastcallexten lastmissed lastmissedexten
|
|
for i in answerfirst beforeanswer timeout menucontext \
|
|
lastcall lastcalltype missed missedtype allowtransfer mailbox match matchcaller aftertimeout aftertimeouttype; do
|
|
eval "local iz_$i=\"\${incoming_${context}_$i}\""
|
|
eval "logdebug 1 \"Incoming \$context: iz_\$i=\${iz_$i}\""
|
|
done
|
|
[ ! -z ${iz_menucontext} ] && iz_answerfirst=yes
|
|
|
|
if [ ! -z ${curext} ] ; then
|
|
[ -z ${iz_answerfirst} ] && iz_answerfirst=${incoming_answerfirst}
|
|
# [ -z ${iz_lastcall} ] && iz_lastcall=${feature_lastcall_inqueue}
|
|
if [ -z ${iz_lastcall} ] ; then
|
|
iz_lastcall=${incoming_lastcall}
|
|
iz_lastcalltype=${incoming_lastcalltype}
|
|
fi
|
|
if [ -z ${iz_missed} ] ; then
|
|
iz_missed=${incoming_missed}
|
|
iz_missedtype=${incoming_missedtype}
|
|
fi
|
|
[ -z ${iz_mailbox} ] && iz_mailbox=${incoming_mailbox}
|
|
[ -z ${iz_timeout} ] && iz_timeout=${incoming_timeout}
|
|
[ -z ${iz_allowtransfer} ] && iz_allowtransfer=${incoming_allowtransfer}
|
|
fi
|
|
|
|
[ -z ${iz_match} ] && iz_match=_X.
|
|
[ ! -z ${iz_matchcaller} ] && iz_match=${iz_match}/${iz_matchcaller}
|
|
|
|
local ext="exten => ${iz_match},"
|
|
local planopt=
|
|
[ "${iz_allowtransfer}" == "yes" ] && planopt=${planopt}t
|
|
local item="1,"
|
|
|
|
#append_dialplan_context ${context} "${ext}${item}Ringing()"
|
|
if [ ! -z "${iz_lastcall}" ] ; then
|
|
|
|
enable_module func_callerid
|
|
local lastparam="\${CALLERID(num)}"
|
|
local lastmacrotype="${iz_lastcalltype}"
|
|
[ -z "${iz_lastcalltype}" ] && lastmacrotype=macro
|
|
local lastmacro=${iz_lastcall}
|
|
append_jumpmacro "${context}" "${ext}${item}" "" "${lastmacrotype}" "${lastmacro}" "${lastparam}"
|
|
item="n,"
|
|
fi
|
|
if [ ! -z "${iz_missed}" ] ; then
|
|
enable_module func_callerid
|
|
local missedparam="\${CALLERID(num)}"
|
|
[ -z "${iz_missedtype}" ] && iz_missedtype=macro
|
|
|
|
append_dialplan_context ${context} "${ext}${item}Set(lcsMissed=\${CALLERID(num)})"
|
|
item="n,"
|
|
fi
|
|
# Ring before answering
|
|
if [ ! -z "${iz_beforeanswer}" -a ! -z "${curext}" ] ; then
|
|
append_dialplan_context ${context} "${ext}${item}Dial(${curext},${iz_beforeanswer},${planopt})"
|
|
iz_answerfirst=yes
|
|
item="n,"
|
|
fi
|
|
# Now answer
|
|
if [ "$iz_answerfirst" == "yes" ] ; then
|
|
append_dialplan_context ${context} "${ext}${item}Answer"
|
|
item="n,"
|
|
fi
|
|
# if [ ! -z ${iz_lastcallexten} ] ; then
|
|
# enable_lastcall
|
|
# add_dialplan_lastcall extensions "${iz_lastcallexten}" "${iz_lastcall}" "${feature_lastcall_incount}"
|
|
# fi
|
|
|
|
if [ ! -z ${curext} ] ; then
|
|
if [ ! -z ${iz_menucontext} ] ; then
|
|
planopt=${planopt}rd
|
|
enable_module res_indications
|
|
# wait so the next ring connects.
|
|
append_dialplan_context ${context} "${ext}${item}Wait(1)"
|
|
append_dialplan_context ${context} "${ext}n,Set(EXITCONTEXT=${iz_menucontext})"
|
|
fi
|
|
|
|
if [ ! -z ${planopt} ] ; then
|
|
planopt=",${iz_timeout-},${planopt}"
|
|
elif [ ! -z ${iz_timeout-} ] ; then
|
|
planopt=",${iz_timeout-}"
|
|
fi
|
|
local dial="Dial(${curext}${planopt})"
|
|
|
|
append_dialplan_context ${context} "${ext}n,${dial})"
|
|
|
|
if [ ! -z ${iz_missed} ] ; then
|
|
# It went to voicemail or was hung up - consider missed
|
|
append_jumpmacro ${context} "${ext}${item}" "" "${iz_missedtype}" "${iz_missed}" "\${lcsMissed}"
|
|
fi
|
|
fi
|
|
|
|
local need_hangup=1
|
|
# Add a goto or macro at the end
|
|
if [ ! -z ${iz_target} ] ; then
|
|
case ${iz_aftertimeouttype} in
|
|
macro) append_dialplan_context ${context} "${ext}${item}Macro(${iz_target})";;
|
|
s|start) append_dialplan_context ${context} "${ext}${item}Goto(${iz_target},s,1)"
|
|
need_hangup=0;;
|
|
*) append_dialplan_context ${context} "${ext}${item}Goto(${iz_target},\${EXTEN},1)"
|
|
need_hangup=0;;
|
|
esac
|
|
fi
|
|
|
|
if [ ! -z ${iz_mailbox} ] ; then
|
|
enable_voicemail
|
|
append_dialplan_context ${context} "${ext}n,VoiceMail(${iz_mailbox})"
|
|
fi
|
|
|
|
[ "${need_hangup}" = "1" ] && append_dialplan_context ${context} "${ext}n,Hangup"
|
|
|
|
if [ ! -z ${iz_missed} ] ; then
|
|
# Check for missed call
|
|
|
|
append_jumpmacro ${context} "exten => h,1," "\$[\"\${DIALSTATUS}\" = \"CANCEL\"]" "${iz_missedtype}" "${iz_missed}" "\${lcsMissed}"
|
|
#append dialplan_context_${context} \
|
|
# "exten => h,1,MacroIf(\$[\"\${DIALSTATUS}\" = \"CANCEL\"]?lastcallstore,\${lcsMissed},${iz_lastmissed},${feature_lastcall_incount})" "${N}"
|
|
# [ ! -z ${iz_lastmissedexten} ] && \
|
|
# add_dialplan_lastcall extensions "${iz_lastmissedexten}" "${iz_lastmissed}" "${feature_lastcall_incount}"
|
|
fi
|
|
done
|
|
}
|
|
|
|
append_dialplan_extensions(){
|
|
local file=$1
|
|
# Evaluate the 'extension' dialplans
|
|
logdebug 1 "Add the 'extension' dialplans: ${dialplan_exts}"
|
|
for i in ${dialplan_exts} ; do
|
|
eval "local curext=\"\${dialplan_ext_$i}\""
|
|
add_dialplan_exten extensions $i $curext
|
|
done
|
|
}
|
|
|
|
append_include() {
|
|
append dialplan_includes "#include <$1>" "$N"
|
|
}
|
|
|
|
|
|
create_dialplanconf() {
|
|
# Add general section
|
|
logdebug 1 "Dialplan: Add general section"
|
|
local file=${DEST_DIR}/extensions.conf
|
|
get_checksum dialplan_conf $file
|
|
|
|
echo "${asteriskuci_gen}" > $file
|
|
|
|
[ -z "${dialplan_includes}" ] || (echo "${dialplan_includes}${N}" >> $file)
|
|
|
|
if [ ! -z "${dialplan_globals}" ] ; then
|
|
echo "[globals]${N}${dialplan_globals}${N}" >> $file
|
|
fi
|
|
|
|
echo "[general]" >> $file
|
|
for i in ${dialplangeneral_list} ; do
|
|
eval "local val=\"\$dialplan_$i\""
|
|
if [ ! -z "$val" ] ; then
|
|
echo "$i=$val" >> $file
|
|
fi
|
|
done
|
|
|
|
append_dialplan_dialzone "$file"
|
|
|
|
append_dialplan_dialzone_out "$file"
|
|
|
|
append_dialplan_park "$file"
|
|
|
|
append_dialplan_extensions "$file"
|
|
|
|
append_dialplan_inzone "$file"
|
|
|
|
append_dialplan_incoming "$file"
|
|
|
|
|
|
# append_dialplan_lastcall "$file"
|
|
|
|
# Add all the contexts
|
|
logdebug 1 "Dialplan: Add all the contexts"
|
|
for i in ${dialplan_contexts} ; do
|
|
echo "${N}[$i]" >> $file
|
|
[ "${i#macro-}" == "${i}" ] || i=macro__${i#macro-}
|
|
eval "local curcontext=\"\${dialplan_context_$i-}\""
|
|
echo "$curcontext">> $file
|
|
eval unset dialplan_context_$i
|
|
done
|
|
|
|
check_checksum "$dialplan_conf" "$file" || ast_dialplan_restart=1
|
|
|
|
return 0
|
|
}
|
|
|
|
handle_dialplangeneral() {
|
|
option_cb(){
|
|
if valid_dialplangeneral $1 $2 ; then
|
|
eval "dialplan_$1=\"$2\""
|
|
else
|
|
logerror "Invalid Dialplan General option: $1"
|
|
fi
|
|
}
|
|
}
|
|
|
|
|
|
handle_dialplan(){
|
|
context_name=$1
|
|
if [ -z ${context_name} ] ; then
|
|
logerror "Context name required for dialplan"
|
|
context_name=default
|
|
fi
|
|
option_cb() {
|
|
logdebug 4 "dialplan ${context_name}: '$1' '$2'"
|
|
case $1 in
|
|
include_LENGTH) ;;
|
|
include|include_ITEM*) add_dialplan_include ${context_name} $2 ;;
|
|
*)
|
|
lhs=$1
|
|
logdebug 4 "Add extension $lhs"
|
|
if [ "$(expr $lhs : [0-9][0-9]\*)" != 0 ] ; then
|
|
addtype=${2%%:*}
|
|
if [ "${addtype}" == "$2" ]; then
|
|
addparam=
|
|
else
|
|
addparam=${2#*:}
|
|
fi
|
|
case ${addtype} in
|
|
mailbox|voice)
|
|
add_dialplan_voice ${context_name} $1 $addparam ;;
|
|
meetme|conf|conference) add_dialplan_meetme ${context_name} $1 $addparam ;;
|
|
saytime|time) add_dialplan_saytime ${context_name} $1 $addparam ;;
|
|
clock) add_dialplan_talkclock ${context_name} $1 $addparam ;;
|
|
*) logerror "Unknown type '${addtype}' in dialplan ${context_name}, extension ${1}"
|
|
esac
|
|
else
|
|
logerror "Invalid option: $1 for dialplan ${context_name}"
|
|
fi
|
|
esac
|
|
}
|
|
}
|
|
|
|
handle_dialplanexten() {
|
|
check_add dialplanexten
|
|
option_cb() {
|
|
case $1 in
|
|
dialplan|extension|type|target|dialextension|voicebox|timeout|answerfirst)
|
|
eval "dial_exten_$1=\"$2\""
|
|
esac
|
|
}
|
|
}
|
|
|
|
check_add_dialplanexten() {
|
|
if [ ! -z "${dial_exten_dialplan}" -a ! -z "${dial_exten_extension}" ] ; then
|
|
|
|
local dialtarget=${dial_exten_type}/${dial_exten_dialextension+@}${dial_exten_dialextension}${dial_exten_target}
|
|
|
|
check_add_context ${dial_exten_dialplan}
|
|
add_dialplan_exten "${dial_exten_dialplan}" "${dial_exten_extension}" \
|
|
"${dialtarget}" "${dial_exten_voicebox}" "${dial_exten_timeout}" \
|
|
"${dial_exten_answerfirst}"
|
|
fi
|
|
for i in dialplan extension voicebox type target dialextension timeout answerfirst ; do
|
|
eval "unset dial_voice_$i"
|
|
done
|
|
}
|
|
|
|
handle_dialplansaytime() {
|
|
check_add dialplansaytime
|
|
option_cb() {
|
|
case $1 in
|
|
dialplan|extension|zone|format)
|
|
eval "dial_saytime_$1=\"$2\""
|
|
esac
|
|
}
|
|
}
|
|
|
|
check_add_dialplansaytime() {
|
|
logdebug 1 "Add Saytime to $1 / $2"
|
|
if [ ! -z "${dial_saytime_dialplan}" -a ! -z "${dial_saytime_extension}" ] ; then
|
|
# local ext="exten => ${dial_saytime_extension},"
|
|
[ -z "${dial_saytime_dialplan}" ] && dial_saytime_dialplan=default
|
|
|
|
add_dialplan_saytime "${dial_saytime_dialplan}" "${dial_saytime_extension}" \
|
|
"${dial_saytime_zone}" "${dial_saytime_format}"
|
|
fi
|
|
for i in dialplan extension zone format; do
|
|
eval "unset dial_saytime_$i"
|
|
done
|
|
|
|
}
|
|
|
|
handle_dialzone_match() {
|
|
eval "local isadded=\"\${dzone_${zone_name}-0}\""
|
|
if [ "${isadded}" != "1" ] ; then
|
|
eval "dzone_${zone_name}=1"
|
|
append dzones_match ${zone_name} " "
|
|
fi
|
|
append dzone_${zone_name}_match $1 ","
|
|
}
|
|
|
|
# Set up outgoing zones (match patterns)
|
|
handle_dialzone() {
|
|
zone_name=$1
|
|
logdebug 2 "Loading dialzone: $zone_name"
|
|
option_cb(){
|
|
logdebug 2 "Dialzone $1/$2"
|
|
case $1 in
|
|
uses)
|
|
local areatype=${2%[-/]*}
|
|
local areaname=${2#*[-/]}
|
|
logdebug 3 "Added: $areatype $areaname"
|
|
eval "local isadded=\"\${dzone_${areatype}_${areaname}-0}\""
|
|
if [ "${isadded}" != "1" ] ; then
|
|
eval dzone_${areatype}_${areaname}=1
|
|
append dzones_${areatype} "${areaname}" " "
|
|
fi
|
|
eval "dzone_match_use_${zone_name}=${areatype}_${areaname}"
|
|
logdebug 3 "Finished uses"
|
|
;;
|
|
match_LENGTH) ;;
|
|
match|match_ITEM*)
|
|
handle_dialzone_match "$2"
|
|
;;
|
|
international_LENGTH) ;;
|
|
international|international_ITEM*)
|
|
eval "local isadded=\"$dzone_${zone_name}\""
|
|
if [ "${isadded}" != "1" ] ; then
|
|
eval "dzone_${zone_name}=1"
|
|
append dzones_match ${zone_name} " "
|
|
fi
|
|
append dzone_${zone_name}_international $2 ","
|
|
;;
|
|
countrycode|localzone|addprefix|localprefix)
|
|
eval "dzone_${zone_name}_${1}=\"$2\""
|
|
eval "y=\${dzone_${zone_name}_${1}}"
|
|
;;
|
|
*)
|
|
logerror "Invalid Dialzone option: $1 in zone '${zone_name}'" ;;
|
|
esac
|
|
}
|
|
}
|
|
|
|
check_add_dialplangoto() {
|
|
logdebug 1 "Add Goto to $1 / $2"
|
|
if [ ! -z "${dial_goto_dialplan}" -a ! -z "${dial_goto_extension}" ] ; then
|
|
local ext="exten => ${dial_goto_extension},"
|
|
check_add_context ${dial_goto_dialplan}
|
|
append_dialplan_context ${dial_goto_dialplan} "${ext}1,Goto(${dial_goto_target})"
|
|
fi
|
|
for i in dialplan extension room ; do
|
|
eval "unset dial_goto_$i"
|
|
done
|
|
}
|
|
|
|
handle_dialplangoto(){
|
|
check_add dialplangoto
|
|
option_cb() {
|
|
case $1 in
|
|
dialplan|extension|target)
|
|
eval "dial_goto_$1=\"$2\"" ;;
|
|
*) logerror "Invalid dialplangoto option: $1"
|
|
esac
|
|
}
|
|
}
|
|
|
|
# Options for incoming calls.
|
|
|
|
valid_incoming_list="allowtransfer timeout answerfirst mailbox lastcall lastcalltype missed missedtype"
|
|
|
|
valid_incoming_option() {
|
|
is_in_list $1 ${valid_incoming_list}
|
|
return $?
|
|
}
|
|
|
|
handle_incominggeneral() {
|
|
option_cb() {
|
|
if valid_incoming_option $1 ; then
|
|
logdebug 3 "Add Incoming General option $1=$2"
|
|
eval "incoming_${1}=\"$2\""
|
|
else
|
|
logerror "Invalid incominggeneral option $1"
|
|
fi
|
|
}
|
|
}
|
|
|
|
handle_incoming() {
|
|
incoming_context=$1
|
|
incoming_list=
|
|
add_incoming_context "${incoming_context}"
|
|
|
|
option_cb() {
|
|
logdebug 1 "Incoming ${incoming_context} $1=$2"
|
|
case $1 in
|
|
lastcall|lastcalltype|missed|missedtype) eval "incoming_${incoming_context}_${1}=\"$2\"" ;;
|
|
# lastcall|lastcallexten|lastmissed|lastmissedexten)
|
|
# enable_lastcall
|
|
# eval "incoming_${incoming_context}_${1}=\"$2\""
|
|
# ;;
|
|
mailbox|allowtransfer|answerfirst|beforeanswer|timeout|menucontext|match|matchcaller|aftertimeout|aftertimeouttype)
|
|
eval "incoming_${incoming_context}_${1}=\"$2\""
|
|
;;
|
|
target|target_ITEM*)
|
|
append dialplan_incoming_${incoming_context} "$2" "&"
|
|
;;
|
|
target_COUNT) ;;
|
|
*) logerror "Invalid option $1 in incoming" ;;
|
|
esac
|
|
}
|
|
}
|
|
|
|
# vim: ts=2 sw=2 noet foldmethod=indent
|