check_mailcleaner_v2.sh

MailCleaner Support, 2018-09-14 11:39

Download (13.3 KB)

 
1
#!/bin/bash
2
#set -x
3

    
4
# Checks the MailCleaner overall status using SNMP values.
5
#
6
# NB: don't forget to allow the monitoring poller IP in the MailCleaner configuration
7
#     ( Configuration => Services => SNMP monitoring )
8
#
9
#
10
# by fabricat
11
#
12

    
13
: <<'SNMP-DOCUMENTATION'
14
Source: http://www.mailcleaner.org/doku.php/documentation:snmp_monitoring
15

    
16

    
17
Here are the few more traps provided by MailCleaner:
18

    
19
  extOutput.1 (1.3.6.1.4.1.2021.8.1.101.1): number of filtered messages (integer)
20

    
21
  extOutput.2 (1.3.6.1.4.1.2021.8.1.101.2): number of spams detected (integer)
22

    
23
  extOutput.3 (1.3.6.1.4.1.2021.8.1.101.3): number of bytes filtered (integer)
24

    
25
  extOutput.4 (1.3.6.1.4.1.2021.8.1.101.4): number of viruses detected (integer)
26

    
27
  extOutput.5 (1.3.6.1.4.1.2021.8.1.101.5): processes status (boolean list e.g: |1|1|1|1|1|1|1|1).
28
    Definition and order of processes (0 = down, 1= running):
29
        incoming MTA (critical)
30
        queuing MTA (critical)
31
        outgoing MTA (critical)
32
        Web GUI (not critical)
33
        antispam/antivirus process/filtering engine (critical)
34
        master database (not critical)
35
        slave database (critical)
36
        firewall (not critical)
37

    
38
  extOutput.6 (1.3.6.1.4.1.2021.8.1.101.6): spools status, number of messages in queues (integer list, e.g.:|190|4|26)
39
    Definition and order of spools:
40
        incoming : incoming MTA. Messages can be stored here on massive attacks, or when the MailCleaner is used as an outgoing relay for your network.
41
        filtering: main engine spool. Messages are stored here when processed by the engine. Less than 300 messages is normal because messages are NOT deleted here until process if completly finished). More messages can be an indication that your system is getting a little bit busy at the time.
42
        outgoing: outgoing MTA. MEssages are stored here when they cannot be delivered immediatly (temporary failure of destination host)
43

    
44
  extOutput.7 (1.3.6.1.4.1.2021.8.1.101.7): system load (float list, e.g. |5.29|3.79|3.55)
45
    Definition and order of loads:
46
         5 minutes:  5 last minutes average
47
        10 minutes: 10 last minutes average
48
        15 minutes: 15 last minutes average dernieres minutes
49

    
50
  extOutput.8 (1.3.6.1.4.1.2021.8.1.101.8): disk partitions usage (list of string, e.g. |/|32%|/var|35%)
51

    
52
  extOutput.9 (1.3.6.1.4.1.2021.8.1.101.9): system memory usage (integer list, e.g. |2068628|177144|1951888|1936572)
53
    Definition and order of usages:
54
        total physical memory
55
        free physical memory
56
        total swap memory
57
        free swap memory
58

    
59
  extOutput.10 (1.3.6.1.4.1.2021.8.1.101.10): all daily counts (integer list)
60
    Definition and order of counts:
61
    $total_bytes|$total_msg|$total_spam|$percentspam|$total_virus|$percentvirus|$total_content|$percentcontent|$total_clean|$percentclean
62
        number of bytes filtered
63
        number of messages filtered
64
        number of spams detected
65
        spam percentage
66
        number of viruses detected
67
        viruses percentage
68
        number of dangerous content detected
69
        dangerous content percentage
70
        number of clean messages
71
        clean messages percentages
72

    
73
SNMP-DOCUMENTATION
74

    
75
# Default values
76
COMMUNITY="mailcleaner"
77
MC_HOST="127.0.0.1"
78
VERBOSE="0"
79

    
80
SNMPWALK="/usr/bin/snmpwalk"
81

    
82

    
83
# Default thresholds
84
MSG_SPAM_CRIT=70
85
MSG_SPAM_WARN=50
86

    
87
MSG_VIRUS_CRIT=30
88
MSG_VIRUS_WARN=15
89

    
90
MSG_QUEUE_CRIT=100
91
MSG_QUEUE_WARN=50
92

    
93
LOAD_CRIT=10
94
LOAD_WARN=5
95

    
96
MEM_CRIT=90
97
MEM_WARN=75
98

    
99
SWAP_CRIT=80
100
SWAP_WARN=50
101

    
102
DISK_CRIT=90
103
DISK_WARN=80
104

    
105

    
106

    
107

    
108
USAGE=" Usage: $0 [options...]
109

    
110
 Options:
