sip_to_pjsip.py: Fix comment typo and tabs.
[asterisk/asterisk.git] / contrib / scripts / safe_asterisk
index 0464373..62f3dad 100644 (file)
@@ -1,16 +1,22 @@
 #!/bin/sh
-# vim:textwidth=80:tabstop=4:shiftwidth=4:smartindent:autoindent
 
-CLIARGS="$*"                           # Grab any args passed to safe_asterisk
-TTY=9                                          # TTY (if you want one) for Asterisk to run on
-CONSOLE=yes                                    # Whether or not you want a console
-#NOTIFY=ben@alkaloid.net       # Who to notify about crashes
+ASTETCDIR="__ASTERISK_ETC_DIR__"
+ASTSBINDIR="__ASTERISK_SBIN_DIR__"
+ASTVARRUNDIR="__ASTERISK_VARRUN_DIR__"
+ASTVARLOGDIR="__ASTERISK_LOG_DIR__"
+
+CLIARGS="$*"                   # Grab any args passed to safe_asterisk
+TTY=9                          # TTY (if you want one) for Asterisk to run on
+CONSOLE=yes                    # Whether or not you want a console
+#NOTIFY=root@localhost         # Who to notify about crashes
 #EXEC=/path/to/somescript      # Run this command if Asterisk crashes
-MACHINE=`hostname`                     # To specify which machine has crashed when getting the mail
-DUMPDROP=/tmp
+#LOGFILE="${ASTVARLOGDIR}/safe_asterisk.log"   # Where to place the normal logfile (disabled if blank)
+#SYSLOG=local0                 # Which syslog facility to use (disabled if blank)
+MACHINE=`hostname`             # To specify which machine has crashed when getting the mail
+DUMPDROP="${DUMPDROP:-/tmp}"
+RUNDIR="${RUNDIR:-/tmp}"
 SLEEPSECS=4
-ASTSBINDIR=__ASTERISK_SBIN_DIR__
-ASTPIDFILE=__ASTERISK_VARRUN_DIR__/asterisk.pid
+ASTPIDFILE="${ASTVARRUNDIR}/asterisk.pid"
 
 # comment this line out to have this script _not_ kill all mpg123 processes when
 # asterisk exits
@@ -22,43 +28,66 @@ PRIORITY=0
 # set system filemax on supported OSes if this variable is set
 # SYSMAXFILES=262144
 
+# Asterisk allows full permissions by default, so set a umask, if you want
+# restricted permissions.
+#UMASK=022
+
 # set max files open with ulimit. On linux systems, this will be automatically
 # set to the system's maximum files open devided by two, if not set here.
 # MAXFILES=32768
 
+message() {
+       if test -n "$TTY" && test "$TTY" != "no"; then
+               echo "$1" >/dev/${TTY}
+       fi
+       if test -n "$SYSLOG"; then
+               logger -p "${SYSLOG}.warn" -t safe_asterisk[$$] "$1"
+       fi
+       if test -n "$LOGFILE"; then
+               echo "safe_asterisk[$$]: $1" >>"$LOGFILE"
+       fi
+}
+
+# Check if Asterisk is already running.  If it is, then bug out, because
+# starting safe_asterisk when Asterisk is running is very bad.
+VERSION=`"${ASTSBINDIR}/asterisk" -nrx 'core show version' 2>/dev/null`
+if test "`echo $VERSION | cut -c 1-8`" = "Asterisk"; then
+       message "Asterisk is already running.  $0 will exit now."
+       exit 1
+fi
+
 # since we're going to change priority and open files limits, we need to be
 # root. if running asterisk as other users, pass that to asterisk on the command
 # line.
 # if we're not root, fall back to standard everything.
-if [ `id -u` != 0 ]
-then
-       echo "Ops. I'm not root. Falling back to standard prio and file max." >&2
+if test `id -u` != 0; then
+       echo "Oops. I'm not root. Falling back to standard prio and file max." >&2
        echo "This is NOT suitable for large systems." >&2
        PRIORITY=0
+       message "safe_asterisk was started by `id -n` (uid `id -u`)."
 else
-       if `echo $OSTYPE | grep linux 2>&1 > /dev/null `
-       then
-               # maximum number of open files is set to the system maximum divided by two if
-               # MAXFILES is not set.
-               if [ "$MAXFILES" = "" ]
-               then
+       if `uname -s | grep Linux >/dev/null 2>&1`; then
+               # maximum number of open files is set to the system maximum
+               # divided by two if MAXFILES is not set.
+               if test -z "$MAXFILES"; then
                        # just check if file-max is readable
