luci/contrib/package/asterisk-xip/files/uci/asteriskuci
2009-01-08 16:21:52 +00:00

365 lines
7.6 KiB
Bash
Executable file

#!/bin/sh
# Author: Michael Geddes <michael at frog dot wheelycreek dot net>
# Copyright 2008 Michael Geddes
# Licensed under GPL
Version=0.8
# Todo
# Calling of Macros in dialplan
# Create a Menu
# Incoming Zones
debuglevel=0
. /etc/functions.sh
asteriskuci_gen="; Generated by Openwrt AstriskUCI script version ${Version}$N"
# Utils
logerror() {
echo "Error: $1"
}
logdebug() {
if [ $(expr $1 "<=" ${debuglevel-0}) == 1 ] ; then
echo "Log: $2"
fi
}
is_in_list(){
val=$1
shift
for i in $* ; do
[ $i == $val ] && return 0
done
return 1
}
split_append() {
local lhs="$2"
local rhs="$3"
while [ ! -z "$rhs" ] ; do
cur=${rhs%%,*}
nvar=${rhs#*,}
[ -z $4 ] || eval "$4 ${cur}"
append $1 "${lhs}${cur}" "$4"
[ "$nvar" == "$rhs" ] && break
rhs=${nvar}
done
}
get_checksum() {
if [ -r "$2" ] ; then
local sum=`md5sum $2 | cut -d " " -f 1`
eval "$1=\"$sum\""
else
eval "$1=NONE"
fi
#eval "logdebug 1 \"Checksum $2 : \${$1}\""
}
check_checksum() {
if [ -r "$2" ] ; then
local sum=`md5sum $2 | cut -d " " -f 1`
else
eval sum=NONE
fi
#logdebug 1 "Compare $1 checksum $2 with new checksum $sum "
[ "$sum" == "$1" ]
return $?
}
# Add config module to initialise list
ast_add_conf() append asterisk_conf_list $1 " "
# Add module to initialise list
ast_add_module() append asterisk_module_list $1 " "
# Add to 'reload' list.
ast_add_reload() append asterisk_load_list $1 " "
# Enable a top-level type
ast_enable_type() eval "enabled_section_${1}=1"
# Is a top-level type enabled?
ast_type_enabled() {
eval "local res=\${enabled_section_${1}}"
if [ "$res" != 1 ] ; then
return 1 #Fail
fi
return 0
}
# For use in sections - make sure that the last section is processed
check_add() {
logdebug 1 "Check add $1"
if [ ! -z "${last_added_checked}" ] ; then
logdebug 1 "Eval check-add ${last_added_checked}"
eval "check_add_${last_added_checked}"
fi
last_added_checked=$1
}
# Process the section yet to be checked.
check_all_added() check_add ""
# Create static links for stuff we dont want to configure yet.
create_staticlinks() {
logdebug 1 "Link in a few mostly static configurations"
linkconfigs="codecs.conf say.conf sip_notify.conf udptl.conf logger.conf"
module_enabled res_indications && append linkconfigs indications.conf " "
for i in ${linkconfigs} ; do
[ -e $DEST_DIR/$i ] || ln -s $DEST/etc/asterisk/$i $DEST_DIR
done
logdebug 1 "Link in #include directories"
for i in include inc libs lib library macro macros ; do
if [ -e $DEST/etc/asterisk/$i -a ! -d "$DEST_DIR/$i" -a ! -e "$DEST_DIR/$i" ] ; then
ln -s $DEST/etc/asterisk/$i $DEST_DIR
fi
done
}
# default reboot
reboot_hardware() {}
# Top level handler
setup_asterisk() {
DEST=${1%/}
DEST_DIR=/tmp/asterisk
testing_mode=0
if [ "$2" == "testonly" ] ; then
testing_mode=1
elif [ "$2" == "test" ] ; then
DEST_DIR=/tmp/asterisk.tmp
echo Using Test dir: $DEST_DIR
testing_mode=2
fi
[ -z "$3" ] || debuglevel=$3
logdebug 1 "Loading Asterisk Config"
. ${UCILIB}/asteriskconf
logdebug 2 "Loading Module Config"
. ${UCILIB}/moduleconf
logdebug 2 "Loading Dialplan Config"
. ${UCILIB}/dialplanconf
for f in ${DEST}/etc/asterisk/conf.d/* ; do
logdebug 1 "Loading Module $f"
[ -f $f ] && . $f
done
include /lib/network
scan_interfaces
init_asteriskconf
init_moduleconf
init_dialplanconf
for i in ${asterisk_module_list} ; do
logdebug 1 "Init $i module"
eval "init_${i}"
done
for i in ${asterisk_conf_list} ; do
logdebug 1 "Init $i config"
eval "init_${i}conf"
done
config_cb() {
cur_section=$1/$2
logdebug 2 "Load $1/$2"
eval "local val=\"\${dups_$2}\""
if [ "${val}" == "" ] ; then
eval "dups_$2=1"
else
logerror "Duplicate Section Name: $2 (type $1)"
fi
if ast_type_enabled $1 ; then
eval "handle_$1 \$2"
elif [ ! -z "$1" ] ; then
logerror "Unknown section: $1/$2"
option_cb() {
logerror "Invalid option '$1' for invalid section"
}
fi
}
config_load asterisk
check_all_added
if [ "$testing_mode" != "1" ] ; then
mkdir -p ${DEST_DIR}
create_asteriskconf
for i in ${asterisk_conf_list} ; do
logdebug 1 "Create $i config"
eval "create_${i}conf"
done
create_dialplanconf
create_moduleconf
# Link in a few mostly static configurations
create_staticlinks
fi
[ "$testing_mode" == "2" ] && reload_check_asterisk
return 0
}
astcmd() {
ASTCMD="${DEST%/}/usr/sbin/asterisk -C /tmp/asterisk/asterisk.conf "
logdebug 1 "Command: $1"
if [ -z "${2-}" ] ; then
${ASTCMD} -r -x "$1" 2>&- 1>&-
else
eval "$2=`${ASTCMD} -r -x \"$1\"`"
fi
return $?
}
# waitfor() {
# while [ -d /proc/$1 ] ; do
# sleep 1
# done
# }
restart_gracefully() {
stop_uci_asterisk "$DEST"
startup_asterisk "$DEST"
#ret=0
#echo "Check for pid"
#if [ -r /var/run/asterisk.ctl ] ; then
# astcmd "stop gracefully"
# local ret=$?
# [ ${ret} = 0 ] || return $ret
# waitfor `cat /var/run/asterisk.pid`
#fi
#startup_asterisk ${DEST}
return 0
}
astcmds() {
while [ ! -z "$1" ] ; do
astcmd "$1"
shift
done
}
reload_check_asterisk() {
logdebug 1 "Check Reloading"
local reboot=0
if [ "${ast_restart-}" == 1 ] ; then
logdebug 1 "Restarting Gracefully"
reboot=0
else
for i in ${asterisk_load_list} ; do
logdebug 1 "Checking ${i} reload"
eval "local doload=\${ast_${i}_restart}"
case $doload in
1) logdebug 1 "Reloading ${i}" ;;
2) logdebug 1 "Unloading ${i}" ;;
esac
done
fi
[ ${reboot} = 1 ] && logdebug 1 "reboot hardware"
}
reload_asterisk() {
logdebug 1 "Reloading"
local reboot=0
if [ "${ast_restart-}" == 1 ] ; then
logdebug 2 "Restarting Gracefully"
restart_gracefully
reboot=0
else
for i in ${asterisk_load_list} ; do
logdebug 3 "Checking ${i} reload"
eval "local doload=\${ast_${i}_restart}"
case $doload in
1) logdebug 1 "Reloading ${i}"
eval "reload_${i}" || reboot=1 ;;
2) logdebug 1 "Unloading ${i}"
eval "unload_${i}" || reboot=1 ;;
esac
done
fi
if [ ${reboot} = 1 ] ; then
( sleep 5; reboot_hardware ) &
fi
}
startup_asterisk() {
DEST="${1%/}"
DEFAULT=$DEST/etc/default/asterisk
[ -f $DEFAULT ] && . $DEFAULT
[ -d /var/run ] || mkdir -p /var/run
[ -d ${asterisk_logdir} ] || mkdir -p ${asterisk_logdir}
[ -d ${asterisk_spooldir} ] || mkdir -p ${asterisk_spooldir}
[ -d /var/spool/asterisk ] || mkdir -p /var/spool/asterisk
[ -h $DEST/usr/lib/asterisk/astdb ] || ln -sf /var/spool/asterisk/astdb $DEST/usr/lib/asterisk/astdb
$DEST/usr/sbin/asterisk -C /tmp/asterisk/asterisk.conf $UCIOPTIONS -f 2>&1 > ${asterisk_logdir}/asterisk_proc &
# Wait a bit then reboot the hardware
( sleep 5; reboot_hardware ) &
}
# Init.d start() handler
start_uci_asterisk() {
DEST="${1%/}"
if setup_asterisk $DEST ; then
startup_asterisk "$DEST"
fi
}
restart_uci_asterisk() {
DEST="${1%/}"
if setup_asterisk $DEST ; then
echo "Trying to Restart gracefully"
if [ -r /var/run/asterisk.ctl ] ; then
# if astcmd "restart gracefully" ; then
echo "Sending restart"
if restart_gracefully ; then
echo "Restarting gracefully"
return 0
fi
fi
stop_uci_asterisk "$DEST"
startup_asterisk "$DEST"
else
stop_uci_asterisk $1
echo "Setup Failed"
return 1
fi
}
# init.d stop() handler
stop_uci_asterisk() {
DEST=${1%/}
if [ -r /var/run/asterisk.ctl ] ; then
astcmd "stop now"
sleep 1
fi
[ -f /var/run/asterisk.pid ] && kill $(cat /var/run/asterisk.pid) >/dev/null 2>&1
}
reload_uci_asterisk() {
DEST=${1%/}
DEFAULT=$DEST/etc/default/asterisk
if [ -r /var/run/asterisk.ctl ] ; then
if setup_asterisk "$DEST" ; then
# Selective reload modules.
reload_asterisk
fi
else
start_uci_asterisk "$1"
fi
}
# vim: ts=2 sw=2 noet foldmethod=indent