File check_asterisk_peers of Package monitoring-plugins-asterisk

#!/bin/sh

# Check asterisk peers plugin for Nagios.
# web site: http://exchange.nagios.org/directory/Plugins/Telephony/Asterisk/check_asterisk_peers/details
# Written by Chad Phillips <chad@apartmentlines.com>
# Adapted to SUSE by Martin Caj <mcaj@suse.cz>
# Last Modified: 2013-12-10

ASTERISK="$(which asterisk)"
LIBDIR='/usr/lib/nagios/plugins'

REVISION="$(echo '$Revision: 2 $' | sed -e 's/[^0-9.]//g')"


# load nagios-plugin enviroments:

. $LIBDIR/utils.sh

print_usage() {
    echo "Check asterisk peers plugin for Nagios."
    echo "
Usage: check_asterisk_peers [--type | -t <sip|iax>] [--peers | -p <peers>] [--registrations | -r <registrations>] 
                            [--verify-peers] [--verify-registrations] [--config-file <filepaths>] [--help | -h]

Description:

This plugin checks Asterisk peers via Asterisk CLI commands to make sure
they are in a healthy state.  Unlike other monitoring plugins, status
is obtained from the perspective of the Asterisk server -- it's a good plugin
to use for monitoring the state of your connections to providers.

Both the peer itself and registration status to a peer can be monitored,
with the option of verifying that the peer/registration is actively configured.

If any of the checked peers/registrations return a non-OK state, a critical
state is returned. If verification is being used and a peer/registration is
not verified as being in the active configuration, then the status check is
skipped for that item instead of a critical state being returned.

Tested to work on a Linux machine.

The following arguments are accepted:

  --type  | -t            (Optional) The type of peer to check.  Valid values
                          are sip, iax. Defaults to sip.

  --peers | -p            (Optional) A space separated list of peers to check.
                          Use the peer name given in the configuration,
                          without the surrounding brackets.

  --registrations | -r    (Optional) A space separated list of registrations
                          to check, in the form of username@uri. For example,
                          to check the registration of peer foo to
                          somesite.com, use foo@somesite.com

  --verify-peers          (Optional) If set, peer entries are verified in
                          the configuration, and the check is skipped
                          if they are not found.

  --verify-registrations  (Optional) If set, registrations are verified in
                          the configuration, and the check is skipped
                          if they are not found.

  --config-file           (Optional) The location of the configuration file(s).
                          Use a space separated list if specifying multiple
                          files.
                          Default value is based on the --type setting:
                          sip: /etc/asterisk/sip.conf
                          iax: /etc/asterisk/iax.conf

  --help | -h             Print this help and exit.

Examples:

Check peers [foo] and [bar]:

  check_asterisk_peers -p \"foo bar\"

Check peers [foo] and [bar], and registration for usr baz at somesite.com,
and verify that both the peers and the registration are actively configured.

  check_asterisk_peers -p \"foo bar\" -r \"baz@somesite.com\" --verify-peers --verify-registrations
See README file for information how to allow user nagios to run this sctipt.
Version: $REVISION.
"
}

print_help() {
    print_usage
    echo ""
}

# Sets the exit status for the plugin.  This is done in such a way that the
# status can only go in one direction: OK -> WARNING -> CRITICAL.
set_exit_status() {
	new_status=$1
	# Nothing needs to be done if the state is already critical, so exclude
	# that case.
	case $exitstatus
	in
		$STATE_WARNING)
			# Only upgrade from warning to critical.
			if [ "$new_status" = "$STATE_CRITICAL" ]; then
				exitstatus=$new_status;
			fi
		;;
		$STATE_OK)
			# Always update state if current state is OK.
			exitstatus=$new_status;
		;;
	esac
}

# Ensures that a call to the Asterisk process returns successfully.  Exits
# critical if not.
check_asterisk_result() {
	if [ "$1" != "0" ]; then
		echo "CRITICAL: $2"
		exit $STATE_CRITICAL
	fi
}

# Recurse through the configuration file and find all included files, building
# a final list of files to use for verification checks.
get_config_files() {
	for file in $1
	do
		if [ "$conf_file_list" ]; then
			conf_file_list="$conf_file_list $file"
		else
			conf_file_list="$file"
		fi
		files=`cat $file | grep ^\#include | awk '{print $2;}'`
		if [ "$files" ]; then
			get_config_files "$files"
		fi
	done
}

# Defaults.
exitstatus=$STATE_OK
peers=
registrations=
verify_peers=
verify_registrations=
peer_type=
conf_file=
conf_file_list=
all_config=
test_ok=
test_errors=
output=

# Grab the command line arguments.
while test -n "$1"; do
    case "$1" in
        --help)
            print_help
            exit $STATE_OK
            ;;
        -h)
            print_help
            exit $STATE_OK
            ;;
        --peers)
            peers=$2
            shift
            ;;
        -p)
            peers=$2
            shift
            ;;
		--registrations)
			registrations=$2
			shift
            ;;
		-r)
			registrations=$2
			shift
            ;;
        --verify-peers)
        	verify_peers=1
        	;;
        --verify-registrations)
        	verify_registrations=1
        	;;
        --type)
            peer_type=$2
            shift
            ;;
        -t)
            peer_type=$2
            shift
            ;;
        --conf-file)
        	conf_file=$2
        	shift
        	;;
        -x)
            exitstatus=$2
            shift
            ;;
        --exitstatus)
            exitstatus=$2
            shift
            ;;
        *)
            echo "Unknown argument: $1"
            print_usage
            exit $STATE_UNKNOWN
            ;;
    esac
    shift
