-
Notifications
You must be signed in to change notification settings - Fork 8
/
muninlite.in
executable file
·135 lines (119 loc) · 3.44 KB
/
muninlite.in
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
#!/bin/sh
#
# Simple Bourne Shell script that implements Munin protocol and
# some common Linux plugins.
#
# For latest version, see http://muninlite.sf.net/
#
# Copyright (c) 2007-2011 Rune Nordbøe Skillingstad <[email protected]>
#
# Licensed under GPLv2 (see LICENSE file for full License)
#
VERSION="@@VERSION@@"
set -eu
@@CONF@@
# Name of runtime configuration file
CONFIG_FILE=/etc/munin/muninlite.conf
# if plugindir_ is present in $PLUGINS, executables (scripts, binaries) in the specified path
# and matching the pattern will be scanned and operated as plugins
PLUGIN_DIRECTORY=/etc/munin/plugins
PLUGINPATTERN="*"
# 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 -qwF "$1"; then
"config_$1"
else
echo "# Unknown service"
fi
echo "."
}
do_fetch() {
if echo "$PLUGINS" | grep -qwF "$1"; then
"fetch_$1"
else
echo "# Unknown service"
fi
echo "."
}
do_version() {
echo "munins node on $HOSTNAME version: $VERSION (muninlite)"
}
do_quit() {
exit 0
}
# ===== Runtime config =====
# shellcheck source=/dev/null
[ -f ${CONFIG_FILE} ] && . ${CONFIG_FILE}
RES=""
for PLUG in $PLUGINS; do
case "$PLUG" in
if_|if_err_)
interface_names=$(sed 's/^ *//; s/:.*$//; / /d; /^lo$/d' /proc/net/dev)
for INTER in $interface_names; do
INTERRES=$(echo "$INTER" | sed -e 's/\./VLAN/' -e 's/\-/_/g')
RES="$RES ${PLUG}${INTERRES}"
eval "fetch_${PLUG}${INTERRES}() { 'fetch_${PLUG%_}' '$INTER'; }"
eval "config_${PLUG}${INTERRES}() { 'config_${PLUG%_}' '$INTER'; }"
done
;;
netstat)
if netstat -s >/dev/null 2>&1; then
RES="$RES netstat"
fi
;;
wireless)
if iwinfo >/dev/null 2>&1; then
RES="${RES} ${PLUG}"
fi
;;
plugindir_)
for MYPLUGIN in $(if [ -d "$PLUGIN_DIRECTORY" ]; then find -L "$PLUGIN_DIRECTORY" -type f -name "$PLUGINPATTERN"; fi); do
if [ -f "$MYPLUGIN" ] && [ -x "$MYPLUGIN" ]; then
# generate a name suitable for shell function names
MYPLUGINNAME=$(basename "$MYPLUGIN" | sed 's/[^0-9a-zA-Z_]/_/g')
# detect and avoid name collision
if echo "$RES" | grep -qwF "$MYPLUGINNAME"; then
MYPLUGINNAME="plugindir_$MYPLUGINNAME"
fi
RES="$RES $MYPLUGINNAME"
eval "fetch_${MYPLUGINNAME}() { '$MYPLUGIN'; }"
eval "config_${MYPLUGINNAME}() { '$MYPLUGIN' config; }"
fi
done
;;
*)
RES="$RES $PLUG"
;;
esac
done
# sort plugin names and remove surrounding whitespace
PLUGINS=$(echo "$RES" | xargs -r -n 1 echo | sort | xargs echo)
# ===== MAIN LOOP =====
FUNCTIONS="list nodes config fetch version quit"
HOSTNAME=$( { hostname -f || hostname || cat /proc/sys/kernel/hostname || echo "unknown"; } 2>/dev/null )
echo "# munin node at $HOSTNAME"
while read -r arg0 arg1
do
arg0=$(printf '%s\n' "$arg0" | xargs)
arg1=$(printf '%s\n' "$arg1" | xargs)
if ! echo "$FUNCTIONS" | grep -qwF -- "$arg0"; then
echo "# Unknown command. Try $(echo "$FUNCTIONS" | sed -e 's/\( [[:alpha:]]\{1,\}\)/,\1/g' -e 's/,\( [[:alpha:]]\{1,\}\)$/ or\1/')"
elif [ -n "$arg0" ]; then
"do_$arg0" "$arg1"
fi
done