#!/bin/sh
#
# Wildcard-plugin to monitor network interfaces. To monitor an
# interface, link if_err_<interface> to this file. E.g.
#
#    ln -s /usr/share/munin/node/plugins-auto/if_err_ /etc/munin/node.d/if_err_eth0
#
# ...will monitor eth0.
#
# Any devince found in /proc/net/dev can be monitored. Examples include
# ipsec*, eth*, irda* and lo. Please note that aliases cannot be
# monitored with this plugin.
#
# $Log$
# Revision 1.8.2.3  2005/02/16 20:59:58  jimmyo
# Make suggest a tad less trigger happy.
#
# Revision 1.8.2.2  2005/02/16 17:08:11  jimmyo
# linux/if* now treats ra* interfaces as wireless.
#
# Revision 1.8.2.1  2005/01/29 21:17:12  jimmyo
# Added madwifi support to linux/if_* plugins.
#
# Revision 1.8  2004/12/10 10:47:49  jimmyo
# Change name from ${scale} to ${graph_period}, to be more consistent.
#
# Revision 1.7  2004/12/09 22:12:56  jimmyo
# Added "graph_period" option, to make "graph_sums" usable.
#
# Revision 1.6  2004/11/12 20:09:06  ilmari
# Remove deprecated host_name outputting
#
# Revision 1.5  2004/11/12 20:08:01  ilmari
# Fixed linux/if_(err_) braindamage affecting hosts with vlans or
# multi-digit interface numbers.
#
# Revision 1.4  2004/09/26 22:28:42  jimmyo
# Suggest wlan interfaces as well as eth interfaces.
#
# Revision 1.3  2004/09/25 22:29:16  jimmyo
# Added info fields to a bunch of plugins.
#
# Revision 1.2  2004/05/20 13:57:12  jimmyo
# Set categories to some of the plugins.
#
# Revision 1.1  2004/01/02 18:50:01  jimmyo
# Renamed occurrances of lrrd -> munin
#
# Revision 1.1.1.1  2004/01/02 15:18:07  jimmyo
# Import of LRRD CVS tree after renaming to Munin
#
# Revision 1.3  2003/11/07 22:12:50  jimmyo
# Changed deprecated plugin options
#
# Revision 1.2  2003/11/07 17:43:16  jimmyo
# Cleanups and log entries
#
#
#
# Magic markers (optional - used by munin-config and some installation
# scripts):
#
#%# family=auto
#%# capabilities=autoconf suggest

INTERFACE=`basename $0 | sed 's/^if_err_//g'`

if [ "$1" = "autoconf" ]; then
	if [ -r /proc/net/dev ]; then
		echo yes
		exit 0
	else
		echo "no (/proc/net/dev not found)"
		exit 1
	fi
fi

if [ "$1" = "suggest" ]; then
	if [ -r /proc/net/dev ]; then
		egrep '^ *(eth|wlan|ath|ra)[0-9]+:' /proc/net/dev | cut -f1 -d: | sed 's/ //g'
		exit 0
	else
		exit 1
	fi
fi

if [ "$1" = "config" ]; then
	echo "graph_order rcvd trans" 
	echo "graph_title $INTERFACE errors"
	echo 'graph_args --base 1000'
	echo 'graph_vlabel packets in (-) / out (+) per ${graph_period}'
	echo 'graph_category network'
	echo "graph_info This graph shows the amount of errors on the $INTERFACE network interface."
	echo 'rcvd.label packets'
        echo 'rcvd.type COUNTER'
        echo 'rcvd.graph no'
        echo 'rcvd.warning 1'
        echo 'trans.label packets'
	echo 'trans.type COUNTER'
	echo 'trans.negative rcvd'
        echo 'trans.warning 1'
	exit 0
fi;

# Escape dots in the interface name (eg. vlans) before using it as a regex
awk -v interface="$INTERFACE" \
    'BEGIN { gsub(/\./, "\\.", interface) } \
    $1 ~ "^" interface ":" {
        split($0, a, /: */); $0 = a[2]; \
        print "rcvd.value " $3 "\ntrans.value " $11 \
    }' \
    /proc/net/dev
