diff options
Diffstat (limited to 'plugins-scripts/check_mailq.pl')
-rwxr-xr-x | plugins-scripts/check_mailq.pl | 105 |
1 files changed, 84 insertions, 21 deletions
diff --git a/plugins-scripts/check_mailq.pl b/plugins-scripts/check_mailq.pl index 1d0a3ad7..488cf2f1 100755 --- a/plugins-scripts/check_mailq.pl +++ b/plugins-scripts/check_mailq.pl | |||
@@ -20,8 +20,8 @@ | |||
20 | # | 20 | # |
21 | # You should have received a copy of the GNU General Public License | 21 | # You should have received a copy of the GNU General Public License |
22 | # along with this program; if not, write to the Free Software | 22 | # along with this program; if not, write to the Free Software |
23 | # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 23 | # Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 |
24 | # | 24 | # USA |
25 | # | 25 | # |
26 | ############################################################################ | 26 | ############################################################################ |
27 | 27 | ||
@@ -31,7 +31,8 @@ use Getopt::Long; | |||
31 | use vars qw($opt_V $opt_h $opt_v $verbose $PROGNAME $opt_w $opt_c $opt_t | 31 | use vars qw($opt_V $opt_h $opt_v $verbose $PROGNAME $opt_w $opt_c $opt_t |
32 | $opt_M $mailq $status $state $msg $msg_q $msg_p $opt_W $opt_C $mailq @lines | 32 | $opt_M $mailq $status $state $msg $msg_q $msg_p $opt_W $opt_C $mailq @lines |
33 | %srcdomains %dstdomains); | 33 | %srcdomains %dstdomains); |
34 | use lib utils.pm; | 34 | use FindBin; |
35 | use lib "$FindBin::Bin"; | ||
35 | use utils qw(%ERRORS &print_revision &support &usage ); | 36 | use utils qw(%ERRORS &print_revision &support &usage ); |
36 | 37 | ||
37 | 38 | ||
@@ -199,20 +200,20 @@ if ($mailq eq "sendmail") { | |||
199 | ## now check the queue length(s) | 200 | ## now check the queue length(s) |
200 | 201 | ||
201 | if ($msg_q == 0) { | 202 | if ($msg_q == 0) { |
202 | $msg = "OK: mailq is empty"; | 203 | $msg = "OK: $mailq mailq is empty"; |
203 | $state = $ERRORS{'OK'}; | 204 | $state = $ERRORS{'OK'}; |
204 | } else { | 205 | } else { |
205 | print "msg_q = $msg_q warn=$opt_w crit=$opt_c\n" if $verbose; | 206 | print "msg_q = $msg_q warn=$opt_w crit=$opt_c\n" if $verbose; |
206 | 207 | ||
207 | # overall queue length | 208 | # overall queue length |
208 | if ($msg_q < $opt_w) { | 209 | if ($msg_q < $opt_w) { |
209 | $msg = "OK: mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; | 210 | $msg = "OK: $mailq mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; |
210 | $state = $ERRORS{'OK'}; | 211 | $state = $ERRORS{'OK'}; |
211 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { | 212 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { |
212 | $msg = "WARNING: mailq is $msg_q (threshold w = $opt_w)"; | 213 | $msg = "WARNING: $mailq mailq is $msg_q (threshold w = $opt_w)"; |
213 | $state = $ERRORS{'WARNING'}; | 214 | $state = $ERRORS{'WARNING'}; |
214 | }else { | 215 | }else { |
215 | $msg = "CRITICAL: mailq is $msg_q (threshold c = $opt_c)"; | 216 | $msg = "CRITICAL: $mailq mailq is $msg_q (threshold c = $opt_c)"; |
216 | $state = $ERRORS{'CRITICAL'}; | 217 | $state = $ERRORS{'CRITICAL'}; |
217 | } | 218 | } |
218 | 219 | ||
@@ -344,20 +345,20 @@ elsif ( $mailq eq "postfix" ) { | |||
344 | 345 | ||
345 | # check queue length(s) | 346 | # check queue length(s) |
346 | if ($msg_q == 0){ | 347 | if ($msg_q == 0){ |
347 | $msg = "OK: mailq reports queue is empty"; | 348 | $msg = "OK: $mailq mailq reports queue is empty"; |
348 | $state = $ERRORS{'OK'}; | 349 | $state = $ERRORS{'OK'}; |
349 | } else { | 350 | } else { |
350 | print "msg_q = $msg_q warn=$opt_w crit=$opt_c\n" if $verbose; | 351 | print "msg_q = $msg_q warn=$opt_w crit=$opt_c\n" if $verbose; |
351 | 352 | ||
352 | # overall queue length | 353 | # overall queue length |
353 | if ($msg_q < $opt_w) { | 354 | if ($msg_q < $opt_w) { |
354 | $msg = "OK: mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; | 355 | $msg = "OK: $mailq mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; |
355 | $state = $ERRORS{'OK'}; | 356 | $state = $ERRORS{'OK'}; |
356 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { | 357 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { |
357 | $msg = "WARNING: mailq is $msg_q (threshold w = $opt_w)"; | 358 | $msg = "WARNING: $mailq mailq is $msg_q (threshold w = $opt_w)"; |
358 | $state = $ERRORS{'WARNING'}; | 359 | $state = $ERRORS{'WARNING'}; |
359 | }else { | 360 | }else { |
360 | $msg = "CRITICAL: mailq is $msg_q (threshold c = $opt_c)"; | 361 | $msg = "CRITICAL: $mailq mailq is $msg_q (threshold c = $opt_c)"; |
361 | $state = $ERRORS{'CRITICAL'}; | 362 | $state = $ERRORS{'CRITICAL'}; |
362 | } | 363 | } |
363 | 364 | ||
@@ -373,7 +374,7 @@ elsif ( $mailq eq "postfix" ) { | |||
373 | # } | 374 | # } |
374 | #} | 375 | #} |
375 | } | 376 | } |
376 | } # end of ($mailq eq "postfixl") | 377 | } # end of ($mailq eq "postfix") |
377 | elsif ( $mailq eq "qmail" ) { | 378 | elsif ( $mailq eq "qmail" ) { |
378 | 379 | ||
379 | # open qmail-qstat | 380 | # open qmail-qstat |
@@ -431,13 +432,13 @@ elsif ( $mailq eq "qmail" ) { | |||
431 | 432 | ||
432 | # overall queue length | 433 | # overall queue length |
433 | if ($msg_q < $opt_w) { | 434 | if ($msg_q < $opt_w) { |
434 | $msg = "OK: mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; | 435 | $msg = "OK: $mailq mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; |
435 | $state = $ERRORS{'OK'}; | 436 | $state = $ERRORS{'OK'}; |
436 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { | 437 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { |
437 | $msg = "WARNING: mailq is $msg_q (threshold w = $opt_w)"; | 438 | $msg = "WARNING: $mailq mailq is $msg_q (threshold w = $opt_w)"; |
438 | $state = $ERRORS{'WARNING'}; | 439 | $state = $ERRORS{'WARNING'}; |
439 | }else { | 440 | }else { |
440 | $msg = "CRITICAL: mailq is $msg_q (threshold c = $opt_c)"; | 441 | $msg = "CRITICAL: $mailq mailq is $msg_q (threshold c = $opt_c)"; |
441 | $state = $ERRORS{'CRITICAL'}; | 442 | $state = $ERRORS{'CRITICAL'}; |
442 | } | 443 | } |
443 | 444 | ||
@@ -489,17 +490,54 @@ elsif ( $mailq eq "exim" ) { | |||
489 | exit $ERRORS{CRITICAL}; | 490 | exit $ERRORS{CRITICAL}; |
490 | } | 491 | } |
491 | if ($msg_q < $opt_w) { | 492 | if ($msg_q < $opt_w) { |
492 | $msg = "OK: mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; | 493 | $msg = "OK: $mailq mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; |
493 | $state = $ERRORS{'OK'}; | 494 | $state = $ERRORS{'OK'}; |
494 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { | 495 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { |
495 | $msg = "WARNING: mailq is $msg_q (threshold w = $opt_w)"; | 496 | $msg = "WARNING: $mailq mailq is $msg_q (threshold w = $opt_w)"; |
496 | $state = $ERRORS{'WARNING'}; | 497 | $state = $ERRORS{'WARNING'}; |
497 | }else { | 498 | }else { |
498 | $msg = "CRITICAL: mailq is $msg_q (threshold c = $opt_c)"; | 499 | $msg = "CRITICAL: $mailq mailq is $msg_q (threshold c = $opt_c)"; |
499 | $state = $ERRORS{'CRITICAL'}; | 500 | $state = $ERRORS{'CRITICAL'}; |
500 | } | 501 | } |
501 | } # end of ($mailq eq "exim") | 502 | } # end of ($mailq eq "exim") |
502 | 503 | ||
504 | elsif ( $mailq eq "nullmailer" ) { | ||
505 | ## open mailq | ||
506 | if ( defined $utils::PATH_TO_MAILQ && -x $utils::PATH_TO_MAILQ ) { | ||
507 | if (! open (MAILQ, "$utils::PATH_TO_MAILQ | " ) ) { | ||
508 | print "ERROR: could not open $utils::PATH_TO_MAILQ \n"; | ||
509 | exit $ERRORS{'UNKNOWN'}; | ||
510 | } | ||
511 | }elsif( defined $utils::PATH_TO_MAILQ){ | ||
512 | unless (-x $utils::PATH_TO_MAILQ) { | ||
513 | print "ERROR: $utils::PATH_TO_MAILQ is not executable by (uid $>:gid($)))\n"; | ||
514 | exit $ERRORS{'UNKNOWN'}; | ||
515 | } | ||
516 | } else { | ||
517 | print "ERROR: \$utils::PATH_TO_MAILQ is not defined\n"; | ||
518 | exit $ERRORS{'UNKNOWN'}; | ||
519 | } | ||
520 | |||
521 | while (<MAILQ>) { | ||
522 | #2006-06-22 16:00:00 282 bytes | ||
523 | |||
524 | if (/^[1-9][0-9]*-[01][0-9]-[0-3][0-9]\s[0-2][0-9]\:[0-2][0-9]\:[0-2][0-9]\s{2}[0-9]+\sbytes$/) { | ||
525 | $msg_q++ ; | ||
526 | } | ||
527 | } | ||
528 | close(MAILQ) ; | ||
529 | if ($msg_q < $opt_w) { | ||
530 | $msg = "OK: $mailq mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; | ||
531 | $state = $ERRORS{'OK'}; | ||
532 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { | ||
533 | $msg = "WARNING: $mailq mailq is $msg_q (threshold w = $opt_w)"; | ||
534 | $state = $ERRORS{'WARNING'}; | ||
535 | }else { | ||
536 | $msg = "CRITICAL: $mailq mailq is $msg_q (threshold c = $opt_c)"; | ||
537 | $state = $ERRORS{'CRITICAL'}; | ||
538 | } | ||
539 | } # end of ($mailq eq "nullmailer") | ||
540 | |||
503 | # Perfdata support | 541 | # Perfdata support |
504 | print "$msg|unsent=$msg_q;$opt_w;$opt_c;0\n"; | 542 | print "$msg|unsent=$msg_q;$opt_w;$opt_c;0\n"; |
505 | exit $state; | 543 | exit $state; |
@@ -559,7 +597,7 @@ sub process_arguments(){ | |||
559 | } | 597 | } |
560 | 598 | ||
561 | if (defined $opt_M) { | 599 | if (defined $opt_M) { |
562 | if ($opt_M =~ /^(sendmail|qmail|postfix|exim)$/) { | 600 | if ($opt_M =~ /^(sendmail|qmail|postfix|exim|nullmailer)$/) { |
563 | $mailq = $opt_M ; | 601 | $mailq = $opt_M ; |
564 | }elsif( $opt_M eq ''){ | 602 | }elsif( $opt_M eq ''){ |
565 | $mailq = 'sendmail'; | 603 | $mailq = 'sendmail'; |
@@ -568,7 +606,30 @@ sub process_arguments(){ | |||
568 | exit $ERRORS{'UNKNOWN'}; | 606 | exit $ERRORS{'UNKNOWN'}; |
569 | } | 607 | } |
570 | }else{ | 608 | }else{ |
571 | $mailq = 'sendmail' ; | 609 | if (defined $utils::PATH_TO_QMAIL_QSTAT |
610 | && -x $utils::PATH_TO_QMAIL_QSTAT) | ||
611 | { | ||
612 | $mailq = 'qmail'; | ||
613 | } | ||
614 | elsif (-d '/var/lib/postfix' || -d '/var/local/lib/postfix' | ||
615 | || -e '/usr/sbin/postfix' || -e '/usr/local/sbin/postfix') | ||
616 | { | ||
617 | $mailq = 'postfix'; | ||
618 | } | ||
619 | elsif (-d '/usr/lib/exim4' || -d '/usr/local/lib/exim4' | ||
620 | || -e '/usr/sbin/exim' || -e '/usr/local/sbin/exim') | ||
621 | { | ||
622 | $mailq = 'exim'; | ||
623 | } | ||
624 | elsif (-d '/usr/lib/nullmailer' || -d '/usr/local/lib/nullmailer' | ||
625 | || -e '/usr/sbin/nullmailer-send' | ||
626 | || -e '/usr/local/sbin/nullmailer-send') | ||
627 | { | ||
628 | $mailq = 'nullmailer'; | ||
629 | } | ||
630 | else { | ||
631 | $mailq = 'sendmail'; | ||
632 | } | ||
572 | } | 633 | } |
573 | 634 | ||
574 | return $ERRORS{'OK'}; | 635 | return $ERRORS{'OK'}; |
@@ -591,7 +652,7 @@ sub print_help () { | |||
591 | print "-W (--Warning) = Min. number of messages for same domain in queue to generate warning\n"; | 652 | print "-W (--Warning) = Min. number of messages for same domain in queue to generate warning\n"; |
592 | print "-C (--Critical) = Min. number of messages for same domain in queue to generate critical alert ( W < C )\n"; | 653 | print "-C (--Critical) = Min. number of messages for same domain in queue to generate critical alert ( W < C )\n"; |
593 | print "-t (--timeout) = Plugin timeout in seconds (default = $utils::TIMEOUT)\n"; | 654 | print "-t (--timeout) = Plugin timeout in seconds (default = $utils::TIMEOUT)\n"; |
594 | print "-M (--mailserver) = [ sendmail | qmail | postfix | exim ] (default = sendmail)\n"; | 655 | print "-M (--mailserver) = [ sendmail | qmail | postfix | exim | nullmailer ] (default = autodetect)\n"; |
595 | print "-h (--help)\n"; | 656 | print "-h (--help)\n"; |
596 | print "-V (--version)\n"; | 657 | print "-V (--version)\n"; |
597 | print "-v (--verbose) = debugging output\n"; | 658 | print "-v (--verbose) = debugging output\n"; |
@@ -599,6 +660,8 @@ sub print_help () { | |||
599 | print "Note: -w and -c are required arguments. -W and -C are optional.\n"; | 660 | print "Note: -w and -c are required arguments. -W and -C are optional.\n"; |
600 | print " -W and -C are applied to domains listed on the queues - both FROM and TO. (sendmail)\n"; | 661 | print " -W and -C are applied to domains listed on the queues - both FROM and TO. (sendmail)\n"; |
601 | print " -W and -C are applied message not yet preproccessed. (qmail)\n"; | 662 | print " -W and -C are applied message not yet preproccessed. (qmail)\n"; |
663 | print " This plugin tries to autodetect which mailserver you are running,\n"; | ||
664 | print " you can override the autodetection with -M.\n"; | ||
602 | print " This plugin uses the system mailq command (sendmail) or qmail-stat (qmail)\n"; | 665 | print " This plugin uses the system mailq command (sendmail) or qmail-stat (qmail)\n"; |
603 | print " to look at the queues. Mailq can usually only be accessed by root or \n"; | 666 | print " to look at the queues. Mailq can usually only be accessed by root or \n"; |
604 | print " a TrustedUser. You will have to set appropriate permissions for the plugin to work.\n"; | 667 | print " a TrustedUser. You will have to set appropriate permissions for the plugin to work.\n"; |