/usr/share/munin/plugins/if_ is in munin-node 1.4.6-3ubuntu3.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 | #!/bin/bash
# -*- sh -*-
: << =cut
=head1 NAME
if_ - Wildcard-plugin to monitor traffic and errors on network
interfaces.
=head1 CONFIGURATION
This plugin does not normaly 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
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_<interface> to this file. E.g.
ln -s /usr/share/node/node/plugins-auto/if_ \
/etc/munin/node.d/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
Unknown author
=head1 LICENSE
Unknown license
=head1 MAGIC MARKERS
#%# family=auto
#%# capabilities=autoconf suggest
=head1 VERSION
$Id: if_.in 4163 2011-04-15 04:42:08Z bldewolf $
=cut
. $MUNIN_LIBDIR/plugins/plugin.sh
INTERFACE=${0##*if_}
findspeed () {
# Who whould have thought it's so much work to determine the
# maximum speed of a network interface. Buckle up!
IWLIST="$(type -p iwlist)"
WIRELESS=0
# Do not use interface name to guess technology. Many many
# wifi drivers use "eth*" names.
case $IWLIST in
'')
# Used to use iwconfig to look for "no wireless
# extentions" message - but this seemed un-needed. If we
# don't have iwlist we can't find out if # the interface
# is wireless
:;;
*) IWO="$($IWLIST $INTERFACE rate 2>&1)"
case $IWO in
*no*) :;;
*) WIRELESS=1;;
esac
;;
esac
SPEED=U
# Find speed in Mbps. - or not
case $WIRELESS:$IWLIST in
0:*)
ETHTOOL="$(type -p ethtool)"
if [ -x "$ETHTOOL" ]; then
SPEED="$($ETHTOOL $INTERFACE 2>&1 |
awk '/Speed:/ { gsub(/[^0-9]*/,"",$2); print $2; }')"
case $SPEED in
[0-9]*) :;; # OK
*) SPEED=U;; # Could be "unknown"
esac
else
INSTALL="ethtool"
fi
;;
1:/*)
# Current bit rate is not very interesting, it varies too often
SPEED=$(echo "$IWO" |
awk 'BEGIN { RATE=U }
{ if ($2 == "Mb/s") RATE=$1; }
END { print RATE; }')
;;
*)
# Wireless interface, cannot find iwlist
INSTALL="wireless-tools"
;;
esac
MIITOOL="$(type -p mii-tool)"
case $SPEED:$MIITOOL in
U:/*)
SPEED="$($MIITOOL $INTERFACE 2>&1)"
case $SPEED in
*1000base*) SPEED=1000;; # as if...
*100base*) SPEED=100;;
*10base*) SPEED=10;;
*) SPEED=U;;
esac
;;
esac
# sysfs can report the speed if the driver supports it
SYSFS="$(cat /sys/class/net/$INTERFACE/speed 2>/dev/null)"
# If it can't, it fails on I/O, so we check cat's return value
if [ $? -eq 0 -a "$SPEED" = "U" -a -n "$SYSFS" ]; then
SPEED="$SYSFS"
fi
case $SPEED in
U) echo "up.info Traffic of the $INTERFACE interface. Unable to determine interface speed. Please install ethtool, wireless-tools (or mii-tool), whatever is appropriate for the interface."
return;;
esac
BPS=$(( $SPEED * 1000 * 1000 ))
cat <<EOF
up.max $BPS
up.info Traffic of the $INTERFACE interface. Maximum speed is $SPEED Mbps.
down.max $BPS
EOF
return
}
case $1 in
autoconf)
if [ -r /proc/net/dev ]; then
echo yes
exit 0
else
echo "no (/proc/net/dev not found)"
exit 0
fi
;;
suggest)
if [ -r /proc/net/dev ]; then
awk '
/^ *(eth|tap|bond|wlan|ath|ra|sw|vlan|venet|veth|msh)[0-9]+(\.[0-9]+)?:/ {
split($0, a, /: */);
gsub(/^ +/,"",a[1]);
if (($2 > 0) || ($10 > 0)) print a[1]; }' /proc/net/dev
fi
exit 0
;;
config)
echo "graph_order down up"
echo "graph_title $INTERFACE traffic"
echo 'graph_args --base 1000'
echo 'graph_vlabel bits in (-) / out (+) per ${graph_period}'
echo 'graph_category network'
echo "graph_info This graph shows the traffic of the $INTERFACE network interface. Please note that the traffic is shown in bits per second, not bytes. IMPORTANT: On 32 bit systems the data source for this plugin uses 32bit counters, which makes the plugin unreliable and unsuitable for most 100Mb (or faster) interfaces, where traffic is expected to exceed 50Mbps over a 5 minute period. This means that this plugin is unsuitable for most 32 bit production environments. To avoid this problem, use the ip_ plugin instead. There should be no problems on 64 bit systems running 64 bit kernels."
echo 'down.label received'
echo 'down.type DERIVE'
echo 'down.graph no'
echo 'down.cdef down,8,*'
echo 'down.min 0'
echo 'up.label bps'
echo 'up.type DERIVE'
echo 'up.negative down'
echo 'up.cdef up,8,*'
echo 'up.min 0'
print_warning down
print_warning up
print_critical down
print_critical up
findspeed
exit 0
;;
esac
# 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 "down.value " $1 "\nup.value " $9 \
}' \
/proc/net/dev
|