#!/bin/sh # # Simple Bourne Shell script that implements Munin protocoll and # some common Linux plugins. # # For latest version, see http://muninlite.sf.net/ # # Copyright (c) 2007-2011 Rune Nordbøe Skillingstad # # Licensed under GPLv2 (see LICENSE file for full License) # VERSION="@@VERSION@@" @@CONF@@ # if plugindir_ is present in $PLUGINS, # iexecutables (scripts, binaries) matching the following pattern will be scanned and operated as plugins PLUGINPATTERN=$(dirname $0)"/munin-node-plugin.d/*" # Remove unwanted plugins from this list PLUGINS="@@PLUGINS@@" # ===== LIB FUNCTIONS ===== clean_fieldname() { echo "$@" | sed -e 's/^[^A-Za-z_]/_/' -e 's/[^A-Za-z0-9_]/_/g' } # ===== PLUGINS CODE ===== @@PLSTR@@ # ===== NODE CODE ===== do_list() { echo $PLUGINS } do_nodes() { echo "$HOSTNAME" echo "." } do_config() { if echo "$PLUGINS" | grep "\b$1\b" >/dev/null 2>&1; then config_$1 else echo "# Unknown service" fi echo "." } do_fetch() { if echo "$PLUGINS" | grep "\b$1\b" >/dev/null 2>&1; then fetch_$1 else echo "# Unknown service" fi echo "." } do_version() { echo "munins node on $HOSTNAME version: $VERSION (munin-lite)" } do_quit() { exit 0 } # ===== Runtime config ===== RES="" for PLUG in $PLUGINS do if [ "$PLUG" = "if_" ]; then for INTER in $(grep -E '^ *(ppp|eth|wlan|ath|ra|ipsec|tap|br-)[^:]{1,}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g'); do INTERRES=$(echo $INTER | sed -e 's/\./VLAN/' -e 's/\-/_/') RES="$RES if_$INTERRES" eval "fetch_if_${INTERRES}() { fetch_if $INTER $@; };" eval "config_if_${INTERRES}() { config_if $INTER $@; };" done elif [ "$PLUG" = "if_err_" ]; then for INTER in $(grep -E '^ *(ppp|eth|wlan|ath|ra|ipsec|tap|br-)[^:]{1,}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g'); do INTERRES=$(echo $INTER | sed -e 's/\./VLAN/' -e 's/\-/_/') RES="$RES if_err_$INTERRES" eval "fetch_if_err_${INTERRES}() { fetch_if_err $INTER $@; };" eval "config_if_err_${INTERRES}() { config_if_err $INTER $@; };" done elif [ "$PLUG" = "netstat" ]; then if netstat -s >/dev/null 2>&1; then RES="$RES netstat" fi elif [ "$PLUG" = "plugindir_" ]; then for MYPLUGIN in $(ls -1 $PLUGINPATTERN 2>/dev/null ); do if [ -f $MYPLUGIN -a -x $MYPLUGIN ]; then MYPLUGINNAME=$(basename $MYPLUGIN) #ensure we don't have name collision if echo "$RES" | grep "\b$MYPLUGINNAME\b" >/dev/null 2>&1 ; then MYPLUGINNAME="plugindir_$MYPLUGINNAME" fi RES="$RES $MYPLUGINNAME" eval "fetch_${MYPLUGINNAME}() { $MYPLUGIN ; };" eval "config_${MYPLUGINNAME}() { $MYPLUGIN config ; };" fi done else RES="$RES $PLUG" fi done PLUGINS=$RES # ===== MAIN LOOP ===== FUNCTIONS="list nodes config fetch version quit" HOSTNAME=$(hostname -f 2>/dev/null || hostname) echo "# munin node at $HOSTNAME" while read arg0 arg1 do arg0=$(echo "$arg0" | xargs) arg1=$(echo "$arg1" | xargs) if ! echo "$FUNCTIONS" | grep "\b$arg0\b" >/dev/null 2>&1 ; then echo "# Unknown command. Try" $(echo "$FUNCTIONS" | sed -e 's/\( [[:alpha:]]\{1,\}\)/,\1/g' -e 's/,\( [[:alpha:]]\{1,\}\)$/ or\1/') continue fi do_$arg0 $arg1 done