4 add_incoming_context() {
6 eval "local added=\${dialplan_incoming_${context}_added}"
7 if [ "${added}" != "1" ] ; then
8 append dialplan_extensions_incoming "${context}" " "
9 eval "dialplan_incoming_${context}_added=1"
14 # Add to incoming ringing
18 while [ ! -z "$rhs" ] ; do
21 add_incoming_context ${cur}
22 append dialplan_incoming_${cur} "$1/$2" "&"
23 [ "$nvar" == "$rhs" ] && break
28 # Add to internal extensions
30 logdebug 1 "Adding $1/$2 extension to $3"
31 eval "local ext=\"\${dialplan_ext_$3}\""
32 [ -z "${ext}" ] && append dialplan_exts "$3" " "
33 local lower=`echo $1|tr [A-Z] [a-z]`
34 eval "local ext=\"\${${lower}_last_extension}\""
35 [ -z "${ext}" ] && eval "${lower}_last_extension=\"$3\""
36 append dialplan_ext_$3 $1/${2} "&"
39 check_append_local() {
40 local extension="${1}"
41 logdebug 3 "added local context for ${1}"
42 eval "local isadded=\"\${dialplan_add_local_${extension}-0}\""
43 if [ "$isadded" != "1" ] ; then
44 logdebug 3 "Not added before - adding"
45 eval "dialplan_add_local_${extension}=1"
46 append dialplan_locals "$extension"
47 eval "dialplan_local_${1}_context=\"${2}\""
48 eval "dialplan_local_${1}_selfmailbox=\"${3}\""
49 eval "dialplan_local_${1}_mailbox=\"${4}\""
55 append_dialplan_locals(){
56 for i in ${dialplan_locals} ; do
58 for x in context selfmailbox mailbox ; do
59 eval "x_${x}=\${dialplan_local_${i}_${x}}"
61 local newcontext=local_${extension}
63 if check_add_context ${newcontext} ; then
64 # add_dialplan_voice ${newcontext} ${x_last_extension} ${x_last_mailbox}
65 # Make sure as much is matched as possible
66 #add_dialplan_goto ${newcontext} _[0-9#*+]. ${x_last_context}
67 # add_dialplan_include ${newcontext} ${x_last_context}
69 append_dialplan_context ${newcontext} "exten => ${match_all},1,Set(CALLERID(num)=${extension})"
70 if [ ! -z "${x_mailbox}" ] ; then
71 [ "${x_selfmailbox}" = "yes" ] && append_dialplan_context ${newcontext} "exten => ${extension},2,VoiceMailMain(${x_mailbox})"
72 [ ! -z "${dialplan_voiceboxext}" ] && append_dialplan_context ${newcontext} "exten => ${dialplan_voiceboxext},2,VoiceMailMain(${x_mailbox})"
74 append_dialplan_context ${newcontext} "exten => ${match_all},2,Goto(${x_context},\${EXTEN},1)"
81 check_add_sipitems() {
82 if [ "${sip_doregister}" == "1" ] ; then
83 local line="register => ${sip_last_username}@${sip_last_fromdomain}:${sip_last_secret}:${sip_last_username}@${sip_sectionname}"
84 case ${sip_last_registerextension} in
85 -) line="$line/${sip_last_username}" ;;
86 .*) line="$line/${sip_last_registerextension}" ;;
88 append sip_register "$line" "$N"
91 do_check_add_items sip
93 check_add_iaxitems() {
94 do_check_add_items iax
99 for i in type last_host last_context selfmailbox last_extension last_mailbox ; do
100 eval "x_${i}=\"\${${1}_${i}-}\""
103 if [ ! -z "${x_last_context}" ] ; then
104 if [ ! -z "${x_last_extension}" ] ; then
105 [ "${x_last_context}" = "-" ] && eval "x_last_context=\"\${${1}_opt_context}\""
106 check_append_local "${x_last_extension}" "${x_last_context}" "${x_selfmailbox}" "${x_last_mailbox}"
107 x_last_context=local_${x_last_extension}
109 if [ "${x_last_context}" != "-" ] ; then
110 append ${1}_sections "context=${x_last_context}" "$N"
112 if [ "${x_type}" != "user" -a -z "${x_last_host}" ] ; then
113 append ${1}_sections "host=dynamic" "$N"
117 for i in last_username last_fromdomain last_secret last_username \
118 sectionname last_fromuser last_context last_extension last_mailbox last_type last_host ; do
122 eval ${1}_selfmailbox=no
123 eval ${1}_last_registerextension=-
130 unload_sip() astcmd "unload chan_sip.so"
132 rtp_option_list="rtpstart rtpend rtpdtmftimeout rtcpinterval rtpchecksums"
133 # Validate RTP options
135 is_in_list $1 ${rtp_option_list}
138 # Validate sip options, depending on context.
139 valid_sipiax_option() {
181 writeprotect|static) return ${use_glob_iax} ;;
190 call-limit) return ${use_glob_sip} ;;
193 externip) return ${use_glob_sip} ;;
195 localnet) return ${use_glob_sip} ;;
197 deny) return ${use_user_sip} ;;
200 domain) return ${use_glob_sip} ;;
202 context) return ${use_glob} ;;
204 notifymimetype) return ${use_glob_sip} ;;
206 canreinvite) return ${use_glob} ;;
207 nat|allowoverlap|allowsubscribe|allowtransfer|\
208 videosupport) return ${use_glob_sip} ;;
212 useclientcode) return ${use_user_sip} ;;
214 dtmfmode) return ${use_glob_sip} ;;
215 type) return ${use_user} ;;
216 insecure|callingpres|\
217 progressinband) return ${use_user_sip} ;;
220 disallow) return ${use_glob_sip} ;;
222 register) return ${use_glob_sip} ;;
224 username|secret|md5secret|host|\
225 mailbox) return ${use_user} ;;
226 auth) return ${use_user_iax} ;;
227 callgroup|pickupgroup|language|accountcode|\
228 setvar|callerid|amaflags|subscribecontext|\
229 maxcallbitrate|rfc2833compensate|\
230 mailbox) return ${use_user_sip};;
231 template|fromdomain|regexten|fromuser|\
232 qualify|defaultip|sendrpid|\
233 outboundproxy) return ${use_peer_sip};;
234 extension) return 0;;
242 ast_enable_type sipgeneral
244 ast_enable_type target
247 sip_opt_bindaddr=0.0.0.0
248 sip_opt_context=default
249 sip_opt_maxexpirey=3600
250 sip_opt_defaultexpirey=3600
251 sip_opt_notifymimetype=text/plain
252 sip_opt_rtptimeout=60
253 sip_opt_rtpholdtimeout=300
254 config_get WAN_IP wan ipaddr
255 # TODO check why the above does not work all the time
256 if [ -z "${WAN_IP}" ] ; then
257 config_get WAN_IF wan ifname
258 WAN_IP=$(ifconfig ${WAN_IF} | grep "inet addr:" | sed 's/^.*inet addr:\([^ ]*\) .*$/\1/')
261 sip_opt_externip=${WAN_IP}
263 sip_opt_realm=asterisk
264 config_get LAN_MASK lan netmask
265 config_get LAN_IP lan ipaddr
266 LAN_NET=$(/bin/ipcalc.sh $LAN_IP $LAN_MASK | grep NETWORK | cut -d= -f2)
267 sip_opt_localnet=$LAN_NET/$LAN_MASK
269 # default to ulaw only
271 sip_opt_registertimeout=20
272 sip_opt_registerattempts=10
273 sip_opt_canreinvite=no
278 sip_list="port bindaddr context maxexpirey defaultexpirey notifymimetype \
279 rtptimeout rtpholdtimeout realm domain localnet externip"
283 append_dialplan_locals
285 file=${DEST_DIR}/sip.conf
286 get_checksum sip_conf $file
288 if [ -z "${sip_sections}" ] ; then
292 [ -z "${sip_opt_domain}" ] && sip_opt_domain=${sip_opt_realm}
294 echo "${asteriskuci_gen}[general]" > $file
295 for i in ${sip_list} ; do
296 eval value=\$sip_opt_$i
297 [ ! -z "$value" ] && ( echo "$i=$value" >> $file )
299 echo "disallow=all" >> $file
300 local rhs="${sip_opt_allow}"
301 if [ -z "$rhs" ] ; then
304 while [ ! -z "$rhs" ] ; do
308 echo "allow=${cur}" >> $file
309 [ "$nvar" == "$rhs" ] && break
313 echo "${N}${sip_register}${N}${N}${sip_sections}" >> $file
317 check_checksum "$sip_conf" "$file" || ast_sip_restart=$isempty
321 handle_sipgeneral() {
323 if valid_sipiax_option globalsip $1 $2 ; then
326 if [ -z "$2" ] ; then
333 append sip_opt_allow "$2" "," ;;
334 *) eval "sip_opt_$1=\"\$2\"" ;;
336 elif valid_rtp_option $1 $2 ; then
337 eval "rtp_opt_$1=\"\$2\""
339 logerror "Invalid SIP global option: $1"
346 append sip_sections [$1] "$N$N"
347 enable_module chan_sip
348 sip_sectionname=${1#sip_}
352 sip_last_doregister=-
355 logdebug 3 "SIP/${sip_sectionname}: '$1' '$2'"
358 append sip_sections "$1=$2" "$N"
361 if [ "$2" == "yes" ]; then
364 registerextension) eval sip_last_$1="$2";;
365 allow|allow_ITEM*) split_append sip_sections allow= "$2" "${N}" enable_format ;;
366 extension|extension_ITEM*) add_extension SIP ${sip_sectionname} "$2" ;;
367 context) sip_last_context="$2" ;;
368 selfmailbox) sip_selfmailbox="$2" ;;
369 incoming|incoming_ITEM*)
370 add_incoming SIP ${sip_sectionname} "$2" ;;
371 timeout|prefix|internationalprefix|alwaysinternational|countrycode)
372 eval "target_$1_SIP_${sectionname}=\"$2\""
374 allow_LENGTH|incoming_LENGTH|extension_LENGTH) ;;
376 eval sip_last_$1="$2"
377 if valid_sipiax_option ${sip_type}sip $1 $2 ; then
378 append sip_sections "$1=$2" "$N"
380 logerror "Invalid SIP option for ${sip_type}: $1"
391 rtp_opt_rtpstart=5000
393 rtp_opt_rtpchecksums=
394 rtp_opt_rtpdtmftimeout=
395 rtp_opt_rtcpinterval=5000
399 file=${DEST_DIR}/rtp.conf
400 get_checksum rtp_conf $file
402 if module_enabled chan_sip ; then
403 echo "${asteriskuci_gen}[general]" > $file
404 for i in $rtp_option_list ; do
405 eval "local val=\"\$rtp_opt_$i\""
406 if [ ! -z "$val" ] ; then
409 rtpdtmftimeout) lhs=dtmftimeout
411 echo "$lhs=$val" >> $file
419 check_checksum "$rtp_conf" "$file" || ast_rtp_restart=$isempty
421 reload_rtp() astcmd "rtp reload"
422 unload_rtp() astcmd "unload rtp"
431 ast_enable_type iaxgeneral
438 local file=$DEST_DIR/iax.conf
439 get_checksum iax_conf $file
441 if [ -z "${iax_sections}" ] ; then
445 echo "${asteriskuci_gen}${iax_general}$N$N${iax_sections}" > $file
447 check_checksum "$iax_conf" "$file" || ast_iax_restart=${isempty}
450 handle_iaxgeneral() {
451 iax_general="[general]"
455 allow|allow_ITEM*) split_append iax_general allow= "$2" "${N}" enable_format ;;
457 if valid_sipiax_option globaliax $1 $2 ; then
458 eval "iax_opt_$1=\"$2\""
459 append iax_general "$1=$2" "$N"
461 logerror "Invalid IAX global option: $1"
470 iax_sectionname="${1#iax_}"
471 append iax_sections "[${iax_sectionname}]" "$N$N"
474 enable_module chan_iax2
479 append iax_sections "type=$2" "$N" ;;
480 allow_LENGTH|incoming_LENGTH) ;;
482 split_append iax_sections allow= "$2" "${N}" enable_format ;;
484 extension|extension_ITEM*) add_extension IAX ${iax_sectionname} "$2" ;;
486 eval iax_last_context="$2" ;;
488 eval iax_selfmailbox="$2" ;;
489 incoming|incoming_ITEM*)
490 add_incoming IAX ${iax_sectionname} "$3" ;;
491 timeout|prefix|internationalprefix|alwaysinternational|countrycode)
492 eval "target_$1_IAX_${sectionname}=\"$2\"" ;;
494 eval iax_last_$1="$2"
495 if valid_sipiax_option ${iax_type}iax $1 $2 ; then
496 append iax_sections "$1=$2" "$N"
498 logerror "Invalid IAX option for ${iax_type}: $1"
508 unload_iax() astcmd "unload chan_iax2.so"
512 targettype=${1%[-_]*}
513 if [ ${targettype} == $1 ] ; then
514 logerror "No target type specified (SIP-$1 IAX-$1)"
517 targetname=${1#*[-_]}
520 [Ss][Ii][Pp]) handle_dialtarget SIP $targetname ;;
521 [Ii][Aa][Xx]) handle_dialtarget IAX $targetname ;;
522 *) logerror "Invalid target type specified: $targettype"
526 # Set up options sip/iax targets for outgoing sip/iax
527 handle_dialtarget() {
528 # Dialzone target option
531 logdebug 1 "Dialzone Target for ${areatype}/${areaname}"
534 timeout|prefix|internationalprefix|alwaysinternational|countrycode)
535 eval target_$1_${areatype}_${areaname}=$2
538 logerror "Invalid target for $areatype/$areaname: ${1}"
543 # vim: ts=2 sw=2 noet foldmethod=indent