Generate context for adding callerid name with proper sequences.
[project/luci.git] / contrib / package / asterisk-xip / files / uci / sipiaxconf
index f3f0720..ab2e8fc 100755 (executable)
@@ -1,37 +1,14 @@
 #!/bin/sh
 # Sip / IAX extensions
 
-add_incoming_context() {
-       local context=$1
-       eval "local added=\${dialplan_incoming_${context}_added}"
-       if [ "${added}" != "1" ] ; then
-               append dialplan_extensions_incoming "${context}" " "
-               eval "dialplan_incoming_${context}_added=1"
-       fi
-
-}
-
-# Add to incoming ringing
-add_incoming() {
-       local rhs="$3"
-       
-       while [ ! -z "$rhs" ] ; do
-               cur=${rhs%%,*}
-               nvar=${rhs#*,}
-               add_incoming_context ${cur}
-               append dialplan_incoming_${cur} "$1/$2" "&" 
-               [ "$nvar" == "$rhs" ] && break
-               rhs=${nvar}
-       done
-}
-
 # Add to internal extensions
 add_extension() {
        logdebug 1 "Adding $1/$2 extension to $3"
-       (eval [ -z "\${dialplan_ext_$2}" ] )\
-               && append dialplan_exts "$3" " "
+       eval "local ext=\"\${dialplan_ext_$3}\""
+       [ -z "${ext}" ] && append dialplan_exts "$3" " "
        local lower=`echo $1|tr [A-Z] [a-z]`
-       eval "${lower}_last_extension=\"$3\""
+       eval "local ext=\"\${${lower}_last_extension}\""
+       [ -z "${ext}" ] && eval "${lower}_last_extension=\"$3\""
        append dialplan_ext_$3 $1/${2} "&"
 }
 
@@ -40,11 +17,13 @@ check_append_local() {
        logdebug 3 "added local context for ${1}"
        eval "local isadded=\"\${dialplan_add_local_${extension}-0}\""
        if [ "$isadded" != "1" ] ; then
+               logdebug 3 "Not added before - adding"
                eval "dialplan_add_local_${extension}=1"
                append dialplan_locals "$extension"
                eval  "dialplan_local_${1}_context=\"${2}\""
                eval  "dialplan_local_${1}_selfmailbox=\"${3}\""
                eval  "dialplan_local_${1}_mailbox=\"${4}\""
+               eval  "dialplan_local_${1}_displayname=\"${5}\""
                return 0
        else
                return 1
@@ -53,7 +32,7 @@ check_append_local() {
 append_dialplan_locals(){
        for i in ${dialplan_locals} ; do
                local extension=$i
-               for x in context selfmailbox mailbox ; do
+               for x in context selfmailbox mailbox displayname ; do
                        eval "x_${x}=\${dialplan_local_${i}_${x}}"
                done
                local newcontext=local_${extension}
@@ -64,12 +43,17 @@ append_dialplan_locals(){
                        #add_dialplan_goto ${newcontext} _[0-9#*+]. ${x_last_context}
                        # add_dialplan_include ${newcontext}  ${x_last_context}
 
-                       append_dialplan_context ${newcontext} "exten => _.,1,Set(CALLERID(num)=${extension})"
+                       append_dialplan_context ${newcontext} "exten => ${match_all},1,Set(CALLERID(num)=${extension})"
+                       local next=2
+                       if [ ! -z "${x_displayname}" ] ; then
+                               append_dialplan_context ${newcontext} "exten => ${match_all},2,Set(CALLERID(name)=${x_displayname})"
+                               local next=3
+                       fi
                        if [ ! -z "${x_mailbox}" ] ; then
-                               [ "${x_selfmailbox}" = "yes" ] && append_dialplan_context ${newcontext} "exten => ${extension},2,VoiceMailMain(${x_mailbox})"
-                               [ ! -z "${dialplan_voiceboxext}" ]  && append_dialplan_context ${newcontext} "exten => ${dialplan_voiceboxext},2,VoiceMailMain(${x_mailbox})"
+                               [ "${x_selfmailbox}" = "yes" ] && append_dialplan_context ${newcontext} "exten => ${extension},${next},VoiceMailMain(${x_mailbox})"
+                               [ ! -z "${dialplan_voiceboxext}" ]  && append_dialplan_context ${newcontext} "exten => ${dialplan_voiceboxext},${next},VoiceMailMain(${x_mailbox})"
                        fi
-                       append_dialplan_context ${newcontext} "exten => _.,2,Goto(${x_context},\${EXTEN},1)"
+                       append_dialplan_context ${newcontext} "exten => ${match_all},${next},Goto(${x_context},\${EXTEN},1)"
                fi
        done
 }
@@ -94,14 +78,14 @@ check_add_iaxitems() {
 
 do_check_add_items(){
 
-       for i in type last_host last_context selfmailbox last_extension last_mailbox ; do
+       for i in type last_host last_context selfmailbox last_extension last_mailbox last_displayname ; do
                eval "x_${i}=\"\${${1}_${i}-}\""
        done
 
        if [ ! -z "${x_last_context}" ] ; then
                if [ ! -z "${x_last_extension}" ] ; then
                        [ "${x_last_context}" = "-" ] && eval "x_last_context=\"\${${1}_opt_context}\""
-                       check_append_local "${x_last_extension}" "${x_last_context}" "${x_selfmailbox}" "${x_last_mailbox}"
+                       check_append_local "${x_last_extension}" "${x_last_context}" "${x_selfmailbox}" "${x_last_mailbox}" "${x_last_displayname}"
                        x_last_context=local_${x_last_extension}
                fi
                if [ "${x_last_context}" != "-" ] ; then
@@ -113,7 +97,8 @@ do_check_add_items(){
        fi
 
        for i in last_username last_fromdomain last_secret last_username \
-               sectionname last_fromuser last_context last_extension last_mailbox last_type last_host ; do
+               sectionname last_fromuser last_context last_extension last_mailbox \
+               last_type last_host last_displayname ; do
                eval unset $1_$i
        done
 
@@ -261,8 +246,9 @@ init_sipconf() {
        sip_opt_realm=asterisk
        config_get LAN_MASK lan netmask
        config_get LAN_IP lan ipaddr
-       LAN_NET=$(/bin/ipcalc.sh $LAN_IP $LAN_MASK | grep NETWORK | cut -d= -f2)
-       sip_opt_localnet=$LAN_NET/$LAN_MASK
+       local LAN_NET=$(/bin/ipcalc.sh $LAN_IP $LAN_MASK | grep NETWORK | cut -d= -f2)
+       sip_opt_localnet_def=$LAN_NET/$LAN_MASK
+       sip_opt_localip=${LAN_IP}
 
        # default to ulaw only
        sip_opt_allow=
@@ -274,7 +260,7 @@ init_sipconf() {
 }
 
 sip_list="port bindaddr context maxexpirey defaultexpirey notifymimetype \
-rtptimeout rtpholdtimeout realm domain localnet externip"
+rtptimeout rtpholdtimeout realm externip"
 
 create_sipconf() {
 
@@ -287,18 +273,20 @@ create_sipconf() {
                rm -f $file
                isempty=2
        else
-               [ -z "${sip_opt_domain}" ]  && sip_opt_domain=${sip_opt_realm}
+               [ -z "${sip_opt_domain}" ]  && sip_opt_domain="domain=${sip_opt_realm}"
 
                echo "${asteriskuci_gen}[general]" > $file
+               echo "${sip_opt_domain}" >> "$file"
+               echo "domain=${sip_opt_localip}" >> "$file"
                for i in ${sip_list} ; do
                        eval value=\$sip_opt_$i
                        [ ! -z "$value" ] && ( echo "$i=$value" >> $file )
                done
+               [ -z "${sip_opt_localnet}" ] && sip_opt_localnet="localnet=${sip_opt_localnet_def}"
+               echo "${sip_opt_localnet}" >> "${file}"
                echo "disallow=all" >> $file
                local rhs="${sip_opt_allow}"
-               if [ -z "$rhs" ] ; then
-                       rhs=ulaw
-               fi
+               [ -z "$rhs" ] && rhs=ulaw
                while [ ! -z "$rhs" ] ; do
                        cur=${rhs%%,*}
                        nvar=${rhs#*,}
@@ -318,23 +306,23 @@ create_sipconf() {
 
 handle_sipgeneral() {
        option_cb(){
-               if valid_sipiax_option globalsip $1 $2 ; then
-                       case "$1" in
-                               host)
-                                       if  [ -z "$2" ] ; then
-                                               sip_opt_host=dynamic
-                                       else
-                                               sip_opt_host="$2"
-                                       fi ;;
-                               allow_LENGTH) ;;
-                               allow|allow_ITEM*)
-                                       append sip_opt_allow "$2" "," ;;
-                               *) eval "sip_opt_$1=\"\$2\"" ;;
-                       esac
-               elif valid_rtp_option $1 $2 ; then
-                       eval "rtp_opt_$1=\"\$2\""
-               else
-                       logerror "Invalid SIP global option: $1"
+               if [ "${1%_LENGTH}" = "${1}" ] ; then
+                       local opt=${1%_ITEM*}
+                       logdebug 4 "SipGeneral option ${opt} $2"
+                       if valid_sipiax_option globalsip ${opt} "$2" ; then
+                               case "${opt}" in
+                                       host) sip_opt_host="$2"
+                                               [ -z "${sip_opt_host}" ] && sip_opt_host=dynamic ;;
+                                       allow)    append sip_opt_allow "$2" "," ;;
+                                       domain)   split_append sip_opt_domain domain= "$2" "${N}"  ;;
+                                       localnet) split_append sip_opt_localnet localnet= "$2" "${N}" ;;
+                                       *) eval "sip_opt_$1=\"\$2\"" ;;
+                               esac
+                       elif valid_rtp_option $1 "$2" ; then
+                               eval "rtp_opt_$1=\"\$2\""
+                       else
+                               logerror "Invalid SIP global option: $1"
+                       fi
                fi
        }
 }
@@ -355,13 +343,11 @@ handle_sip() {
                        type) sip_type=$2
                                append sip_sections "$1=$2" "$N"
                                ;;
-                       register)
-                               if [ "$2" == "yes" ]; then
-                                       sip_doregister=1
-                               fi ;;
-                       registerextension) eval sip_last_$1="$2";;
+                       register) [ "$2" == "yes" ] && sip_doregister=1 ;;
+                       registerextension|displayname) eval sip_last_$1="$2";;
                        allow|allow_ITEM*) split_append sip_sections allow= "$2" "${N}" enable_format ;;
                        extension|extension_ITEM*)    add_extension SIP ${sip_sectionname} "$2" ;;
