diff options
Diffstat (limited to 'plugins-scripts/check_mailq.pl')
-rwxr-xr-x | plugins-scripts/check_mailq.pl | 1042 |
1 files changed, 517 insertions, 525 deletions
diff --git a/plugins-scripts/check_mailq.pl b/plugins-scripts/check_mailq.pl index 49156af..f143c6f 100755 --- a/plugins-scripts/check_mailq.pl +++ b/plugins-scripts/check_mailq.pl | |||
@@ -1,7 +1,7 @@ | |||
1 | #!@PERL@ -w | 1 | #!@PERL@ -w |
2 | 2 | ||
3 | # check_mailq - check to see how many messages are in the smtp queue awating | 3 | # check_mailq - check to see how many messages are in the smtp queue awating |
4 | # transmittal. | 4 | # transmittal. |
5 | # | 5 | # |
6 | # Initial version support sendmail's mailq command | 6 | # Initial version support sendmail's mailq command |
7 | # Support for multiple sendmail queues (Carlos Canau) | 7 | # Support for multiple sendmail queues (Carlos Canau) |
@@ -29,8 +29,8 @@ use POSIX; | |||
29 | use strict; | 29 | use strict; |
30 | use Getopt::Long; | 30 | use Getopt::Long; |
31 | use vars qw($opt_V $opt_h $opt_v $verbose $PROGNAME $opt_w $opt_c $opt_t $opt_s $opt_d | 31 | use vars qw($opt_V $opt_h $opt_v $verbose $PROGNAME $opt_w $opt_c $opt_t $opt_s $opt_d |
32 | $opt_M $mailq $status $state $msg $msg_q $msg_p $opt_W $opt_C $mailq $mailq_args | 32 | $opt_M $mailq $status $state $msg $msg_q $msg_p $opt_W $opt_C $mailq $mailq_args |
33 | @lines %srcdomains %dstdomains); | 33 | @lines %srcdomains %dstdomains); |
34 | use FindBin; | 34 | use FindBin; |
35 | use lib "$FindBin::Bin"; | 35 | use lib "$FindBin::Bin"; |
36 | use utils qw(%ERRORS &print_revision &support &usage ); | 36 | use utils qw(%ERRORS &print_revision &support &usage ); |
@@ -42,10 +42,10 @@ sub print_usage (); | |||
42 | sub process_arguments (); | 42 | sub process_arguments (); |
43 | 43 | ||
44 | $ENV{'PATH'}='@TRUSTED_PATH@'; | 44 | $ENV{'PATH'}='@TRUSTED_PATH@'; |
45 | $ENV{'BASH_ENV'}=''; | 45 | $ENV{'BASH_ENV'}=''; |
46 | $ENV{'ENV'}=''; | 46 | $ENV{'ENV'}=''; |
47 | $PROGNAME = "check_mailq"; | 47 | $PROGNAME = "check_mailq"; |
48 | $mailq = 'sendmail'; # default | 48 | $mailq = 'sendmail'; # default |
49 | $msg_q = 0 ; | 49 | $msg_q = 0 ; |
50 | $msg_p = 0 ; | 50 | $msg_p = 0 ; |
51 | # If appended, must start with a space | 51 | # If appended, must start with a space |
@@ -55,50 +55,49 @@ $state = $ERRORS{'UNKNOWN'}; | |||
55 | Getopt::Long::Configure('bundling'); | 55 | Getopt::Long::Configure('bundling'); |
56 | $status = process_arguments(); | 56 | $status = process_arguments(); |
57 | if ($status){ | 57 | if ($status){ |
58 | print "ERROR: processing arguments\n"; | 58 | print "ERROR: processing arguments\n"; |
59 | exit $ERRORS{"UNKNOWN"}; | 59 | exit $ERRORS{"UNKNOWN"}; |
60 | } | 60 | } |
61 | 61 | ||
62 | if ($opt_s) { | 62 | if ($opt_s) { |
63 | if (defined $utils::PATH_TO_SUDO && -x $utils::PATH_TO_SUDO) { | 63 | if (defined $utils::PATH_TO_SUDO && -x $utils::PATH_TO_SUDO) { |
64 | $sudo = $utils::PATH_TO_SUDO; | 64 | $sudo = $utils::PATH_TO_SUDO; |
65 | } else { | 65 | } else { |
66 | print "ERROR: Cannot execute sudo\n"; | 66 | print "ERROR: Cannot execute sudo\n"; |
67 | exit $ERRORS{'UNKNOWN'}; | 67 | exit $ERRORS{'UNKNOWN'}; |
68 | } | 68 | } |
69 | } else { | 69 | } else { |
70 | $sudo = ""; | 70 | $sudo = ""; |
71 | } | 71 | } |
72 | 72 | ||
73 | if ($opt_d) { | 73 | if ($opt_d) { |
74 | $mailq_args = $mailq_args . ' -C ' . $opt_d; | 74 | $mailq_args = $mailq_args . ' -C ' . $opt_d; |
75 | } | 75 | } |
76 | 76 | ||
77 | $SIG{'ALRM'} = sub { | 77 | $SIG{'ALRM'} = sub { |
78 | print ("ERROR: timed out waiting for $utils::PATH_TO_MAILQ \n"); | 78 | print ("ERROR: timed out waiting for $utils::PATH_TO_MAILQ \n"); |
79 | exit $ERRORS{"WARNING"}; | 79 | exit $ERRORS{"WARNING"}; |
80 | }; | 80 | }; |
81 | alarm($opt_t); | 81 | alarm($opt_t); |
82 | 82 | ||
83 | # switch based on MTA | 83 | # switch based on MTA |
84 | 84 | ||
85 | if ($mailq eq "sendmail") { | 85 | if ($mailq eq "sendmail") { |
86 | 86 | if( ! $utils::PATH_TO_MAILQ) { | |
87 | ## open mailq | 87 | print "ERROR: \$utils::PATH_TO_MAILQ is not defined\n"; |
88 | if ( defined $utils::PATH_TO_MAILQ && -x $utils::PATH_TO_MAILQ ) { | 88 | exit $ERRORS{'UNKNOWN'}; |
89 | if (! open (MAILQ, "$sudo $utils::PATH_TO_MAILQ | " ) ) { | 89 | } |
90 | print "ERROR: could not open $utils::PATH_TO_MAILQ \n"; | 90 | |
91 | exit $ERRORS{'UNKNOWN'}; | 91 | if ( ! -x $utils::PATH_TO_MAILQ) { |
92 | } | 92 | print "ERROR: $utils::PATH_TO_MAILQ is not executable by (uid $>:gid($)))\n"; |
93 | }elsif( defined $utils::PATH_TO_MAILQ){ | 93 | exit $ERRORS{'UNKNOWN'}; |
94 | unless (-x $utils::PATH_TO_MAILQ) { | 94 | } |
95 | print "ERROR: $utils::PATH_TO_MAILQ is not executable by (uid $>:gid($)))\n"; | 95 | |
96 | exit $ERRORS{'UNKNOWN'}; | 96 | ## open mailq |
97 | } | 97 | if (! open (MAILQ, "$sudo $utils::PATH_TO_MAILQ | " ) ) { |
98 | } else { | 98 | print "ERROR: could not open $sudo $utils::PATH_TO_MAILQ \n"; |
99 | print "ERROR: \$utils::PATH_TO_MAILQ is not defined\n"; | 99 | exit $ERRORS{'UNKNOWN'}; |
100 | exit $ERRORS{'UNKNOWN'}; | 100 | } |
101 | } | ||
102 | # single queue empty | 101 | # single queue empty |
103 | ##/var/spool/mqueue is empty | 102 | ##/var/spool/mqueue is empty |
104 | # single queue: 1 | 103 | # single queue: 1 |
@@ -168,213 +167,207 @@ if ($mailq eq "sendmail") { | |||
168 | ## /var/spool/mqueue is empty | 167 | ## /var/spool/mqueue is empty |
169 | ## Total requests: 0 | 168 | ## Total requests: 0 |
170 | 169 | ||
171 | my $this_msg_q = 0; | 170 | my $this_msg_q = 0; |
172 | while (<MAILQ>) { | 171 | while (<MAILQ>) { |
173 | 172 | ||
174 | # match email addr on queue listing | 173 | # match email addr on queue listing |
175 | if ( (/<.*@.*\.(\w+\.\w+)>/) || (/<.*@(\w+\.\w+)>/) ) { | 174 | if ( (/<.*@.*\.(\w+\.\w+)>/) || (/<.*@(\w+\.\w+)>/) ) { |
176 | my $domain = $1; | 175 | my $domain = $1; |
177 | if (/^\w+/) { | 176 | if (/^\w+/) { |
178 | print "$utils::PATH_TO_MAILQ = srcdomain = $domain \n" if $verbose ; | 177 | print "$utils::PATH_TO_MAILQ = srcdomain = $domain \n" if $verbose ; |
179 | $srcdomains{$domain} ++; | 178 | $srcdomains{$domain} ++; |
180 | } | 179 | } |
181 | next; | 180 | next; |
182 | } | 181 | } |
183 | |||
184 | # | ||
185 | # ... | ||
186 | # sendmail considers a message with more than one destiny, say N, to the same MX | ||
187 | # to have N messages in queue. | ||
188 | # we will only consider one in this code | ||
189 | if (( /\s\(reply:\sread\serror\sfrom\s.*\.(\w+\.\w+)\.$/ ) || ( /\s\(reply:\sread\serror\sfrom\s(\w+\.\w+)\.$/ ) || | ||
190 | ( /\s\(timeout\swriting\smessage\sto\s.*\.(\w+\.\w+)\.:/ ) || ( /\s\(timeout\swriting\smessage\sto\s(\w+\.\w+)\.:/ ) || | ||
191 | ( /\s\(host\smap:\slookup\s\(.*\.(\w+\.\w+)\):/ ) || ( /\s\(host\smap:\slookup\s\((\w+\.\w+)\):/ ) || | ||
192 | ( /\s\(Deferred:\s.*\s.*\.(\w+\.\w+)\.\)/ ) || ( /\s\(Deferred:\s.*\s(\w+\.\w+)\.\)/ ) ) { | ||
193 | |||
194 | print "$utils::PATH_TO_MAILQ = dstdomain = $1 \n" if $verbose ; | ||
195 | $dstdomains{$1} ++; | ||
196 | } | ||
197 | |||
198 | if (/\s+\(I\/O\serror\)/) { | ||
199 | print "$utils::PATH_TO_MAILQ = dstdomain = UNKNOWN \n" if $verbose ; | ||
200 | $dstdomains{'UNKNOWN'} ++; | ||
201 | } | ||
202 | |||
203 | # Finally look at the overall queue length | ||
204 | # | ||
205 | if (/mqueue/) { | ||
206 | print "$utils::PATH_TO_MAILQ = $_ "if $verbose ; | ||
207 | if (/ \((\d+) request/) { | ||
208 | # | ||
209 | # single queue: first line | ||
210 | # multi queue: one for each queue. overwrite on multi queue below | ||
211 | $this_msg_q = $1 ; | ||
212 | $msg_q += $1 ; | ||
213 | } | ||
214 | } elsif (/^\s+Total\sRequests:\s(\d+)$/i) { | ||
215 | if ($this_msg_q) { | ||
216 | $this_msg_q = 0 ; | ||
217 | } else { | ||
218 | print "$utils::PATH_TO_MAILQ = $_ \n" if $verbose ; | ||
219 | # | ||
220 | # multi queue: last line | ||
221 | $msg_q += $1 ; | ||
222 | } | ||
223 | } | ||
224 | |||
225 | } | ||
226 | |||
227 | |||
228 | ## close mailq | ||
229 | |||
230 | close (MAILQ); | ||
231 | |||
232 | if ( $? ) { | ||
233 | print "CRITICAL: Error code ".($?>>8)." returned from $utils::PATH_TO_MAILQ",$/; | ||
234 | exit $ERRORS{CRITICAL}; | ||
235 | } | ||
236 | |||
237 | ## shut off the alarm | ||
238 | alarm(0); | ||
239 | |||
240 | |||
241 | |||
242 | ## now check the queue length(s) | ||
243 | |||
244 | if ($msg_q == 0) { | ||
245 | $msg = "OK: $mailq mailq is empty"; | ||
246 | $state = $ERRORS{'OK'}; | ||
247 | } else { | ||
248 | print "msg_q = $msg_q warn=$opt_w crit=$opt_c\n" if $verbose; | ||
249 | |||
250 | # overall queue length | ||
251 | if ($msg_q < $opt_w) { | ||
252 | $msg = "OK: $mailq mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; | ||
253 | $state = $ERRORS{'OK'}; | ||
254 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { | ||
255 | $msg = "WARNING: $mailq mailq is $msg_q (threshold w = $opt_w)"; | ||
256 | $state = $ERRORS{'WARNING'}; | ||
257 | }else { | ||
258 | $msg = "CRITICAL: $mailq mailq is $msg_q (threshold c = $opt_c)"; | ||
259 | $state = $ERRORS{'CRITICAL'}; | ||
260 | } | ||
261 | |||
262 | # check for domain specific queue lengths if requested | ||
263 | if (defined $opt_W) { | ||
264 | |||
265 | # Apply threshold to queue lengths FROM domain | ||
266 | my @srckeys = sort { $srcdomains{$b} <=> $srcdomains{$a} } keys %srcdomains; | ||
267 | my $srcmaxkey = $srckeys[0]; | ||
268 | print "src max is $srcmaxkey with $srcdomains{$srcmaxkey} messages\n" if $verbose; | ||
269 | |||
270 | if ($srcdomains{$srcmaxkey} >= $opt_W && $srcdomains{$srcmaxkey} < $opt_C) { | ||
271 | if ($state == $ERRORS{'OK'}) { | ||
272 | $msg = "WARNING: $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold W = $opt_W)"; | ||
273 | $state = $ERRORS{'WARNING'}; | ||
274 | } elsif (($state == $ERRORS{'WARNING'}) || ($state == $ERRORS{'CRITICAL'})){ | ||
275 | $msg .= " -and- $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold W = $opt_W)"; | ||
276 | } else { | ||
277 | $msg = "WARNING: $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold W = $opt_W)"; | ||
278 | $state = $ERRORS{'WARNING'}; | ||
279 | } | ||
280 | } elsif ($srcdomains{$srcmaxkey} >= $opt_C) { | ||
281 | if ($state == $ERRORS{'OK'}) { | ||
282 | $msg = "CRITICAL: $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold C = $opt_C)"; | ||
283 | $state = $ERRORS{'CRITICAL'}; | ||
284 | } elsif ($state == $ERRORS{'WARNING'}) { | ||
285 | $msg = "CRITICAL: $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold C = $opt_C) -and- " . $msg; | ||
286 | $msg =~ s/WARNING: //; | ||
287 | } elsif ($state == $ERRORS{'CRITICAL'}) { | ||
288 | $msg .= " -and- $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold W = $opt_W)"; | ||
289 | } else { | ||
290 | $msg = "CRITICAL: $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold W = $opt_W)"; | ||
291 | $state = $ERRORS{'CRITICAL'}; | ||
292 | } | ||
293 | } else { | ||
294 | if ($srcdomains{$srcmaxkey} > 0) { | ||
295 | $msg .= " $srcdomains{$srcmaxkey} msgs. FROM $srcmaxkey is below threshold ($opt_W/$opt_C)"; | ||
296 | } | ||
297 | } | ||
298 | |||
299 | # Apply threshold to queue lengths TO domain | ||
300 | my @dstkeys = sort { $dstdomains{$b} <=> $dstdomains{$a} } keys %dstdomains; | ||
301 | my $dstmaxkey = $dstkeys[0]; | ||
302 | print "dst max is $dstmaxkey with $dstdomains{$dstmaxkey} messages\n" if $verbose; | ||
303 | |||
304 | if ($dstdomains{$dstmaxkey} >= $opt_W && $dstdomains{$dstmaxkey} < $opt_C) { | ||
305 | if ($state == $ERRORS{'OK'}) { | ||
306 | $msg = "WARNING: $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold W = $opt_W)"; | ||
307 | $state = $ERRORS{'WARNING'}; | ||
308 | } elsif (($state == $ERRORS{'WARNING'}) || ($state == $ERRORS{'CRITICAL'})){ | ||
309 | $msg .= " -and- $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold W = $opt_W)"; | ||
310 | } else { | ||
311 | $msg = "WARNING: $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold W = $opt_W)"; | ||
312 | $state = $ERRORS{'WARNING'}; | ||
313 | } | ||
314 | } elsif ($dstdomains{$dstmaxkey} >= $opt_C) { | ||
315 | if ($state == $ERRORS{'OK'}) { | ||
316 | $msg = "CRITICAL: $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold C = $opt_C)"; | ||
317 | $state = $ERRORS{'CRITICAL'}; | ||
318 | } elsif ($state == $ERRORS{'WARNING'}) { | ||
319 | $msg = "CRITICAL: $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold C = $opt_C) -and- " . $msg; | ||
320 | $msg =~ s/WARNING: //; | ||
321 | } elsif ($state == $ERRORS{'CRITICAL'}) { | ||
322 | $msg .= " -and- $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold W = $opt_W)"; | ||
323 | } else { | ||
324 | $msg = "CRITICAL: $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold W = $opt_W)"; | ||
325 | $state = $ERRORS{'CRITICAL'}; | ||
326 | } | ||
327 | } else { | ||
328 | if ($dstdomains{$dstmaxkey} > 0) { | ||
329 | $msg .= " $dstdomains{$dstmaxkey} msgs. TO $dstmaxkey is below threshold ($opt_W/$opt_C)"; | ||
330 | } | ||
331 | } | ||
332 | |||
333 | } # End of queue length thresholds | ||
334 | |||
335 | } | ||
336 | 182 | ||
337 | } # end of ($mailq eq "sendmail") | 183 | # |
338 | elsif ( $mailq eq "postfix" ) { | 184 | # ... |
185 | # sendmail considers a message with more than one destiny, say N, to the same MX | ||
186 | # to have N messages in queue. | ||
187 | # we will only consider one in this code | ||
188 | if (( /\s\(reply:\sread\serror\sfrom\s.*\.(\w+\.\w+)\.$/ ) || ( /\s\(reply:\sread\serror\sfrom\s(\w+\.\w+)\.$/ ) || | ||
189 | ( /\s\(timeout\swriting\smessage\sto\s.*\.(\w+\.\w+)\.:/ ) || ( /\s\(timeout\swriting\smessage\sto\s(\w+\.\w+)\.:/ ) || | ||
190 | ( /\s\(host\smap:\slookup\s\(.*\.(\w+\.\w+)\):/ ) || ( /\s\(host\smap:\slookup\s\((\w+\.\w+)\):/ ) || | ||
191 | ( /\s\(Deferred:\s.*\s.*\.(\w+\.\w+)\.\)/ ) || ( /\s\(Deferred:\s.*\s(\w+\.\w+)\.\)/ ) ) { | ||
192 | |||
193 | print "$utils::PATH_TO_MAILQ = dstdomain = $1 \n" if $verbose ; | ||
194 | $dstdomains{$1} ++; | ||
195 | } | ||
339 | 196 | ||
340 | ## open mailq | 197 | if (/\s+\(I\/O\serror\)/) { |
341 | if ( defined $utils::PATH_TO_MAILQ && -x $utils::PATH_TO_MAILQ ) { | 198 | print "$utils::PATH_TO_MAILQ = dstdomain = UNKNOWN \n" if $verbose ; |
342 | if (! open (MAILQ, "$sudo $utils::PATH_TO_MAILQ$mailq_args | " ) ) { | 199 | $dstdomains{'UNKNOWN'} ++; |
343 | print "ERROR: could not open $utils::PATH_TO_MAILQ$mailq_args \n"; | ||
344 | exit $ERRORS{'UNKNOWN'}; | ||
345 | } | ||
346 | }elsif( defined $utils::PATH_TO_MAILQ){ | ||
347 | unless (-x $utils::PATH_TO_MAILQ) { | ||
348 | print "ERROR: $utils::PATH_TO_MAILQ is not executable by (uid $>:gid($)))\n"; | ||
349 | exit $ERRORS{'UNKNOWN'}; | ||
350 | } | ||
351 | } else { | ||
352 | print "ERROR: \$utils::PATH_TO_MAILQ is not defined\n"; | ||
353 | exit $ERRORS{'UNKNOWN'}; | ||
354 | } | 200 | } |
355 | 201 | ||
202 | # Finally look at the overall queue length | ||
203 | # | ||
204 | if (/mqueue/) { | ||
205 | print "$utils::PATH_TO_MAILQ = $_ "if $verbose ; | ||
206 | if (/ \((\d+) request/) { | ||
207 | # | ||
208 | # single queue: first line | ||
209 | # multi queue: one for each queue. overwrite on multi queue below | ||
210 | $this_msg_q = $1 ; | ||
211 | $msg_q += $1 ; | ||
212 | } | ||
213 | } elsif (/^\s+Total\sRequests:\s(\d+)$/i) { | ||
214 | if ($this_msg_q) { | ||
215 | $this_msg_q = 0 ; | ||
216 | } else { | ||
217 | print "$utils::PATH_TO_MAILQ = $_ \n" if $verbose ; | ||
218 | # | ||
219 | # multi queue: last line | ||
220 | $msg_q += $1 ; | ||
221 | } | ||
222 | } | ||
356 | 223 | ||
357 | @lines = reverse <MAILQ>; | 224 | } |
225 | |||
226 | ## close mailq | ||
227 | close (MAILQ); | ||
228 | |||
229 | if ( $? ) { | ||
230 | print "CRITICAL: Error code ".($?>>8)." returned from $utils::PATH_TO_MAILQ",$/; | ||
231 | exit $ERRORS{CRITICAL}; | ||
232 | } | ||
233 | |||
234 | ## shut off the alarm | ||
235 | alarm(0); | ||
236 | |||
237 | ## now check the queue length(s) | ||
238 | |||
239 | if ($msg_q == 0) { | ||
240 | $msg = "OK: $mailq mailq is empty"; | ||
241 | $state = $ERRORS{'OK'}; | ||
242 | } else { | ||
243 | print "msg_q = $msg_q warn=$opt_w crit=$opt_c\n" if $verbose; | ||
244 | |||
245 | # overall queue length | ||
246 | if ($msg_q < $opt_w) { | ||
247 | $msg = "OK: $mailq mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; | ||
248 | $state = $ERRORS{'OK'}; | ||
249 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { | ||
250 | $msg = "WARNING: $mailq mailq is $msg_q (threshold w = $opt_w)"; | ||
251 | $state = $ERRORS{'WARNING'}; | ||
252 | }else { | ||
253 | $msg = "CRITICAL: $mailq mailq is $msg_q (threshold c = $opt_c)"; | ||
254 | $state = $ERRORS{'CRITICAL'}; | ||
255 | } | ||
358 | 256 | ||
359 | # close qmail-qstat | 257 | # check for domain specific queue lengths if requested |
360 | close MAILQ; | 258 | if (defined $opt_W) { |
259 | |||
260 | # Apply threshold to queue lengths FROM domain | ||
261 | my @srckeys = sort { $srcdomains{$b} <=> $srcdomains{$a} } keys %srcdomains; | ||
262 | my $srcmaxkey = $srckeys[0]; | ||
263 | print "src max is $srcmaxkey with $srcdomains{$srcmaxkey} messages\n" if $verbose; | ||
264 | |||
265 | if ($srcdomains{$srcmaxkey} >= $opt_W && $srcdomains{$srcmaxkey} < $opt_C) { | ||
266 | if ($state == $ERRORS{'OK'}) { | ||
267 | $msg = "WARNING: $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold W = $opt_W)"; | ||
268 | $state = $ERRORS{'WARNING'}; | ||
269 | } elsif (($state == $ERRORS{'WARNING'}) || ($state == $ERRORS{'CRITICAL'})){ | ||
270 | $msg .= " -and- $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold W = $opt_W)"; | ||
271 | } else { | ||
272 | $msg = "WARNING: $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold W = $opt_W)"; | ||
273 | $state = $ERRORS{'WARNING'}; | ||
274 | } | ||
275 | } elsif ($srcdomains{$srcmaxkey} >= $opt_C) { | ||
276 | if ($state == $ERRORS{'OK'}) { | ||
277 | $msg = "CRITICAL: $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold C = $opt_C)"; | ||
278 | $state = $ERRORS{'CRITICAL'}; | ||
279 | } elsif ($state == $ERRORS{'WARNING'}) { | ||
280 | $msg = "CRITICAL: $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold C = $opt_C) -and- " . $msg; | ||
281 | $msg =~ s/WARNING: //; | ||
282 | } elsif ($state == $ERRORS{'CRITICAL'}) { | ||
283 | $msg .= " -and- $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold W = $opt_W)"; | ||
284 | } else { | ||
285 | $msg = "CRITICAL: $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold W = $opt_W)"; | ||
286 | $state = $ERRORS{'CRITICAL'}; | ||
287 | } | ||
288 | } else { | ||
289 | if ($srcdomains{$srcmaxkey} > 0) { | ||
290 | $msg .= " $srcdomains{$srcmaxkey} msgs. FROM $srcmaxkey is below threshold ($opt_W/$opt_C)"; | ||
291 | } | ||
292 | } | ||
293 | |||
294 | # Apply threshold to queue lengths TO domain | ||
295 | my @dstkeys = sort { $dstdomains{$b} <=> $dstdomains{$a} } keys %dstdomains; | ||
296 | my $dstmaxkey = $dstkeys[0]; | ||
297 | print "dst max is $dstmaxkey with $dstdomains{$dstmaxkey} messages\n" if $verbose; | ||
298 | |||
299 | if ($dstdomains{$dstmaxkey} >= $opt_W && $dstdomains{$dstmaxkey} < $opt_C) { | ||
300 | if ($state == $ERRORS{'OK'}) { | ||
301 | $msg = "WARNING: $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold W = $opt_W)"; | ||
302 | $state = $ERRORS{'WARNING'}; | ||
303 | } elsif (($state == $ERRORS{'WARNING'}) || ($state == $ERRORS{'CRITICAL'})){ | ||
304 | $msg .= " -and- $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold W = $opt_W)"; | ||
305 | } else { | ||
306 | $msg = "WARNING: $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold W = $opt_W)"; | ||
307 | $state = $ERRORS{'WARNING'}; | ||
308 | } | ||
309 | } elsif ($dstdomains{$dstmaxkey} >= $opt_C) { | ||
310 | if ($state == $ERRORS{'OK'}) { | ||
311 | $msg = "CRITICAL: $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold C = $opt_C)"; | ||
312 | $state = $ERRORS{'CRITICAL'}; | ||
313 | } elsif ($state == $ERRORS{'WARNING'}) { | ||
314 | $msg = "CRITICAL: $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold C = $opt_C) -and- " . $msg; | ||
315 | $msg =~ s/WARNING: //; | ||
316 | } elsif ($state == $ERRORS{'CRITICAL'}) { | ||
317 | $msg .= " -and- $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold W = $opt_W)"; | ||
318 | } else { | ||
319 | $msg = "CRITICAL: $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold W = $opt_W)"; | ||
320 | $state = $ERRORS{'CRITICAL'}; | ||
321 | } | ||
322 | } else { | ||
323 | if ($dstdomains{$dstmaxkey} > 0) { | ||
324 | $msg .= " $dstdomains{$dstmaxkey} msgs. TO $dstmaxkey is below threshold ($opt_W/$opt_C)"; | ||
325 | } | ||
326 | } | ||
361 | 327 | ||
362 | if ( $? ) { | 328 | } # End of queue length thresholds |
363 | print "CRITICAL: Error code ".($?>>8)." returned from $utils::PATH_TO_MAILQ$mailq_args",$/; | ||
364 | exit $ERRORS{CRITICAL}; | ||
365 | } | ||
366 | 329 | ||
367 | ## shut off the alarm | 330 | } |
368 | alarm(0); | ||
369 | 331 | ||
370 | # check queue length | 332 | } # end of ($mailq eq "sendmail") |
371 | if ($lines[0]=~/Kbytes in (\d+)/) { | 333 | elsif ( $mailq eq "postfix" ) { |
372 | $msg_q = $1 ; | 334 | if( ! $utils::PATH_TO_MAILQ ) { |
373 | }elsif ($lines[0]=~/Mail queue is empty/) { | 335 | print "ERROR: \$utils::PATH_TO_MAILQ is not defined\n"; |
374 | $msg_q = 0; | 336 | exit $ERRORS{'UNKNOWN'}; |
337 | } | ||
338 | |||
339 | if ( ! -x $utils::PATH_TO_MAILQ) { | ||
340 | print "ERROR: $utils::PATH_TO_MAILQ is not executable by (uid $>:gid($)))\n"; | ||
341 | exit $ERRORS{'UNKNOWN'}; | ||
342 | } | ||
343 | |||
344 | ## open mailq | ||
345 | if (! open (MAILQ, "$sudo $utils::PATH_TO_MAILQ$mailq_args | " ) ) { | ||
346 | print "ERROR: could not open $utils::PATH_TO_MAILQ$mailq_args \n"; | ||
347 | exit $ERRORS{'UNKNOWN'}; | ||
348 | } | ||
349 | |||
350 | @lines = reverse <MAILQ>; | ||
351 | |||
352 | # close qmail-qstat | ||
353 | close MAILQ; | ||
354 | |||
355 | if ( $? ) { | ||
356 | print "CRITICAL: Error code ".($?>>8)." returned from $utils::PATH_TO_MAILQ$mailq_args",$/; | ||
357 | exit $ERRORS{CRITICAL}; | ||
358 | } | ||
359 | |||
360 | ## shut off the alarm | ||
361 | alarm(0); | ||
362 | |||
363 | # check queue length | ||
364 | if ($lines[0]=~/Kbytes in (\d+)/) { | ||
365 | $msg_q = $1 ; | ||
366 | }elsif ($lines[0]=~/Mail queue is empty/) { | ||
367 | $msg_q = 0; | ||
375 | }else{ | 368 | }else{ |
376 | print "Couldn't match $utils::PATH_TO_MAILQ$mailq_args output\n"; | 369 | print "Couldn't match $utils::PATH_TO_MAILQ$mailq_args output\n"; |
377 | exit $ERRORS{'UNKNOWN'}; | 370 | exit $ERRORS{'UNKNOWN'}; |
378 | } | 371 | } |
379 | 372 | ||
380 | # check messages not processed | 373 | # check messages not processed |
@@ -390,194 +383,193 @@ elsif ( $mailq eq "postfix" ) { | |||
390 | $msg = "OK: $mailq mailq reports queue is empty"; | 383 | $msg = "OK: $mailq mailq reports queue is empty"; |
391 | $state = $ERRORS{'OK'}; | 384 | $state = $ERRORS{'OK'}; |
392 | } else { | 385 | } else { |
393 | print "msg_q = $msg_q warn=$opt_w crit=$opt_c\n" if $verbose; | 386 | print "msg_q = $msg_q warn=$opt_w crit=$opt_c\n" if $verbose; |
394 | 387 | ||
395 | # overall queue length | 388 | # overall queue length |
396 | if ($msg_q < $opt_w) { | 389 | if ($msg_q < $opt_w) { |
397 | $msg = "OK: $mailq mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; | 390 | $msg = "OK: $mailq mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; |
398 | $state = $ERRORS{'OK'}; | 391 | $state = $ERRORS{'OK'}; |
399 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { | 392 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { |
400 | $msg = "WARNING: $mailq mailq is $msg_q (threshold w = $opt_w)"; | 393 | $msg = "WARNING: $mailq mailq is $msg_q (threshold w = $opt_w)"; |
401 | $state = $ERRORS{'WARNING'}; | 394 | $state = $ERRORS{'WARNING'}; |
402 | }else { | 395 | }else { |
403 | $msg = "CRITICAL: $mailq mailq is $msg_q (threshold c = $opt_c)"; | 396 | $msg = "CRITICAL: $mailq mailq is $msg_q (threshold c = $opt_c)"; |
404 | $state = $ERRORS{'CRITICAL'}; | 397 | $state = $ERRORS{'CRITICAL'}; |
405 | } | 398 | } |
406 | 399 | ||
407 | # check messages not yet preprocessed (only compare is $opt_W and $opt_C | 400 | # check messages not yet preprocessed (only compare is $opt_W and $opt_C |
408 | # are defined) | 401 | # are defined) |
409 | 402 | ||
410 | #if (defined $opt_W) { | 403 | #if (defined $opt_W) { |
411 | # $msg .= "[Preprocessed = $msg_p]"; | 404 | # $msg .= "[Preprocessed = $msg_p]"; |
412 | # if ($msg_p >= $opt_W && $msg_p < $opt_C ) { | 405 | # if ($msg_p >= $opt_W && $msg_p < $opt_C ) { |
413 | # $state = $state == $ERRORS{"CRITICAL"} ? $ERRORS{"CRITICAL"} : $ERRORS{"WARNING"} ; | 406 | # $state = $state == $ERRORS{"CRITICAL"} ? $ERRORS{"CRITICAL"} : $ERRORS{"WARNING"} ; |
414 | # }elsif ($msg_p >= $opt_C ) { | 407 | # }elsif ($msg_p >= $opt_C ) { |
415 | # $state = $ERRORS{"CRITICAL"} ; | 408 | # $state = $ERRORS{"CRITICAL"} ; |
416 | # } | 409 | # } |
417 | #} | 410 | #} |
418 | } | 411 | } |
419 | } # end of ($mailq eq "postfix") | 412 | } # end of ($mailq eq "postfix") |
420 | elsif ( $mailq eq "qmail" ) { | 413 | elsif ( $mailq eq "qmail" ) { |
414 | if ( ! $utils::PATH_TO_QMAIL_QSTAT ) { | ||
415 | print "ERROR: \$utils::PATH_TO_QMAIL_QSTAT is not defined\n"; | ||
416 | exit $ERRORS{'UNKNOWN'}; | ||
417 | } | ||
418 | |||
419 | if ( ! -x $utils::PATH_TO_QMAIL_QSTAT) { | ||
420 | print "ERROR: $utils::PATH_TO_QMAIL_QSTAT is not executable by (uid $>:gid($)))\n"; | ||
421 | exit $ERRORS{'UNKNOWN'}; | ||
422 | } | ||
423 | |||
424 | # open qmail-qstat | ||
425 | if (! open (MAILQ, "$sudo $utils::PATH_TO_QMAIL_QSTAT | " ) ) { | ||
426 | print "ERROR: could not open $utils::PATH_TO_QMAIL_QSTAT \n"; | ||
427 | exit $ERRORS{'UNKNOWN'}; | ||
428 | } | ||
429 | |||
430 | @lines = <MAILQ>; | ||
431 | |||
432 | # close qmail-qstat | ||
433 | close MAILQ; | ||
434 | |||
435 | if ( $? ) { | ||
436 | print "CRITICAL: Error code ".($?>>8)." returned from $utils::PATH_TO_MAILQ",$/; | ||
437 | exit $ERRORS{CRITICAL}; | ||
438 | } | ||
439 | |||
440 | ## shut off the alarm | ||
441 | alarm(0); | ||
442 | |||
443 | # check queue length | ||
444 | if ($lines[0]=~/^messages in queue: (\d+)/) { | ||
445 | $msg_q = $1 ; | ||
446 | }else{ | ||
447 | print "Couldn't match $utils::PATH_TO_QMAIL_QSTAT output\n"; | ||
448 | exit $ERRORS{'UNKNOWN'}; | ||
449 | } | ||
450 | |||
451 | # check messages not processed | ||
452 | if ($lines[1]=~/^messages in queue but not yet preprocessed: (\d+)/) { | ||
453 | my $msg_p = $1; | ||
454 | }else{ | ||
455 | print "Couldn't match $utils::PATH_TO_QMAIL_QSTAT output\n"; | ||
456 | exit $ERRORS{'UNKNOWN'}; | ||
457 | } | ||
458 | |||
459 | |||
460 | # check queue length(s) | ||
461 | if ($msg_q == 0){ | ||
462 | $msg = "OK: qmail-qstat reports queue is empty"; | ||
463 | $state = $ERRORS{'OK'}; | ||
464 | } else { | ||
465 | print "msg_q = $msg_q warn=$opt_w crit=$opt_c\n" if $verbose; | ||
466 | |||
467 | # overall queue length | ||
468 | if ($msg_q < $opt_w) { | ||
469 | $msg = "OK: $mailq mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; | ||
470 | $state = $ERRORS{'OK'}; | ||
471 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { | ||
472 | $msg = "WARNING: $mailq mailq is $msg_q (threshold w = $opt_w)"; | ||
473 | $state = $ERRORS{'WARNING'}; | ||
474 | }else { | ||
475 | $msg = "CRITICAL: $mailq mailq is $msg_q (threshold c = $opt_c)"; | ||
476 | $state = $ERRORS{'CRITICAL'}; | ||
477 | } | ||
478 | |||
479 | # check messages not yet preprocessed (only compare is $opt_W and $opt_C | ||
480 | # are defined) | ||
481 | |||
482 | if (defined $opt_W) { | ||
483 | $msg .= "[Preprocessed = $msg_p]"; | ||
484 | if ($msg_p >= $opt_W && $msg_p < $opt_C ) { | ||
485 | $state = $state == $ERRORS{"CRITICAL"} ? $ERRORS{"CRITICAL"} : $ERRORS{"WARNING"} ; | ||
486 | }elsif ($msg_p >= $opt_C ) { | ||
487 | $state = $ERRORS{"CRITICAL"} ; | ||
488 | } | ||
489 | } | ||
490 | } | ||
421 | 491 | ||
422 | # open qmail-qstat | ||
423 | if ( defined $utils::PATH_TO_QMAIL_QSTAT && -x $utils::PATH_TO_QMAIL_QSTAT ) { | ||
424 | if (! open (MAILQ, "$sudo $utils::PATH_TO_QMAIL_QSTAT | " ) ) { | ||
425 | print "ERROR: could not open $utils::PATH_TO_QMAIL_QSTAT \n"; | ||
426 | exit $ERRORS{'UNKNOWN'}; | ||
427 | } | ||
428 | }elsif( defined $utils::PATH_TO_QMAIL_QSTAT){ | ||
429 | unless (-x $utils::PATH_TO_QMAIL_QSTAT) { | ||
430 | print "ERROR: $utils::PATH_TO_QMAIL_QSTAT is not executable by (uid $>:gid($)))\n"; | ||
431 | exit $ERRORS{'UNKNOWN'}; | ||
432 | } | ||
433 | } else { | ||
434 | print "ERROR: \$utils::PATH_TO_QMAIL_QSTAT is not defined\n"; | ||
435 | exit $ERRORS{'UNKNOWN'}; | ||
436 | } | ||
437 | |||
438 | @lines = <MAILQ>; | ||
439 | |||
440 | # close qmail-qstat | ||
441 | close MAILQ; | ||
442 | |||
443 | if ( $? ) { | ||
444 | print "CRITICAL: Error code ".($?>>8)." returned from $utils::PATH_TO_MAILQ",$/; | ||
445 | exit $ERRORS{CRITICAL}; | ||
446 | } | ||
447 | |||
448 | ## shut off the alarm | ||
449 | alarm(0); | ||
450 | |||
451 | # check queue length | ||
452 | if ($lines[0]=~/^messages in queue: (\d+)/) { | ||
453 | $msg_q = $1 ; | ||
454 | }else{ | ||
455 | print "Couldn't match $utils::PATH_TO_QMAIL_QSTAT output\n"; | ||
456 | exit $ERRORS{'UNKNOWN'}; | ||
457 | } | ||
458 | |||
459 | # check messages not processed | ||
460 | if ($lines[1]=~/^messages in queue but not yet preprocessed: (\d+)/) { | ||
461 | my $msg_p = $1; | ||
462 | }else{ | ||
463 | print "Couldn't match $utils::PATH_TO_QMAIL_QSTAT output\n"; | ||
464 | exit $ERRORS{'UNKNOWN'}; | ||
465 | } | ||
466 | |||
467 | |||
468 | # check queue length(s) | ||
469 | if ($msg_q == 0){ | ||
470 | $msg = "OK: qmail-qstat reports queue is empty"; | ||
471 | $state = $ERRORS{'OK'}; | ||
472 | } else { | ||
473 | print "msg_q = $msg_q warn=$opt_w crit=$opt_c\n" if $verbose; | ||
474 | |||
475 | # overall queue length | ||
476 | if ($msg_q < $opt_w) { | ||
477 | $msg = "OK: $mailq mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; | ||
478 | $state = $ERRORS{'OK'}; | ||
479 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { | ||
480 | $msg = "WARNING: $mailq mailq is $msg_q (threshold w = $opt_w)"; | ||
481 | $state = $ERRORS{'WARNING'}; | ||
482 | }else { | ||
483 | $msg = "CRITICAL: $mailq mailq is $msg_q (threshold c = $opt_c)"; | ||
484 | $state = $ERRORS{'CRITICAL'}; | ||
485 | } | ||
486 | |||
487 | # check messages not yet preprocessed (only compare is $opt_W and $opt_C | ||
488 | # are defined) | ||
489 | |||
490 | if (defined $opt_W) { | ||
491 | $msg .= "[Preprocessed = $msg_p]"; | ||
492 | if ($msg_p >= $opt_W && $msg_p < $opt_C ) { | ||
493 | $state = $state == $ERRORS{"CRITICAL"} ? $ERRORS{"CRITICAL"} : $ERRORS{"WARNING"} ; | ||
494 | }elsif ($msg_p >= $opt_C ) { | ||
495 | $state = $ERRORS{"CRITICAL"} ; | ||
496 | } | ||
497 | } | ||
498 | } | ||
499 | |||
500 | 492 | ||
501 | 493 | ||
502 | } # end of ($mailq eq "qmail") | 494 | } # end of ($mailq eq "qmail") |
503 | elsif ( $mailq eq "exim" ) { | 495 | elsif ( $mailq eq "exim" ) { |
504 | ## open mailq | 496 | if ( ! $utils::PATH_TO_MAILQ ) { |
505 | if ( defined $utils::PATH_TO_MAILQ && -x $utils::PATH_TO_MAILQ ) { | 497 | print "ERROR: \$utils::PATH_TO_MAILQ is not defined\n"; |
506 | if (! open (MAILQ, "$sudo $utils::PATH_TO_MAILQ | " ) ) { | 498 | exit $ERRORS{'UNKNOWN'}; |
507 | print "ERROR: could not open $utils::PATH_TO_MAILQ \n"; | 499 | } |
508 | exit $ERRORS{'UNKNOWN'}; | 500 | |
509 | } | 501 | if ( ! -x $utils::PATH_TO_MAILQ) { |
510 | }elsif( defined $utils::PATH_TO_MAILQ){ | 502 | print "ERROR: $utils::PATH_TO_MAILQ is not executable by (uid $>:gid($)))\n"; |
511 | unless (-x $utils::PATH_TO_MAILQ) { | 503 | exit $ERRORS{'UNKNOWN'}; |
512 | print "ERROR: $utils::PATH_TO_MAILQ is not executable by (uid $>:gid($)))\n"; | 504 | } |
513 | exit $ERRORS{'UNKNOWN'}; | 505 | |
514 | } | 506 | ## open mailq |
515 | } else { | 507 | if (! open (MAILQ, "$sudo $utils::PATH_TO_MAILQ | " ) ) { |
516 | print "ERROR: \$utils::PATH_TO_MAILQ is not defined\n"; | 508 | print "ERROR: could not open $utils::PATH_TO_MAILQ \n"; |
517 | exit $ERRORS{'UNKNOWN'}; | 509 | exit $ERRORS{'UNKNOWN'}; |
518 | } | 510 | } |
519 | 511 | ||
520 | while (<MAILQ>) { | 512 | while (<MAILQ>) { |
521 | #22m 1.7K 19aEEr-0007hx-Dy <> *** frozen *** | 513 | #22m 1.7K 19aEEr-0007hx-Dy <> *** frozen *** |
522 | #root@exlixams.glups.fr | 514 | #root@exlixams.glups.fr |
523 | 515 | ||
524 | if (/\s[\w\d]{6}-[\w\d]{6}-[\w\d]{2}\s/) { # message id 19aEEr-0007hx-Dy | 516 | if (/\s[\w\d]{6}-[\w\d]{6}-[\w\d]{2}\s/) { # message id 19aEEr-0007hx-Dy |
525 | $msg_q++ ; | 517 | $msg_q++ ; |
526 | } | 518 | } |
527 | } | 519 | } |
528 | close(MAILQ) ; | 520 | close(MAILQ) ; |
529 | 521 | ||
530 | if ( $? ) { | 522 | if ( $? ) { |
531 | print "CRITICAL: Error code ".($?>>8)." returned from $utils::PATH_TO_MAILQ",$/; | 523 | print "CRITICAL: Error code ".($?>>8)." returned from $utils::PATH_TO_MAILQ",$/; |
532 | exit $ERRORS{CRITICAL}; | 524 | exit $ERRORS{CRITICAL}; |
533 | } | 525 | } |
534 | if ($msg_q < $opt_w) { | 526 | if ($msg_q < $opt_w) { |
535 | $msg = "OK: $mailq mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; | 527 | $msg = "OK: $mailq mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; |
536 | $state = $ERRORS{'OK'}; | 528 | $state = $ERRORS{'OK'}; |
537 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { | 529 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { |
538 | $msg = "WARNING: $mailq mailq is $msg_q (threshold w = $opt_w)"; | 530 | $msg = "WARNING: $mailq mailq is $msg_q (threshold w = $opt_w)"; |
539 | $state = $ERRORS{'WARNING'}; | 531 | $state = $ERRORS{'WARNING'}; |
540 | }else { | 532 | }else { |
541 | $msg = "CRITICAL: $mailq mailq is $msg_q (threshold c = $opt_c)"; | 533 | $msg = "CRITICAL: $mailq mailq is $msg_q (threshold c = $opt_c)"; |
542 | $state = $ERRORS{'CRITICAL'}; | 534 | $state = $ERRORS{'CRITICAL'}; |
543 | } | 535 | } |
544 | } # end of ($mailq eq "exim") | 536 | } # end of ($mailq eq "exim") |
545 | 537 | ||
546 | elsif ( $mailq eq "nullmailer" ) { | 538 | elsif ( $mailq eq "nullmailer" ) { |
547 | ## open mailq | 539 | if( ! $utils::PATH_TO_MAILQ) { |
548 | if ( defined $utils::PATH_TO_MAILQ && -x $utils::PATH_TO_MAILQ ) { | 540 | print "ERROR: \$utils::PATH_TO_MAILQ is not defined\n"; |
549 | if (! open (MAILQ, "$sudo $utils::PATH_TO_MAILQ | " ) ) { | 541 | exit $ERRORS{'UNKNOWN'}; |
550 | print "ERROR: could not open $utils::PATH_TO_MAILQ \n"; | 542 | } |
551 | exit $ERRORS{'UNKNOWN'}; | 543 | |
552 | } | 544 | if ( ! -x $utils::PATH_TO_MAILQ) { |
553 | }elsif( defined $utils::PATH_TO_MAILQ){ | 545 | print "ERROR: $utils::PATH_TO_MAILQ is not executable by (uid $>:gid($)))\n"; |
554 | unless (-x $utils::PATH_TO_MAILQ) { | 546 | exit $ERRORS{'UNKNOWN'}; |
555 | print "ERROR: $utils::PATH_TO_MAILQ is not executable by (uid $>:gid($)))\n"; | 547 | } |
556 | exit $ERRORS{'UNKNOWN'}; | 548 | |
557 | } | 549 | ## open mailq |
558 | } else { | 550 | if ( ! open (MAILQ, "$sudo $utils::PATH_TO_MAILQ | " ) ) { |
559 | print "ERROR: \$utils::PATH_TO_MAILQ is not defined\n"; | 551 | print "ERROR: could not open $utils::PATH_TO_MAILQ \n"; |
560 | exit $ERRORS{'UNKNOWN'}; | 552 | exit $ERRORS{'UNKNOWN'}; |
561 | } | 553 | } |
562 | 554 | ||
563 | while (<MAILQ>) { | 555 | while (<MAILQ>) { |
564 | #2022-08-25 01:30:40 502 bytes from <user@example.com> | 556 | #2022-08-25 01:30:40 502 bytes from <user@example.com> |
565 | 557 | ||
566 | if (/^\d{4}-\d{2}-\d{2}\s+\d{2}\:\d{2}\:\d{2}\s+\d+\sbytes/) { | 558 | if (/^\d{4}-\d{2}-\d{2}\s+\d{2}\:\d{2}\:\d{2}\s+\d+\sbytes/) { |
567 | $msg_q++ ; | 559 | $msg_q++ ; |
568 | } | 560 | } |
569 | } | 561 | } |
570 | close(MAILQ) ; | 562 | close(MAILQ) ; |
571 | if ($msg_q < $opt_w) { | 563 | if ($msg_q < $opt_w) { |
572 | $msg = "OK: $mailq mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; | 564 | $msg = "OK: $mailq mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; |
573 | $state = $ERRORS{'OK'}; | 565 | $state = $ERRORS{'OK'}; |
574 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { | 566 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { |
575 | $msg = "WARNING: $mailq mailq is $msg_q (threshold w = $opt_w)"; | 567 | $msg = "WARNING: $mailq mailq is $msg_q (threshold w = $opt_w)"; |
576 | $state = $ERRORS{'WARNING'}; | 568 | $state = $ERRORS{'WARNING'}; |
577 | }else { | 569 | }else { |
578 | $msg = "CRITICAL: $mailq mailq is $msg_q (threshold c = $opt_c)"; | 570 | $msg = "CRITICAL: $mailq mailq is $msg_q (threshold c = $opt_c)"; |
579 | $state = $ERRORS{'CRITICAL'}; | 571 | $state = $ERRORS{'CRITICAL'}; |
580 | } | 572 | } |
581 | } # end of ($mailq eq "nullmailer") | 573 | } # end of ($mailq eq "nullmailer") |
582 | 574 | ||
583 | # Perfdata support | 575 | # Perfdata support |
@@ -590,130 +582,130 @@ exit $state; | |||
590 | 582 | ||
591 | 583 | ||
592 | sub process_arguments(){ | 584 | sub process_arguments(){ |
593 | GetOptions | 585 | GetOptions |
594 | ("V" => \$opt_V, "version" => \$opt_V, | 586 | ("V" => \$opt_V, "version" => \$opt_V, |
595 | "v" => \$opt_v, "verbose" => \$opt_v, | 587 | "v" => \$opt_v, "verbose" => \$opt_v, |
596 | "h" => \$opt_h, "help" => \$opt_h, | 588 | "h" => \$opt_h, "help" => \$opt_h, |
597 | "M:s" => \$opt_M, "mailserver:s" => \$opt_M, # mailserver (default sendmail) | 589 | "M:s" => \$opt_M, "mailserver:s" => \$opt_M, # mailserver (default sendmail) |
598 | "w=i" => \$opt_w, "warning=i" => \$opt_w, # warning if above this number | 590 | "w=i" => \$opt_w, "warning=i" => \$opt_w, # warning if above this number |
599 | "c=i" => \$opt_c, "critical=i" => \$opt_c, # critical if above this number | 591 | "c=i" => \$opt_c, "critical=i" => \$opt_c, # critical if above this number |
600 | "W=i" => \$opt_W, "warning-domain=i" => \$opt_W, # Warning if above this number | 592 | "W=i" => \$opt_W, "warning-domain=i" => \$opt_W, # Warning if above this number |
601 | "C=i" => \$opt_C, "critical-domain=i" => \$opt_C, # Critical if above this number | 593 | "C=i" => \$opt_C, "critical-domain=i" => \$opt_C, # Critical if above this number |
602 | "t=i" => \$opt_t, "timeout=i" => \$opt_t, | 594 | "t=i" => \$opt_t, "timeout=i" => \$opt_t, |
603 | "s" => \$opt_s, "sudo" => \$opt_s, | 595 | "s" => \$opt_s, "sudo" => \$opt_s, |
604 | "d:s" => \$opt_d, "configdir:s" => \$opt_d, | 596 | "d:s" => \$opt_d, "configdir:s" => \$opt_d, |
605 | ); | 597 | ); |
606 | 598 | ||
607 | if ($opt_V) { | 599 | if ($opt_V) { |
608 | print_revision($PROGNAME,'@NP_VERSION@'); | 600 | print_revision($PROGNAME,'@NP_VERSION@'); |
609 | exit $ERRORS{'UNKNOWN'}; | 601 | exit $ERRORS{'UNKNOWN'}; |
610 | } | 602 | } |
611 | 603 | ||
612 | if ($opt_h) { | 604 | if ($opt_h) { |
613 | print_help(); | 605 | print_help(); |
614 | exit $ERRORS{'UNKNOWN'}; | 606 | exit $ERRORS{'UNKNOWN'}; |
615 | } | 607 | } |
616 | 608 | ||
617 | if (defined $opt_v ){ | 609 | if (defined $opt_v ){ |
618 | $verbose = $opt_v; | 610 | $verbose = $opt_v; |
619 | } | 611 | } |
620 | 612 | ||
621 | unless (defined $opt_t) { | 613 | unless (defined $opt_t) { |
622 | $opt_t = $utils::TIMEOUT ; # default timeout | 614 | $opt_t = $utils::TIMEOUT ; # default timeout |
623 | } | 615 | } |
624 | 616 | ||
625 | unless ( defined $opt_w && defined $opt_c ) { | 617 | unless ( defined $opt_w && defined $opt_c ) { |
626 | print_usage(); | 618 | print_usage(); |
627 | exit $ERRORS{'UNKNOWN'}; | 619 | exit $ERRORS{'UNKNOWN'}; |
628 | } | 620 | } |
629 | 621 | ||
630 | if ( $opt_w >= $opt_c) { | 622 | if ( $opt_w >= $opt_c) { |
631 | print "Warning (-w) cannot be greater than Critical (-c)!\n"; | 623 | print "Warning (-w) cannot be greater than Critical (-c)!\n"; |
632 | exit $ERRORS{'UNKNOWN'}; | 624 | exit $ERRORS{'UNKNOWN'}; |
633 | } | 625 | } |
634 | 626 | ||
635 | if (defined $opt_W && ! defined !$opt_C) { | 627 | if (defined $opt_W && ! defined !$opt_C) { |
636 | print "Need -C if using -W\n"; | 628 | print "Need -C if using -W\n"; |
637 | exit $ERRORS{'UNKNOWN'}; | 629 | exit $ERRORS{'UNKNOWN'}; |
638 | }elsif(defined $opt_W && defined $opt_C) { | 630 | }elsif(defined $opt_W && defined $opt_C) { |
639 | if ($opt_W >= $opt_C) { | 631 | if ($opt_W >= $opt_C) { |
640 | print "Warning (-W) cannot be greater than Critical (-C)!\n"; | 632 | print "Warning (-W) cannot be greater than Critical (-C)!\n"; |
641 | exit $ERRORS{'UNKNOWN'}; | 633 | exit $ERRORS{'UNKNOWN'}; |
642 | } | 634 | } |
643 | } | 635 | } |
644 | 636 | ||
645 | if (defined $opt_M) { | 637 | if (defined $opt_M) { |
646 | if ($opt_M =~ /^(sendmail|qmail|postfix|exim|nullmailer)$/) { | 638 | if ($opt_M =~ /^(sendmail|qmail|postfix|exim|nullmailer)$/) { |
647 | $mailq = $opt_M ; | 639 | $mailq = $opt_M ; |
648 | }elsif( $opt_M eq ''){ | 640 | }elsif( $opt_M eq ''){ |
649 | $mailq = 'sendmail'; | 641 | $mailq = 'sendmail'; |
650 | }else{ | 642 | }else{ |
651 | print "-M: $opt_M is not supported\n"; | 643 | print "-M: $opt_M is not supported\n"; |
652 | exit $ERRORS{'UNKNOWN'}; | 644 | exit $ERRORS{'UNKNOWN'}; |
653 | } | 645 | } |
654 | }else{ | 646 | }else{ |
655 | if (defined $utils::PATH_TO_QMAIL_QSTAT | 647 | if (defined $utils::PATH_TO_QMAIL_QSTAT |
656 | && -x $utils::PATH_TO_QMAIL_QSTAT) | 648 | && -x $utils::PATH_TO_QMAIL_QSTAT) |
657 | { | 649 | { |
658 | $mailq = 'qmail'; | 650 | $mailq = 'qmail'; |
659 | } | 651 | } |
660 | elsif (-d '/var/lib/postfix' || -d '/var/local/lib/postfix' | 652 | elsif (-d '/var/lib/postfix' || -d '/var/local/lib/postfix' |
661 | || -e '/usr/sbin/postfix' || -e '/usr/local/sbin/postfix') | 653 | || -e '/usr/sbin/postfix' || -e '/usr/local/sbin/postfix') |
662 | { | 654 | { |
663 | $mailq = 'postfix'; | 655 | $mailq = 'postfix'; |
664 | } | 656 | } |
665 | elsif (-d '/usr/lib/exim4' || -d '/usr/local/lib/exim4' | 657 | elsif (-d '/usr/lib/exim4' || -d '/usr/local/lib/exim4' |
666 | || -e '/usr/sbin/exim' || -e '/usr/local/sbin/exim') | 658 | || -e '/usr/sbin/exim' || -e '/usr/local/sbin/exim') |
667 | { | 659 | { |
668 | $mailq = 'exim'; | 660 | $mailq = 'exim'; |
669 | } | 661 | } |
670 | elsif (-d '/usr/lib/nullmailer' || -d '/usr/local/lib/nullmailer' | 662 | elsif (-d '/usr/lib/nullmailer' || -d '/usr/local/lib/nullmailer' |
671 | || -e '/usr/sbin/nullmailer-send' | 663 | || -e '/usr/sbin/nullmailer-send' |
672 | || -e '/usr/local/sbin/nullmailer-send') | 664 | || -e '/usr/local/sbin/nullmailer-send') |
673 | { | 665 | { |
674 | $mailq = 'nullmailer'; | 666 | $mailq = 'nullmailer'; |
675 | } | 667 | } |
676 | else { | 668 | else { |
677 | $mailq = 'sendmail'; | 669 | $mailq = 'sendmail'; |
678 | } | 670 | } |
679 | } | 671 | } |
680 | 672 | ||
681 | return $ERRORS{'OK'}; | 673 | return $ERRORS{'OK'}; |
682 | } | 674 | } |
683 | 675 | ||
684 | sub print_usage () { | 676 | sub print_usage () { |
685 | print "Usage: $PROGNAME -w <warn> -c <crit> [-W <warn>] [-C <crit>] [-M <MTA>] [-t <timeout>] [-s] [-d <CONFIGDIR>] [-v]\n"; | 677 | print "Usage: $PROGNAME -w <warn> -c <crit> [-W <warn>] [-C <crit>] [-M <MTA>] [-t <timeout>] [-s] [-d <CONFIGDIR>] [-v]\n"; |
686 | } | 678 | } |
687 | 679 | ||
688 | sub print_help () { | 680 | sub print_help () { |
689 | print_revision($PROGNAME,'@NP_VERSION@'); | 681 | print_revision($PROGNAME,'@NP_VERSION@'); |
690 | print "Copyright (c) 2002 Subhendu Ghosh/Carlos Canau/Benjamin Schmid\n"; | 682 | print "Copyright (c) 2002 Subhendu Ghosh/Carlos Canau/Benjamin Schmid\n"; |
691 | print "\n"; | 683 | print "\n"; |
692 | print_usage(); | 684 | print_usage(); |
693 | print "\n"; | 685 | print "\n"; |
694 | print " Checks the number of messages in the mail queue (supports multiple sendmail queues, qmail)\n"; | 686 | print " Checks the number of messages in the mail queue (supports multiple sendmail queues, qmail)\n"; |
695 | print " Feedback/patches to support non-sendmail mailqueue welcome\n\n"; | 687 | print " Feedback/patches to support non-sendmail mailqueue welcome\n\n"; |
696 | print "-w (--warning) = Min. number of messages in queue to generate warning\n"; | 688 | print "-w (--warning) = Min. number of messages in queue to generate warning\n"; |
697 | print "-c (--critical) = Min. number of messages in queue to generate critical alert ( w < c )\n"; | 689 | print "-c (--critical) = Min. number of messages in queue to generate critical alert ( w < c )\n"; |
698 | print "-W (--warning-domain) = Min. number of messages for same domain in queue to generate warning\n"; | 690 | print "-W (--warning-domain) = Min. number of messages for same domain in queue to generate warning\n"; |
699 | print "-C (--critical-domain) = Min. number of messages for same domain in queue to generate critical alert ( W < C )\n"; | 691 | print "-C (--critical-domain) = Min. number of messages for same domain in queue to generate critical alert ( W < C )\n"; |
700 | print "-t (--timeout) = Plugin timeout in seconds (default = $utils::TIMEOUT)\n"; | 692 | print "-t (--timeout) = Plugin timeout in seconds (default = $utils::TIMEOUT)\n"; |
701 | print "-M (--mailserver) = [ sendmail | qmail | postfix | exim | nullmailer ] (default = autodetect)\n"; | 693 | print "-M (--mailserver) = [ sendmail | qmail | postfix | exim | nullmailer ] (default = autodetect)\n"; |
702 | print "-s (--sudo) = Use sudo to call the mailq command\n"; | 694 | print "-s (--sudo) = Use sudo to call the mailq command\n"; |
703 | print "-d (--configdir) = Config file or directory\n"; | 695 | print "-d (--configdir) = Config file or directory\n"; |
704 | print "-h (--help)\n"; | 696 | print "-h (--help)\n"; |
705 | print "-V (--version)\n"; | 697 | print "-V (--version)\n"; |
706 | print "-v (--verbose) = debugging output\n"; | 698 | print "-v (--verbose) = debugging output\n"; |
707 | print "\n\n"; | 699 | print "\n\n"; |
708 | print "Note: -w and -c are required arguments. -W and -C are optional.\n"; | 700 | print "Note: -w and -c are required arguments. -W and -C are optional.\n"; |
709 | print " -W and -C are applied to domains listed on the queues - both FROM and TO. (sendmail)\n"; | 701 | print " -W and -C are applied to domains listed on the queues - both FROM and TO. (sendmail)\n"; |
710 | print " -W and -C are applied message not yet preproccessed. (qmail)\n"; | 702 | print " -W and -C are applied message not yet preproccessed. (qmail)\n"; |
711 | print " This plugin tries to autodetect which mailserver you are running,\n"; | 703 | print " This plugin tries to autodetect which mailserver you are running,\n"; |
712 | print " you can override the autodetection with -M.\n"; | 704 | print " you can override the autodetection with -M.\n"; |
713 | print " This plugin uses the system mailq command (sendmail) or qmail-stat (qmail)\n"; | 705 | print " This plugin uses the system mailq command (sendmail) or qmail-stat (qmail)\n"; |
714 | print " to look at the queues. Mailq can usually only be accessed by root or \n"; | 706 | print " to look at the queues. Mailq can usually only be accessed by root or \n"; |
715 | print " a TrustedUser. You will have to set appropriate permissions for the plugin to work.\n"; | 707 | print " a TrustedUser. You will have to set appropriate permissions for the plugin to work.\n"; |
716 | print ""; | 708 | print ""; |
717 | print "\n\n"; | 709 | print "\n\n"; |
718 | support(); | 710 | support(); |
719 | } | 711 | } |