111
    -H <string>    MailCleaner host or IP              (default: ${MC_HOST})
112
    -C <string>    SNMP read community                 (default: ${COMMUNITY})
113
    -v             Verbose output
114
    -V             Very verbose output
115
    -h             Print this help and exit
116
    -w <int>       Spam warning percentage             (default: ${MSG_SPAM_WARN})
117
    -c <int>       Spam error percentage               (default: ${MSG_SPAM_CRIT})
118
    -r <int>       Virus warning percentage            (default: ${MSG_VIRUS_WARN})
119
    -R <int>       Virus error percentage              (default: ${MSG_VIRUS_CRIT})
120
    -q <int>       Mail queues warning level           (default: ${MSG_QUEUE_WARN})
121
    -Q <int>       Mail queues error level             (default: ${MSG_QUEUE_CRIT})
122
    -l <int>       System load warning level           (default: ${LOAD_WARN})
123
    -L <int>       System load error level             (default: ${LOAD_CRIT})
124
    -m <int>       Memory load warning percentage      (default: ${MEM_WARN})
125
    -M <int>       Memory load error percentage        (default: ${MEM_CRIT})
126
    -s <int>       Swap load warning percentage        (default: ${SWAP_WARN})
127
    -S <int>       Swap load error percentage          (default: ${SWAP_CRIT})
128
    -d <int>       Partitions usage warning percentage (default: ${DISK_WARN})
129
    -D <int>       Partitions usage error percentage   (default: ${DISK_CRIT})
130
"
131
# Getting parameters:
132
while getopts "H:C:vVhw:c:r:R:q:Q:l:L:m:M:s:S:d:D:" OPT
133
do
134
	case $OPT in
135
		"H") MC_HOST=$OPTARG;;
136
		"C") COMMUNITY=$OPTARG;;
137
		"v") if [ "$VERBOSE" -lt "1" ]; then VERBOSE="1"; fi;;
138
		"V") VERBOSE="2";;
139
		"h") echo "$USAGE" && exit 3;;
140
		"w") MSG_SPAM_WARN=$OPTARG;;
141
		"c") MSG_SPAM_CRIT=$OPTARG;;
142
		"r") MSG_VIRUS_WARN=$OPTARG;;
143
		"R") MSG_VIRUS_CRIT=$OPTARG;;
144
		"q") MSG_QUEUE_WARN=$OPTARG;;
145
		"Q") MSG_QUEUE_CRIT=$OPTARG;;
146
		"l") LOAD_WARN=$OPTARG;;
147
		"L") LOAD_CRIT=$OPTARG;;
148
		"m") MEM_WARN=$OPTARG;;
149
		"M") MEM_CRIT=$OPTARG;;
150
		"s") SWAP_WARN=$OPTARG;;
151
		"S") SWAP_CRIT=$OPTARG;;
152
		"d") DISK_WARN=$OPTARG;;
153
		"D") DISK_CRIT=$OPTARG;;
154
        *) echo "$USAGE" && exit 3;;
155
	esac
156
done
157

    
158

    
159
# Other variables
160
STATE_OK=0
161
STATE_WARNING=1
162
STATE_CRITICAL=2
163

    
164
ISSUECRIT=""
165
ISSUEWARN=""
166
ISSUEOK=""
167
STATS=""
168

    
169
SEPARATOR=" - "
170

    
171
# Get data from SNMP queries
172
DAILY_COUNTS=$("${SNMPWALK}" -v2c -c "${COMMUNITY}" -O qv "${MC_HOST}" 1.3.6.1.4.1.2021.8.1.101.10 | sed "s/\"//g" 2>&1)
173
if [ $? -ne 0 ]
174
then
175
	echo "CRITICAL: $DAILY_COUNTS"
176
	exit $STATE_CRITICAL