+
                        context)      sip_last_context="$2" ;;
                        selfmailbox)  sip_selfmailbox="$2" ;;
                        incoming|incoming_ITEM*)
@@ -369,13 +355,14 @@ handle_sip() {
                        timeout|prefix|internationalprefix|alwaysinternational|countrycode)
                                eval "target_$1_SIP_${sectionname}=\"$2\""
                        ;;
-                       allow_LENGTH|incoming_LENGTH|extension_LENGTH) ;;
+                       *_LENGTH) ;;
                        *)
                                eval sip_last_$1="$2"
-                               if valid_sipiax_option ${sip_type}sip $1 $2 ; then
-                                       append sip_sections "$1=$2" "$N"
+                               local opt=${1%_ITEM*}
+                               if valid_sipiax_option ${sip_type}sip ${opt} $2 ; then
+                                       append sip_sections "${opt}=$2" "$N"
                                else
-                                       logerror "Invalid SIP option for ${sip_type}: $1"
+                                       logerror "Invalid SIP option for ${sip_type}: ${opt}"
                                fi
                esac
        }
@@ -464,9 +451,9 @@ handle_iaxgeneral() {
 
 handle_iax() {
        check_add iaxitems
-       append iax_sections "[$1]" "$N$N"
        iax_type=peer
        iax_sectionname="${1#iax_}"
+       append iax_sections "[${iax_sectionname}]" "$N$N"
        iax_last_context=-
        iax_selfmailbox=no
        enable_module chan_iax2
@@ -475,21 +462,18 @@ handle_iax() {
                        type)
                                iax_type=$2
                                append iax_sections "type=$2" "$N" ;;
-                       allow_LENGTH) ;;
+                       allow_LENGTH|incoming_LENGTH) ;;
                        allow|allow_ITEM*)
                                split_append iax_sections allow= "$2" "${N}" enable_format ;;
