/
check_snmp_ups
267 lines (241 loc) · 7.13 KB
/
check_snmp_ups
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
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
#!/bin/bash
# check_snmp_ups
# Description : Check Uninterruptible Power Supply (UPS)
# Version : 1.0
# Author : Yoann LAMY
# Licence : GPLv2
# Commands
CMD_BASENAME="/bin/basename"
CMD_SNMPGET="/usr/bin/snmpget"
CMD_SNMPWALK="/usr/bin/snmpwalk"
CMD_BC="/usr/bin/bc"
CMD_EXPR="/usr/bin/expr"
# Script name
SCRIPTNAME=`$CMD_BASENAME $0`
# Version
VERSION="1.0"
# Plugin return codes
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
# 'upsBatteryStatus', UPS-MIB
OID_BATTERY_STATUS=".1.3.6.1.2.1.33.1.2.1.0"
# 'upsEstimatedChargeRemaining', UPS-MIB
OID_BATTERY_CHARGE=".1.3.6.1.2.1.33.1.2.4.0"
# 'upsEstimatedMinutesRemaining', UPS-MIB
OID_BATTERY_REMAINING=".1.3.6.1.2.1.33.1.2.3.0"
# 'upsOutputSource', UPS-MIB
OID_BATTERY_OUTPUTSOURCE=".1.3.6.1.2.1.33.1.4.1.0"
# 'upsOutputPower', UPS-MIB
OID_BATTERY_OUTPUTPOWER=".1.3.6.1.2.1.33.1.4.4.1.4"
# 'upsBatteryTemperature', UPS-MIB
OID_BATTERY_TEMPERATURE=".1.3.6.1.2.1.33.1.2.7.0"
# Default variables
DESCRIPTION="Unknown"
STATE=$STATE_UNKNOWN
OUTPUTPOWER=0
# Default options
COMMUNITY="public"
HOSTNAME="127.0.0.1"
TYPE="battery"
WARNING=0
CRITICAL=0
# Option processing
print_usage() {
echo "Usage: ./check_snmp_ups -H 127.0.0.1 -C public -t battery"
echo " $SCRIPTNAME -H ADDRESS"
echo " $SCRIPTNAME -C STRING"
echo " $SCRIPTNAME -t STRING"
echo " $SCRIPTNAME -w INTEGER"
echo " $SCRIPTNAME -c INTEGER"
echo " $SCRIPTNAME -h"
echo " $SCRIPTNAME -V"
}
print_version() {
echo $SCRIPTNAME version $VERSION
echo ""
echo "This nagios plugins comes with ABSOLUTELY NO WARRANTY."
echo "You may redistribute copies of the plugins under the terms of the GNU General Public License v2."
}
print_help() {
print_version
echo ""
print_usage
echo ""
echo "Check Uninterruptible power supply (UPS)"
echo ""
echo "-H ADDRESS"
echo " Name or IP address of host (default: 127.0.0.1)"
echo "-C STRING"
echo " Community name for the host's SNMP agent (default: public)"
echo "-t STRING"
echo " Different status (battery, charge, power, source, temperature) (default: battery)"
echo "-w INTEGER"
echo " Warning battery level in percent and UPS Warning temperature level in degres celsius (default: 0)"
echo "-c INTEGER"
echo " Critical battery level in percent and UPS Critical temperature level in degres celsius (default: 0)"
echo "-h"
echo " Print this help screen"
echo "-V"
echo " Print version and license information"
echo ""
echo ""
echo "This plugin uses the 'snmpget' command included with the NET-SNMP package."
}
while getopts H:C:t:w:c:hV OPT
do
case $OPT in
H) HOSTNAME="$OPTARG" ;;
C) COMMUNITY="$OPTARG" ;;
t) TYPE="$OPTARG" ;;
w) WARNING="$OPTARG" ;;
c) CRITICAL="$OPTARG" ;;
h)
print_help
exit $STATE_UNKNOWN
;;
V)
print_version
exit $STATE_UNKNOWN
;;
esac
done
# Plugin processing
size_convert() {
if [ $VALUE -ge 1000 ]; then
VALUE=`echo "scale=2 ; $VALUE / 1000" | $CMD_BC`
VALUE="$VALUE KWatt"
else
VALUE="$VALUE Watt"
fi
}
if [ $TYPE = "battery" ]; then
# Check battery status (Usage: ./check_snmp_ups -H 127.0.0.1 -C public -t battery)
BATTERY=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME $OID_BATTERY_STATUS`
DESCRIPTION="Battery status : "
case $BATTERY in
1)
DESCRIPTION="$DESCRIPTION Unknown"
STATE=$STATE_UNKNOWN
;;
2)
DESCRIPTION="$DESCRIPTION Battery level is ok"
STATE=$STATE_OK
;;
3)
DESCRIPTION="$DESCRIPTION Low battery level"
STATE=$STATE_WARNING
;;
4)
DESCRIPTION="$DESCRIPTION UPS Battery is Discharged"
STATE=$STATE_CRITICAL
;;
*)
DESCRIPTION="$DESCRIPTION Unknown"
STATE=$STATE_UNKNOWN
;;
esac
elif [ $TYPE = "charge" ]; then
# Check battery charge (Usage: ./check_snmp_ups -H 127.0.0.1 -C public -t charge -w 60 -c 30)
CHARGE=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME $OID_BATTERY_CHARGE`
if [ -n "$CHARGE" ]; then
CHARGE_REMAINING=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME $OID_BATTERY_REMAINING`
if [ $WARNING != 0 ] || [ $CRITICAL != 0 ]; then
if [ $CHARGE -lt $CRITICAL ] && [ $CRITICAL != 0 ]; then
STATE=$STATE_CRITICAL
elif [ $CHARGE -lt $WARNING ] && [ $WARNING != 0 ]; then
STATE=$STATE_WARNING
else
STATE=$STATE_OK
fi
else
STATE=$STATE_OK
fi
DESCRIPTION="Battery level : ${CHARGE}%. Remaining time : ${CHARGE_REMAINING} minutes | charge=$CHARGE;$WARNING;$CRITICAL;0"
fi
elif [ $TYPE = "power" ]; then
# Check output power (Usage: ./check_snmp_ups -H 127.0.0.1 -C public -t power -w 40000 -c 50000)
for NUMBER in `$CMD_SNMPWALK -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME $OID_BATTERY_OUTPUTPOWER`
do
if [ -n "$NUMBER" ]; then
OUTPUTPOWER=`$CMD_EXPR $OUTPUTPOWER + $NUMBER`
fi
done
if [ $WARNING != 0 ] || [ $CRITICAL != 0 ]; then
if [ $OUTPUTPOWER -lt $CRITICAL ] && [ $CRITICAL != 0 ]; then
STATE=$STATE_CRITICAL
elif [ $OUTPUTPOWER -lt $WARNING ] && [ $WARNING != 0 ]; then
STATE=$STATE_WARNING
else
STATE=$STATE_OK
fi
else
if [ $OUTPUTPOWER != 0 ]; then
STATE=$STATE_OK
else
STATE=$STATE_UNKNOWN
fi
fi
VALUE=$OUTPUTPOWER
size_convert
OUTPUTPOWER_FORMAT=$VALUE
DESCRIPTION="Output power : $OUTPUTPOWER_FORMAT | output_power=$OUTPUTPOWER;$WARNING;$CRITICAL;0"
elif [ $TYPE = "source" ]; then
# Check output source (Usage: ./check_snmp_ups -H 127.0.0.1 -C public -t source)
SOURCE=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME $OID_BATTERY_OUTPUTSOURCE`
DESCRIPTION="Output source : "
case $SOURCE in
1)
DESCRIPTION="$DESCRIPTION Unknown"
STATE=$STATE_UNKNOWN
;;
2)
DESCRIPTION="$DESCRIPTION UPS circuit breaker is tripped"
STATE=$STATE_CRITICAL
;;
3)
DESCRIPTION="$DESCRIPTION Output is filtered"
STATE=$STATE_OK
;;
4)
DESCRIPTION="$DESCRIPTION UPS is in bypass mode"
STATE=$STATE_CRITICAL
;;
5)
DESCRIPTION="$DESCRIPTION Power loss. UPS is in backup mode"
STATE=$STATE_CRITICAL
;;
6)
DESCRIPTION="$DESCRIPTION Voltage regulator mode (booster)"
STATE=$STATE_WARNING
;;
7)
DESCRIPTION="$DESCRIPTION Voltage regulator mode (reducer)"
STATE=$STATE_WARNING
;;
*)
DESCRIPTION="$DESCRIPTION Unknown"
STATE=$STATE_UNKNOWN
;;
esac
elif [ $TYPE = "temperature" ]; then
# Check temperature (Usage: ./check_snmp_ups -H 127.0.0.1 -C public -t temperature -w 25 -c 30)
TEMPERATURE=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME $OID_BATTERY_TEMPERATURE`
if [ -n "$TEMPERATURE" ]; then
if [ $WARNING != 0 ] || [ $CRITICAL != 0 ]; then
if [ $TEMPERATURE -gt $CRITICAL ] && [ $CRITICAL != 0 ]; then
STATE=$STATE_CRITICAL
elif [ $TEMPERATURE -gt $WARNING ] && [ $WARNING != 0 ]; then
STATE=$STATE_WARNING
else
STATE=$STATE_OK
fi
else
STATE=$STATE_OK
fi
DESCRIPTION="Temperature : $TEMPERATURE Degree Celsius | temperature=$TEMPERATURE;$WARNING;$CRITICAL;0"
fi
fi
echo $DESCRIPTION
exit $STATE