123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399 |
- #!/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
|