diff options
Diffstat (limited to 'contrib')
-rwxr-xr-x | contrib/scripts/ast_logescalator | 399 |
1 files changed, 399 insertions, 0 deletions
diff --git a/contrib/scripts/ast_logescalator b/contrib/scripts/ast_logescalator new file mode 100755 index 000000000..054ef9b9c --- /dev/null +++ b/contrib/scripts/ast_logescalator @@ -0,0 +1,399 @@ +#!/usr/bin/env bash +# Turn on extended globbing +shopt -s extglob +# Bail on any error +set -e + +prog=$(basename $0) + +print_help() { +cat <<EOF +NAME + $prog - Escalate Asterisk logging levels + +SYNOPSIS + $prog [ --help ] | [ [ --reset ] | [ + [ --uniqueid="<uniqueid>" ] + + [ --pjsip-debug=<on|off> ] [ --sip-debug=<on|off> ] + [ --iax2-debug=<on|off> ] + + [ --agi-debug=<on|off> ] [ --ami-debug=<on|off> ] + [ --ari-debug=<on|off> ] [ --cdr-debug=<on|off> ] + [ --channel-debug=<on|off> ] [ --rtp-debug=<on|off> ] + [ --rtcp-debug=<on|off> ] + + [ --dtmf-debug=<on|off> ] [ --fax-debug=<on|off> ] + [ --security-debug=<on|off> ] + + [ --pjsip-history=<on|off> ] [ --sip-history=<on|off> ] + + [ --verbose=<level> ] [ --debug=<level> ] + ] ] + +DESCRIPTION + + Escalates log and/or debug levels on Asterisk subsystems. + + Options: + + --help + Print this help. + + --reset + Resets logging to the pre-escalation state. + + --uniqueid="<uniqueid>" + Normally DATEFORMAT from ast_debug_tools.conf is used to make + the log files unique but you can set the unique id to + something else such as the Jira issue. Once any logging + is enabled, the uniqueid is stored in cli.conf so any future + on/off commands will use the same uniqueid. Use the --reset + option to reset it (and everything else). + + --pjsip-debug --sip-debug --iax2-debug --agi-debug --ami-debug + --ari-debug --cdr-debug --channel-debug --rtp-debug --rtcp-debug + Issues the subsystem appropriate command to turn on + or off debugging. These are usually functional debug messages + such as packet dumps as opposed to code level messages and usually + go to the VERBOSE log channel. + + --dtmf-debug --fax-debug --security-debug + These subsystems set up their own log channels so if turned + on, log files will be created in \$astlogdir for them. + + --pjsip-history --sip-history + The pjsip and sip channels have the ability to output an + abbreviated, one-line, packet summary. If enabled, the summaries + will be written to \$astlogdir/pjsip_history.\$UNIQUEID and + \$astlogdir/sip_history.\$UNIQUEID. + + --verbose-level --debug-level + Sets the levels for their respective messages. + +NOTES + + The escalator works by creating a set of startup commands in cli.conf + that set up logger channels and issue the debug commands. If asterisk + is running when $prog is executed, the same commands will be issued + to the running instance. The original cli.conf is saved before any + changes are made and can be restored by executing '$prog --reset'. + + The log output will be stored in... + \$astlogdir/message.\$uniqueid + \$astlogdir/debug.\$uniqueid + \$astlogdir/dtmf.\$uniqueid + \$astlogdir/fax.\$uniqueid + \$astlogdir/security.\$uniqueid + \$astlogdir/pjsip_history.\$uniqueid + \$astlogdir/sip_history.\$uniqueid + +EOF + exit 1 +} + +PJSIP_DEBUG_SPECIFIED=false +PJSIP_HISTORY_SPECIFIED=false +SIP_DEBUG_SPECIFIED=false +SIP_HISTORY_SPECIFIED=false +IAX2_DEBUG_SPECIFIED=false +ARI_DEBUG_SPECIFIED=false +AMI_DEBUG_SPECIFIED=false +AGI_DEBUG_SPECIFIED=false +CDR_DEBUG_SPECIFIED=false +CHANNEL_DEBUG_SPECIFIED=false +RTP_DEBUG_SPECIFIED=false +RTCP_DEBUG_SPECIFIED=false +DTMF_DEBUG_SPECIFIED=false +FAX_DEBUG_SPECIFIED=false +SECURITY_DEBUG_SPECIFIED=false +DEBUG_LEVEL_SPECIFIED=false +VERBOSE_LEVEL_SPECIFIED=false +DEBUGS=false +RESET=false + +declare -A DEBUG_COMMANDS=( +[PJSIP,on]="pjsip set logger on" [PJSIP,off]="pjsip set logger off" +[SIP,on]="sip set debug on" [SIP,off]="sip set debug off" +[IAX2,on]="iax2 set debug on" [IAX2,off]="iax2 set debug off" +[ARI,on]="ari set debug all on" [ARI,off]="ari set debug all off" +[AMI,on]="manager set debug on" [AMI,off]="manager set debug off" +[AGI,on]="agi set debug on" [AGI,off]="agi set debug off" +[CDR,on]="cdr set debug on" [CDR,off]="cdr set debug off" +[CHANNEL,on]="core set debug channel all" [CHANNEL,off]="core set debug channel all off" +[RTP,on]="rtp set debug on" [RTP,on]="rtp set debug off" +[RTCP,on]="rtcp set debug on" [RTCP,off]="rtcp set debug off" +) + +VERBOSE_LEVELS="NOTICE,WARNING,ERROR,VERBOSE" +DEBUG_LEVELS="DEBUG" + +# Read config files from least important to most important +[ -f /etc/asterisk/ast_debug_tools.conf ] && source /etc/asterisk/ast_debug_tools.conf +[ -f ~/ast_debug_tools.conf ] && source ~/ast_debug_tools.conf +[ -f ./ast_debug_tools.conf ] && source ./ast_debug_tools.conf + +DATEFORMAT=${DATEFORMAT:-'date +%FT%H-%M-%S%z'} +UNIQUEID=$($DATEFORMAT) +UNIQUEID_SPECIFIED=false + +for a in "$@" ; do + case "$a" in + --*-debug=*) + subsystem=${a%-debug=*} + subsystem=${subsystem#--} + flag=${a#*=} + if [[ ${flag,,} =~ ^y(es)?|on ]] ; then + eval ${subsystem^^}_DEBUG=true + else + eval ${subsystem^^}_DEBUG=false + fi + eval ${subsystem^^}_DEBUG_SPECIFIED=true + DEBUGS=true + ;; + --pjsip-history=*) + ;& + --sip-history=*) + subsystem=${a%-history=*} + subsystem=${subsystem#--} + if [[ ${a#*=} =~ ^[Yy].* ]] ; then + eval ${subsystem^^}_HISTORY=true + else + eval ${subsystem^^}_HISTORY=false + fi + eval ${subsystem^^}_HISTORY_SPECIFIED=true + DEBUGS=true + ;; + --verbose=*) + VERBOSE_LEVEL=${a#*=} + VERBOSE_LEVEL_SPECIFIED=true + DEBUGS=true + ;; + --debug=*) + DEBUG_LEVEL=${a#*=} + DEBUG_LEVEL_SPECIFIED=true + DEBUGS=true + ;; + --reset) + RESET=true + ;; + --uniqueid=*) + UNIQUEID=${a#*=} + UNIQUEID_SPECIFIED=true + DEBUGS=true + ;; + --help|*) + print_help + ;; + esac +done + +if $DEBUGS && $RESET ; then + echo "--reset must be specified by itself" + print_help +fi + +if ! $DEBUGS && ! $RESET ; then + echo "No options specified." + print_help +fi + +ASTERISK_IS_RUNNING=false +CONFIG_DIR=/etc/asterisk +LOG_DIR=/var/log/asterisk + +if [ "$(pidof asterisk)" != "" ] ; then + CONFIG_DIR=`asterisk -rx "core show settings" | sed -n -r -e "s/^\s*Configuration\s+directory:\s+(.*)$/\1/gp"` + LOG_DIR=`asterisk -rx "core show settings" | sed -n -r -e "s/^\s*Log\s+directory:\s+(.*)$/\1/gp"` + ASTERISK_IS_RUNNING=true +fi +CLI_CONF="$CONFIG_DIR/cli.conf" + +if [ ! -f "$CLI_CONF" ] ; then + echo "The location of cli.conf could not be determined." + exit 1 +fi + +if $RESET ; then + if [ -f "$CLI_CONF.unescalated" ] ; then + mv "$CLI_CONF.unescalated" "$CLI_CONF" + fi + if $ASTERISK_IS_RUNNING ; then + ( + asterisk -rx "core set verbose 0" + asterisk -rx "core set debug 0" + asterisk -rx "pjsip set logger off" + asterisk -rx "pjsip set history off" + asterisk -rx "sip set debug off" + asterisk -rx "sip set history off" + asterisk -rx "iax2 set debug off" + asterisk -rx "manager set debug off" + asterisk -rx "ari set debug all off" + asterisk -rx "agi set debug off" + asterisk -rx "rtp set debug off" + asterisk -rx "rtcp set debug off" + asterisk -rx "cdr set debug off" + asterisk -rx "core set debug channel all off" + asterisk -rx "logger reload" + ) >/dev/null 2>&1 || : + fi + exit 1 +fi + +if ! grep -q "; --START DEBUG_LOGGING-- ;" $CLI_CONF ; then + VERBOSE_LOG="$LOG_DIR/message.${UNIQUEID}" + DEBUG_LOG="$LOG_DIR/debug.${UNIQUEID}" + PJSIP_HISTORY_LOG="$LOG_DIR/pjsip_history.${UNIQUEID}" + SIP_HISTORY_LOG="$LOG_DIR/sip_history.${UNIQUEID}" + DTMF_LOG="$LOG_DIR/dtmf.${UNIQUEID}" + FAX_LOG="$LOG_DIR/fax.${UNIQUEID}" + SECURITY_LOG="$LOG_DIR/security.${UNIQUEID}" + + cp "$CLI_CONF" "$CLI_CONF.unescalated" + + sed -i -r -e "s/\[startup_commands\]/[startup_commands_original](!)/g" "$CLI_CONF" + + cat >> "$CLI_CONF" <<-EOF + ; --START DEBUG_LOGGING-- ; + + [pjsip_debug](!) + pjsip set logger on = yes + + [sip_debug](!) + sip set debug on = yes + + [iax2_debug](!) + iax2 set debug on = yes + + [ari_debug](!) + ari set debug all on = yes + + [ami_debug](!) + manager set debug on = yes + + [agi_debug](!) + agi set debug on = yes + + [cdr_debug](!) + cdr set debug on = yes + + [channel_debug](!) + core set debug channel all = yes + + [rtp_debug](!) + rtp set debug on = yes + + [rtcp_debug](!) + rtcp set debug on = yes + + [dtmf_debug](!) + logger add channel $DTMF_LOG DTMF = yes + + [fax_debug](!) + logger add channel $FAX_LOG FAX = yes + + [security_debug](!) + logger add channel $SECURITY_LOG SECURITY = yes + + [pjsip_history](!) + logger add channel $PJSIP_HISTORY_LOG PJSIP_HISTORY = yes + pjsip set history on = yes + + [sip_history](!) + logger add channel $SIP_HISTORY_LOG SIP_HISTORY = yes + sip set history on = yes + + [verbose_level](!) + core set verbose 3 = yes + + [debug_level](!) + core set debug 3 = yes + + [log_channels](!) + logger add channel $VERBOSE_LOG NOTICE,WARNING,ERROR,VERBOSE = yes + logger add channel $DEBUG_LOG DEBUG = yes + + [startup_commands](startup_commands_original,log_channels) + + ; --END DEBUG_LOGGING-- ; + EOF + +else + if $UNIQUEID_SPECIFIED ; then + echo "Debug logging is already active. Either rerun $prog without --uniqueid or with --reset to start over." + exit 1 + fi + + VERBOSE_LOG=$(sed -n -r -e "s@logger add channel ($LOG_DIR/message\..+)\s+NOTICE.*@\1@p" "$CLI_CONF") + DEBUG_LOG=$(sed -n -r -e "s@logger add channel ($LOG_DIR/debug\..+)\s+DEBUG.*@\1@p" "$CLI_CONF") + PJSIP_HISTORY_LOG=$(sed -n -r -e "s@logger add channel ($LOG_DIR/pjsip_history\..+)\s+PJSIP.*@\1@p" "$CLI_CONF") + SIP_HISTORY_LOG=$(sed -n -r -e "s@logger add channel ($LOG_DIR/sip_history\..+)\s+SIP.*@\1@p" "$CLI_CONF") + DTMF_LOG=$(sed -n -r -e "s@logger add channel ($LOG_DIR/dtmf\..+)\s+DTMF.*@\1@p" "$CLI_CONF") + FAX_LOG=$(sed -n -r -e "s@logger add channel ($LOG_DIR/fax\..+)\s+FAX.*@\1@p" "$CLI_CONF") + SECURITY_LOG=$(sed -n -r -e "s@logger add channel ($LOG_DIR/security\..+)\s+SECURITY.*@\1@p" "$CLI_CONF") +fi + +for x in PJSIP SIP ARI AMI AGI ARI IAX2 CDR RTP RTCP ; do + if eval \$${x}_DEBUG_SPECIFIED ; then + if eval \$${x}_DEBUG ; then + if $ASTERISK_IS_RUNNING ; then + asterisk -rx "${DEBUG_COMMANDS[$x,on]}" + fi + egrep -q "^\[startup_commands\].*${x,,}_debug.*" "$CLI_CONF" || + sed -i -r -e "/\[startup_commands\]/ s/\((.*)\)/(\1,${x,,}_debug)/g" "$CLI_CONF" + else + if $ASTERISK_IS_RUNNING ; then + asterisk -rx "${DEBUG_COMMANDS[$x,off]}" + fi + sed -i -r -e "/\[startup_commands\].*${x,,}_debug.*/ s/,${x,,}_debug//g" "$CLI_CONF" + fi + fi +done + +for x in DTMF FAX SECURITY ; do + if eval \$${x}_DEBUG_SPECIFIED ; then + if eval \$${x}_DEBUG ; then + if $ASTERISK_IS_RUNNING ; then + asterisk -rx "$(eval "echo logger add channel \$${x}_LOG ${x}")" >/dev/null 2>&1 + fi + egrep -q "^\[startup_commands\].*${x,,}_debug.*" "$CLI_CONF" || + sed -i -r -e "/\[startup_commands\]/ s/\((.*)\)/(\1,${x,,}_debug)/g" "$CLI_CONF" + else + if $ASTERISK_IS_RUNNING ; then + asterisk -rx "$(eval "echo logger remove channel \$${x}_LOG")" + fi + sed -i -r -e "/\[startup_commands\].*${x,,}_debug.*/ s/,${x,,}_debug//g" "$CLI_CONF" + fi + fi +done + +for x in PJSIP SIP ; do + if eval \$${x}_HISTORY_SPECIFIED ; then + if eval \$${x}_HISTORY ; then + if $ASTERISK_IS_RUNNING ; then + asterisk -rx "$(eval "echo logger add channel \$${x}_HISTORY_LOG ${x}_HISTORY")" + asterisk -rx "${x,,} set history on" + fi + egrep -q "^\[startup_commands\].*${x,,}_history.*" "$CLI_CONF" || + sed -i -r -e "/\[startup_commands\]/ s/\((.*)\)/(\1,${x,,}_history)/g" "$CLI_CONF" + else + if $ASTERISK_IS_RUNNING ; then + asterisk -rx "$(eval "echo logger remove channel \$${x}_HISTORY_LOG")" + asterisk -rx "${x,,} set history off" + fi + sed -i -r -e "/\[startup_commands\].*${x,,}_history.*/ s/,${x,,}_history//g" "$CLI_CONF" + fi + fi +done + +for x in VERBOSE DEBUG ; do + if eval \$${x}_LEVEL_SPECIFIED ; then + if $ASTERISK_IS_RUNNING ; then + asterisk -rx "$(eval "echo logger add channel \$${x}_LOG \$${x}_LEVELS")" + asterisk -rx "$(eval "echo core set ${x,,} \$${x}_LEVEL")" + fi + sed -i -r -e "$(eval "echo s/core set ${x,,} .*/core set ${x,,} \$${x}_LEVEL/g")" "$CLI_CONF" + egrep -q "^\[startup_commands\].*${x,,}_level.*" "$CLI_CONF" || + sed -i -r -e "/\[startup_commands\]/ s/\((.*)\)/(\1,${x,,}_level)/g" "$CLI_CONF" + fi +done |