-                       if [ -r /proc/sys/fs/file-max ]
-                       then
-                               MAXFILES=$(( `cat /proc/sys/fs/file-max` / 2 ))
+                       if test -r /proc/sys/fs/file-max; then
+                               MAXFILES=$((`cat /proc/sys/fs/file-max` / 2))
+                               # don't exceed upper limit of 2^20 for open
+                               # files on systems where file-max is > 2^21
+                               if test $MAXFILES -gt 1048576; then
+                                       MAXFILES=1048576
+                               fi
                        fi
                fi
                SYSCTL_MAXFILES="fs.file-max"
-       elif `echo $OSTYPE | grep darwin 2>&1 > /dev/null `
-       then
+       elif `uname -s | grep Darwin /dev/null 2>&1`; then
                SYSCTL_MAXFILES="kern.maxfiles"
        fi
 
 
-       if [ "$SYSMAXFILES" != "" ]
-       then
-               if [ "$SYSCTL_MAXFILES" != "" ]
-               then
+       if test -n "$SYSMAXFILES"; then
+               if test -n "$SYSCTL_MAXFILES"; then
                        sysctl -w $SYSCTL_MAXFILES=$SYSMAXFILES
                fi
        fi
@@ -66,6 +95,15 @@ else
        # set the process's filemax to whatever set above
        ulimit -n $MAXFILES
 
+       if test ! -d "${ASTVARRUNDIR}"; then
+               mkdir -p "${ASTVARRUNDIR}"
+               chmod 770 "${ASTVARRUNDIR}"
+       fi
+
+fi
+
+if test -n "$UMASK"; then
+       umask $UMASK
 fi
 
 #
@@ -77,99 +115,107 @@ ulimit -c unlimited
 # Don't fork when running "safely"
 #
 ASTARGS=""
-if [ "$TTY" != "" ]; then
-       if [ -c /dev/tty${TTY} ]; then
+if test -n "$TTY" && test "$TTY" != "no"; then
+       if test -c /dev/tty${TTY}; then
                TTY=tty${TTY}
-       elif [ -c /dev/vc/${TTY} ]; then
+       elif test -c /dev/vc/${TTY}; then
                TTY=vc/${TTY}
        else
-               echo "Cannot find your TTY (${TTY})" >&2
+               message "Cannot find specified TTY (${TTY})"
                exit 1
        fi
        ASTARGS="${ASTARGS} -vvvg"
-       if [ "$CONSOLE" != "no" ]; then
+       if test "$CONSOLE" != "no"; then
                ASTARGS="${ASTARGS} -c"
        fi
 fi
-if [ ! -w ${DUMPDROP} ]; then  
-       echo "Cannot write to ${DUMPDROP}" >&2
+
+if test ! -d "${RUNDIR}"; then
+       message "${RUNDIR} does not exist, creating"
+       if ! mkdir -p "${RUNDIR}"; then
+               message "Unable to create ${RUNDIR}"
+               exit 1
+       fi
+fi
+
+if test ! -w "${DUMPDROP}"; then
+       message "Cannot write to ${DUMPDROP}"
        exit 1
 fi
 
 #
 # Don't die if stdout/stderr can't be written to
 #
-trap '' SIGPIPE
+trap '' PIPE
 
 #
 # Run scripts to set any environment variables or do any other system-specific setup needed
 #
 
