Skip to content
Snippets Groups Projects
safe_asterisk_restart 2.73 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/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" "killall -15 $PROCVICTIMS"
    docmd "Sending asterisk processes KILL signal" "killall -9 $PROCVICTIMS"
    docmd "Starting safe_asterisk" "$SAFE_ASTERISK"
    for i in $PROCVICTIMS
    do
    	ps axf | grep -w $i | grep -v grep
    done