177
fi
178

    
179
MSG_TOTAL=$(   "${SNMPWALK}" -v2c -c "${COMMUNITY}" -O qv "${MC_HOST}" 1.3.6.1.4.1.2021.8.1.101.1 | sed "s/\"//g")
180
MSG_SPAM=$(    "${SNMPWALK}" -v2c -c "${COMMUNITY}" -O qv "${MC_HOST}" 1.3.6.1.4.1.2021.8.1.101.2 | sed "s/\"//g")
181
MSG_BYTES=$(   "${SNMPWALK}" -v2c -c "${COMMUNITY}" -O qv "${MC_HOST}" 1.3.6.1.4.1.2021.8.1.101.3 | sed "s/\"//g")
182
MSG_VIRUS=$(   "${SNMPWALK}" -v2c -c "${COMMUNITY}" -O qv "${MC_HOST}" 1.3.6.1.4.1.2021.8.1.101.4 | sed "s/\"//g")
183

    
184
PROCS_STATUS=$("${SNMPWALK}" -v2c -c "${COMMUNITY}" -O qv "${MC_HOST}" 1.3.6.1.4.1.2021.8.1.101.5 | sed "s/\"//g")
185
SPOOL_STATUS=$("${SNMPWALK}" -v2c -c "${COMMUNITY}" -O qv "${MC_HOST}" 1.3.6.1.4.1.2021.8.1.101.6 | sed "s/\"//g")
186

    
187
LOAD_STATUS=$( "${SNMPWALK}" -v2c -c "${COMMUNITY}" -O qv "${MC_HOST}" 1.3.6.1.4.1.2021.8.1.101.7 | sed "s/\"//g")
188
PART_STATUS=$( "${SNMPWALK}" -v2c -c "${COMMUNITY}" -O qv "${MC_HOST}" 1.3.6.1.4.1.2021.8.1.101.8 | sed "s/\"//g")
189
MEM_STATUS=$(  "${SNMPWALK}" -v2c -c "${COMMUNITY}" -O qv "${MC_HOST}" 1.3.6.1.4.1.2021.8.1.101.9 | sed "s/\"//g")
190

    
191

    
192

    
193
# Process some stats
194
STATS="${STATS} msg_tot=${MSG_TOTAL} msg_spam=${MSG_SPAM} msg_virus=${MSG_VIRUS}"
195

    
196
### Process data
197

    
198
# Queue status
199
incoming=$(echo "${SPOOL_STATUS}" | cut -d'|' -f 2)
200
filtered=$(echo "${SPOOL_STATUS}" | cut -d'|' -f 3)
201
outgoing=$(echo "${SPOOL_STATUS}" | cut -d'|' -f 4)
202
STATS="${STATS} queue_in=${incoming} queue_filter=${filtered} queue_out=${outgoing}"
203

    
204
MSG="Queue count: $incoming incoming, $filtered filtered, $outgoing outgoing"
205
if [ "$incoming" -ge "$MSG_QUEUE_CRIT" ] || [ "$filtered" -ge "$MSG_QUEUE_CRIT" ] || [ "$outgoing" -ge "$MSG_QUEUE_CRIT" ]
206
then
207
	ISSUECRIT="${ISSUECRIT}${MSG}${SEPARATOR}"
208
elif [ "$incoming" -ge "$MSG_QUEUE_WARN" ] || [ "$filtered" -ge "$MSG_QUEUE_WARN" ] || [ "$outgoing" -ge "$MSG_QUEUE_WARN" ]
209
then
210
	ISSUEWARN="${ISSUEWARN}${MSG}${SEPARATOR}"
211
else
212
	ISSUEOK="${ISSUEOK}${MSG}\\n"
213
fi
214

    
215

    
216
# Procs status
217
mta_in=$(     echo "${PROCS_STATUS}" | cut -d'|' -f 2)
218
mta_queue=$(  echo "${PROCS_STATUS}" | cut -d'|' -f 3)
219
mta_out=$(    echo "${PROCS_STATUS}" | cut -d'|' -f 4)
220
web_gui=$(    echo "${PROCS_STATUS}" | cut -d'|' -f 5)
221
filt_engine=$(echo "${PROCS_STATUS}" | cut -d'|' -f 6)
222
master_db=$(  echo "${PROCS_STATUS}" | cut -d'|' -f 7)
223
slave_db=$(   echo "${PROCS_STATUS}" | cut -d'|' -f 8)
224
firewall=$(   echo "${PROCS_STATUS}" | cut -d'|' -f 9)
225

    
226
if [ "$mta_in" == "1" ]
227
then
228
	ISSUEOK="${ISSUEOK}Incoming MTA: running\\n"
229
else
230
	ISSUECRIT="${ISSUECRIT}Incoming MTA down${SEPARATOR}"
231
fi
232

    
233
if [ "$mta_queue" == "1" ]
234
then
235
	ISSUEOK="${ISSUEOK}Queuing MTA: running\\n"
236
else
237
	ISSUECRIT="${ISSUECRIT}Queuing MTA down${SEPARATOR}"
238
fi
239

    
240
if [ "$mta_out" == "1" ]
241
then
242
	ISSUEOK="${ISSUEOK}Outgoing MTA: running\\n"
243
else
244
	ISSUECRIT="${ISSUECRIT}Outgoing MTA down${SEPARATOR}"
