summaryrefslogtreecommitdiffhomepage
path: root/contrib/package/asterisk-xip/files/uci/sipiaxconf
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/package/asterisk-xip/files/uci/sipiaxconf')
-rwxr-xr-xcontrib/package/asterisk-xip/files/uci/sipiaxconf545
1 files changed, 545 insertions, 0 deletions
diff --git a/contrib/package/asterisk-xip/files/uci/sipiaxconf b/contrib/package/asterisk-xip/files/uci/sipiaxconf
new file mode 100755
index 000000000..f3f072020
--- /dev/null
+++ b/contrib/package/asterisk-xip/files/uci/sipiaxconf
@@ -0,0 +1,545 @@
+#!/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" " "
+ local lower=`echo $1|tr [A-Z] [a-z]`
+ eval "${lower}_last_extension=\"$3\""
+ append dialplan_ext_$3 $1/${2} "&"
+}
+
+check_append_local() {
+ local extension="${1}"
+ logdebug 3 "added local context for ${1}"
+ eval "local isadded=\"\${dialplan_add_local_${extension}-0}\""
+ if [ "$isadded" != "1" ] ; then
+ 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}\""
+ return 0
+ else
+ return 1
+ fi
+}
+append_dialplan_locals(){
+ for i in ${dialplan_locals} ; do
+ local extension=$i
+ for x in context selfmailbox mailbox ; do
+ eval "x_${x}=\${dialplan_local_${i}_${x}}"
+ done
+ local newcontext=local_${extension}
+
+ if check_add_context ${newcontext} ; then
+ # add_dialplan_voice ${newcontext} ${x_last_extension} ${x_last_mailbox}
+ # Make sure as much is matched as possible
+ #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})"
+ 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})"
+ fi
+ append_dialplan_context ${newcontext} "exten => _.,2,Goto(${x_context},\${EXTEN},1)"
+ fi
+ done
+}
+
+# Sip
+
+check_add_sipitems() {
+ if [ "${sip_doregister}" == "1" ] ; then
+ local line="register => ${sip_last_username}@${sip_last_fromdomain}:${sip_last_secret}:${sip_last_username}@${sip_sectionname}"
+ case ${sip_last_registerextension} in
+ -) line="$line/${sip_last_username}" ;;
+ .*) line="$line/${sip_last_registerextension}" ;;
+ esac
+ append sip_register "$line" "$N"
+ sip_doregister=0
+ fi
+ do_check_add_items sip
+}
+check_add_iaxitems() {
+ do_check_add_items iax
+}
+
+do_check_add_items(){
+
+ for i in type last_host last_context selfmailbox last_extension last_mailbox ; 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}"
+ x_last_context=local_${x_last_extension}
+ fi
+ if [ "${x_last_context}" != "-" ] ; then
+ append ${1}_sections "context=${x_last_context}" "$N"
+ fi
+ if [ "${x_type}" != "user" -a -z "${x_last_host}" ] ; then
+ append ${1}_sections "host=dynamic" "$N"
+ fi
+ 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
+ eval unset $1_$i
+ done
+
+ eval ${1}_selfmailbox=no
+ eval ${1}_last_registerextension=-
+}
+
+reload_sip() {
+ astcmd "sip reload"
+ return 1 # reboot
+}
+unload_sip() astcmd "unload chan_sip.so"
+
+rtp_option_list="rtpstart rtpend rtpdtmftimeout rtcpinterval rtpchecksums"
+# Validate RTP options
+valid_rtp_option() {
+ is_in_list $1 ${rtp_option_list}
+}
+
+# Validate sip options, depending on context.
+valid_sipiax_option() {
+ local use_glob=1
+ local use_glob_iax=1
+ local use_glob_sip=1
+ local use_user=1
+ local use_peer=1
+ local use_user_sip=1
+ local use_user_iax=1
+ local use_peer_sip=1
+ local use_peer_iax=1
+ case "$1" in
+ globalsip)
+ use_glob_sip=0
+ use_glob=0 ;;
+ usersip)
+ use_glob_sip=0
+ use_glob=0
+ use_user=0 ;;
+ peersip|friendsip)
+ use_glob_sip=0
+ use_glob=0
+ use_user=0
+ use_peer=0
+ use_user_sip=0
+ use_peer_sip=0 ;;
+ globaliax)
+ use_glob_iax=0
+ use_glob=0 ;;
+ useriax)
+ use_glob_iax=0
+ use_glob=0
+ use_user=0 ;;
+ peeriax|friendiax)
+ use_glob_iax=0
+ use_glob=0
+ use_user=0
+ use_peer=0
+ use_user_iax=0
+ use_peer_iax=0 ;;
+ esac
+
+ case "$2" in
+ writeprotect|static) return ${use_glob_iax} ;;
+# Integer
+ port|\
+ maxexpirey|\
+ rtptimeout|\
+ rtpholdtimeout|\
+ defaultexpirey|\
+ registertimeout|\
+ registerattempts|\
+ call-limit) return ${use_glob_sip} ;;
+# ip addr
+ bindaddr|\
+ externip) return ${use_glob_sip} ;;
+# net/mask
+ localnet) return ${use_glob_sip} ;;
+ permit|\
+ deny) return ${use_user_sip} ;;
+# Domain name
+ realm|\
+ domain) return ${use_glob_sip} ;;
+# valid context
+ context) return ${use_glob} ;;
+# Mime type
+ notifymimetype) return ${use_glob_sip} ;;
+# Yes/No
+ canreinvite) return ${use_glob} ;;
+ nat|allowoverlap|allowsubscribe|allowtransfer|\
+ videosupport) return ${use_glob_sip} ;;
+ pedantic|\
+ trustrpid|\
+ promiscredir|\
+ useclientcode) return ${use_user_sip} ;;
+# Enums
+ dtmfmode) return ${use_glob_sip} ;;
+ type) return ${use_user} ;;
+ insecure|callingpres|\
+ progressinband) return ${use_user_sip} ;;
+# List
+ allow|\
+ disallow) return ${use_glob_sip} ;;
+# Register string
+ register) return ${use_glob_sip} ;;
+# String
+ username|secret|md5secret|host|\
+ mailbox) return ${use_user} ;;
+ auth) return ${use_user_iax} ;;
+ callgroup|pickupgroup|language|accountcode|\
+ setvar|callerid|amaflags|subscribecontext|\
+ maxcallbitrate|rfc2833compensate|\
+ mailbox) return ${use_user_sip};;
+ template|fromdomain|regexten|fromuser|\
+ qualify|defaultip|sendrpid|\
+ outboundproxy) return ${use_peer_sip};;
+ extension) return 0;;
+ *) return 1;;
+ esac
+}
+
+ast_add_conf sip
+init_sipconf() {
+ ast_add_reload sip
+ ast_enable_type sipgeneral
+ ast_enable_type sip
+ ast_enable_type target
+
+ sip_opt_port=5060
+ sip_opt_bindaddr=0.0.0.0
+ sip_opt_context=default
+ sip_opt_maxexpirey=3600
+ sip_opt_defaultexpirey=3600
+ sip_opt_notifymimetype=text/plain
+ sip_opt_rtptimeout=60
+ sip_opt_rtpholdtimeout=300
+ config_get WAN_IP wan ipaddr
+ # TODO check why the above does not work all the time
+ if [ -z "${WAN_IP}" ] ; then
+ config_get WAN_IF wan ifname
+ WAN_IP=$(ifconfig ${WAN_IF} | grep "inet addr:" | sed 's/^.*inet addr:\([^ ]*\) .*$/\1/')
+ fi
+
+ sip_opt_externip=${WAN_IP}
+
+ 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
+
+ # default to ulaw only
+ sip_opt_allow=
+ sip_opt_registertimeout=20
+ sip_opt_registerattempts=10
+ sip_opt_canreinvite=no
+
+ sip_sections=
+}
+
+sip_list="port bindaddr context maxexpirey defaultexpirey notifymimetype \
+rtptimeout rtpholdtimeout realm domain localnet externip"
+
+create_sipconf() {
+
+ append_dialplan_locals
+
+ file=${DEST_DIR}/sip.conf
+ get_checksum sip_conf $file
+ local isempty=1
+ if [ -z "${sip_sections}" ] ; then
+ rm -f $file
+ isempty=2
+ else
+ [ -z "${sip_opt_domain}" ] && sip_opt_domain=${sip_opt_realm}
+
+ echo "${asteriskuci_gen}[general]" > $file
+ for i in ${sip_list} ; do
+ eval value=\$sip_opt_$i
+ [ ! -z "$value" ] && ( echo "$i=$value" >> $file )
+ done
+ echo "disallow=all" >> $file
+ local rhs="${sip_opt_allow}"
+ if [ -z "$rhs" ] ; then
+ rhs=ulaw
+ fi
+ while [ ! -z "$rhs" ] ; do
+ cur=${rhs%%,*}
+ nvar=${rhs#*,}
+ enable_format ${cur}
+ echo "allow=${cur}" >> $file
+ [ "$nvar" == "$rhs" ] && break
+ rhs=${nvar}
+ done
+
+ echo "${N}${sip_register}${N}${N}${sip_sections}" >> $file
+ unset sip_register
+ unset sip_sections
+ fi
+ check_checksum "$sip_conf" "$file" || ast_sip_restart=$isempty
+}
+
+
+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"
+ fi
+ }
+}
+
+handle_sip() {
+ check_add sipitems
+ append sip_sections [$1] "$N$N"
+ enable_module chan_sip
+ sip_sectionname=${1#sip_}
+ sip_type=peer
+ sip_doregister=0
+ sip_last_context=-
+ sip_last_doregister=-
+ sip_selfmailbox=no
+ option_cb() {
+ logdebug 3 "SIP/${sip_sectionname}: '$1' '$2'"
+ case $1 in
+ 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";;
+ 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*)
+ add_incoming SIP ${sip_sectionname} "$2" ;;
+ timeout|prefix|internationalprefix|alwaysinternational|countrycode)
+ eval "target_$1_SIP_${sectionname}=\"$2\""
+ ;;
+ allow_LENGTH|incoming_LENGTH|extension_LENGTH) ;;
+ *)
+ eval sip_last_$1="$2"
+ if valid_sipiax_option ${sip_type}sip $1 $2 ; then
+ append sip_sections "$1=$2" "$N"
+ else
+ logerror "Invalid SIP option for ${sip_type}: $1"
+ fi
+ esac
+ }
+}
+
+# rtp.conf
+
+ast_add_conf rtp
+init_rtpconf() {
+ ast_add_reload rtp
+ rtp_opt_rtpstart=5000
+ rtp_opt_rtpend=31000
+ rtp_opt_rtpchecksums=
+ rtp_opt_rtpdtmftimeout=
+ rtp_opt_rtcpinterval=5000
+}
+
+create_rtpconf() {
+ file=${DEST_DIR}/rtp.conf
+ get_checksum rtp_conf $file
+ local isempty=1
+ if module_enabled chan_sip ; then
+ echo "${asteriskuci_gen}[general]" > $file
+ for i in $rtp_option_list ; do
+ eval "local val=\"\$rtp_opt_$i\""
+ if [ ! -z "$val" ] ; then
+ lhs=$i
+ case "$i" in
+ rtpdtmftimeout) lhs=dtmftimeout
+ esac
+ echo "$lhs=$val" >> $file
+ fi
+ done
+ else
+ rm -f $file
+ isempty=2
+ fi
+
+ check_checksum "$rtp_conf" "$file" || ast_rtp_restart=$isempty
+}
+reload_rtp() astcmd "rtp reload"
+unload_rtp() astcmd "unload rtp"
+
+
+# Iax
+
+ast_add_conf iax
+
+init_iaxconf() {
+ ast_add_reload iax
+ ast_enable_type iaxgeneral
+ ast_enable_type iax
+
+ return 0
+}
+
+create_iaxconf() {
+ local file=$DEST_DIR/iax.conf
+ get_checksum iax_conf $file
+ local isempty=1
+ if [ -z "${iax_sections}" ] ; then
+ rm -f $file
+ isempty=2
+ else
+ echo "${asteriskuci_gen}${iax_general}$N$N${iax_sections}" > $file
+ fi
+ check_checksum "$iax_conf" "$file" || ast_iax_restart=${isempty}
+}
+
+handle_iaxgeneral() {
+ iax_general="[general]"
+ option_cb() {
+ case $1 in
+ allow_LENGTH) ;;
+ allow|allow_ITEM*) split_append iax_general allow= "$2" "${N}" enable_format ;;
+ *)
+ if valid_sipiax_option globaliax $1 $2 ; then
+ eval "iax_opt_$1=\"$2\""
+ append iax_general "$1=$2" "$N"
+ else
+ logerror "Invalid IAX global option: $1"
+ fi ;;
+ esac
+ }
+}
+
+handle_iax() {
+ check_add iaxitems
+ append iax_sections "[$1]" "$N$N"
+ iax_type=peer
+ iax_sectionname="${1#iax_}"
+ iax_last_context=-
+ iax_selfmailbox=no
+ enable_module chan_iax2
+ option_cb() {
+ case $1 in
+ type)
+ iax_type=$2
+ append iax_sections "type=$2" "$N" ;;
+ allow_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" ;;
+ context)
+ eval iax_last_context="$2" ;;
+ selfmailbox)
+ eval iax_selfmailbox="$2" ;;
+ incoming)
+ add_incoming IAX ${iax_sectionname} "$3" ;;
+ timeout|prefix|internationalprefix|alwaysinternational|countrycode)
+ eval "target_$1_IAX_${sectionname}=\"$2\"" ;;
+ *)
+ eval iax_last_$1="$2"
+ if valid_sipiax_option ${iax_type}iax $1 $2 ; then
+ append iax_sections "$1=$2" "$N"
+ else
+ logerror "Invalid IAX option for ${iax_type}: $1"
+ fi
+ esac
+ }
+}
+
+reload_iax() {
+ astcmd "iax2 reload"
+ return 1
+}
+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
+ 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}"
+ option_cb(){
+ case $1 in
+ timeout|prefix|internationalprefix|alwaysinternational|countrycode)
+ eval target_$1_${areatype}_${areaname}=$2
+ ;;
+ *)
+ logerror "Invalid target for $areatype/$areaname: ${1}"
+ esac
+ }
+}
+
+# vim: ts=2 sw=2 noet foldmethod=indent