diff --git a/heartbeat/asterisk b/heartbeat/asterisk index 46f1f1c9a..82e9552be 100755 --- a/heartbeat/asterisk +++ b/heartbeat/asterisk @@ -1,427 +1,427 @@ #!/bin/sh # # # Asterisk # # Description: Manages an Asterisk PBX as an HA resource # # Authors: Martin Gerhard Loschwitz # Support: linux-ha@lists.linux-ha.org # License: GNU General Public License (GPL) # # (c) 2011 hastexo Professional Services GmbH # # This resource agent is losely derived from the MySQL resource # agent, which itself is made available to the public under the # following copyright: # # (c) 2002-2005 International Business Machines, Inc. # 2005-2010 Linux-HA contributors # # See usage() function below for more details ... # # OCF instance parameters: # OCF_RESKEY_binary # OCF_RESKEY_canary_binary # OCF_RESKEY_config # OCF_RESKEY_user # OCF_RESKEY_group # OCF_RESKEY_additional_parameters # OCF_RESKEY_realtime # OCF_RESKEY_maxfiles ####################################################################### # Initialization: : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs ####################################################################### # Fill in some defaults if no values are specified HOSTOS=`uname` if [ "X${HOSTOS}" = "XOpenBSD" ]; then OCF_RESKEY_user_default="_asterisk" OCF_RESKEY_group_default="_asterisk" else OCF_RESKEY_user_default="asterisk" OCF_RESKEY_group_default="asterisk" fi OCF_RESKEY_binary_default="/usr/sbin/asterisk" OCF_RESKEY_canary_binary_default="/usr/sbin/astcanary" OCF_RESKEY_config_default="/etc/asterisk/asterisk.conf" OCF_RESKEY_additional_parameters_default="-g -vvv" OCF_RESKEY_realtime_default="false" OCF_RESKEY_maxfiles_default="8192" : ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}} : ${OCF_RESKEY_canary_binary=${OCF_RESKEY_canary_binary_default}} : ${OCF_RESKEY_config=${OCF_RESKEY_config_default}} : ${OCF_RESKEY_user=${OCF_RESKEY_user_default}} : ${OCF_RESKEY_group=${OCF_RESKEY_group_default}} : ${OCF_RESKEY_additional_parameters=${OCF_RESKEY_additional_parameters_default}} : ${OCF_RESKEY_realtime=${OCF_RESKEY_realtime_default}} : ${OCF_RESKEY_maxfiles=${OCF_RESKEY_maxfiles_default}} ####################################################################### usage() { cat < 1.0 Resource agent for the Asterisk PBX. May manage an Asterisk PBX telephony system or a clone set that forms an Asterisk distributed device setup. Manages an Asterisk PBX Location of the Asterisk PBX server binary Asterisk PBX server binary Location of the Asterisk PBX Canary server binary Asterisk PBX Canary server binary The Asterisk PBX configuration file Asterisk PBX config User running Asterisk PBX daemon Asterisk PBX user Group running Asterisk PBX daemon (for logfile and directory permissions) Asterisk PBX group Additional parameters which are passed to the Asterisk PBX on startup (e.g. -L <load> or -M <value>). Additional parameters to pass to the Asterisk PBX Determines whether the Asterisk PBX daemon will be run with realtime priority or not. Asterisk PBX realtime priority Determines how many files the Asterisk PBX is allowed to open at a time. Helps to fix the 'Too many open files' error message. Asterisk PBX allowed MAXFILES END } ####################################################################### # Convenience variables ASTERISK=$OCF_RESKEY_binary if [ -f "$OCF_RESKEY_config" ]; then ASTRUNDIR=`grep astrundir $OCF_RESKEY_config | awk '/^astrundir/ {print $3}'` fi if [ -f "$OCF_RESKEY_config" ]; then ASTLOGDIR=`grep astlogdir $OCF_RESKEY_config | awk '/^astlogdir/ {print $3}'` fi ####################################################################### # Functions invoked by resource manager actions asterisk_validate() { check_binary $OCF_RESKEY_binary if [ ! -f $OCF_RESKEY_config ]; then ocf_log err "Config $OCF_RESKEY_config doesn't exist"; return $OCF_ERR_INSTALLED; fi getent passwd $OCF_RESKEY_user >/dev/null 2>&1 if [ ! $? -eq 0 ]; then ocf_log err "User $OCF_RESKEY_user doesn't exit"; return $OCF_ERR_INSTALLED; fi getent group $OCF_RESKEY_group >/dev/null 2>&1 if [ ! $? -eq 0 ]; then ocf_log err "Group $OCF_RESKEY_group doesn't exist"; return $OCF_ERR_INSTALLED; fi true } asterisk_status() { if [ ! -e $ASTRUNDIR/asterisk.pid ]; then ocf_log err "Asterisk PBX is not running" return $OCF_NOT_RUNNING; fi pid=`cat $ASTRUNDIR/asterisk.pid`; if [ -d /proc -a -d /proc/1 ]; then [ "u$pid" != "u" -a -d /proc/$pid ] else kill -s 0 $pid >/dev/null 2>&1 fi if [ $? -eq 0 ]; then return $OCF_SUCCESS; else ocf_log err "Asterisk PBX not running: removing old PID file" rm -f $ASTRUNDIR/asterisk.pid return $OCF_NOT_RUNNING; fi } asterisk_monitor() { local rc asterisk_status rc=$? # If status returned an error, return that immediately if [ $rc -ne $OCF_SUCCESS ]; then return $rc fi local asterisk_options asterisk_options="-r -vvv -x 'core show uptime'" # Check whether connecting to asterisk is possible ocf_run $ASTERISK $asterisk_options rc=$? if [ $rc -ne 0 ]; then ocf_log err "Failed to connect to the Asterisk PBX"; return $OCF_ERR_GENERIC; fi ocf_log info "Asterisk PBX monitor succeeded"; return $OCF_SUCCESS } asterisk_start() { asterisk_status if [ $? -eq $OCF_SUCCESS ]; then ocf_log info "Asterisk PBX already running" return $OCF_SUCCESS fi for i in $ASTRUNDIR $ASTLOGDIR $ASTLOGDIR/cdr-csv $ASTLOGDIR/cdr-custom; do [ -d $dir ] || install -d -o $OCF_RESKEY_user -g $OCF_RESKEY_group $i done # set MAXFILES ulimit -n $OCF_RESKEY_maxfiles pid_dir=`dirname $ASTRUNDIR` if [ ! -d $pid_dir ] ; then ocf_log info "Creating PID dir: $pid_dir" mkdir -p $pid_dir chown $OCF_RESKEY_user:$OCF_RESKEY_group $pid_dir fi # Determine whether Asterisk PBX is supposed to run in Realtime mode # or not and make asterisk daemonize automatically local asterisk_extra_params if ocf_is_true "$OCF_RESKEY_realtime"; then asterisk_extra_params="-F -p" else asterisk_extra_params="-F" fi # Regardless of whether we just created the directory or it # already existed, check whether it is writable by the configured # user for dir in $pid_dir; do if ! su -s /bin/sh - $OCF_RESKEY_user -c "test -w $dir"; then ocf_log err "Directory $dir is not writable by $OCF_RESKEY_user" exit $OCF_ERR_PERM; fi done - ${OCF_RESKEY_binary} -G $OCF_RESKEY_group -U $OCF_RESKEY_user \ + ocf_run ${OCF_RESKEY_binary} -G $OCF_RESKEY_group -U $OCF_RESKEY_user \ -C $OCF_RESKEY_config \ $OCF_RESKEY_additional_parameters \ - $asterisk_extra_params >/dev/null 2>&1 + $asterisk_extra_params rc=$? if [ $rc -ne 0 ]; then ocf_log err "Asterisk PBX start command failed: $rc" return $rc fi # Spin waiting for the server to come up. # Let the CRM/LRM time us out if required start_wait=1 while [ $start_wait = 1 ]; do asterisk_status rc=$? if [ $rc -eq $OCF_SUCCESS ]; then start_wait=0 elif [ $rc -ne $OCF_NOT_RUNNING ]; then ocf_log info "Asterisk PBX start failed: $rc" return $rc fi sleep 2 done asterisk_monitor rc=$? if [ $rc -ne $OCF_SUCCESS ]; then ocf_log err "Failed initial monitor action" return $rc fi ocf_log info "Asterisk PBX started" return $OCF_SUCCESS } asterisk_stop() { if [ ! -f $ASTRUNDIR/asterisk.pid ]; then ocf_log info "Asterisk PBX is not running" return $OCF_SUCCESS fi # Before killing asterisk, stop astcanary if [ $OCF_RESKEY_realtime = "yes" ]; then astcanary_pid=`pidof $OCF_RESKEY_canary_binary` - /bin/kill -9 $astcanary_pid > /dev/null + ocf_run kill -s KILL $astcanary_pid fi # kill asterisk itself pid=`cat $ASTRUNDIR/asterisk.pid 2> /dev/null ` - /bin/kill $pid > /dev/null + ocf_run kill -s TERM $pid rc=$? if [ $rc -ne 0 ]; then ocf_log err "Asterisk PBX couldn't be stopped" return $OCF_ERR_GENERIC fi # stop waiting shutdown_timeout=15 if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5)) fi count=0 while [ $count -lt $shutdown_timeout ] do asterisk_status rc=$? if [ $rc -eq $OCF_NOT_RUNNING ]; then break fi count=`expr $count + 1` sleep 1 ocf_log debug "Asterisk PBX still hasn't stopped yet. Waiting ..." done asterisk_status if [ $? != $OCF_NOT_RUNNING ]; then ocf_log info "Asterisk PBX failed to stop after ${shutdown_timeout}s using SIGTERM. Trying SIGKILL ..." - /bin/kill -KILL $pid > /dev/null + ocf_run kill -s KILL $pid fi ocf_log info "Asterisk PBX stopped"; return $OCF_SUCCESS } ####################################################################### case "$1" in meta-data) meta_data exit $OCF_SUCCESS;; usage|help) usage exit $OCF_SUCCESS;; esac asterisk_validate rc=$? LSB_STATUS_STOPPED=3 if [ $rc -ne 0 ]; then case "$1" in stop) exit $OCF_SUCCESS;; monitor) exit $OCF_NOT_RUNNING;; status) exit $LSB_STATUS_STOPPED;; *) exit $rc;; esac fi # What kind of method was invoked? case "$1" in start) asterisk_start;; stop) asterisk_stop;; status) asterisk_status;; monitor) asterisk_monitor;; validate-all) exit $OCF_SUCCESS;; *) usage exit $OCF_ERR_UNIMPLEMENTED;; esac