245
fi
246

    
247
if [ "$web_gui" == "1" ]
248
then
249
	ISSUEOK="${ISSUEOK}Web GUI: running\\n"
250
else
251
	ISSUEWARN="${ISSUEWARN}Web GUI down${SEPARATOR}"
252
fi
253

    
254
if [ "$filt_engine" == "1" ]
255
then
256
	ISSUEOK="${ISSUEOK}Antispam/antivirus process/filtering engine: running\\n"
257
else
258
	ISSUECRIT="${ISSUECRIT}Antispam/antivirus process/filtering engine down${SEPARATOR}"
259
fi
260

    
261
if [ "$master_db" == "1" ]
262
then
263
	ISSUEOK="${ISSUEOK}Master DB: running\\n"
264
else
265
	ISSUEWARN="${ISSUEWARN}Master DB down${SEPARATOR}"
266
fi
267

    
268
if [ "$slave_db" == "1" ]
269
then
270
	ISSUEOK="${ISSUEOK}Slave DB: running\\n"
271
else
272
	ISSUECRIT="${ISSUECRIT}Slave DB down${SEPARATOR}"
273
fi
274

    
275
if [ "$firewall" == "1" ]
276
then
277
	ISSUEOK="${ISSUEOK}Firewall: running\\n"
278
else
279
	ISSUEWARN="${ISSUEWARN}Firewall down${SEPARATOR}"
280
fi
281

    
282

    
283
# Load status
284
load05=$(echo "${LOAD_STATUS}" | cut -d'|' -f 2)
285
load10=$(echo "${LOAD_STATUS}" | cut -d'|' -f 3)
286
load15=$(echo "${LOAD_STATUS}" | cut -d'|' -f 4)
287
STATS="${STATS} load5=${load05} load10=${load10} load15=${load15}"
288

    
289
MSG="System load: $load05/$load10/$load15"
290
load05=${load05/.*}
291
load10=${load10/.*}
292
load15=${load15/.*}
293
if [ "$load05" -ge "$LOAD_CRIT" ] || [ "$load10" -ge "$LOAD_CRIT" ] || [ "$load15" -ge "$LOAD_CRIT" ]
294
then
295
	ISSUECRIT="${ISSUECRIT}${MSG}${SEPARATOR}"
296
elif [ "$load05" -ge "$LOAD_WARN" ] || [ "$load10" -ge "$LOAD_WARN" ] || [ "$load15" -ge "$LOAD_WARN" ]
297
then
298
	ISSUEWARN="${ISSUEWARN}${MSG}${SEPARATOR}"
299
else
300
	ISSUEOK="${ISSUEOK}${MSG}\\n"
301
fi
302

    
303

    
304
# Memory status
305
ram_tot=$(  echo "${MEM_STATUS}" | cut -d'|' -f 2)
306
ram_free=$( echo "${MEM_STATUS}" | cut -d'|' -f 3)
307
swap_tot=$( echo "${MEM_STATUS}" | cut -d'|' -f 4)
308
swap_free=$(echo "${MEM_STATUS}" | cut -d'|' -f 5)
309

    
310
ram_perc=$(( 100 - ( ram_free  * 100 / ram_tot  ) ))
311
swap_perc=$(( 100 - ( swap_free * 100 / swap_tot ) ))
312
STATS="${STATS} ram=${ram_perc}% swap=${swap_perc}%"
313

    
314
MSG="Memory load: ${ram_perc}%"
315
if [ "$ram_perc" -ge "$MEM_CRIT" ]
316
then
317
	ISSUECRIT="${ISSUECRIT}${MSG}${SEPARATOR}"
318
elif [ "$ram_perc" -ge "$MEM_WARN" ]
319
then
320
	ISSUEWARN="${ISSUEWARN}${MSG}${SEPARATOR}"
321
else
322
	ISSUEOK="${ISSUEOK}${MSG}\\n"
323
fi
324

    
325
MSG="Swap load: ${swap_perc}%"
326
if [ "$swap_perc" -ge "$SWAP_CRIT" ]
327
then
328
	ISSUECRIT="${ISSUECRIT}${MSG}${SEPARATOR}"
329
elif [ "$swap_perc" -ge "$SWAP_WARN" ]
330
then
331
	ISSUEWARN="${ISSUEWARN}${MSG}${SEPARATOR}"
332
else
333
	ISSUEOK="${ISSUEOK}${MSG}\\n"
334
fi
335

    
336

    
337
# Disk partitions status
338
i="2"
339
part_name=$(echo "${PART_STATUS}" | cut -d'|' -f $i)
340
while [ "$part_name" != "" ]
341
do
342
	i=$(( i + 1 ))
