luci/contrib/package/asterisk-xip/files/uci/sipiaxconf

526 lines
13 KiB
Text
Raw Normal View History

#!/bin/sh
# Sip / IAX extensions
# Add to internal extensions
add_extension() {
logdebug 1 "Adding $1/$2 extension to $3"
eval "local ext=\"\${dialplan_ext_$3}\""
[ -z "${ext}" ] && append dialplan_exts "$3" " "
local lower=`echo $1|tr [A-Z] [a-z]`
eval "local ext=\"\${${lower}_last_extension}\""
[ -z "${ext}" ] && 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
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
fi
}
append_dialplan_locals(){
for i in ${dialplan_locals} ; do
local extension=$i
for x in context selfmailbox mailbox displayname ; 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 => ${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},${next},VoiceMailMain(${x_mailbox})"
[ ! -z "${dialplan_voiceboxext}" ] && append_dialplan_context ${newcontext} "exten => ${dialplan_voiceboxext},${next},VoiceMailMain(${x_mailbox})"
fi
append_dialplan_context ${newcontext} "exten => ${match_all},${next},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 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}" "${x_last_displayname}"
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 last_displayname ; 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
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=
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 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="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}"
[ -z "$rhs" ] && rhs=ulaw
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 [ "${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
}
}
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) [ "$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*)
add_incoming SIP ${sip_sectionname} "$2" ;;
timeout|prefix|internationalprefix|alwaysinternational|countrycode)
eval "target_$1_SIP_${sectionname}=\"$2\""
;;
*_LENGTH) ;;
2009-01-19 21:37:03 +00:00
_*) ;;
*)
eval sip_last_$1="$2"
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}: ${opt}"
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
iax_type=peer
iax_sectionname="${1#iax_}"
append iax_sections "[${iax_sectionname}]" "$N$N"
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|incoming_LENGTH) ;;
allow|allow_ITEM*)
split_append iax_sections allow= "$2" "${N}" enable_format ;;
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|incoming_ITEM*)
add_incoming IAX ${iax_sectionname} "$2" ;;
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
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
}
# Set up options sip/iax targets for outgoing sip/iax
handle_dialtarget() {
# Dialzone target option
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_${dt_areatype}_${dt_areaname}=\"$2\""
;;
*)
logerror "Invalid target for ${dt_areatype}/${dt_areaname}: ${1}"
esac
}
}
# vim: ts=2 sw=2 noet foldmethod=indent