diff options
author | V3n3RiX <venerix@koprulu.sector> | 2022-07-13 13:36:46 +0100 |
---|---|---|
committer | V3n3RiX <venerix@koprulu.sector> | 2022-07-13 13:36:46 +0100 |
commit | 7b02e37a04e4051a91a109814d386711f41f9a4b (patch) | |
tree | d0689f14f1d1df3a6a2525512a6812b146064a9e /net-misc/asterisk/files/asterisk_wrapper-16.26.1-18.12.1 | |
parent | 5c0c70d5917e66743293789a6d6fd7d72250eb32 (diff) |
gentoo auto-resync : 13:07:2022 - 13:36:46
Diffstat (limited to 'net-misc/asterisk/files/asterisk_wrapper-16.26.1-18.12.1')
-rw-r--r-- | net-misc/asterisk/files/asterisk_wrapper-16.26.1-18.12.1 | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/net-misc/asterisk/files/asterisk_wrapper-16.26.1-18.12.1 b/net-misc/asterisk/files/asterisk_wrapper-16.26.1-18.12.1 new file mode 100644 index 000000000000..477812171a86 --- /dev/null +++ b/net-misc/asterisk/files/asterisk_wrapper-16.26.1-18.12.1 @@ -0,0 +1,202 @@ +#! /bin/bash +# Copyright 1999-2022 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +progname="$(basename "$0")" + +T="$(getopt -o "h" --long "help,corecompress:,corerename:,crashemail:,dumpcore:,instance:,maxfd:,nicelevel:,restartdelay:,rundir:,syslog,tty:" -n "$progname" -- "$@")" +eval set -- "${T}" + +rundir=/run/asterisk +restartdelay=5 +nicelevel=0 +maxfd=4096 +dumpcore=0 +unset tty instance syslog corecompress corerename crashemail + +function usage() { + cat <<USAGE +USAGE: $progname [options] -- asterisk options" +OPTIONS: + -h|--help + Output this text and exit. + --corecompress[=tool] + asterisk's address space can get quite large, compressing the core dumps can + save significant space, especially if asterisk core dumps frequently. + --corerename pattern + It's assumed core files (if enabled) will go into PWD, this specifies a + rename pattern. The following % codes are recognised: + %h - hostname + %D - date in format YYYYMMDD + %T - time in format HHMMSS + It must be mentioned that if kernel.core_pattern (sysctl) is modified + from the default 'core' value this option is unlikely to work. + --crashemail email@address + This will send an email whenver asterisk crashes (does not terminate + cleanly with a zero exit code). You need a working sendmail binary. + --dumpcore sizelimit + Maximum size of core limit, or the word unlimited. Default is disabled + (sizelimit of 0). + --instance name + Updated label for sylog logger. + --maxfd maxfd + Sets the maximum number of file descriptors (default 4096). + --nicelevel nicelevel + Will set the asterisk nice level to the specified value. + --restartdelay delay_in_seconds + Number of seconds to wait before attempting to restart asterisk. This helps + to avoid tight-loop crashes. Defaults to 5s. Minimum 1. + --rundir path + Where to store the asterisk asterisk_wrapper.pid file. In order to terminate the + wrapper (when asterisk next terminates), remove this file. + --syslog + Pass to redirect output to syslog rather than using stdout and stderr. + --tty tty + If asterisk should be attached to a TTY device, then pass this, eg --tty /dev/tty8. + Use of this is not recommended in general. + +NOTE: There are some quirks with bash getopt shunting non-options prior to -- + to asterisk options, so be careful of this. Typically stuff will break. +USAGE +} + +while [ "$1" != "--" ]; do + case "$1" in + --corecompress|--corerename|--crashemail|--dumpcore|--instance|--maxfd|--nicelevel|--restartdelay|--rundir|--tty) + eval "${1:2}=\"\${2}\"" + shift 2 + ;; + --syslog) + eval "${1:2}=1" + shift + ;; + --help|-h) + usage + exit 0 + ;; + *) + echo "BUG: Don't know how to process option $1." >&2 + usage >&2 + exit 1 + ;; + esac +done +shift # -- + +ast_opts=("$@") + +if ! [[ "${restartdelay}" =~ ^[1-9][0-9]*$ ]]; then + echo "Invalid --restartdelay value ${restartdelay}, resetting to 5." >&2 + restartdelay=5 +fi + +if [[ -n "${corecompress}" && ! -x "${corecompress}" ]]; then + corecompress=$(which "${corecompress}" 2>/dev/null) + [[ -z "${corecompress}" ]] && echo "Error locating core compression tool, disabling core compression." >&2 +fi + +# Before here will still be output (potentially munged, to the terminal). +if [[ -n "${syslog}" ]]; then + exec 1> >(logger -t "asterisk_wrapper${instance:+:}${instance}" &>/dev/null) + exec 2>&1 +fi + +echo "Initializing ${progname}" + +function cleanup(){ + # There is a tiny race here, if this gets replaced inbetween the read and the rm. + # To fix this is quite complex in that we need to keep an fd, compare inode numbers + # and manage flock's. + [[ -r "${rundir}/${progname}.pid" ]] && \ + [[ "$(<"${rundir}/${progname}.pid")" = $$ ]] && \ + rm "${rundir}/${progname}.pid" +} +trap cleanup EXIT + +# We could be clobbering an old version's pid, in which case it'll just terminate on +# it's next iteration. Towards this end, if asterisk.pid exists, attempt to find it's +# config file and request a core stop when convenient so that we can take over. +echo $$ > "${rundir}/${progname}.pid" +if [[ -r "${rundir}/asterisk.pid" ]]; then + ast_pid="$(<"${rundir}/asterisk.pid")" + [[ -r "/proc/${ast_pid}/cmdline" ]] && ast_conf="$(tr '\0' '\n' < "/proc/${ast_pid}/cmdline" | grep -A1 '^-C$' | tail -n1)" && /usr/sbin/asterisk -C "${ast_conf:-/etc/asterisk/asterisk.conf}" -rx "core stop when convenient" + # We may hit a few (depending on how busy the server is a great many number) loop failures still ... +fi + +ulimit -c "${dumpcore}" +ulimit -n "${maxfd}" + +ast_cmd=() +if [ -n "${nicelevel}" ]; then + ast_cmd+=(nice -n "${nicelevel}") +fi +ast_cmd+=(/usr/sbin/asterisk "${ast_opts[@]}") + +while [[ -r "${rundir}/${progname}.pid" ]]; do + # Another instance is looking to replace us, so terminate. + if [[ "$(<"${rundir}/${progname}.pid")" != $$ ]]; then + break + fi + + echo "Starting asterisk with ${ast_opts[*]}" + if [ -n "${tty+yes}" ]; then + /bin/stty -F "${tty}" sane + "${ast_cmd[@]}" >"${tty}" 2>&1 <"${tty}" + result=$? + else + # Purposefully leave stderr alone, this will under certain odd cases (like exceptions, + # and other odd cases logged from glibc) result in those logs at least being captured + # in syslog. + "${ast_cmd[@]}" </dev/null >/dev/null + result=$? + fi + + if [ "$result" -eq 0 ]; then + echo "Asterisk terminated normally." + break + fi + + if [ "$result" -gt 128 ]; then + signal="$(( result - 128 ))" + signame="$(kill -l $signal 2>/dev/null)" + MSG="Asterisk terminated with Signal: $signal (SIG${signame:-???})" + + # TODO: figure out how to use /proc/sys/kernel/core_pattern here, but if someone is using + # that, chances are they're already dealing with what we want here. + if [[ -r core ]]; then + if [[ -n "${corerename+yes}" ]]; then + core_target="${core_pattern}" + core_target="${core_target//%h/$(hostname)}" + core_target="${core_target//%D/$(date +%Y%m%d)}" + core_target="${core_target//%T/$(date +%H%M%S)}" + mv core "${core_target}" + core_target=$(readlink -f "${core_target}") + else + core_target=$(readlink -f core) + fi + + if [[ -n "${corecompress}" && -x "${corecompress}" ]]; then + "${corecompress}" "${core_target}" + # TODO: Figure out a way to tag the extension onto core_target. + fi + + MSG="${MSG}\r\nCore dumped: ${core_target}" + fi + else + MSG="Asterisk terminated with return code: $result" + fi + + [ -n "${tty+yes}" ] \ + && echo "${MSG}" >"${tty}" \ + || echo "${MSG}" + + if [[ -n "${crashemail+yes}" && -x /usr/sbin/sendmail ]]; then + echo -e -n "Subject: Asterisk crashed\r\n${MSG}\r\n" |\ + /usr/sbin/sendmail "${crashemail}" + fi + echo "Restarting asterisk after ${restartdelay}s ..." + sleep "${restartdelay}" +done + +echo "Terminating $progname." +exit 0 |