#!@@BASH@@ # -*- sh -*- set -e : << =cut =head1 NAME if_ - Wildcard-plugin to monitor traffic and errors on network interfaces. =head1 CONFIGURATION This plugin does not normally require configuration. The plugin may need to run as root to determine the maximum speed of the network interface. This is configured like this: [if_*] user root If the interface speed cannot be determined automatically by this plugin, you may manually configure the speed using the "speed" environment variable, in megabits per second, like this: [if_*] env.speed 1000 To set warning and critical levels do like this: [if_*] env.warning 10000000 or [if_*] env.if_0_warning 10000000 This is a wildcard plugin. To monitor an interface, link if_ to this file. For example, ln -s /usr/share/munin/plugins/if_ \ /etc/munin/plugins/if_eth0 will monitor eth0. Most devices 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. =head1 AUTHOR Original author unknown Copyright (C) 2011 Diego Elio Pettenò =head1 LICENSE GPLv2 =head1 MAGIC MARKERS #%# family=auto #%# capabilities=autoconf suggest =cut . "$MUNIN_LIBDIR/plugins/plugin.sh" INTERFACE=${0##*if_} speed=${speed:-} # Who whould have thought it's so much work to determine the # maximum speed of a network interface. Buckle up! findspeed_mbps() { # Do not use interface name to guess technology. Many many # wifi drivers use "eth*" names. IWLIST=$(type -p iwlist) if [[ -x "$IWLIST" ]]; then SPEED=$("$IWLIST" "$INTERFACE" rate 2>&1 | awk 'BEGIN { RATE="U" } { if ($2 == "Mb/s") RATE=$1; } END { print RATE; }') if [[ "$SPEED" != "U" ]]; then echo "$SPEED" return fi fi # sysfs can report the speed if the driver supports it (but it # doesn't work as well for wireless cards, thus why we check for # iwlist first) if [[ -r "/sys/class/net/$INTERFACE/speed" ]]; then SPEED=$(cat "/sys/class/net/$INTERFACE/speed" 2>/dev/null) if [[ "$SPEED" -gt 0 ]]; then echo "$SPEED" return fi fi ETHTOOL=$(type -p ethtool) if [[ -x "$ETHTOOL" ]]; then SPEED=$("$ETHTOOL" "$INTERFACE" 2>&1 | awk '/Speed:/ { gsub(/[^0-9]*/,"",$2); print $2; }') if [[ $SPEED == [0-9]* ]]; then echo "$SPEED" return fi fi MIITOOL=$(type -p mii-tool) if [[ -x "$MIITOOL" ]]; then case $("$MIITOOL" "$INTERFACE" 2>&1) in *1000base*) echo 1000; return ;; *100base*) echo 100; return ;; *10base*) echo 10; return ;; esac fi echo U } findspeed() { if [[ "$speed" ]]; then SPEED=$speed else SPEED=$(findspeed_mbps) fi if [[ -z "$SPEED" ]] || [[ "$SPEED" == "U" ]]; then printf "up.info Traffic of the %s interface. Unable to determine interface speed." "$INTERFACE" if [[ $EUID -ne 0 ]]; then echo " Please run the plugin as root." else echo " Please install ethtool, wireless-tools, mii-tool or whatever is appropriate for the interface." fi return fi BPS=$(( SPEED * 1000 * 1000 )) cat <