mirror of https://github.com/asterisk/asterisk
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							400 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
	
	
							400 lines
						
					
					
						
							11 KiB
						
					
					
				| #!/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
 |