4 # Add to internal extensions
6 logdebug 1 "Adding $1/$2 extension to $3"
7 eval "local ext=\"\${dialplan_ext_$3}\""
8 [ -z "${ext}" ] && append dialplan_exts "$3" " "
9 local lower=`echo $1|tr [A-Z] [a-z]`
10 eval "local ext=\"\${${lower}_last_extension}\""
11 [ -z "${ext}" ] && eval "${lower}_last_extension=\"$3\""
12 append dialplan_ext_$3 $1/${2} "&"
15 check_append_local() {
16 local extension="${1}"
17 logdebug 3 "added local context for ${1}"
18 eval "local isadded=\"\${dialplan_add_local_${extension}-0}\""
19 if [ "$isadded" != "1" ] ; then
20 logdebug 3 "Not added before - adding"
21 eval "dialplan_add_local_${extension}=1"
22 append dialplan_locals "$extension"
23 eval "dialplan_local_${1}_context=\"${2}\""
24 eval "dialplan_local_${1}_selfmailbox=\"${3}\""
25 eval "dialplan_local_${1}_mailbox=\"${4}\""
26 eval "dialplan_local_${1}_displayname=\"${5}\""
32 append_dialplan_locals(){
33 for i in ${dialplan_locals} ; do
35 for x in context selfmailbox mailbox displayname ; do
36 eval "x_${x}=\${dialplan_local_${i}_${x}}"
38 local newcontext=local_${extension}
40 if check_add_context ${newcontext} ; then
41 # add_dialplan_voice ${newcontext} ${x_last_extension} ${x_last_mailbox}
42 # Make sure as much is matched as possible
43 #add_dialplan_goto ${newcontext} _[0-9#*+]. ${x_last_context}
44 # add_dialplan_include ${newcontext} ${x_last_context}
46 append_dialplan_context ${newcontext} "exten => ${match_all},1,Set(CALLERID(num)=${extension})"
48 if [ ! -z "${x_displayname}" ] ; then
49 append_dialplan_context ${newcontext} "exten => ${match_all},2,Set(CALLERID(name)=${x_displayname})"
52 if [ ! -z "${x_mailbox}" ] ; then
53 [ "${x_selfmailbox}" = "yes" ] && append_dialplan_context ${newcontext} "exten => ${extension},${next},VoiceMailMain(${x_mailbox})"
54 [ ! -z "${dialplan_voiceboxext}" ] && append_dialplan_context ${newcontext} "exten => ${dialplan_voiceboxext},${next},VoiceMailMain(${x_mailbox})"
56 append_dialplan_context ${newcontext} "exten => ${match_all},${next},Goto(${x_context},\${EXTEN},1)"
63 check_add_sipitems() {
64 if [ "${sip_doregister}" == "1" ] ; then
65 local line="register => ${sip_last_username}@${sip_last_fromdomain}:${sip_last_secret}:${sip_last_username}@${sip_sectionname}"
66 case ${sip_last_registerextension} in
67 -) line="$line/${sip_last_username}" ;;
68 .*) line="$line/${sip_last_registerextension}" ;;
70 append sip_register "$line" "$N"
73 do_check_add_items sip
75 check_add_iaxitems() {
76 do_check_add_items iax
81 for i in type last_host last_context selfmailbox last_extension last_mailbox last_displayname ; do
82 eval "x_${i}=\"\${${1}_${i}-}\""
85 if [ ! -z "${x_last_context}" ] ; then
86 if [ ! -z "${x_last_extension}" ] ; then
87 [ "${x_last_context}" = "-" ] && eval "x_last_context=\"\${${1}_opt_context}\""
88 check_append_local "${x_last_extension}" "${x_last_context}" "${x_selfmailbox}" "${x_last_mailbox}" "${x_last_displayname}"
89 x_last_context=local_${x_last_extension}
91 if [ "${x_last_context}" != "-" ] ; then
92 append ${1}_sections "context=${x_last_context}" "$N"
94 if [ "${x_type}" != "user" -a -z "${x_last_host}" ] ; then
95 append ${1}_sections "host=dynamic" "$N"
99 for i in last_username last_fromdomain last_secret last_username \
100 sectionname last_fromuser last_context last_extension last_mailbox \
101 last_type last_host last_displayname ; do
105 eval ${1}_selfmailbox=no
106 eval ${1}_last_registerextension=-
113 unload_sip() astcmd "unload chan_sip.so"
115 rtp_option_list="rtpstart rtpend rtpdtmftimeout rtcpinterval rtpchecksums"
116 # Validate RTP options
118 is_in_list $1 ${rtp_option_list}
121 # Validate sip options, depending on context.
122 valid_sipiax_option() {
164 writeprotect|static) return ${use_glob_iax} ;;
173 call-limit) return ${use_glob_sip} ;;
176 externip) return ${use_glob_sip} ;;
178 localnet) return ${use_glob_sip} ;;
180 deny) return ${use_user_sip} ;;
183 domain) return ${use_glob_sip} ;;
185 context) return ${use_glob} ;;
187 notifymimetype) return ${use_glob_sip} ;;
189 canreinvite) return ${use_glob} ;;
190 nat|allowoverlap|allowsubscribe|allowtransfer|\
191 videosupport) return ${use_glob_sip} ;;
195 useclientcode) return ${use_user_sip} ;;
197 dtmfmode) return ${use_glob_sip} ;;
198 type) return ${use_user} ;;
199 insecure|callingpres|\
200 progressinband) return ${use_user_sip} ;;
203 disallow) return ${use_glob_sip} ;;
205 register) return ${use_glob_sip} ;;
207 username|secret|md5secret|host|\
208 mailbox) return ${use_user} ;;
209 auth) return ${use_user_iax} ;;
210 callgroup|pickupgroup|language|accountcode|\
211 setvar|callerid|amaflags|subscribecontext|\
212 maxcallbitrate|rfc2833compensate|\
213 mailbox) return ${use_user_sip};;
214 template|fromdomain|regexten|fromuser|\
215 qualify|defaultip|sendrpid|\
216 outboundproxy) return ${use_peer_sip};;
217 extension) return 0;;
225 ast_enable_type sipgeneral
227 ast_enable_type target
230 sip_opt_bindaddr=0.0.0.0
231 sip_opt_context=default
232 sip_opt_maxexpirey=3600
233 sip_opt_defaultexpirey=3600
234 sip_opt_notifymimetype=text/plain
235 sip_opt_rtptimeout=60
236 sip_opt_rtpholdtimeout=300
237 config_get WAN_IP wan ipaddr
238 # TODO check why the above does not work all the time
239 if [ -z "${WAN_IP}" ] ; then
240 config_get WAN_IF wan ifname
241 WAN_IP=$(ifconfig ${WAN_IF} | grep "inet addr:" | sed 's/^.*inet addr:\([^ ]*\) .*$/\1/')
244 sip_opt_externip=${WAN_IP}
246 sip_opt_realm=asterisk
247 config_get LAN_MASK lan netmask
248 config_get LAN_IP lan ipaddr
249 local LAN_NET=$(/bin/ipcalc.sh $LAN_IP $LAN_MASK | grep NETWORK | cut -d= -f2)
250 sip_opt_localnet_def=$LAN_NET/$LAN_MASK
251 sip_opt_localip=${LAN_IP}
253 # default to ulaw only
255 sip_opt_registertimeout=20
256 sip_opt_registerattempts=10
257 sip_opt_canreinvite=no
262 sip_list="port bindaddr context maxexpirey defaultexpirey notifymimetype \
263 rtptimeout rtpholdtimeout realm externip"
267 append_dialplan_locals
269 file=${DEST_DIR}/sip.conf
270 get_checksum sip_conf $file
272 if [ -z "${sip_sections}" ] ; then
276 [ -z "${sip_opt_domain}" ] && sip_opt_domain="domain=${sip_opt_realm}"
278 echo "${asteriskuci_gen}[general]" > $file
279 echo "${sip_opt_domain}" >> "$file"
280 echo "domain=${sip_opt_localip}" >> "$file"
281 for i in ${sip_list} ; do
282 eval value=\$sip_opt_$i
283 [ ! -z "$value" ] && ( echo "$i=$value" >> $file )
285 [ -z "${sip_opt_localnet}" ] && sip_opt_localnet="localnet=${sip_opt_localnet_def}"
286 echo "${sip_opt_localnet}" >> "${file}"
287 echo "disallow=all" >> $file
288 local rhs="${sip_opt_allow}"
289 [ -z "$rhs" ] && rhs=ulaw
290 while [ ! -z "$rhs" ] ; do
294 echo "allow=${cur}" >> $file
295 [ "$nvar" == "$rhs" ] && break
299 echo "${N}${sip_register}${N}${N}${sip_sections}" >> $file
303 check_checksum "$sip_conf" "$file" || ast_sip_restart=$isempty
307 handle_sipgeneral() {
309 if [ "${1%_LENGTH}" = "${1}" ] ; then
310 local opt=${1%_ITEM*}
311 logdebug 4 "SipGeneral option ${opt} $2"
312 if valid_sipiax_option globalsip ${opt} "$2" ; then
314 host) sip_opt_host="$2"
315 [ -z "${sip_opt_host}" ] && sip_opt_host=dynamic ;;
316 allow) append sip_opt_allow "$2" "," ;;
317 domain) split_append sip_opt_domain domain= "$2" "${N}" ;;
318 localnet) split_append sip_opt_localnet localnet= "$2" "${N}" ;;
319 *) eval "sip_opt_$1=\"\$2\"" ;;
321 elif valid_rtp_option $1 "$2" ; then
322 eval "rtp_opt_$1=\"\$2\""
324 logerror "Invalid SIP global option: $1"
332 append sip_sections [$1] "$N$N"
333 enable_module chan_sip
334 sip_sectionname=${1#sip_}
338 sip_last_doregister=-
341 logdebug 3 "SIP/${sip_sectionname}: '$1' '$2'"
344 append sip_sections "$1=$2" "$N"
346 register) [ "$2" == "yes" ] && sip_doregister=1 ;;
347 registerextension|displayname) eval sip_last_$1="$2";;
348 allow|allow_ITEM*) split_append sip_sections allow= "$2" "${N}" enable_format ;;
349 extension|extension_ITEM*) add_extension SIP ${sip_sectionname} "$2" ;;
351 context) sip_last_context="$2" ;;
352 selfmailbox) sip_selfmailbox="$2" ;;
353 incoming|incoming_ITEM*)
354 add_incoming SIP ${sip_sectionname} "$2" ;;
355 timeout|prefix|internationalprefix|alwaysinternational|countrycode)
356 eval "target_$1_SIP_${sectionname}=\"$2\""
360 eval sip_last_$1="$2"
361 local opt=${1%_ITEM*}
362 if valid_sipiax_option ${sip_type}sip ${opt} $2 ; then
363 append sip_sections "${opt}=$2" "$N"
365 logerror "Invalid SIP option for ${sip_type}: ${opt}"
376 rtp_opt_rtpstart=5000
378 rtp_opt_rtpchecksums=
379 rtp_opt_rtpdtmftimeout=
380 rtp_opt_rtcpinterval=5000
384 file=${DEST_DIR}/rtp.conf
385 get_checksum rtp_conf $file
387 if module_enabled chan_sip ; then
388 echo "${asteriskuci_gen}[general]" > $file
389 for i in $rtp_option_list ; do
390 eval "local val=\"\$rtp_opt_$i\""
391 if [ ! -z "$val" ] ; then
394 rtpdtmftimeout) lhs=dtmftimeout
396 echo "$lhs=$val" >> $file
404 check_checksum "$rtp_conf" "$file" || ast_rtp_restart=$isempty
406 reload_rtp() astcmd "rtp reload"
407 unload_rtp() astcmd "unload rtp"
416 ast_enable_type iaxgeneral
423 local file=$DEST_DIR/iax.conf
424 get_checksum iax_conf $file
426 if [ -z "${iax_sections}" ] ; then
430 echo "${asteriskuci_gen}${iax_general}$N$N${iax_sections}" > $file
432 check_checksum "$iax_conf" "$file" || ast_iax_restart=${isempty}
435 handle_iaxgeneral() {
436 iax_general="[general]"
440 allow|allow_ITEM*) split_append iax_general allow= "$2" "${N}" enable_format ;;
442 if valid_sipiax_option globaliax $1 $2 ; then
443 eval "iax_opt_$1=\"$2\""
444 append iax_general "$1=$2" "$N"
446 logerror "Invalid IAX global option: $1"
455 iax_sectionname="${1#iax_}"
456 append iax_sections "[${iax_sectionname}]" "$N$N"
459 enable_module chan_iax2
464 append iax_sections "type=$2" "$N" ;;
465 allow_LENGTH|incoming_LENGTH) ;;
467 split_append iax_sections allow= "$2" "${N}" enable_format ;;
469 extension|extension_ITEM*) add_extension IAX ${iax_sectionname} "$2" ;;
470 displayname) eval iax_last_$1="$2";;
472 eval iax_last_context="$2" ;;
474 eval iax_selfmailbox="$2" ;;
475 incoming|incoming_ITEM*)
476 add_incoming IAX ${iax_sectionname} "$2" ;;
477 timeout|prefix|internationalprefix|alwaysinternational|countrycode)
478 eval "target_$1_IAX_${sectionname}=\"$2\"" ;;
480 eval iax_last_$1="$2"
481 if valid_sipiax_option ${iax_type}iax $1 $2 ; then
482 append iax_sections "$1=$2" "$N"
484 logerror "Invalid IAX option for ${iax_type}: $1"
494 unload_iax() astcmd "unload chan_iax2.so"
498 if split_targettype targettype targetname "${1}" ; then
499 logdebug 4 "Handle target ${targettype}/${targetname} - ${1}"
500 handle_dialtarget "${targettype}" "${targetname}"
502 logerror "No target type specified for target $1"
506 # Set up options sip/iax targets for outgoing sip/iax
507 handle_dialtarget() {
508 # Dialzone target option
511 logdebug 1 "Dialzone Target for ${dt_areatype}/${dt_areaname}"
513 logdebug 3 "Option $1='$2' for dialzone target"
515 timeout|prefix|internationalprefix|alwaysinternational|countrycode)
516 eval "target_$1_${dt_areatype}_${dt_areaname}=\"$2\""
519 logerror "Invalid target for ${dt_areatype}/${dt_areaname}: ${1}"
524 # vim: ts=2 sw=2 noet foldmethod=indent