contrib/package: move asterisk14-xip to feed
[project/luci.git] / contrib / package / asterisk-xip / files / uci / asteriskuci
1 #!/bin/sh
2
3 # Author: Michael Geddes <michael at frog dot wheelycreek dot net>
4 # Copyright 2008 Michael Geddes
5 # Licensed under GPL
6 Version=0.8
7
8
9 # Todo
10 # Calling of Macros in dialplan
11 # Create a Menu
12 # Incoming Zones
13
14 debuglevel=0
15
16 . /etc/functions.sh
17
18 asteriskuci_gen="; Generated by Openwrt AstriskUCI script version ${Version}$N"
19
20 # Utils
21
22 logerror() {
23 echo "Error: $1"
24 }
25
26 logdebug() {
27 if [ $(expr $1 "<=" ${debuglevel-0}) == 1 ] ; then
28 echo "Log: $2"
29 fi
30 }
31
32 is_in_list(){
33 val=$1
34 shift
35 for i in $* ; do
36 [ $i == $val ] && return 0
37 done
38 return 1
39 }
40
41 split_append() {
42 local lhs="$2"
43 local rhs="$3"
44
45 while [ ! -z "$rhs" ] ; do
46 cur=${rhs%%,*}
47 nvar=${rhs#*,}
48 [ -z $4 ] || eval "$4 ${cur}"
49 append $1 "${lhs}${cur}" "$4"
50 [ "$nvar" == "$rhs" ] && break
51 rhs=${nvar}
52 done
53 }
54
55 get_checksum() {
56 if [ -r "$2" ] ; then
57 local sum=`md5sum $2 | cut -d " " -f 1`
58 eval "$1=\"$sum\""
59 else
60 eval "$1=NONE"
61 fi
62 #eval "logdebug 1 \"Checksum $2 : \${$1}\""
63 }
64
65 check_checksum() {
66 if [ -r "$2" ] ; then
67 local sum=`md5sum $2 | cut -d " " -f 1`
68 else
69 eval sum=NONE
70 fi
71 #logdebug 1 "Compare $1 checksum $2 with new checksum $sum "
72 [ "$sum" == "$1" ]
73 return $?
74 }
75
76 # Add config module to initialise list
77 ast_add_conf() append asterisk_conf_list $1 " "
78 # Add module to initialise list
79 ast_add_module() append asterisk_module_list $1 " "
80 # Add to 'reload' list.
81 ast_add_reload() append asterisk_load_list $1 " "
82
83 # Enable a top-level type
84 ast_enable_type() eval "enabled_section_${1}=1"
85
86 # Is a top-level type enabled?
87 ast_type_enabled() {
88 eval "local res=\${enabled_section_${1}}"
89 if [ "$res" != 1 ] ; then
90 return 1 #Fail
91 fi
92 return 0
93 }
94
95 # For use in sections - make sure that the last section is processed
96 check_add() {
97 logdebug 1 "Check add $1"
98 if [ ! -z "${last_added_checked}" ] ; then
99 logdebug 1 "Eval check-add ${last_added_checked}"
100 eval "check_add_${last_added_checked}"
101 fi
102 last_added_checked=$1
103 }
104
105 # Process the section yet to be checked.
106 check_all_added() check_add ""
107
108 # Create static links for stuff we dont want to configure yet.
109 create_staticlinks() {
110 logdebug 1 "Link in a few mostly static configurations"
111 linkconfigs="codecs.conf say.conf sip_notify.conf udptl.conf logger.conf"
112 module_enabled res_indications && append linkconfigs indications.conf " "
113 for i in ${linkconfigs} ; do
114 [ -e $DEST_DIR/$i ] || ln -s $DEST/etc/asterisk/$i $DEST_DIR
115 done
116
117 logdebug 1 "Link in #include directories"
118 for i in include inc libs lib library macro macros ; do
119 if [ -e $DEST/etc/asterisk/$i -a ! -d "$DEST_DIR/$i" -a ! -e "$DEST_DIR/$i" ] ; then
120 ln -s $DEST/etc/asterisk/$i $DEST_DIR
121 fi
122 done
123 }
124
125 # default reboot
126 reboot_hardware() {}
127
128
129 # Top level handler
130 setup_asterisk() {
131 DEST=${1%/}
132 DEST_DIR=/tmp/asterisk
133
134 testing_mode=0
135 if [ "$2" == "testonly" ] ; then
136 testing_mode=1
137 elif [ "$2" == "test" ] ; then
138 DEST_DIR=/tmp/asterisk.tmp
139 echo Using Test dir: $DEST_DIR
140 testing_mode=2
141 fi
142
143 [ -z "$3" ] || debuglevel=$3
144
145 logdebug 1 "Loading Asterisk Config"
146 . ${UCILIB}/asteriskconf
147 logdebug 2 "Loading Module Config"
148 . ${UCILIB}/moduleconf
149 logdebug 2 "Loading Dialplan Config"
150 . ${UCILIB}/dialplanconf
151
152 for f in ${DEST}/etc/asterisk/conf.d/* ; do
153 logdebug 1 "Loading Module $f"
154 [ -f $f ] && . $f
155 done
156
157 include /lib/network
158 scan_interfaces
159
160 init_asteriskconf
161 init_moduleconf
162 init_dialplanconf
163
164 for i in ${asterisk_module_list} ; do
165 logdebug 1 "Init $i module"
166 eval "init_${i}"
167 done
168
169 for i in ${asterisk_conf_list} ; do
170 logdebug 1 "Init $i config"
171 eval "init_${i}conf"
172 done
173
174 config_cb() {
175 cur_section=$1/$2
176 logdebug 2 "Load $1/$2"
177 eval "local val=\"\${dups_$2}\""
178 if [ "${val}" == "" ] ; then
179 eval "dups_$2=1"
180 else
181 logerror "Duplicate Section Name: $2 (type $1)"
182 fi
183
184 if ast_type_enabled $1 ; then
185 eval "handle_$1 \$2"
186 elif [ ! -z "$1" ] ; then
187
188 logerror "Unknown section: $1/$2"
189 option_cb() {
190 logerror "Invalid option '$1' for invalid section"
191 }
192 fi
193 }
194 config_load asterisk
195 check_all_added
196
197 if [ "$testing_mode" != "1" ] ; then
198 mkdir -p ${DEST_DIR}
199
200 create_asteriskconf
201 for i in ${asterisk_conf_list} ; do
202 logdebug 1 "Create $i config"
203 eval "create_${i}conf"
204 done
205 create_dialplanconf
206 create_moduleconf
207
208 # Link in a few mostly static configurations
209 create_staticlinks
210 fi
211 [ "$testing_mode" == "2" ] && reload_check_asterisk
212 return 0
213 }
214
215 astcmd() {
216 ASTCMD="${DEST%/}/usr/sbin/asterisk -C /tmp/asterisk/asterisk.conf "
217 logdebug 1 "Command: $1"
218 if [ -z "${2-}" ] ; then
219 ${ASTCMD} -r -x "$1" 2>&- 1>&-
220 else
221 eval "$2=`${ASTCMD} -r -x \"$1\"`"
222 fi
223 return $?
224 }
225
226 # waitfor() {
227 # while [ -d /proc/$1 ] ; do
228 # sleep 1
229 # done
230 # }
231
232 restart_gracefully() {
233 stop_uci_asterisk "$DEST"
234 startup_asterisk "$DEST"
235 #ret=0
236 #echo "Check for pid"
237 #if [ -r /var/run/asterisk.ctl ] ; then
238 # astcmd "stop gracefully"
239 # local ret=$?
240 # [ ${ret} = 0 ] || return $ret
241 # waitfor `cat /var/run/asterisk.pid`
242 #fi
243 #startup_asterisk ${DEST}
244 return 0
245 }
246 astcmds() {
247 while [ ! -z "$1" ] ; do
248 astcmd "$1"
249 shift
250 done
251 }
252
253 reload_check_asterisk() {
254 logdebug 1 "Check Reloading"
255 local reboot=0
256 if [ "${ast_restart-}" == 1 ] ; then
257 logdebug 1 "Restarting Gracefully"
258 reboot=0
259 else
260 for i in ${asterisk_load_list} ; do
261 logdebug 1 "Checking ${i} reload"
262 eval "local doload=\${ast_${i}_restart}"
263 case $doload in
264 1) logdebug 1 "Reloading ${i}" ;;
265 2) logdebug 1 "Unloading ${i}" ;;
266 esac
267 done
268 fi
269 [ ${reboot} = 1 ] && logdebug 1 "reboot hardware"
270 }
271
272 reload_asterisk() {
273 logdebug 1 "Reloading"
274 local reboot=0
275 if [ "${ast_restart-}" == 1 ] ; then
276 logdebug 2 "Restarting Gracefully"
277 restart_gracefully
278 reboot=0
279 else
280 for i in ${asterisk_load_list} ; do
281 logdebug 3 "Checking ${i} reload"
282 eval "local doload=\${ast_${i}_restart}"
283 case $doload in
284 1) logdebug 1 "Reloading ${i}"
285 eval "reload_${i}" || reboot=1 ;;
286 2) logdebug 1 "Unloading ${i}"
287 eval "unload_${i}" || reboot=1 ;;
288 esac
289 done
290 fi
291
292 if [ ${reboot} = 1 ] ; then
293 ( sleep 5; reboot_hardware ) &
294 fi
295 }
296 startup_asterisk() {
297 DEST="${1%/}"
298 DEFAULT=$DEST/etc/default/asterisk
299 [ -f $DEFAULT ] && . $DEFAULT
300 [ -d /var/run ] || mkdir -p /var/run
301 [ -d ${asterisk_logdir} ] || mkdir -p ${asterisk_logdir}
302 [ -d ${asterisk_spooldir} ] || mkdir -p ${asterisk_spooldir}
303 [ -d /var/spool/asterisk ] || mkdir -p /var/spool/asterisk
304 [ -h $DEST/usr/lib/asterisk/astdb ] || ln -sf /var/spool/asterisk/astdb $DEST/usr/lib/asterisk/astdb
305
306 $DEST/usr/sbin/asterisk -C /tmp/asterisk/asterisk.conf $UCIOPTIONS -f 2>&1 > ${asterisk_logdir}/asterisk_proc &
307 # Wait a bit then reboot the hardware
308 ( sleep 5; reboot_hardware ) &
309 }
310
311 # Init.d start() handler
312 start_uci_asterisk() {
313 DEST="${1%/}"
314
315 if setup_asterisk $DEST ; then
316 startup_asterisk "$DEST"
317 fi
318 }
319
320 restart_uci_asterisk() {
321 DEST="${1%/}"
322 if setup_asterisk $DEST ; then
323 echo "Trying to Restart gracefully"
324 if [ -r /var/run/asterisk.ctl ] ; then
325 # if astcmd "restart gracefully" ; then
326 echo "Sending restart"
327 if restart_gracefully ; then
328 echo "Restarting gracefully"
329 return 0
330 fi
331 fi
332 stop_uci_asterisk "$DEST"
333 startup_asterisk "$DEST"
334 else
335 stop_uci_asterisk $1
336 echo "Setup Failed"
337 return 1
338 fi
339 }
340
341 # init.d stop() handler
342 stop_uci_asterisk() {
343 DEST=${1%/}
344 if [ -r /var/run/asterisk.ctl ] ; then
345 astcmd "stop now"
346 sleep 1
347 fi
348 [ -f /var/run/asterisk.pid ] && kill $(cat /var/run/asterisk.pid) >/dev/null 2>&1
349 }
350
351 reload_uci_asterisk() {
352 DEST=${1%/}
353 DEFAULT=$DEST/etc/default/asterisk
354
355 if [ -r /var/run/asterisk.ctl ] ; then
356 if setup_asterisk "$DEST" ; then
357 # Selective reload modules.
358 reload_asterisk
359 fi
360 else
361 start_uci_asterisk "$1"
362 fi
363 }
364
365 # vim: ts=2 sw=2 noet foldmethod=indent