asterisk/contrib/scripts/safe_asterisk_restart

111 lines
2.7 KiB
Bash

#!/bin/bash
# vim:textwidth=80:tabstop=4:shiftwidth=4:smartindent
#
# this scripts prompts the user thrice, then tells asterisk to please shut down,
# then kills asterisk and related processes with SIGTERM, then kills asterisk
# and related processes with SIGKILL, and then starts asterisk with
# safe_asterisk. Three arguments are currently supported, --no-countdown,
# --no-prompt and --no-stop-now-first
LOGFILE=/var/log/asterisk/safe_asterisk_restart.log
ASTERISK=/usr/sbin/asterisk
SAFE_ASTERISK=/usr/sbin/safe_asterisk
DELAY=1 # Seconds between steps in countdown
COUNTDOWN_FROM=5 # Steps to count down
DO_COUNTDOWN=1 # Should I do a countdown before restarting asterisk?
DO_PROMPT=1 # Should I prompt the user?
TRY_STOP_NOW_FIRST=1 # Attempt a 'stop now' before killing processes. Note
# that this might make this script hang if asterisk
# can't respond to the command.
# processes to kill. Please list all AGI scripts here as well as the asterisk
# processes, since asterisk may leave them unkilled.
PROCVICTIMS="safe_asterisk asterisk mpg123"
# helper functions
# die ["string to print"]
function die {
if [[ "$1" != "" ]]; then
echo $1
else
echo "ok. no harm done..."
fi
exit
}
# docmd "string to print" "cmd"
function docmd {
printf "$1..."
`$2 >> $LOGFILE 2>&1`
RETCODE=$?
sleep $DELAY
if [[ "$RETCODE" == "0" ]]; then
echo " OK"
else
echo " FAILED"
fi
}
# prompt "string" "positive answer"
function prompt {
printf "$1"
read answer
if [[ "$answer" != "$2" ]]; then
die
fi
}
# countdown secs
function countdown {
echo -n "$1 "
if [[ $1 > 0 ]]; then
sleep 1
countdown $[ $1 - 1 ]
else
echo "boom!"
fi
}
# am I really root?
if [[ "$UID" != "0" ]]; then
echo "Sorry, only root can do this." >&2
exit;
fi
echo "`date`: $0 invoked" >> $LOGFILE
# bash
for i
do
if [[ "$i" == "--no-countdown" ]]
then
unset DO_COUNTDOWN
fi
if [[ "$i" == "--no-prompt" ]]
then
unset DO_PROMPT
fi
if [[ "$i" == "--no-stop-now-first" ]]
then
unset TRY_STOP_NOW_FIRST
fi
done
[[ $DO_PROMPT ]] && prompt "Are you sure you want to restart asterisk? (yes/no)? " "yes"
[[ $DO_PROMPT ]] && prompt "Really sure? (yes/no)? " "yes"
[[ $DO_PROMPT ]] && prompt "Absolutely positive? (YES/no)? " "YES"
[[ $DO_COUNTDOWN ]] && echo "OK, I'll do it, but if you're not sure about this, press ctrl+c now."
[[ $DO_COUNTDOWN ]] && countdown $COUNTDOWN_FROM
# doing the dirty work
[[ $TRY_STOP_NOW_FIRST ]] && docmd "Asking asterisk kindly to shutdown" "$ASTERISK -rx 'stop now'"
docmd "Sending asterisk processes the TERM signal" "pkill -15 $PROCVICTIMS"
docmd "Sending asterisk processes KILL signal" "pkill -9 $PROCVICTIMS"
docmd "Starting safe_asterisk" "$SAFE_ASTERISK"
for i in $PROCVICTIMS
do
ps axf | grep -w $i | grep -v grep
done