-                       extension)
-                               logdebug 1 "Adding IAX extension $2 for $iax_sectionname"
-                               eval [ -z "\${dialplan_ext_$2}" ] && dialplan_exts="${dialplan_exts} $2"
-                               iax_last_extension="$2"
-                               append dialplan_ext_$2 "IAX2/${iax_sectionname}" "&" ;;
-                       extension)    add_extension IAX ${iax_sectionname} "$2" ;;
+                       extension_LENGTH) ;;
+                       extension|extension_ITEM*)    add_extension IAX ${iax_sectionname} "$2" ;;
+                       displayname) eval iax_last_$1="$2";;
                        context)
                                eval iax_last_context="$2" ;;
                        selfmailbox)
                                eval iax_selfmailbox="$2" ;;
-                       incoming)
-                               add_incoming IAX ${iax_sectionname} "$3" ;;
+                       incoming|incoming_ITEM*)
+                               add_incoming IAX ${iax_sectionname} "$2" ;;
                        timeout|prefix|internationalprefix|alwaysinternational|countrycode)
                                eval "target_$1_IAX_${sectionname}=\"$2\"" ;;
                        *)
@@ -511,33 +495,28 @@ unload_iax() astcmd "unload chan_iax2.so"
 
 handle_target() {
        # Target name
-       targettype=${1%[-_]*}
-       if [ ${targettype} == $1 ] ; then
-               logerror "No target type specified (SIP-$1 IAX-$1)"
-               return 1
+       if split_targettype targettype targetname "${1}" ; then
+               logdebug 4 "Handle target ${targettype}/${targetname} - ${1}"
+               handle_dialtarget "${targettype}" "${targetname}"
+       else
+               logerror "No target type specified for target $1"
        fi
-       targetname=${1#*[-_]}
-
-       case $targettype in
-               [Ss][Ii][Pp])  handle_dialtarget SIP $targetname ;;
-               [Ii][Aa][Xx])  handle_dialtarget IAX $targetname ;;
-               *) logerror "Invalid target type specified: $targettype"
-       esac
 }
 
 # Set up options sip/iax targets for outgoing sip/iax
 handle_dialtarget() {
        # Dialzone target option
-       areatype=$1
-       areaname=$2
-       logdebug 1 "Dialzone Target for ${areatype}/${areaname}"
+       dt_areatype="$1"
+       dt_areaname="$2"
+       logdebug 1 "Dialzone Target for ${dt_areatype}/${dt_areaname}"
        option_cb(){
+               logdebug 3 "Option $1='$2' for dialzone target"
                case $1 in
                        timeout|prefix|internationalprefix|alwaysinternational|countrycode)
-                               eval target_$1_${areatype}_${areaname}=$2 
+                               eval "target_$1_${dt_areatype}_${dt_areaname}=\"$2\""
                        ;;
                        *) 
-                               logerror "Invalid target for $areatype/$areaname: ${1}"
+                               logerror "Invalid target for ${dt_areatype}/${dt_areaname}: ${1}"
                esac
        }
 }