modules/admin-full: fix wifi join
[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() { # {list} {prefix} {item} {func call}
42         local lhs="$2"
43         local rhs="$3"
44         
45         while [ ! -z "$rhs" ] ; do
46                 cur=${rhs%%,*}
47                 nvar=${rhs#*,}
48                 [ -z "$5" ] || eval "$5 ${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() {
80         append asterisk_module_list $1 " "
81         eval "createdialplan_$1() return 0"
82 }
83 # Add to 'reload' list.
84 ast_add_reload() append asterisk_load_list $1 " "
85
86 # Enable a top-level type
87 ast_enable_type() eval "enabled_section_${1}=1"
88
89 # Is a top-level type enabled?
90 ast_type_enabled() {
91         eval "local res=\${enabled_section_${1}}"
92         if [ "$res" != 1 ] ; then
93                 return 1 #Fail
94         fi
95         return 0
96 }
97
98 # For use in sections - make sure that the last section is processed
99 check_add() {
100         logdebug 1 "Check add $1"
101         if [ ! -z "${last_added_checked}" ] ; then
102                 logdebug 1 "Eval check-add ${last_added_checked}"
103                 eval "check_add_${last_added_checked}"
104         fi
105         last_added_checked=$1
106 }
107
108 # Process the section yet to be checked.
109 check_all_added() check_add ""
110
111 # Create static links for stuff we dont want to configure yet.
112 create_staticlinks() {
113         logdebug 1 "Link in a few mostly static configurations"
114         linkconfigs="codecs.conf say.conf sip_notify.conf udptl.conf logger.conf"
115         module_enabled res_indications && append linkconfigs indications.conf " "
116         for i in ${linkconfigs} ; do
117                 [ -e $DEST_DIR/$i ] || ln -s $DEST/etc/asterisk/$i $DEST_DIR
118         done
119
120         logdebug 1 "Link in #include directories"
121         for i in include inc libs lib library macro macros ; do
122                 if [ -e $DEST/etc/asterisk/$i -a  ! -d "$DEST_DIR/$i" -a ! -e "$DEST_DIR/$i" ] ; then
123                         ln -s $DEST/etc/asterisk/$i $DEST_DIR
124                 fi
125         done
126 }
127
128 # default reboot
129 reboot_hardware() {}
130
131
132 # Top level handler
133 setup_asterisk() {
134         DEST=${1%/}
135         DEST_DIR=/tmp/asterisk
136
137         testing_mode=0
138         if [ "$2" == "testonly" ] ; then
139                 testing_mode=1
140         elif [ "$2" == "test" ] ; then
141                 DEST_DIR=/tmp/asterisk.tmp
142                 echo Using Test dir: $DEST_DIR
143                 testing_mode=2
144         fi
145
146         [ -z "$3" ] || debuglevel=$3
147
148         logdebug 1 "Loading Asterisk Config"
149         . ${UCILIB}/asteriskconf
150         logdebug 2 "Loading Module Config"
151         . ${UCILIB}/moduleconf
152         logdebug 2 "Loading Dialplan Config"
153         . ${UCILIB}/dialplanconf
154
155         for f in ${DEST}/etc/asterisk/conf.d/* ; do
156                 logdebug 1 "Loading Module $f"
157                 [ -f $f ] && . $f
158         done
159
160         include /lib/network
161         scan_interfaces
162
163         init_asteriskconf
164         init_moduleconf
165         init_dialplanconf
166
167         for i in  ${asterisk_module_list} ; do
168                 logdebug 1 "Init $i module"
169                 eval "init_${i}"
170         done
171
172         for i in ${asterisk_conf_list} ; do
173                 logdebug 1 "Init $i config"
174                 eval "init_${i}conf"
175         done
176  
177         config_cb() {
178                 cur_section=$1/$2
179                 logdebug 2 "Load $1/$2"
180                 eval "local val=\"\${dups_$2}\""
181                 if [ "${val}" == "" ] ; then
182                         eval "dups_$2=1"
183                 else
184                         logerror "Duplicate Section Name: $2  (type $1)"
185                 fi
186
187                 if ast_type_enabled $1 ; then
188                         eval "handle_$1 \$2"
189                 elif [ ! -z "$1" ] ; then
190
191                         logerror "Unknown section: $1/$2"
192                         option_cb() {
193                                 logerror "Invalid option '$1' for invalid section"
194                         }
195                 fi
196         }
197         config_load asterisk
198         check_all_added
199
200         if [ "$testing_mode" != "1" ] ; then
201                 mkdir -p ${DEST_DIR}
202
203                 create_asteriskconf
204                 for i in ${asterisk_conf_list} ; do
205                         logdebug 1 "Create $i config"
206                         eval "create_${i}conf"
207                 done
208
209                 for i in ${asterisk_module_list} ; do
210                         logdebug 1 "Create Dialplan for module $i"
211                         eval "createdialplan_${i}"
212                 done
213                 create_dialplanconf
214                 create_moduleconf
215
216                 # Link in a few mostly static configurations
217                 create_staticlinks
218         fi
219         [ "$testing_mode" == "2" ] && reload_check_asterisk
220         return 0
221 }
222
223 astcmd() {
224         ASTCMD="${DEST%/}/usr/sbin/asterisk -C /tmp/asterisk/asterisk.conf "
225         logdebug 1 "Command: $1"
226         if [ -z "${2-}" ] ; then
227                 ${ASTCMD} -r -x "$1" 2>&- 1>&-
228         else
229                 eval "$2=`${ASTCMD} -r -x \"$1\"`"
230         fi
231         return $?
232 }
233
234 # waitfor() {
235 #       while [ -d /proc/$1 ] ; do
236 #               sleep 1
237 #       done
238 # }
239
240 restart_gracefully() {
241         stop_uci_asterisk "$DEST"
242         startup_asterisk "$DEST"
243         #ret=0
244         #echo "Check for pid"
245         #if [ -r /var/run/asterisk.ctl ] ; then
246         #       astcmd "stop gracefully"
247         #       local ret=$?
248         #       [ ${ret} = 0 ] || return $ret
249         #       waitfor `cat /var/run/asterisk.pid`
250         #fi
251         #startup_asterisk ${DEST}
252         return 0
253 }
254 astcmds() {
255         while [ ! -z "$1" ] ; do
256                 astcmd "$1"
257                 shift
258         done
259 }
260
261 reload_check_asterisk() {
262         logdebug 1 "Check Reloading"
263         local reboot=0
264         if [ "${ast_restart-}" == 1 ] ; then
265                 logdebug 1 "Restarting Gracefully"
266                 reboot=0
267         else
268                 for i in ${asterisk_load_list} ; do
269                         logdebug 1 "Checking ${i} reload"
270                         eval "local doload=\${ast_${i}_restart}"
271                         case $doload in
272                                 1) logdebug 1 "Reloading ${i}" ;;
273                                 2) logdebug 1 "Unloading ${i}" ;;
274                         esac
275                 done
276         fi
277         [ ${reboot} = 1 ] && logdebug 1 "reboot hardware"
278 }
279
280 reload_asterisk() {
281         logdebug 1 "Reloading"
282         local reboot=0
283         if [ "${ast_restart-}" == 1 ] ; then
284                 logdebug 2 "Restarting Gracefully"
285                 restart_gracefully
286                 reboot=0
287         else
288                 for i in ${asterisk_load_list} ; do
289                         logdebug 3 "Checking ${i} reload"
290                         eval "local doload=\${ast_${i}_restart}"
291                         case $doload in
292                                 1) logdebug 1 "Reloading ${i}"
293                                 eval "reload_${i}" || reboot=1 ;;
294                                 2) logdebug 1 "Unloading ${i}"
295                                 eval "unload_${i}" || reboot=1 ;;
296                         esac
297                 done
298         fi
299
300         if [ ${reboot} = 1 ] ; then
301                 ( sleep 5; reboot_hardware ) &
302         fi
303 }
304
305 startup_asterisk() {
306         DEST="${1%/}"
307         DEFAULT=$DEST/etc/default/asterisk
308         [ -f $DEFAULT ] && . $DEFAULT
309         [ -d /var/run ] || mkdir -p /var/run
310         [ -d ${asterisk_logdir} ] || mkdir -p ${asterisk_logdir}
311         [ -d ${asterisk_spooldir} ] || mkdir -p ${asterisk_spooldir}
312         [ -d /var/spool/asterisk ] || mkdir -p /var/spool/asterisk
313         [ -h $DEST/usr/lib/asterisk/astdb ] || ln -sf /var/spool/asterisk/astdb $DEST/usr/lib/asterisk/astdb
314         [ -e /dev/zappseudo ] && [ ! -d /dev/zap -o ! -e /dev/zap/pseudo ] && mkdir -p /dev/zap && ln -s /dev/zappseudo /dev/zap/pseudo
315
316         $DEST/usr/sbin/asterisk -C /tmp/asterisk/asterisk.conf $UCIOPTIONS -f 2>&1 > ${asterisk_logdir}/asterisk_proc &
317         # Wait a bit then reboot the hardware
318         ( sleep 5; reboot_hardware ) &
319 }
320
321 # Init.d start() handler
322 start_uci_asterisk() {
323         DEST="${1%/}"
324
325         if setup_asterisk $DEST ; then
326                 startup_asterisk "$DEST"
327         fi
328 }
329
330 restart_uci_asterisk() {
331         DEST="${1%/}"
332         if setup_asterisk $DEST ; then
333                 echo "Trying to Restart gracefully"
334                 if [ -r /var/run/asterisk.ctl ] ; then
335 #                       if astcmd "restart gracefully" ; then
336                         echo "Sending restart"
337                         if restart_gracefully  ; then
338                                 echo "Restarting gracefully"
339                                 return 0
340                         fi
341                 fi
342                 stop_uci_asterisk "$DEST"
343                 startup_asterisk "$DEST"
344         else
345                 stop_uci_asterisk $1
346                 echo "Setup Failed"
347                 return 1
348         fi
349 }
350
351 # init.d stop() handler
352 stop_uci_asterisk() {
353         DEST=${1%/}
354         if [ -r /var/run/asterisk.ctl ] ; then
355                 astcmd "stop now"
356                 sleep 1
357         fi
358         [ -f /var/run/asterisk.pid ] && kill $(cat /var/run/asterisk.pid) >/dev/null 2>&1
359 }
360
361 reload_uci_asterisk() {
362         DEST=${1%/}
363         DEFAULT=$DEST/etc/default/asterisk
364
365         if [ -r /var/run/asterisk.ctl ] ; then
366
367                 [ -e /dev/zappseudo ] && [ ! -d /dev/zap -o ! -e /dev/zap/pseudo ] && mkdir -p /dev/zap && ln -s /dev/zappseudo /dev/zap/pseudo
368                 if setup_asterisk "$DEST" ; then
369                         # Selective reload modules.
370                         reload_asterisk
371                 fi
372         else
373                 start_uci_asterisk "$1"
374         fi
375 }
376
377 # vim: ts=2 sw=2 noet foldmethod=indent