done

# Check if Asterisk exist on the system:
if [ ! "$ASTERISK" ]; then
	echo "ERROR: no Asterisk was found on the system ,please check if its installed on the machine."
	echo " For example via command: which asterisk"
	exit $STATE_UNKNOWN
fi

# Make sure we have a valid peer type.
if [ "$peer_type" != "" ] && [ "$peer_type" != "sip" ] && [ "$peer_type" != "iax" ]; then
	echo "Peer type must be one of: sip, iax."
	exit $STATE_UNKNOWN
# Convert iax type into internal iax2 type for the Asterisk executable.
elif [ "$peer_type" = "iax" ]; then
	peer_type=iax2
# Default type is SIP.
else
	peer_type=sip
fi

if [ ! "$peers" ] && [ ! "$registrations" ]; then
	print_usage
	echo "At least one peer or registration must be provided."
	exit $STATE_UNKNOWN
fi

# Set a default configuration file if none was set.
if [ "$conf_file" = "" ]; then
	if [ "$peer_type" = "iax2" ]; then
		conf_file=/etc/asterisk/iax.conf
	else
		conf_file=/etc/asterisk/sip.conf
	fi
fi

# Check to make sure the registrations are in the username@uri format.
# This is a weak check, but at least enough to make sure we have something
# in the user/uri variables.
if [ "$registrations" ]; then
	for r in $registrations
	do
		REGISTRATION_FORMAT_CORRECT=`echo "$r" | grep ".\+@.\+"`
		if [ ! "$REGISTRATION_FORMAT_CORRECT" ]; then
			echo "Registration $r is not in the valid username@uri format."
			exit $STATE_UNKNOWN
		fi
	done
fi

# Load the configuration files if necessary.
if [ "$verify_peers" ] || [ "$verify_registrations" ]; then
	get_config_files $conf_file
	all_config=`cat $conf_file_list`
fi

# Check peers.
if [ "$peers" ]; then
	for p in $peers
	do
		if [ "$verify_peers" ]; then
			peer_verified=`echo "$all_config" | grep "^\[${p}\]$"`
		else
			peer_verified=1
		fi
		if [ "$peer_verified" ]; then
			# Fetch the data from asterisk.
			command_output=`$ASTERISK -rx "$peer_type show peer $p" 2>&1`
			check_asterisk_result $? "$command_output"
			status=`echo "$command_output" | grep "^[[:space:]]*Status[[:space:]]*:" | awk '{print $3;}'`
			if [ "$status" = "OK" ]; then
				if [ "$test_ok" ]; then
					test_ok="${test_ok}, $p"
				else
					test_ok="$p"
				fi
			else
				if [ "$status" ]; then
					status_error="$status"
				else
					status_error="Not found"
				fi
				if [ "$test_errors" ]; then
					test_errors="${test_errors}, ${p}: $status_error"
				else
					test_errors="${p}: $status_error"
				fi
			fi
		else
			if [ "$test_ok" ]; then
				test_ok="${test_ok}, $p (not active)"
			else
				test_ok="$p (not active)"
			fi
		fi
	done
fi

# Check registrations.
if [ "$registrations" ]; then
	# Fetch the data from asterisk.
	command_output=`$ASTERISK -rx "$peer_type show registry" 2>&1`
	check_asterisk_result $? "$command_output"
	for r in $registrations
	do
		user=`echo $r | cut -f 1 -d "@"`
		# Add backslashes to escape the dot.
		uri=`echo $r | cut -f 2 -d "@" | sed -e 's/\./\\\./g'`
		if [ "$verify_registrations" ]; then
			# This regex isn't perfect, but it does the trick ok.
			registration_verified=`echo "$all_config" | grep "^register => ${user}:.\+@${uri}$"`
		else
			registration_verified=1
		fi
		if [ "$registration_verified" ]; then
			# Have to cut off registration name at 12 characters, so let's hope
			# it's still unique!
			cut_user=${user:0:12}
			# This regex isn't perfect, but it does the trick ok.
			status=`echo "$command_output" | grep "^${uri}:[[:digit:]].\+[[:space:]].\+${cut_user}[[:space:]].\+" | awk '{print $4;}'`
			if [ "$status" = "Registered" ]; then
				if [ "$test_ok" ]; then
					test_ok="${test_ok}, $r"
				else
					test_ok="$r"
				fi
			else
				if [ "$status" ]; then
					status_error="$status"
				else
					status_error="Not found"
				fi
				if [ "$test_errors" ]; then
					test_errors="${test_errors}, ${r}: $status_error"
				else
					test_errors="${r}: $status_error"
				fi
			fi
		else
			if [ "$test_ok" ]; then
				test_ok="${test_ok}, $r (not active)"
			else
				test_ok="$r (not active)"
			fi
		fi
	done
fi

if [ "$test_errors" ]; then
	output="$output ERROR: $test_errors"
	set_exit_status $STATE_CRITICAL
fi

if [ "$test_ok" ]; then
	output="$output OK: $test_ok"
fi

if [ ! "$output" ]; then
	echo "UNKNOWN: No output"
	exit $STATE_UNKNOWN
fi

echo "$output"
exit $exitstatus
openSUSE Build Service is sponsored by