diff options
Diffstat (limited to 'plugins-scripts/check_mailq.pl')
| -rwxr-xr-x | plugins-scripts/check_mailq.pl | 412 |
1 files changed, 362 insertions, 50 deletions
diff --git a/plugins-scripts/check_mailq.pl b/plugins-scripts/check_mailq.pl index 901209b8..23bc521f 100755 --- a/plugins-scripts/check_mailq.pl +++ b/plugins-scripts/check_mailq.pl | |||
| @@ -4,6 +4,8 @@ | |||
| 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 mutiple sendmail queues (Carlos Canau) | ||
| 8 | # Support for qmail (Benjamin Schmid) | ||
| 7 | 9 | ||
| 8 | # License Information: | 10 | # License Information: |
| 9 | # This program is free software; you can redistribute it and/or modify | 11 | # This program is free software; you can redistribute it and/or modify |
| @@ -25,12 +27,12 @@ | |||
| 25 | use POSIX; | 27 | use POSIX; |
| 26 | use strict; | 28 | use strict; |
| 27 | use Getopt::Long; | 29 | use Getopt::Long; |
| 28 | use vars qw($opt_V $opt_h $opt_v $verbose $PROGNAME $opt_w $opt_c $opt_t $status $state $msg $msg_q ); | 30 | use vars qw($opt_V $opt_h $opt_v $verbose $PROGNAME $opt_w $opt_c $opt_t |
| 31 | $opt_M $mailq $status $state $msg $msg_q $msg_p $opt_W $opt_C $mailq @lines | ||
| 32 | %srcdomains %dstdomains); | ||
| 29 | use lib utils.pm; | 33 | use lib utils.pm; |
| 30 | use utils qw(%ERRORS &print_revision &support &usage ); | 34 | use utils qw(%ERRORS &print_revision &support &usage ); |
| 31 | 35 | ||
| 32 | #my $MAILQ = "/usr/bin/mailq"; # need to migrate support to utils.pm and autoconf | ||
| 33 | |||
| 34 | 36 | ||
| 35 | sub print_help (); | 37 | sub print_help (); |
| 36 | sub print_usage (); | 38 | sub print_usage (); |
| @@ -40,6 +42,10 @@ $ENV{'PATH'}=''; | |||
| 40 | $ENV{'BASH_ENV'}=''; | 42 | $ENV{'BASH_ENV'}=''; |
| 41 | $ENV{'ENV'}=''; | 43 | $ENV{'ENV'}=''; |
| 42 | $PROGNAME = "check_mailq"; | 44 | $PROGNAME = "check_mailq"; |
| 45 | $mailq = 'sendmail'; # default | ||
| 46 | $msg_q = 0 ; | ||
| 47 | $msg_p = 0 ; | ||
| 48 | $state = $ERRORS{'UNKNOWN'}; | ||
| 43 | 49 | ||
| 44 | Getopt::Long::Configure('bundling'); | 50 | Getopt::Long::Configure('bundling'); |
| 45 | $status = process_arguments(); | 51 | $status = process_arguments(); |
| @@ -54,60 +60,329 @@ $SIG{'ALRM'} = sub { | |||
| 54 | }; | 60 | }; |
| 55 | alarm($opt_t); | 61 | alarm($opt_t); |
| 56 | 62 | ||
| 57 | ## open mailq | 63 | # switch based on MTA |
| 58 | if ( defined $utils::PATH_TO_MAILQ && -x $utils::PATH_TO_MAILQ ) { | 64 | |
| 59 | if (! open (MAILQ, "$utils::PATH_TO_MAILQ | " ) ) { | 65 | if ($mailq eq "sendmail") { |
| 60 | print "ERROR: could not open $utils::PATH_TO_MAILQ \n"; | 66 | |
| 67 | ## open mailq | ||
| 68 | if ( defined $utils::PATH_TO_MAILQ && -x $utils::PATH_TO_MAILQ ) { | ||
| 69 | if (! open (MAILQ, "$utils::PATH_TO_MAILQ | " ) ) { | ||
| 70 | print "ERROR: could not open $utils::PATH_TO_MAILQ \n"; | ||
| 71 | exit $ERRORS{'UNKNOWN'}; | ||
| 72 | } | ||
| 73 | }elsif( defined $utils::PATH_TO_MAILQ){ | ||
| 74 | unless (-x $utils::PATH_TO_MAILQ) { | ||
| 75 | print "ERROR: $utils::PATH_TO_MAILQ is not executable by (uid $>:gid($)))\n"; | ||
| 76 | exit $ERRORS{'UNKNOWN'}; | ||
| 77 | } | ||
| 78 | } else { | ||
| 79 | print "ERROR: \$utils::PATH_TO_MAILQ is not defined\n"; | ||
| 61 | exit $ERRORS{'UNKNOWN'}; | 80 | exit $ERRORS{'UNKNOWN'}; |
| 62 | } | 81 | } |
| 63 | }else{ | 82 | # single queue empty |
| 64 | print "ERROR: Could not find mailq executable!\n"; | 83 | ##/var/spool/mqueue is empty |
| 65 | exit $ERRORS{'UNKNOWN'}; | 84 | # single queue: 1 |
| 66 | } | 85 | ## /var/spool/mqueue (1 request) |
| 86 | ##----Q-ID---- --Size-- -----Q-Time----- ------------Sender/Recipient------------ | ||
| 87 | ##h32E30p01763 2782 Wed Apr 2 15:03 <silvaATkpnqwest.pt> | ||
| 88 | ## 8BITMIME | ||
| 89 | ## <silvaATeunet.pt> | ||
| 67 | 90 | ||
| 68 | # only first line is relevant in this iteration. | 91 | # multi queue empty |
| 69 | while (<MAILQ>) { | 92 | ##/var/spool/mqueue/q0/df is empty |
| 70 | if (/mqueue/) { | 93 | ##/var/spool/mqueue/q1/df is empty |
| 71 | print "$utils::PATH_TO_MAILQ = $_ "if $verbose ; | 94 | ##/var/spool/mqueue/q2/df is empty |
| 72 | if (/empty/ ) { | 95 | ##/var/spool/mqueue/q3/df is empty |
| 73 | $msg = "OK: mailq is empty"; | 96 | ##/var/spool/mqueue/q4/df is empty |
| 74 | $msg_q = 0; | 97 | ##/var/spool/mqueue/q5/df is empty |
| 75 | $state = $ERRORS{'OK'}; | 98 | ##/var/spool/mqueue/q6/df is empty |
| 76 | }elsif ( /(\d+)/ ) { | 99 | ##/var/spool/mqueue/q7/df is empty |
| 77 | $msg_q = $1 ; | 100 | ##/var/spool/mqueue/q8/df is empty |
| 101 | ##/var/spool/mqueue/q9/df is empty | ||
| 102 | ##/var/spool/mqueue/qA/df is empty | ||
| 103 | ##/var/spool/mqueue/qB/df is empty | ||
| 104 | ##/var/spool/mqueue/qC/df is empty | ||
| 105 | ##/var/spool/mqueue/qD/df is empty | ||
| 106 | ##/var/spool/mqueue/qE/df is empty | ||
| 107 | ##/var/spool/mqueue/qF/df is empty | ||
| 108 | ## Total Requests: 0 | ||
| 109 | # multi queue: 1 | ||
| 110 | ##/var/spool/mqueue/q0/df is empty | ||
| 111 | ##/var/spool/mqueue/q1/df is empty | ||
| 112 | ##/var/spool/mqueue/q2/df is empty | ||
| 113 | ## /var/spool/mqueue/q3/df (1 request) | ||
| 114 | ##----Q-ID---- --Size-- -----Q-Time----- ------------Sender/Recipient------------ | ||
| 115 | ##h32De2f23534* 48 Wed Apr 2 14:40 nocol | ||
| 116 | ## nouserATEUnet.pt | ||
| 117 | ## canau | ||
| 118 | ##/var/spool/mqueue/q4/df is empty | ||
| 119 | ##/var/spool/mqueue/q5/df is empty | ||
| 120 | ##/var/spool/mqueue/q6/df is empty | ||
| 121 | ##/var/spool/mqueue/q7/df is empty | ||
| 122 | ##/var/spool/mqueue/q8/df is empty | ||
| 123 | ##/var/spool/mqueue/q9/df is empty | ||
| 124 | ##/var/spool/mqueue/qA/df is empty | ||
| 125 | ##/var/spool/mqueue/qB/df is empty | ||
| 126 | ##/var/spool/mqueue/qC/df is empty | ||
| 127 | ##/var/spool/mqueue/qD/df is empty | ||
| 128 | ##/var/spool/mqueue/qE/df is empty | ||
| 129 | ##/var/spool/mqueue/qF/df is empty | ||
| 130 | ## Total Requests: 1 | ||
| 78 | 131 | ||
| 79 | print "msg_q = $msg_q warn=$opt_w crit=$opt_c\n" if $verbose; | 132 | |
| 80 | 133 | while (<MAILQ>) { | |
| 81 | if ($msg_q < $opt_w) { | 134 | |
| 82 | $msg = "OK: mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; | 135 | # match email addr on queue listing |
| 83 | $state = $ERRORS{'OK'}; | 136 | if ( (/<.*@.*\.(\w+\.\w+)>/) || (/<.*@(\w+\.\w+)>/) ) { |
| 84 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { | 137 | my $domain = $1; |
| 85 | $msg = "WARNING: mailq is $msg_q (threshold w = $opt_w)"; | 138 | if (/^\w+/) { |
| 86 | $state = $ERRORS{'WARNING'}; | 139 | print "$utils::PATH_TO_MAILQ = srcdomain = $domain \n" if $verbose ; |
| 87 | }else { | 140 | $srcdomains{$domain} ++; |
| 88 | $msg = "CRITICAL: mailq is $msg_q (threshold c = $opt_c)"; | ||
| 89 | $state = $ERRORS{'CRITICAL'}; | ||
| 90 | } | 141 | } |
| 91 | 142 | next; | |
| 143 | } | ||
| 144 | |||
| 145 | # | ||
| 146 | # ... | ||
| 147 | # sendmail considers a message with more than one destiny, say N, to the same MX | ||
| 148 | # to have N messages in queue. | ||
| 149 | # we will only consider one in this code | ||
| 150 | if (( /\s\(reply:\sread\serror\sfrom\s.*\.(\w+\.\w+)\.$/ ) || ( /\s\(reply:\sread\serror\sfrom\s(\w+\.\w+)\.$/ ) || | ||
| 151 | ( /\s\(timeout\swriting\smessage\sto\s.*\.(\w+\.\w+)\.:/ ) || ( /\s\(timeout\swriting\smessage\sto\s(\w+\.\w+)\.:/ ) || | ||
| 152 | ( /\s\(host\smap:\slookup\s\(.*\.(\w+\.\w+)\):/ ) || ( /\s\(host\smap:\slookup\s\((\w+\.\w+)\):/ ) || | ||
| 153 | ( /\s\(Deferred:\s.*\s.*\.(\w+\.\w+)\.\)/ ) || ( /\s\(Deferred:\s.*\s(\w+\.\w+)\.\)/ ) ) { | ||
| 154 | |||
| 155 | print "$utils::PATH_TO_MAILQ = dstdomain = $1 \n" if $verbose ; | ||
| 156 | $dstdomains{$1} ++; | ||
| 157 | } | ||
| 158 | |||
| 159 | if (/\s+\(I\/O\serror\)/) { | ||
| 160 | print "$utils::PATH_TO_MAILQ = dstdomain = UNKNOWN \n" if $verbose ; | ||
| 161 | $dstdomains{'UNKNOWN'} ++; | ||
| 92 | } | 162 | } |
| 93 | 163 | ||
| 94 | last; | 164 | # Finally look at the overall queue length |
| 165 | # | ||
| 166 | if (/mqueue/) { | ||
| 167 | print "$utils::PATH_TO_MAILQ = $_ "if $verbose ; | ||
| 168 | if (/ \((\d+) request/) { | ||
| 169 | # | ||
| 170 | # single queue: first line | ||
| 171 | # multi queue: one for each queue. overwrite on multi queue below | ||
| 172 | $msg_q = $1 ; | ||
| 173 | } | ||
| 174 | } elsif (/^\s+Total\sRequests:\s(\d+)$/) { | ||
| 175 | print "$utils::PATH_TO_MAILQ = $_ \n" if $verbose ; | ||
| 176 | # | ||
| 177 | # multi queue: last line | ||
| 178 | $msg_q = $1 ; | ||
| 179 | } | ||
| 180 | |||
| 95 | } | 181 | } |
| 96 | 182 | ||
| 97 | } | ||
| 98 | 183 | ||
| 99 | close (MAILQ); | 184 | ## close mailq |
| 100 | # declare an error if we also get a non-zero return code from mailq | 185 | |
| 101 | # unless already set to critical | 186 | close (MAILQ); |
| 102 | if ( $? ) { | 187 | # declare an error if we also get a non-zero return code from mailq |
| 103 | print "stderr = $? : $! \n" if $verbose; | 188 | # unless already set to critical |
| 104 | $state = $state == $ERRORS{"CRITICAL"} ? $ERRORS{"CRITICAL"} : $ERRORS{"UNKNOWN"} ; | 189 | if ( $? ) { |
| 105 | print "MAILQ error: $!\n" if $verbose; | 190 | $state = $state == $ERRORS{"CRITICAL"} ? $ERRORS{"CRITICAL"} : $ERRORS{"WARNING"} ; |
| 106 | } | 191 | print "STDERR $?: $!\n" if $verbose; |
| 107 | ## close mailq | 192 | $msg = "$state: (stderr)\n"; |
| 193 | } | ||
| 194 | |||
| 195 | ## shut off the alarm | ||
| 196 | alarm(0); | ||
| 197 | |||
| 198 | |||
| 199 | |||
| 200 | ## now check the queue length(s) | ||
| 201 | |||
| 202 | if ($msg_q == 0) { | ||
| 203 | $msg = "OK: mailq is empty"; | ||
| 204 | $state = $ERRORS{'OK'}; | ||
| 205 | } else { | ||
| 206 | print "msg_q = $msg_q warn=$opt_w crit=$opt_c\n" if $verbose; | ||
| 207 | |||
| 208 | # overall queue length | ||
| 209 | if ($msg_q < $opt_w) { | ||
| 210 | $msg = "OK: mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; | ||
| 211 | $state = $ERRORS{'OK'}; | ||
| 212 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { | ||
| 213 | $msg = "WARNING: mailq is $msg_q (threshold w = $opt_w)"; | ||
| 214 | $state = $ERRORS{'WARNING'}; | ||
| 215 | }else { | ||
| 216 | $msg = "CRITICAL: mailq is $msg_q (threshold c = $opt_c)"; | ||
| 217 | $state = $ERRORS{'CRITICAL'}; | ||
| 218 | } | ||
| 219 | |||
| 220 | # check for domain specific queue lengths if requested | ||
| 221 | if (defined $opt_W) { | ||
| 222 | |||
| 223 | # Apply threshold to queue lengths FROM domain | ||
| 224 | my @srckeys = sort { $srcdomains{$b} <=> $srcdomains{$a} } keys %srcdomains; | ||
| 225 | my $srcmaxkey = $srckeys[0]; | ||
| 226 | print "src max is $srcmaxkey with $srcdomains{$srcmaxkey} messages\n" if $verbose; | ||
| 227 | |||
| 228 | if ($srcdomains{$srcmaxkey} >= $opt_W && $srcdomains{$srcmaxkey} < $opt_C) { | ||
| 229 | if ($state == $ERRORS{'OK'}) { | ||
| 230 | $msg = "WARNING: $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold W = $opt_W)"; | ||
| 231 | $state = $ERRORS{'WARNING'}; | ||
| 232 | } elsif (($state == $ERRORS{'WARNING'}) || ($state == $ERRORS{'CRITICAL'})){ | ||
| 233 | $msg .= " -and- $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold W = $opt_W)"; | ||
| 234 | } else { | ||
| 235 | $msg = "WARNING: $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold W = $opt_W)"; | ||
| 236 | $state = $ERRORS{'WARNING'}; | ||
| 237 | } | ||
| 238 | } elsif ($srcdomains{$srcmaxkey} >= $opt_C) { | ||
| 239 | if ($state == $ERRORS{'OK'}) { | ||
| 240 | $msg = "CRITICAL: $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold C = $opt_C)"; | ||
| 241 | $state = $ERRORS{'CRITICAL'}; | ||
| 242 | } elsif ($state == $ERRORS{'WARNING'}) { | ||
| 243 | $msg = "CRITICAL: $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold C = $opt_C) -and- " . $msg; | ||
| 244 | $msg =~ s/WARNING: //; | ||
| 245 | } elsif ($state == $ERRORS{'CRITICAL'}) { | ||
| 246 | $msg .= " -and- $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold W = $opt_W)"; | ||
| 247 | } else { | ||
| 248 | $msg = "CRITICAL: $srcdomains{$srcmaxkey} messages in queue FROM $srcmaxkey (threshold W = $opt_W)"; | ||
| 249 | $state = $ERRORS{'CRITICAL'}; | ||
| 250 | } | ||
| 251 | } else { | ||
| 252 | if ($srcdomains{$srcmaxkey} > 0) { | ||
| 253 | $msg .= " $srcdomains{$srcmaxkey} msgs. FROM $srcmaxkey is below threshold ($opt_W/$opt_C)"; | ||
| 254 | } | ||
| 255 | } | ||
| 256 | |||
| 257 | # Apply threshold to queue lengths TO domain | ||
| 258 | my @dstkeys = sort { $dstdomains{$b} <=> $dstdomains{$a} } keys %dstdomains; | ||
| 259 | my $dstmaxkey = $dstkeys[0]; | ||
| 260 | print "dst max is $dstmaxkey with $dstdomains{$dstmaxkey} messages\n" if $verbose; | ||
| 261 | |||
| 262 | if ($dstdomains{$dstmaxkey} >= $opt_W && $dstdomains{$dstmaxkey} < $opt_C) { | ||
| 263 | if ($state == $ERRORS{'OK'}) { | ||
| 264 | $msg = "WARNING: $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold W = $opt_W)"; | ||
| 265 | $state = $ERRORS{'WARNING'}; | ||
| 266 | } elsif (($state == $ERRORS{'WARNING'}) || ($state == $ERRORS{'CRITICAL'})){ | ||
| 267 | $msg .= " -and- $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold W = $opt_W)"; | ||
| 268 | } else { | ||
| 269 | $msg = "WARNING: $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold W = $opt_W)"; | ||
| 270 | $state = $ERRORS{'WARNING'}; | ||
| 271 | } | ||
| 272 | } elsif ($dstdomains{$dstmaxkey} >= $opt_C) { | ||
| 273 | if ($state == $ERRORS{'OK'}) { | ||
| 274 | $msg = "CRITICAL: $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold C = $opt_C)"; | ||
| 275 | $state = $ERRORS{'CRITICAL'}; | ||
| 276 | } elsif ($state == $ERRORS{'WARNING'}) { | ||
| 277 | $msg = "CRITICAL: $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold C = $opt_C) -and- " . $msg; | ||
| 278 | $msg =~ s/WARNING: //; | ||
| 279 | } elsif ($state == $ERRORS{'CRITICAL'}) { | ||
| 280 | $msg .= " -and- $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold W = $opt_W)"; | ||
| 281 | } else { | ||
| 282 | $msg = "CRITICAL: $dstdomains{$dstmaxkey} messages in queue TO $dstmaxkey (threshold W = $opt_W)"; | ||
| 283 | $state = $ERRORS{'CRITICAL'}; | ||
| 284 | } | ||
| 285 | } else { | ||
| 286 | if ($dstdomains{$dstmaxkey} > 0) { | ||
| 287 | $msg .= " $dstdomains{$dstmaxkey} msgs. TO $dstmaxkey is below threshold ($opt_W/$opt_C)"; | ||
| 288 | } | ||
| 289 | } | ||
| 290 | |||
| 291 | } # End of queue length thresholds | ||
| 292 | |||
| 293 | } | ||
| 294 | |||
| 295 | } # end of ($mailq eq "sendmail") | ||
| 296 | elsif ( $mailq eq "qmail" ) { | ||
| 297 | |||
| 298 | # open qmail-qstat | ||
| 299 | if ( defined $utils::PATH_TO_QMAIL_QSTAT && -x $utils::PATH_TO_QMAIL_QSTAT ) { | ||
| 300 | if (! open (MAILQ, "$utils::PATH_TO_QMAIL_QSTAT | " ) ) { | ||
| 301 | print "ERROR: could not open $utils::PATH_TO_QMAIL_QSTAT \n"; | ||
| 302 | exit $ERRORS{'UNKNOWN'}; | ||
| 303 | } | ||
| 304 | }elsif( defined $utils::PATH_TO_QMAIL_QSTAT){ | ||
| 305 | unless (-x $utils::PATH_TO_QMAIL_QSTAT) { | ||
| 306 | print "ERROR: $utils::PATH_TO_QMAIL_QSTAT is not executable by (uid $>:gid($)))\n"; | ||
| 307 | exit $ERRORS{'UNKNOWN'}; | ||
| 308 | } | ||
| 309 | } else { | ||
| 310 | print "ERROR: \$utils::PATH_TO_QMAIL_QSTAT is not defined\n"; | ||
| 311 | exit $ERRORS{'UNKNOWN'}; | ||
| 312 | } | ||
| 313 | |||
| 314 | @lines = <MAILQ>; | ||
| 315 | |||
| 316 | # close qmail-qstat | ||
| 317 | close MAILQ; | ||
| 318 | # declare an error if we also get a non-zero return code from mailq | ||
| 319 | # unless already set to critical | ||
| 320 | if ( $? ) { | ||
| 321 | $state = $state == $ERRORS{"CRITICAL"} ? $ERRORS{"CRITICAL"} : $ERRORS{"WARNING"} ; | ||
| 322 | print "STDERR $?: $!\n" if $verbose; | ||
| 323 | $msg = "$state: (stderr)\n"; | ||
| 324 | } | ||
| 325 | |||
| 326 | ## shut off the alarm | ||
| 327 | alarm(0); | ||
| 328 | |||
| 329 | # check queue length | ||
| 330 | if ($lines[0]=~/^messages in queue: (\d+)/) { | ||
| 331 | $msg_q = $1 ; | ||
| 332 | }else{ | ||
| 333 | print "Couldn't match $utils::PATH_TO_QMAIL_QSTAT output\n"; | ||
| 334 | exit $ERRORS{'UNKNOWN'}; | ||
| 335 | } | ||
| 336 | |||
| 337 | # check messages not processed | ||
| 338 | if ($lines[1]=~/^messages in queue but not yet preprocessed: (\d+)/) { | ||
| 339 | my $msg_p = $1; | ||
| 340 | }else{ | ||
| 341 | print "Couldn't match $utils::PATH_TO_QMAIL_QSTAT output\n"; | ||
| 342 | exit $ERRORS{'UNKNOWN'}; | ||
| 343 | } | ||
| 344 | |||
| 345 | |||
| 346 | # check queue length(s) | ||
| 347 | if ($msg_q == 0){ | ||
| 348 | $msg = "OK: qmail-qstat reports queue is empty"; | ||
| 349 | $state = $ERRORS{'OK'}; | ||
| 350 | } else { | ||
| 351 | print "msg_q = $msg_q warn=$opt_w crit=$opt_c\n" if $verbose; | ||
| 352 | |||
| 353 | # overall queue length | ||
| 354 | if ($msg_q < $opt_w) { | ||
| 355 | $msg = "OK: mailq ($msg_q) is below threshold ($opt_w/$opt_c)"; | ||
| 356 | $state = $ERRORS{'OK'}; | ||
| 357 | }elsif ($msg_q >= $opt_w && $msg_q < $opt_c) { | ||
| 358 | $msg = "WARNING: mailq is $msg_q (threshold w = $opt_w)"; | ||
| 359 | $state = $ERRORS{'WARNING'}; | ||
| 360 | }else { | ||
| 361 | $msg = "CRITICAL: mailq is $msg_q (threshold c = $opt_c)"; | ||
| 362 | $state = $ERRORS{'CRITICAL'}; | ||
| 363 | } | ||
| 364 | |||
| 365 | # check messages not yet preprocessed (only compare is $opt_W and $opt_C | ||
| 366 | # are defined) | ||
| 367 | |||
| 368 | if (defined $opt_W) { | ||
| 369 | $msg .= "[Preprocessed = $msg_p]"; | ||
| 370 | if ($msg_p >= $opt_W && $msg_p < $opt_C ) { | ||
| 371 | $state = $state == $ERRORS{"CRITICAL"} ? $ERRORS{"CRITICAL"} : $ERRORS{"WARNING"} ; | ||
| 372 | }elsif ($msg_p >= $opt_C ) { | ||
| 373 | $state = $ERRORS{"CRITICAL"} ; | ||
| 374 | } | ||
| 375 | } | ||
| 376 | } | ||
| 377 | |||
| 378 | |||
| 379 | |||
| 380 | } # end of ($mailq eq "qmail") | ||
| 381 | |||
| 382 | |||
| 108 | 383 | ||
| 109 | # Perfdata support | 384 | # Perfdata support |
| 110 | print "$msg | mailq = $msg_q\n"; | 385 | print "$msg |mailq=$msg_q\n"; |
| 111 | exit $state; | 386 | exit $state; |
| 112 | 387 | ||
| 113 | 388 | ||
| @@ -120,8 +395,11 @@ sub process_arguments(){ | |||
| 120 | ("V" => \$opt_V, "version" => \$opt_V, | 395 | ("V" => \$opt_V, "version" => \$opt_V, |
| 121 | "v" => \$opt_v, "verbose" => \$opt_v, | 396 | "v" => \$opt_v, "verbose" => \$opt_v, |
| 122 | "h" => \$opt_h, "help" => \$opt_h, | 397 | "h" => \$opt_h, "help" => \$opt_h, |
| 398 | "M:s" => \$opt_M, "mailserver:s" => \$opt_M, # mailserver (default sendmail) | ||
| 123 | "w=i" => \$opt_w, "warning=i" => \$opt_w, # warning if above this number | 399 | "w=i" => \$opt_w, "warning=i" => \$opt_w, # warning if above this number |
| 124 | "c=i" => \$opt_c, "critical=i" => \$opt_c, # critical if above this number | 400 | "c=i" => \$opt_c, "critical=i" => \$opt_c, # critical if above this number |
| 401 | "W=i" => \$opt_W, "Warning=i" => \$opt_W, # warning if above this number | ||
| 402 | "C=i" => \$opt_C, "Critical=i" => \$opt_C, # critical if above this number | ||
| 125 | "t=i" => \$opt_t, "timeout=i" => \$opt_t | 403 | "t=i" => \$opt_t, "timeout=i" => \$opt_t |
| 126 | ); | 404 | ); |
| 127 | 405 | ||
| @@ -149,31 +427,65 @@ sub process_arguments(){ | |||
| 149 | } | 427 | } |
| 150 | 428 | ||
| 151 | if ( $opt_w >= $opt_c) { | 429 | if ( $opt_w >= $opt_c) { |
| 152 | print "Warning cannot be greater than Critical!\n"; | 430 | print "Warning (-w) cannot be greater than Critical (-c)!\n"; |
| 431 | exit $ERRORS{'UNKNOWN'}; | ||
| 432 | } | ||
| 433 | |||
| 434 | if (defined $opt_W && ! defined !$opt_C) { | ||
| 435 | print "Need -C if using -W\n"; | ||
| 153 | exit $ERRORS{'UNKNOWN'}; | 436 | exit $ERRORS{'UNKNOWN'}; |
| 437 | }elsif(defined $opt_W && defined $opt_C) { | ||
| 438 | if ($opt_W >= $opt_C) { | ||
| 439 | print "Warning (-W) cannot be greater than Critical (-C)!\n"; | ||
| 440 | exit $ERRORS{'UNKNOWN'}; | ||
| 441 | } | ||
| 154 | } | 442 | } |
| 155 | 443 | ||
| 444 | if (defined $opt_M) { | ||
| 445 | if ($opt_M =~ /sendmail/ || $opt_M =~ /qmail/ ) { | ||
| 446 | $mailq = $opt_M ; | ||
| 447 | }elsif( $opt_M eq ''){ | ||
| 448 | $mailq = 'sendmail'; | ||
| 449 | }else{ | ||
| 450 | print "-M: $opt_M is not supported\n"; | ||
| 451 | exit $ERRORS{'UNKNOWN'}; | ||
| 452 | } | ||
| 453 | }else{ | ||
| 454 | $mailq = 'sendmail' ; | ||
| 455 | } | ||
| 456 | |||
| 156 | return $ERRORS{'OK'}; | 457 | return $ERRORS{'OK'}; |
| 157 | } | 458 | } |
| 158 | 459 | ||
| 159 | sub print_usage () { | 460 | sub print_usage () { |
| 160 | print "Usage: $PROGNAME [-w <warn>] [-c <crit>] [-t <timeout>] [-v verbose]\n"; | 461 | print "Usage: $PROGNAME [-w <warn>] [-c <crit>] [-W <warn>] [-C <crit>] [-M <MTA>] [-t <timeout>] [-v verbose]\n"; |
| 161 | } | 462 | } |
| 162 | 463 | ||
| 163 | sub print_help () { | 464 | sub print_help () { |
| 164 | print_revision($PROGNAME,'$Revision$'); | 465 | print_revision($PROGNAME,'$Revision$'); |
| 165 | print "Copyright (c) 2002 Subhendu Ghosh\n"; | 466 | print "Copyright (c) 2002 Subhendu Ghosh/Carlos Canau/Benjamin Schmid\n"; |
| 166 | print "\n"; | 467 | print "\n"; |
| 167 | print_usage(); | 468 | print_usage(); |
| 168 | print "\n"; | 469 | print "\n"; |
| 169 | print " Checks the number of messages in the mail queue\n"; | 470 | print " Checks the number of messages in the mail queue (supports multiple sendmail queues, qmail)\n"; |
| 170 | print " Feedback/patches to support non-sendmail mailqueue welcome\n\n"; | 471 | print " Feedback/patches to support non-sendmail mailqueue welcome\n\n"; |
| 171 | print "-w (--warning) = Min. number of messages in queue to generate warning\n"; | 472 | print "-w (--warning) = Min. number of messages in queue to generate warning\n"; |
| 172 | print "-c (--critical) = Min. number of messages in queu to generate critical alert ( w < c )\n"; | 473 | print "-c (--critical) = Min. number of messages in queu to generate critical alert ( w < c )\n"; |
| 474 | print "-W (--Warning) = Min. number of messages for same domain in queue to generate warning\n"; | ||
| 475 | print "-C (--Critical) = Min. number of messages for same domain in queue to generate critical alert ( W < C )\n"; | ||
| 173 | print "-t (--timeout) = Plugin timeout in seconds (default = $utils::TIMEOUT)\n"; | 476 | print "-t (--timeout) = Plugin timeout in seconds (default = $utils::TIMEOUT)\n"; |
| 477 | print "-M (--mailserver) = [ sendmail | qmail ] (default = sendmail)\n"; | ||
| 174 | print "-h (--help)\n"; | 478 | print "-h (--help)\n"; |
| 175 | print "-V (--version)\n"; | 479 | print "-V (--version)\n"; |
| 176 | print "-v (--verbose) = deebugging output\n"; | 480 | print "-v (--verbose) = debugging output\n"; |
| 481 | print "\n\n"; | ||
| 482 | print "Note: -w and -c are required arguments. -W and -C are optional.\n"; | ||
| 483 | print " -W and -C are applied to domains listed on the queues - both FROM and TO. (sendmail)\n"; | ||
| 484 | print " -W and -C are applied message not yet preproccessed. (qmail)\n"; | ||
| 485 | print " This plugin uses the system mailq command (sendmail) or qmail-stat (qmail)\n"; | ||
| 486 | print " to look at the queues. Mailq can usually only be accessed by root or \n"; | ||
| 487 | print " a TrustedUser. You will have to set appropriate permissions for the plugin to work.\n"; | ||
| 488 | print ""; | ||
| 177 | print "\n\n"; | 489 | print "\n\n"; |
| 178 | support(); | 490 | support(); |
| 179 | } | 491 | } |
