diff options
author | V3n3RiX <venerix@redcorelinux.org> | 2017-10-09 18:53:29 +0100 |
---|---|---|
committer | V3n3RiX <venerix@redcorelinux.org> | 2017-10-09 18:53:29 +0100 |
commit | 4f2d7949f03e1c198bc888f2d05f421d35c57e21 (patch) | |
tree | ba5f07bf3f9d22d82e54a462313f5d244036c768 /net-misc/asterisk/files |
reinit the tree, so we can have metadata
Diffstat (limited to 'net-misc/asterisk/files')
-rw-r--r-- | net-misc/asterisk/files/1.6.2/asterisk.logrotate3 | 25 | ||||
-rw-r--r-- | net-misc/asterisk/files/1.6.2/asterisk.logrotate4 | 27 | ||||
-rw-r--r-- | net-misc/asterisk/files/1.6.2/call_data.txt | 32 | ||||
-rw-r--r-- | net-misc/asterisk/files/1.6.2/find_call_ids.sh | 17 | ||||
-rw-r--r-- | net-misc/asterisk/files/1.6.2/find_call_sip_trace.sh | 21 | ||||
-rw-r--r-- | net-misc/asterisk/files/1.6.2/sip_calc_auth | 25 | ||||
-rw-r--r-- | net-misc/asterisk/files/1.8.0/asterisk.confd | 94 | ||||
-rw-r--r-- | net-misc/asterisk/files/1.8.0/asterisk.initd7 | 346 | ||||
-rw-r--r-- | net-misc/asterisk/files/1.8.0/asterisk.initd8 | 361 | ||||
-rw-r--r-- | net-misc/asterisk/files/1.8.0/find_call_ids.sh | 68 | ||||
-rw-r--r-- | net-misc/asterisk/files/1.8.0/find_call_sip_trace.sh | 76 | ||||
-rw-r--r-- | net-misc/asterisk/files/asterisk.service | 23 | ||||
-rw-r--r-- | net-misc/asterisk/files/asterisk.service.conf | 11 | ||||
-rw-r--r-- | net-misc/asterisk/files/asterisk.tmpfiles.conf | 2 |
14 files changed, 1128 insertions, 0 deletions
diff --git a/net-misc/asterisk/files/1.6.2/asterisk.logrotate3 b/net-misc/asterisk/files/1.6.2/asterisk.logrotate3 new file mode 100644 index 000000000000..69296c99e66d --- /dev/null +++ b/net-misc/asterisk/files/1.6.2/asterisk.logrotate3 @@ -0,0 +1,25 @@ +/var/log/asterisk/messages /var/log/asterisk/queue_log { + missingok + notifempty + + postrotate + /usr/sbin/asterisk -rnx "logger reload" || /bin/true + endscript +} + +/var/log/asterisk/debug /var/log/asterisk/full { + missingok + notifempty + daily + + postrotate + /usr/sbin/asterisk -rnx "logger reload" || /bin/true + endscript +} + +/var/log/asterisk/cdr-csv/*.csv /var/log/asterisk/cdr-custom/*.csv { + missingok + notifempty + weekly + rotate 52 +} diff --git a/net-misc/asterisk/files/1.6.2/asterisk.logrotate4 b/net-misc/asterisk/files/1.6.2/asterisk.logrotate4 new file mode 100644 index 000000000000..29e78eb16064 --- /dev/null +++ b/net-misc/asterisk/files/1.6.2/asterisk.logrotate4 @@ -0,0 +1,27 @@ +/var/log/asterisk/messages /var/log/asterisk/queue_log { + missingok + notifempty + + postrotate + test -e /run/openrc/softlevel && /etc/init.d/asterisk --quiet status && /usr/sbin/asterisk -rnx "logger reload" || /bin/true + test -e /run/systemd/system && systemctl is-active --quiet asterisk.service && /usr/sbin/asterisk -rnx "logger reload" || /bin/true + endscript +} + +/var/log/asterisk/debug /var/log/asterisk/full { + missingok + notifempty + daily + + postrotate + test -e /run/openrc/softlevel && /etc/init.d/asterisk --quiet status && /usr/sbin/asterisk -rnx "logger reload" || /bin/true + test -e /run/systemd/system && systemctl is-active --quiet asterisk.service && /usr/sbin/asterisk -rnx "logger reload" || /bin/true + endscript +} + +/var/log/asterisk/cdr-csv/*.csv /var/log/asterisk/cdr-custom/*.csv { + missingok + notifempty + weekly + rotate 52 +} diff --git a/net-misc/asterisk/files/1.6.2/call_data.txt b/net-misc/asterisk/files/1.6.2/call_data.txt new file mode 100644 index 000000000000..ba9cbbba98b5 --- /dev/null +++ b/net-misc/asterisk/files/1.6.2/call_data.txt @@ -0,0 +1,32 @@ +It's sometimes useful to look at SIP conversations in retrospect. If you have +a troublesome system, enable sip debug (in the CLI: sip set debug on), set up +logger.conf to log it to some file and then you can use the two scripts here to +extract the SIP converssations as seen by asterisk. + +find_call_ids.sh: + +This script will locate Call-ID values given an A and B number. Just invoke it with: + +find_call_ids.sh /path/to/log A-num B-num + +eg: + +find_call_ids.sh /var/log/asterisk/debug 102 105 + +To find the Call-IDs for calls going from ext 102 to ext 105 (depends on your +exact setup and the actual values being passed in the SIP INVITE packets) + +find_call_sip_trace.sh + +This script will extract a SIP conversation from the log for one or more +Call-ID values. Invoke with: + +find_call_sip_trace.sh /path/to/log Call-ID [...] + +Eg: + +find_call_sip_trace.sh /var/log/asterisk/debug 12341665haf434qgrq3@192.168.0.5 123123@192.168.0.3 + +This will find the SIP packets for those two conversations from the log +(interleaving the packets in the order asterisk output them - useful for +analysing the two SIP legs of the same call). diff --git a/net-misc/asterisk/files/1.6.2/find_call_ids.sh b/net-misc/asterisk/files/1.6.2/find_call_ids.sh new file mode 100644 index 000000000000..c4689bd1579d --- /dev/null +++ b/net-misc/asterisk/files/1.6.2/find_call_ids.sh @@ -0,0 +1,17 @@ +#! /bin/bash + +logfile=$1 +anum=$2 +bnum=$3 + +function usage() +{ + echo "USAGE: $1 logfile anum bnum" + exit -1 +} + +[ -r "${logfile}" ] || usage $0 +[ -n "${anum}" ] || usage $0 +[ -n "${bnum}" ] || usage $0 + +grep -B2 -P '^INVITE sip:'"${bnum}"'@.*\n(([^F].*|F[^r].*|Fr[^o].*|Fro[^m].*|From[^:]|From:.*<sip:'"${anum}"'@.*>.*)\r\n)+\r\n' "${logfile}" | awk '$4 ~ "^VERBOSE" { dt=$1" "$2" "$3 } $1=="Call-ID:" { if (cid != $2) { cid=$2; print dt" "cid; }}' diff --git a/net-misc/asterisk/files/1.6.2/find_call_sip_trace.sh b/net-misc/asterisk/files/1.6.2/find_call_sip_trace.sh new file mode 100644 index 000000000000..5b2e69e517b4 --- /dev/null +++ b/net-misc/asterisk/files/1.6.2/find_call_sip_trace.sh @@ -0,0 +1,21 @@ +#! /bin/bash + +logfile=$1 +callid=$2 + +function usage() +{ + echo "USAGE: $1 logfile Call-ID [Call-ID ...]" + exit -1 +} + +[ -r "${logfile}" ] || usage $0 +[ -n "${callid}" ] || usage $0 + +shift; shift; +while [ $# -gt 0 ]; do + callid="${callid}|$1" + shift +done + +dos2unix < "${logfile}" | grep -P '^.*\n<--- (SIP read|(Reliably )?(Ret|T)ransmitting) .*\n([^<\n].*\n)*Call-ID: ('"${callid//./\\.}"')\n((|[^<\n].*)\n)*<-+>$|^.* chan_sip.c: (Reliably )?(Ret|T)ransmitting .*\n([^-\n].*\n)*Call-ID: ('"${callid//./\\.}"')\n((|[^-\n].*)\n)*---$' diff --git a/net-misc/asterisk/files/1.6.2/sip_calc_auth b/net-misc/asterisk/files/1.6.2/sip_calc_auth new file mode 100644 index 000000000000..3f050ada5738 --- /dev/null +++ b/net-misc/asterisk/files/1.6.2/sip_calc_auth @@ -0,0 +1,25 @@ +#! /bin/bash + +[ $# -lt 7 ] && echo "USAGE: $0 username realm password method uri algorithm nonce" && exit 1 + +un=$1 +realm=$2 +pw=$3 +method=$4 +uri=$5 +alg=$6 +nonce=$7 + +echo "Using $un@$realm (secret $pw) for method $method to $uri with nonce $nonce (alg=$alg)" + +a1=$un:$realm:$pw +a2=$method:$uri +ha1=$(echo -n "$a1" | openssl $alg) +ha2=$(echo -n "$a2" | openssl $alg) +resp=$(echo -n "$ha1:$nonce:$ha2" | openssl $alg) + +echo "a1=$a1" +echo "a2=$a2" +echo "ha1=$ha1" +echo "ha2=$ha2" +echo "resp=$resp" diff --git a/net-misc/asterisk/files/1.8.0/asterisk.confd b/net-misc/asterisk/files/1.8.0/asterisk.confd new file mode 100644 index 000000000000..f826d46f245c --- /dev/null +++ b/net-misc/asterisk/files/1.8.0/asterisk.confd @@ -0,0 +1,94 @@ +# Copyright 1999-2011 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +# +# Additional options for asterisk +# +# see "asterisk -h" for a list of options +# +ASTERISK_OPTS="" + +# +# User and group to run asterisk as +# +# Value: double-colon separated list of user and group, or empty to run as root: +# +# +# "asterisk:asterisk" to run as user "asterisk" and group "asterisk" +# +# "asterisk" to run as user "asterisk" and all groups that user "asterisk" is a member of +# +# ":asterisk" to run as user "root" and group "asterisk" +# +# "" to run as user "root" and group "root" +# +ASTERISK_USER="asterisk" + +# +# Nicelevel +# +# Set the priority of the asterisk process +# +# Value: (highest) -20..19 (lowest) +# +#ASTERISK_NICE="19" + +# Send crash notifications emails to this address +# (needs a working mail service and /usr/sbin/sendmail to do so (e.g. ssmtp)) +# +# Value: Email address or empty to disable +# +#ASTERISK_NOTIFY_EMAIL="root" + +# +# Send asterisk's output to this terminal +# +# Value: Full path to device node or a number +# +#ASTERISK_TTY="/dev/tty9" + +# +# Start an asterisk console on the terminal specified by ASTERISK_TTY +# +# Warning! Use only for debugging, this is a potential security issue! +# +# Value: yes or no/empty +# +ASTERISK_CONSOLE="no" + +# +# Maximum size of core files. +# +# Value: Size in bytes, unlimited for no limit or empty to disable. +# +ASTERISK_CORE_SIZE="unlimited" + +# +# ASTERISK_CORE_DIR +# +# Value: Directory (will be created if non-existant), default is /tmp +# +ASTERISK_CORE_DIR="/var/lib/asterisk/coredump" + +# +# Max number of filedescriptors +# +# Value: Number of descriptors +# +ASTERISK_MAX_FD="4096" + +# +# Delay time before restarting asterisk after a crash. +# +# Value: Number of seconds to sleep after a crash before restarting. +# +ASTERISK_RESTART_DELAY=5 + +# +# Kill these tasks after asterisk crashed +# +# Warning! This will kill _ALL_ tasks with the specified names! +# +# Value: Space separated list of names in double quotes (e.g. "mpg123 mad") +# +#ASTERISK_CLEANUP_ON_CRASH="mpg123 asterisk-mpg123 mad" diff --git a/net-misc/asterisk/files/1.8.0/asterisk.initd7 b/net-misc/asterisk/files/1.8.0/asterisk.initd7 new file mode 100644 index 000000000000..0897919caac5 --- /dev/null +++ b/net-misc/asterisk/files/1.8.0/asterisk.initd7 @@ -0,0 +1,346 @@ +#!/sbin/openrc-run +# Copyright 1999-2013 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +extra_started_commands="forcestop reload" + +depend() { + need net + use nscd dns dahdi mysql postgresql slapd capi +} + +is_running() { + [ -r "${ast_rundir}/asterisk.pid" ] || return 1 + PID="$(cat "${ast_rundir}/asterisk.pid")" + [ -d "/proc/${PID}" ] || return 1 + EXE="$(readlink -f /proc/${PID}/exe)" + EXE="${EXE% (deleted)}" # in case asterisk got upgraded and we're still looking at an old one. + [ "${EXE}" = /usr/sbin/asterisk ] || return 1 # pid got re-used for another process. + + # PID reported in pidfile is active, and is still an asterisk instance. + return 0 +} + +# Sets up a few variables for us for use +# ast_instancename: eg, asterisk when RC_SVCNAME=asterisk, or asterisk(foo) when asterisk.foo. +# ast_rundir: directory to be used as run folder (pid and ctl files). +# ast_spooldir: +setup_svc_variables() +{ + local t + + ast_instancename=asterisk + ast_rundir=/var/run/${RC_SVCNAME} + ast_logdir=/var/log/${RC_SVCNAME} + ast_spooldir=/var/spool/${RC_SVCNAME} + ast_confdir=/etc/${RC_SVCNAME/.//} + + if [ "${RC_SVCNAME}" != "asterisk" ]; then + t="${RC_SVCNAME#asterisk.}" + if [ "${RC_SVCNAME}" = "${t}" ]; then + eerror "Invalid SVCNAME of ${RC_SVCNAME}, must be of the format asterisk.name." + return 1 + fi + ast_instancename+="(${t})" + fi + + [ -n "${ASTERISK_RUNDIR}" ] && ast_rundir="${ASTERISK_RUNDIR}" + [ -n "${ASTERISK_LOGDIR}" ] && ast_logdir="${ASTERISK_LOGDIR}" + [ -n "${ASTERISK_SPOOLDIR}" ] && ast_spooldir="${ASTERISK_SPOOLDIR}" + [ -n "${ASTERISK_CONFDIR}" ] && ast_confdir="${ASTERISK_CONFDIR}" + + return 0 +} + +asterisk_run_loop() { + local result=0 signal=0 + + echo "Initializing ${ast_instancename} wrapper" + OPTS="$*" + + trap "rm -f '${ast_rundir}/wrapper_loop.running'" EXIT + touch "${ast_rundir}/wrapper_loop.running" + + while [ -r "${ast_rundir}/wrapper_loop.running" ]; do + if [ -n "${TTY}" ]; then + /usr/bin/stty -F "${TTY}" sane + ${NICE} /usr/sbin/asterisk -C "${ast_confdir}/asterisk.conf" ${OPTS} >"${TTY}" 2>&1 <"${TTY}" + result=$? + else + ${NICE} /usr/sbin/asterisk -C "${ast_confdir}/asterisk.conf" ${OPTS} 2>&1 >/dev/null + result=$? + fi + + if [ "$result" -eq 0 ]; then + echo "Asterisk terminated normally" + break + else + if [ "$result" -gt 128 ]; then + signal="$(expr "$result" - 128)" + MSG="Asterisk terminated with Signal: $signal" + + CORE_TARGET="core-$(date "+%Y%m%d-%H%M%S")" + + local CORE_DUMPED=0 + if [ -f "${ASTERISK_CORE_DIR}/core" ]; then + mv "${ASTERISK_CORE_DIR}/core" \ + "${ASTERISK_CORE_DIR}/${CORE_TARGET}" + CORE_DUMPED=1 + + elif [ -f "${ASTERISK_CORE_DIR}/core.${PID}" ]; then + mv "${ASTERISK_CORE_DIR}/core.${PID}" \ + "${ASTERISK_CORE_DIR}/${CORE_TARGET}" + CORE_DUMPED=1 + + fi + + [ $CORE_DUMPED -eq 1 ] && \ + MSG="${MSG}\n\rCore dumped: ${ASTERISK_CORE_DIR}/${CORE_TARGET}" + else + MSG="Asterisk terminated with return code: $result" + fi + + # kill left-over tasks + for X in ${ASTERISK_CLEANUP_ON_CRASH}; do + kill -9 "$(pidof "${X}")"; + done + fi + + [ -n "${TTY}" ] \ + && echo "${MSG}" >"${TTY}" \ + || echo "${MSG}" + + + if [ -n "${ASTERISK_NOTIFY_EMAIL}" ] && \ + [ -x /usr/sbin/sendmail ]; then + echo -e -n "Subject: Asterisk crashed\r\n${MSG}\r\n" |\ + /usr/sbin/sendmail "${ASTERISK_NOTIFY_EMAIL}" + fi + sleep "${ASTERISK_RESTART_DELAY}" + echo "Restarting Asterisk..." + done + + echo "Terminating wrapper loop." + return 0 +} + +start() { + local OPTS USER GROUP PID + local tmp x + + local OPTS ARGS + + setup_svc_variables || return $? + + ebegin "Starting ${ast_instancename} PBX" + + eindent + + # filter (redundant) arguments + OPTS="$(echo "${ASTERISK_OPTS}" | sed -re "s:-[cfF]::g")" + + # default options + OPTS="${OPTS} -f" # don't fork / detach breaks wrapper script... + + # mangle yes/no options + ASTERISK_CONSOLE="$(echo ${ASTERISK_CONSOLE} | tr '[:lower:]' '[:upper:]')" + ASTERISK_WAITBOOTED="$(echo "${ASTERISK_WAITBOOTED}" | tr '[:lower:]' '[:upper:]')" + + ASTERISK_RESTART_DELAY="$(echo "${ASTERISK_RESTART_DELAY}" | sed -re 's/^([0-9]*).*/\1/')" + [ -z "${ASTERISK_RESTART_DELAY}" ] && ASTERISK_RESTART_DELAY=5 + + if [ -n "${ASTERISK_CORE_SIZE}" ] && + [ "${ASTERISK_CORE_SIZE}" != "0" ]; then + ulimit -c ${ASTERISK_CORE_SIZE} + + if [ -n "${ASTERISK_CORE_DIR}" ] && \ + [ ! -d "${ASTERISK_CORE_DIR}" ] + then + mkdir -m750 -p "${ASTERISK_CORE_DIR}" + + if [ -n "${ASTERISK_USER}" ]; then + chown -R "${ASTERISK_USER}" "${ASTERISK_CORE_DIR}" + fi + fi + ASTERISK_CORE_DIR="${ASTERISK_CORE_DIR:-/tmp}" + + cd "${ASTERISK_CORE_DIR}" + einfo "Core dump size : ${ASTERISK_CORE_SIZE}" + einfo "Core dump location : ${ASTERISK_CORE_DIR}" + + OPTS="${OPTS} -g" + fi + + if [ -n "${ASTERISK_MAX_FD}" ]; then + ulimit -n ${ASTERISK_MAX_FD} + einfo "Max open filedescriptors : ${ASTERISK_MAX_FD}" + fi + + if [ -n "${ASTERISK_NICE}" ]; then + if [ ${ASTERISK_NICE} -ge -20 ] && \ + [ ${ASTERISK_NICE} -le 19 ]; then + einfo "Nice level : ${ASTERISK_NICE}" + NICE="nice -n ${ASTERISK_NICE} --" + else + eerror "Nice value must be between -20 and 19" + return 1 + fi + else + NICE="" + fi + + if [ -n "${ASTERISK_NOTIFY_EMAIL}" ]; then + if [ -x /usr/sbin/sendmail ]; then + einfo "Email notifications go to : ${ASTERISK_NOTIFY_EMAIL}" + else + ewarn "Notifications disabled, /usr/sbin/sendmail doesn't exist or is not executable!" + unset ASTERISK_NOTIFY_EMAIL + fi + fi + + if [ -n "${ASTERISK_TTY}" ]; then + for x in ${ASTERISK_TTY} \ + /dev/tty${ASTERISK_TTY} \ + /dev/vc/${ASTERISK_TTY} + do + if [ -c "${x}" ]; then + TTY="${x}" + fi + done + [ -n "${TTY}" ] && \ + einfo "Messages are sent to : ${TTY}" + fi + + if [ "${ASTERISK_CONSOLE}" = "YES" ] && [ -n "${TTY}" ]; then + einfo "Starting Asterisk console : ${ASTERISK_CONSOLE}" + OPTS="${OPTS} -c" + fi + + if [ -n "${ASTERISK_USER}" ]; then + USER="$(echo $ASTERISK_USER | sed 's/:.*//')" + GROUP="$(echo $ASTERISK_USER | awk -F: '/.*:.*/ { print $2 }')" + if [ -n "${USER}" ]; then + if ! getent passwd "${USER}" &>/dev/null; then + eerror "Requested to run asterisk as ${USER}, which doesn't exist." + return 1 + fi + OPTS="${OPTS} -U ${USER}" + fi + if [ -n "${GROUP}" ]; then + if ! getent group "${GROUP}" &>/dev/null; then + eerror "Requested to run asterisk with group ${USER}, which doesn't exist." + return 1 + fi + OPTS="${OPTS} -G ${GROUP}" + GROUP=":${GROUP}" # make it look nice... + fi + checkpath -d -m 0755 -o ${USER}${GROUP} "${ast_logdir}" "${ast_rundir}" "${ast_spooldir}" + find "${ast_logdir}" "${ast_rundir}" "${ast_spooldir}" ! -user "${USER}" | while read element; do + ewarn "${USER} is not the owner of $element, or permissions are insufficient, fixing." + chown ${USER} "${element}" + chmod u+rX "${element}" + done; + einfo "Starting asterisk as : ${USER}${GROUP}" + else + checkpath -d -m 0755 -o root:root "${ast_logdir}" "${ast_rundir}" + ewarn "Starting asterisk as root is not recommended." + fi + + asterisk_run_loop ${OPTS} 2>&1 | logger -t "wrapper:${ast_instancename}" & + result=$? + + if [ $result -eq 0 ]; then + # 2 seconds should be enough for asterisk to start + sleep 2 + is_running + result=$? + + [ $result -eq 0 ] || wrapperstop + fi + + eoutdent + eend $result + + if [ $result -eq 0 -a "${ASTERISK_WAITBOOTED}" = "YES" ]; then + ebegin "Waiting for ${ast_instancename} to fully boot" + /usr/sbin/asterisk -C "${ast_confdir}/asterisk.conf" -r -x "core waitfullybooted" &>/dev/null + eend $? + fi + + return $result +} + +wrapperstop() { + # Accomodate system upgrades (so a previous version of the wrapper script that still uses a pid file may be running). + if [ -r "${ast_rundir}/wrapper_loop.pid" ]; then + ebegin "Killing wrapper script" + kill "$(cat /var/run/asterisk/wrapper_loop.pid)" + eend $? + fi + + # The new one (due to "hardened" requirements) uses a simpler + # flag to indicate running or shutting down. + if [ -r "${ast_rundir}/wrapper_loop.running" ]; then + ebegin "Signalling wrapper script to terminate" + rm "${ast_rundir}/wrapper_loop.running" + eend $? + fi + + return 0 +} + +forcestop() { + setup_svc_variables || return $? + + # Just to be sure - when we want to forcestop we should make it all tear down. + wrapperstop + + ebegin "Stopping asterisk PBX" + start-stop-daemon --stop --pidfile /var/run/asterisk/asterisk.pid + eend $? +} + +stop() { + setup_svc_variables || return $? + + wrapperstop + + if ! is_running; then + eerror "Asterisk is not running!" + return 0 + fi + + ebegin "Stopping asterisk PBX gracefully" + /usr/sbin/asterisk -C "${ast_confdir}/asterisk.conf" -r -x "core stop gracefully" &>/dev/null + # Now we have to wait until asterisk has _really_ stopped. + sleep 1 + if is_running; then + einfon "Waiting for asterisk to shutdown ." + local cnt=0 + while is_running; do + cnt="$(expr $cnt + 1)" + if [ $cnt -gt 60 ] ; then + # Waited 120 seconds now. Fail. + echo + eend 1 "Failed." + return + fi + sleep 2 + echo -n "." + done + echo + fi + eend 0 +} + +reload() { + setup_svc_variables || return $? + + if is_running; then + ebegin "Forcing asterisk to reload configuration" + /usr/sbin/asterisk -C "${ast_confdir}/asterisk.conf" -r -x "module reload" &>/dev/null + eend $? + else + eerror "Asterisk is not running!" + fi +} diff --git a/net-misc/asterisk/files/1.8.0/asterisk.initd8 b/net-misc/asterisk/files/1.8.0/asterisk.initd8 new file mode 100644 index 000000000000..4419dda06883 --- /dev/null +++ b/net-misc/asterisk/files/1.8.0/asterisk.initd8 @@ -0,0 +1,361 @@ +#!/sbin/openrc-run +# Copyright 1999-2016 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +extra_started_commands="forcestop reload" +extra_commands="checkperms" + +depend() { + need net + use nscd dns dahdi mysql postgresql slapd capi +} + +is_running() { + [ -r "${ast_rundir}/asterisk.pid" ] || return 1 + PID="$(cat "${ast_rundir}/asterisk.pid")" + [ -d "/proc/${PID}" ] || return 1 + EXE="$(readlink -f /proc/${PID}/exe)" + EXE="${EXE% (deleted)}" # in case asterisk got upgraded and we're still looking at an old one. + [ "${EXE}" = /usr/sbin/asterisk ] || return 1 # pid got re-used for another process. + + # PID reported in pidfile is active, and is still an asterisk instance. + return 0 +} + +# Sets up a few variables for us for use +# ast_instancename: eg, asterisk when RC_SVCNAME=asterisk, or asterisk(foo) when asterisk.foo. +# ast_rundir: directory to be used as run folder (pid and ctl files). +# ast_spooldir: +setup_svc_variables() +{ + local t + + ast_instancename=asterisk + ast_rundir=/var/run/${RC_SVCNAME} + ast_logdir=/var/log/${RC_SVCNAME} + ast_spooldir=/var/spool/${RC_SVCNAME} + ast_confdir=/etc/${RC_SVCNAME/.//} + + if [ "${RC_SVCNAME}" != "asterisk" ]; then + t="${RC_SVCNAME#asterisk.}" + if [ "${RC_SVCNAME}" = "${t}" ]; then + eerror "Invalid SVCNAME of ${RC_SVCNAME}, must be of the format asterisk.name." + return 1 + fi + ast_instancename+="(${t})" + fi + + [ -n "${ASTERISK_RUNDIR}" ] && ast_rundir="${ASTERISK_RUNDIR}" + [ -n "${ASTERISK_LOGDIR}" ] && ast_logdir="${ASTERISK_LOGDIR}" + [ -n "${ASTERISK_SPOOLDIR}" ] && ast_spooldir="${ASTERISK_SPOOLDIR}" + [ -n "${ASTERISK_CONFDIR}" ] && ast_confdir="${ASTERISK_CONFDIR}" + + if [ -n "${ASTERISK_USER}" ]; then + ast_user="${ASTERISK_USER%%:*}" + ast_group="${ASTERISK_USER#*:}" + ast_group="${ast_group%%:*}" + [ -z "${ast_user}" ] && ast_user=root + [ -z "${ast_group}" ] && ast_group="$(getent group $(getent passwd "${ast_user}" | awk -F: '{ print $4 }') | sed -re 's/:.*//')" + fi + + [ -z "${ast_user}" ] && ast_user=root + [ -z "${ast_group}" ] && ast_group=root + + return 0 +} + +checkperms() { + setup_svc_variables + + local path + checkpath -d -m 0755 -o ${ast_user}:${ast_group} "${ast_logdir}" "${ast_rundir}" "${ast_spooldir}" + for path in "${ast_rundir}" "${ast_spooldir}" "${ast_logdir}"; do + ebegin "Checking ${path}" + find "${path}" ! -user "${ast_user}" | while read element; do + [[ "${element}" = *.gz ]] && continue # Skip logrotated files. + ewarn "${ast_user} is not the owner of ${element}, or permissions are insufficient, fixing." + chown ${ast_user} "${element}" + chmod u+rwX "${element}" + done; + eend 0 + done +} + +asterisk_run_loop() { + local result=0 signal=0 + + echo "Initializing ${ast_instancename} wrapper" + OPTS="$*" + + trap "rm -f '${ast_rundir}/wrapper_loop.running'" EXIT + touch "${ast_rundir}/wrapper_loop.running" + + while [ -r "${ast_rundir}/wrapper_loop.running" ]; do + if [ -n "${TTY}" ]; then + /usr/bin/stty -F "${TTY}" sane + ${NICE} /usr/sbin/asterisk -C "${ast_confdir}/asterisk.conf" ${OPTS} >"${TTY}" 2>&1 <"${TTY}" + result=$? + else + ${NICE} /usr/sbin/asterisk -C "${ast_confdir}/asterisk.conf" ${OPTS} 2>&1 >/dev/null + result=$? + fi + + if [ "$result" -eq 0 ]; then + echo "Asterisk terminated normally" + break + else + if [ "$result" -gt 128 ]; then + signal="$(expr "$result" - 128)" + MSG="Asterisk terminated with Signal: $signal" + + CORE_TARGET="core-$(date "+%Y%m%d-%H%M%S")" + + local CORE_DUMPED=0 + if [ -f "${ASTERISK_CORE_DIR}/core" ]; then + mv "${ASTERISK_CORE_DIR}/core" \ + "${ASTERISK_CORE_DIR}/${CORE_TARGET}" + CORE_DUMPED=1 + + elif [ -f "${ASTERISK_CORE_DIR}/core.${PID}" ]; then + mv "${ASTERISK_CORE_DIR}/core.${PID}" \ + "${ASTERISK_CORE_DIR}/${CORE_TARGET}" + CORE_DUMPED=1 + + fi + + [ $CORE_DUMPED -eq 1 ] && \ + MSG="${MSG}\n\rCore dumped: ${ASTERISK_CORE_DIR}/${CORE_TARGET}" + else + MSG="Asterisk terminated with return code: $result" + fi + + # kill left-over tasks + for X in ${ASTERISK_CLEANUP_ON_CRASH}; do + kill -9 "$(pidof "${X}")"; + done + fi + + [ -n "${TTY}" ] \ + && echo "${MSG}" >"${TTY}" \ + || echo "${MSG}" + + + if [ -n "${ASTERISK_NOTIFY_EMAIL}" ] && \ + [ -x /usr/sbin/sendmail ]; then + echo -e -n "Subject: Asterisk crashed\r\n${MSG}\r\n" |\ + /usr/sbin/sendmail "${ASTERISK_NOTIFY_EMAIL}" + fi + sleep "${ASTERISK_RESTART_DELAY}" + echo "Restarting Asterisk..." + done + + echo "Terminating wrapper loop." + return 0 +} + +start() { + local OPTS PID + local tmp x + + local OPTS ARGS + + setup_svc_variables || return $? + + ebegin "Starting ${ast_instancename} PBX" + + eindent + + # filter (redundant) arguments + OPTS="$(echo "${ASTERISK_OPTS}" | sed -re "s:-[cfF]::g")" + + # default options + OPTS="${OPTS} -f" # don't fork / detach breaks wrapper script... + + # mangle yes/no options + ASTERISK_CONSOLE="$(echo ${ASTERISK_CONSOLE} | tr '[:lower:]' '[:upper:]')" + ASTERISK_WAITBOOTED="$(echo "${ASTERISK_WAITBOOTED}" | tr '[:lower:]' '[:upper:]')" + + ASTERISK_RESTART_DELAY="$(echo "${ASTERISK_RESTART_DELAY}" | sed -re 's/^([0-9]*).*/\1/')" + [ -z "${ASTERISK_RESTART_DELAY}" ] && ASTERISK_RESTART_DELAY=5 + + if [ -n "${ASTERISK_CORE_SIZE}" ] && + [ "${ASTERISK_CORE_SIZE}" != "0" ]; then + ulimit -c ${ASTERISK_CORE_SIZE} + + if [ -n "${ASTERISK_CORE_DIR}" ] && \ + [ ! -d "${ASTERISK_CORE_DIR}" ] + then + checkpath -d -m 0755 -o ${ast_user}:${ast_group} "${ASTERISK_CORE_DIR}" + fi + ASTERISK_CORE_DIR="${ASTERISK_CORE_DIR:-/tmp}" + + cd "${ASTERISK_CORE_DIR}" + einfo "Core dump size : ${ASTERISK_CORE_SIZE}" + einfo "Core dump location : ${ASTERISK_CORE_DIR}" + + OPTS="${OPTS} -g" + fi + + if [ -n "${ASTERISK_MAX_FD}" ]; then + ulimit -n ${ASTERISK_MAX_FD} + einfo "Max open filedescriptors : ${ASTERISK_MAX_FD}" + fi + + if [ -n "${ASTERISK_NICE}" ]; then + if [ ${ASTERISK_NICE} -ge -20 ] && \ + [ ${ASTERISK_NICE} -le 19 ]; then + einfo "Nice level : ${ASTERISK_NICE}" + NICE="nice -n ${ASTERISK_NICE} --" + else + eerror "Nice value must be between -20 and 19" + return 1 + fi + else + NICE="" + fi + + if [ -n "${ASTERISK_NOTIFY_EMAIL}" ]; then + if [ -x /usr/sbin/sendmail ]; then + einfo "Email notifications go to : ${ASTERISK_NOTIFY_EMAIL}" + else + ewarn "Notifications disabled, /usr/sbin/sendmail doesn't exist or is not executable!" + unset ASTERISK_NOTIFY_EMAIL + fi + fi + + if [ -n "${ASTERISK_TTY}" ]; then + for x in ${ASTERISK_TTY} \ + /dev/tty${ASTERISK_TTY} \ + /dev/vc/${ASTERISK_TTY} + do + if [ -c "${x}" ]; then + TTY="${x}" + fi + done + [ -n "${TTY}" ] && \ + einfo "Messages are sent to : ${TTY}" + fi + + if [ "${ASTERISK_CONSOLE}" = "YES" ] && [ -n "${TTY}" ]; then + einfo "Starting Asterisk console : ${ASTERISK_CONSOLE}" + OPTS="${OPTS} -c" + fi + + if ! getent passwd "${ast_user}" &>/dev/null; then + eerror "Requested to run asterisk as ${ast_user}, which doesn't exist." + return 1 + fi + OPTS="${OPTS} -U ${ast_user}" + + if ! getent group "${ast_group}" &>/dev/null; then + eerror "Requested to run asterisk with group ${ast_group}, which doesn't exist." + return 1 + fi + OPTS="${OPTS} -G ${ast_group}" + + if [ "${ast_user}" = root ]; then + ewarn "Starting asterisk as root is not recommended (SERIOUS SECURITY CONSIDERATIONS)." + elif [ "${ast_group}" = root ]; then + ewarn "Starting asterisk with group root is not recommended (SERIOUS SECURITY CONSIDERATIONS)." + fi + + checkpath -d -m 0755 -o "${ast_user}:${ast_group}" "${ast_logdir}" "${ast_rundir}" + einfo "Starting asterisk as : ${ast_user}:${ast_group}" + asterisk_run_loop ${OPTS} 2>&1 | logger -t "wrapper:${ast_instancename}" & + result=$? + + if [ $result -eq 0 ]; then + # 2 seconds should be enough for asterisk to start + sleep 2 + is_running + result=$? + + [ $result -eq 0 ] || wrapperstop + fi + + eoutdent + eend $result + + if [ $result -eq 0 -a "${ASTERISK_WAITBOOTED}" = "YES" ]; then + ebegin "Waiting for ${ast_instancename} to fully boot" + /usr/sbin/asterisk -C "${ast_confdir}/asterisk.conf" -r -x "core waitfullybooted" &>/dev/null + eend $? + fi + + return $result +} + +wrapperstop() { + # Accomodate system upgrades (so a previous version of the wrapper script that still uses a pid file may be running). + if [ -r "${ast_rundir}/wrapper_loop.pid" ]; then + ebegin "Killing wrapper script" + kill "$(cat /var/run/asterisk/wrapper_loop.pid)" + eend $? + fi + + # The new one (due to "hardened" requirements) uses a simpler + # flag to indicate running or shutting down. + if [ -r "${ast_rundir}/wrapper_loop.running" ]; then + ebegin "Signalling wrapper script to terminate" + rm "${ast_rundir}/wrapper_loop.running" + eend $? + fi + + return 0 +} + +forcestop() { + setup_svc_variables || return $? + + # Just to be sure - when we want to forcestop we should make it all tear down. + wrapperstop + + ebegin "Stopping asterisk PBX" + start-stop-daemon --stop --pidfile /var/run/asterisk/asterisk.pid + eend $? +} + +stop() { + setup_svc_variables || return $? + + wrapperstop + + if ! is_running; then + eerror "Asterisk is not running!" + return 0 + fi + + ebegin "Stopping asterisk PBX gracefully" + /usr/sbin/asterisk -C "${ast_confdir}/asterisk.conf" -r -x "core stop gracefully" &>/dev/null + # Now we have to wait until asterisk has _really_ stopped. + sleep 1 + if is_running; then + einfon "Waiting for asterisk to shutdown ." + local cnt=0 + while is_running; do + cnt="$(expr $cnt + 1)" + if [ $cnt -gt 60 ] ; then + # Waited 120 seconds now. Fail. + echo + eend 1 "Failed." + return + fi + sleep 2 + echo -n "." + done + echo + fi + eend 0 +} + +reload() { + setup_svc_variables || return $? + + if is_running; then + ebegin "Forcing asterisk to reload configuration" + /usr/sbin/asterisk -C "${ast_confdir}/asterisk.conf" -r -x "module reload" &>/dev/null + eend $? + else + eerror "Asterisk is not running!" + fi +} diff --git a/net-misc/asterisk/files/1.8.0/find_call_ids.sh b/net-misc/asterisk/files/1.8.0/find_call_ids.sh new file mode 100644 index 000000000000..321f3dacd624 --- /dev/null +++ b/net-misc/asterisk/files/1.8.0/find_call_ids.sh @@ -0,0 +1,68 @@ +#! /bin/bash + +logfile=$1 +anum=$2 +bnum=$3 + +function usage() +{ + echo "USAGE: $1 logfile anum bnum" + exit -1 +} + +[ -r "${logfile}" ] || usage $0 +[ -n "${anum}" ] || usage $0 +[ -n "${bnum}" ] || usage $0 + +#echo "Finding calls from '${anum}' to '${bnum}' in ${logfile}." + +# modes: +# 0 - not processing an INVITE. +# 1 - processing an INVITE. +# 2 - from matched (processing). +dos2unix < "${logfile}" | awk ' + BEGIN { mode = 0 } + mode==0 && $4~"^VERBOSE" { + dt=$1" "$2" "$3 + } + + mode==0 && $1=="INVITE" && $2 ~ "^sip:'"${bnum}"'@" { + #print + + mode=1 + + split($2, a, "[:@]") + bnum=a[2] + } + + mode==1 && $1=="From:" { + #print + if ($3 ~ "^<sip:'"${anum}"'@.*>") { + mode=2 + split($3, a, "[:@]") + anum=a[2] + } else { + #print "From does not match ... leaving block." + mode = 0 + } + } + + mode!=0 && $1=="Call-ID:" { + callid=$2 + + if (NF!=2) { + print "WTF @ Call-ID header having NF!=2" + } + } + + mode==1 && $0=="" { + #print "Leaving block (no match)" + mode = 0 + } + + mode==2 && $0=="" { + #print "Leaving block (match)" + print dt " " anum " " bnum " " callid + mode = 0 + } +' diff --git a/net-misc/asterisk/files/1.8.0/find_call_sip_trace.sh b/net-misc/asterisk/files/1.8.0/find_call_sip_trace.sh new file mode 100644 index 000000000000..06ae824def5c --- /dev/null +++ b/net-misc/asterisk/files/1.8.0/find_call_sip_trace.sh @@ -0,0 +1,76 @@ +#! /bin/bash + +logfile=$1 +callid=$2 + +function usage() +{ + echo "USAGE: $1 logfile Call-ID [Call-ID ...]" + exit -1 +} + +[ -r "${logfile}" ] || usage $0 +[ -n "${callid}" ] || usage $0 + +shift; shift; +while [ $# -gt 0 ]; do + callid="${callid}|$1" + shift +done + +# modes: +# 0 - searching for SIP start block ... +# 1 - transmit of sorts +# 2 - receive + +dos2unix < "${logfile}" | awk ' + BEGIN { mode = 0 } + mode==0 && $4~"^VERBOSE" { + dt=$1" "$2" "$3 + } + + mode!=0 && $1 == "Call-ID:" { + #print + + if ($2 ~ /('"${callid}"')/) { + callidmatch=1 + } else { + #print $2" does not match ^('"${callid}"')$" + mode=0 + } + } + + (mode==1 && $0=="---") || (mode==2 && $0=="<------------->") { + if (callidmatch) { + print dt" "sipmode"\n"pckt"---" + } + + mode=0 + } + + mode!=0 { + pckt = pckt $0 "\n" + } + + mode==0 && $0 ~ "chan_sip[.]c: .*[tT]ransmitting" { + #print + + if ($6 == "Retransmitting") { + sipmode = $6" "$7" to "$NF + } else { + sipmode = "Transmitting to "$NF + } + + mode=1 + pckt="" + callidmatch=0 + } + + mode==0 && $0 ~ "SIP read from" { + #print + mode=2 + pckt="" + callidmatch=0 + sipmode="Received from "$5":" + } +' diff --git a/net-misc/asterisk/files/asterisk.service b/net-misc/asterisk/files/asterisk.service new file mode 100644 index 000000000000..08245d9fe87f --- /dev/null +++ b/net-misc/asterisk/files/asterisk.service @@ -0,0 +1,23 @@ +[Unit] +Description=Asterisk PBX and telephony daemon. +After=network.target + +[Service] +Type=simple +WorkingDirectory=/var/lib/asterisk +User=asterisk +Group=asterisk +ExecStart=/usr/sbin/asterisk -f -C /etc/asterisk/asterisk.conf +ExecStop=/usr/sbin/asterisk -rx 'core stop now' +ExecReload=/usr/sbin/asterisk -rx 'core reload' + +LimitNOFILE=4096 +ProtectSystem=full +ProtectHome=yes +PrivateTmp=yes + +Restart=always +RestartSec=5 + +[Install] +WantedBy=multi-user.target diff --git a/net-misc/asterisk/files/asterisk.service.conf b/net-misc/asterisk/files/asterisk.service.conf new file mode 100644 index 000000000000..b7f83b71c5b0 --- /dev/null +++ b/net-misc/asterisk/files/asterisk.service.conf @@ -0,0 +1,11 @@ +# Uncomment the following 7 lines to start asterisk with a console on tty7 +# +# Warning! Use only for debugging, this is a potential security issue! +# +# [Service] +# ExecStart= +# ExecStart=/usr/sbin/asterisk -f -c -C /etc/asterisk/asterisk.conf +# TTYPath=/dev/tty7 +# StandardInput=tty +# StandardOutput=tty +# StandardError=tty diff --git a/net-misc/asterisk/files/asterisk.tmpfiles.conf b/net-misc/asterisk/files/asterisk.tmpfiles.conf new file mode 100644 index 000000000000..637302a27373 --- /dev/null +++ b/net-misc/asterisk/files/asterisk.tmpfiles.conf @@ -0,0 +1,2 @@ +d /var/run/asterisk 0750 asterisk asterisk +d /var/spool/asterisk 0750 asterisk asterisk |