343
	part_perc=$(echo "${PART_STATUS}" | cut -d'|' -f $i)
344
	STATS="${STATS} ${part_name}=${part_perc}"
345

    
346
	MSG="Disk ${part_name}: ${part_perc}"
347
	if [ "${part_perc%\%}" -ge "$DISK_CRIT" ]
348
	then
349
		ISSUECRIT="${ISSUECRIT}${MSG}${SEPARATOR}"
350
	elif [ "${part_perc%\%}" -ge "$DISK_WARN" ]
351
	then
352
		ISSUEWARN="${ISSUEWARN}${MSG}${SEPARATOR}"
353
	else
354
		ISSUEOK="${ISSUEOK}${MSG}\\n"
355
	fi
356

    
357
	i=$(( i + 1 ))
358
	part_name=$(echo "${PART_STATUS}" | cut -d'|' -f $i)
359
done
360

    
361

    
362
# Spam / malicious percentage status
363
spam_perc=$( echo "${DAILY_COUNTS}" | cut -d'|' -f 4)
364
virus_perc=$(echo "${DAILY_COUNTS}" | cut -d'|' -f 6)
365
clean_perc=$(echo "${DAILY_COUNTS}" | cut -d'|' -f 10)
366
STATS="${STATS} spam=${spam_perc}% virus=${virus_perc}% clean=${clean_perc}%"
367

    
368
MSG="Spam load: ${spam_perc}"
369
if [ "${spam_perc/.*}" -ge "$MSG_SPAM_CRIT" ]
370
then
371
	ISSUECRIT="${ISSUECRIT}${MSG}${SEPARATOR}"
372
elif [ "${spam_perc/.*}" -ge "$MSG_SPAM_WARN" ]
373
then
374
	ISSUEWARN="${ISSUEWARN}${MSG}${SEPARATOR}"
375
else
376
	ISSUEOK="${ISSUEOK}${MSG}\\n"
377
fi
378

    
379
MSG="Virus load: ${virus_perc}"
380
if [ "${virus_perc/.*}" -ge "$MSG_VIRUS_CRIT" ]
381
then
382
	ISSUECRIT="${ISSUECRIT}${MSG}${SEPARATOR}"
383
elif [ "${virus_perc/.*}" -ge "$MSG_VIRUS_WARN" ]
384
then
385
	ISSUEWARN="${ISSUEWARN}${MSG}${SEPARATOR}"
386
else
387
	ISSUEOK="${ISSUEOK}${MSG}\\n"
388
fi
389

    
390

    
391

    
392

    
393
# Prepare output values
394
RETSTATE=$STATE_OK
395
if [ -n "$ISSUECRIT" ]
396
then
397
	echo -n "CRITICAL: $ISSUECRIT"
398
	RETSTATE=$STATE_CRITICAL
399
fi
400
if [ -n "$ISSUEWARN" ]
401
then
402
	echo -n "WARNING: $ISSUEWARN"
403
	if [ "$RETSTATE" -lt "$STATE_WARNING" ]
404
	then
405
		RETSTATE=$STATE_WARNING
406
	fi
407
fi
408
if [ $RETSTATE -eq $STATE_OK ]
409
then
410
	echo -n "OK"
411
fi
412

    
413
echo " |$STATS"
414

    
415
if [ -n "$ISSUEOK" ] && [ "${VERBOSE}" -ge "1" ]
416
then
417
	echo -e "\\n$ISSUEOK"
418
fi
419

    
420
if [ "${VERBOSE}" -ge "2" ]
421
then
422
	echo "Raw SNMP values:
423
 1. number of filtered messages = ${MSG_TOTAL}
424
 2. number of spams detected = ${MSG_SPAM}
425
 3. number of bytes filtered = ${MSG_BYTES}
426
 4. number of viruses detected = ${MSG_VIRUS}
427
 5. processes status = ${PROCS_STATUS//\|/#}
428
 6. spools status (messages in incoming#filtering#outgoing queues) = ${SPOOL_STATUS//\|/#}
429
 7. system load (last 5#10#15minutes) = ${LOAD_STATUS//\|/#}
430
 8. disk partitions usage = ${PART_STATUS//\|/#}
431
 9. system memory usage in kB (tot_ram#free_ram#tot_swap#free_swap) = ${MEM_STATUS//\|/#}
432
10. all daily counts (bytes#msg#spam#%spam#virus#%virus#content#%content#clean#%clean) = ${DAILY_COUNTS//\|/#}"
433

    
434
fi
435

    
436
exit $RETSTATE