sip_to_pjsip.py: Fix comment typo and tabs.
[asterisk/asterisk.git] / contrib / scripts / safe_asterisk
old mode 100755 (executable)
new mode 100644 (file)
index ee2cc77..62f3dad
 #!/bin/sh
-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
-DUMPDROP=/tmp
+
+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
+#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
+ASTPIDFILE="${ASTVARRUNDIR}/asterisk.pid"
+
+# comment this line out to have this script _not_ kill all mpg123 processes when
+# asterisk exits
+KILLALLMPG123=1
+
+# run asterisk with this priority
+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 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 `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 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 `uname -s | grep Darwin /dev/null 2>&1`; then
+               SYSCTL_MAXFILES="kern.maxfiles"
+       fi
+
+
+       if test -n "$SYSMAXFILES"; then
+               if test -n "$SYSCTL_MAXFILES"; then
+                       sysctl -w $SYSCTL_MAXFILES=$SYSMAXFILES
+               fi
+       fi
+
+       # 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
+
+#
+# Let Asterisk dump core
+#
+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
 
 #
-# Let Asterisk dump core
+# Don't die if stdout/stderr can't be written to
+#
+trap '' PIPE
+
+#
+# Run scripts to set any environment variables or do any other system-specific setup needed
 #
-ulimit -c unlimited
 
-#launch_asterisk()
-#{
-#}
+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}
-                       asterisk ${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
-                       asterisk ${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
-                               echo "Asterisk exited on signal $EXITSIGNAL.  Might want to take a peek." | \
-                               mail -s "Asterisk Died" $NOTIFY
+               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 on $MACHINE died (sig $EXITSIGNAL)" $NOTIFY
+                       fi
+                       if test -n "$EXEC"; then
+                               $EXEC
                        fi
-                        if [ -f /tmp/core ]; then
-                               mv /tmp/core ${DUMPDROP}/core.`hostname`-`date -Iseconds` &
+
+                       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
                else
-                       if [ "${EXITSTATUS}" = "0" ]; then
-                               echo "Asterisk ended normally.  Aborting."
-                               exit 0
-                       else
-                               echo "Asterisk died with code $EXITSTATUS."
-                               if [ -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."
-               sleep 1
+               message "Automatically restarting Asterisk."
+               sleep $SLEEPSECS
+               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