400 lines
11 KiB
Plaintext
400 lines
11 KiB
Plaintext
|
#!/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
|