-if [ -d /etc/asterisk/startup.d ]; then
-       for script in /etc/asterisk/startup.d/*.sh; do
-               if [ -x ${script} ]; then
-                       source ${script}
+if test -d "${ASTETCDIR}/startup.d"; then
+       for script in "${ASTETCDIR}/startup.d/"*.sh; do
+               if test -r "${script}"; then
+                       . "${script}"
                fi
        done
 fi
 
 run_asterisk()
 {
-       while :; do 
-
-               if [ "$TTY" != "" ]; then
-                       cd /tmp
-                       stty sane < /dev/${TTY}
-                       nice -n $PRIORITY ${ASTSBINDIR}/asterisk -f ${CLIARGS} ${ASTARGS} >& /dev/${TTY} < /dev/${TTY}
+       while :; do
+               if test -n "$TTY" && test "$TTY" != "no"; then
+                       cd "${RUNDIR}"
+                       stty sane </dev/${TTY}
+                       nice -n $PRIORITY "${ASTSBINDIR}/asterisk" -f ${CLIARGS} ${ASTARGS} >/dev/${TTY} 2>&1 </dev/${TTY}
                else
-                       cd /tmp
-                       nice -n $PRIORITY ${ASTSBINDIR}/asterisk -f ${CLIARGS} ${ASTARGS}
+                       cd "${RUNDIR}"
+                       nice -n $PRIORITY "${ASTSBINDIR}/asterisk" -f ${CLIARGS} ${ASTARGS} >/dev/null 2>&1 </dev/null
                fi
                EXITSTATUS=$?
-               echo "Asterisk ended with exit status $EXITSTATUS"
-               if [ "$EXITSTATUS" = "0" ]; then
+               message "Asterisk ended with exit status $EXITSTATUS"
+               if test $EXITSTATUS -eq 0; then
                        # Properly shutdown....
-                       echo "Asterisk shutdown normally."
+                       message "Asterisk shutdown normally."
                        exit 0
-               elif [ $EXITSTATUS -gt 128 ]; then
-                       let EXITSIGNAL=EXITSTATUS-128
-                       echo "Asterisk exited on signal $EXITSIGNAL."
-                       if [ "$NOTIFY" != "" ]; then
+               elif test $EXITSTATUS -gt 128; then
+                       EXITSIGNAL=$((EXITSTATUS - 128))
+                       message "Asterisk exited on signal $EXITSIGNAL."
+                       if test -n "$NOTIFY"; then
                                echo "Asterisk on $MACHINE exited on signal $EXITSIGNAL.  Might want to take a peek." | \
-                               mail -s "Asterisk Died" $NOTIFY
+                               mail -s "Asterisk on $MACHINE died (sig $EXITSIGNAL)" $NOTIFY
                        fi
-                       if [ "$EXEC" != "" ]; then
+                       if test -n "$EXEC"; then
                                $EXEC
                        fi
 
                        PID=`cat ${ASTPIDFILE}`
-                       if [ -f /tmp/core.${PID} ]; then
-                               mv /tmp/core.${PID} ${DUMPDROP}/core.`hostname`-`date -Iseconds` &
-                       elif [ -f /tmp/core ]; then
-                               mv /tmp/core ${DUMPDROP}/core.`hostname`-`date -Iseconds` &
+                       DATE=`date "+%Y-%m-%dT%H:%M:%S%z"`
+                       if test -f "${RUNDIR}/core.${PID}"; then
+                               mv "${RUNDIR}/core.${PID}" "${DUMPDROP}/core.`hostname`-$DATE" &
+                       elif test -f "${RUNDIR}/core"; then
+                               mv "${RUNDIR}/core" "${DUMPDROP}/core.`hostname`-$DATE" &
                        fi
                else
-                       if [ "${EXITSTATUS}" = "0" ]; then
-                               echo "Asterisk ended normally.  Aborting."
-                               exit 0
-                       else
-                               echo "Asterisk died with code $EXITSTATUS."
-
-                               PID=`cat ${ASTPIDFILE}`
-                               if [ -f /tmp/core.${PID} ]; then
-                                       mv /tmp/core.${PID} ${DUMPDROP}/core.`hostname`-`date -Iseconds` &
-                               elif [ -f /tmp/core ]; then
-                                       mv /tmp/core ${DUMPDROP}/core.`hostname`-`date -Iseconds` &
-                               fi
+                       message "Asterisk died with code $EXITSTATUS."
+
+                       PID=`cat ${ASTPIDFILE}`
+                       DATE=`date "+%Y-%m-%dT%H:%M:%S%z"`
+                       if test -f "${RUNDIR}/core.${PID}"; then
+                               mv "${RUNDIR}/core.${PID}" "${DUMPDROP}/core.`hostname`-$DATE" &
+                       elif test -f "${RUNDIR}/core"; then
+                               mv "${RUNDIR}/core" "${DUMPDROP}/core.`hostname`-$DATE" &
                        fi
                fi
-               echo "Automatically restarting Asterisk."
+               message "Automatically restarting Asterisk."
                sleep $SLEEPSECS
-               if [ $KILLALLMPG123 ]
-               then
-                       killall -9 mpg123
+               if test "0$KILLALLMPG123" -gt 0; then
+                       pkill -9 mpg123
                fi
        done
 }
 
-run_asterisk &
+if test -n "$ASTSAFE_FOREGROUND"; then
+       run_asterisk
+else
+       run_asterisk &
+fi