diff options
Diffstat (limited to 'contrib/check_email_loop.pl')
| -rw-r--r-- | contrib/check_email_loop.pl | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/contrib/check_email_loop.pl b/contrib/check_email_loop.pl index 733406da..965f8512 100644 --- a/contrib/check_email_loop.pl +++ b/contrib/check_email_loop.pl | |||
| @@ -24,6 +24,11 @@ | |||
| 24 | # back till now) or if a mails got lost (meaning a mail, that was | 24 | # back till now) or if a mails got lost (meaning a mail, that was |
| 25 | # send later came back prior to another mail). | 25 | # send later came back prior to another mail). |
| 26 | # | 26 | # |
| 27 | # Michael Markstaller, mm@elabnet.de various changes/additions | ||
| 28 | # MM 021003: fixed some unquoted strings | ||
| 29 | # MM 021116: fixed/added pendwarn/lostwarn | ||
| 30 | # MM 030515: added deleting of orphaned check-emails | ||
| 31 | # changed to use "top" instead of get to minimize traffic (required changing match-string from "Subject: Email-ping [" to "Email-Ping [" | ||
| 27 | 32 | ||
| 28 | use Net::POP3; | 33 | use Net::POP3; |
| 29 | use Net::SMTP; | 34 | use Net::SMTP; |
| @@ -40,8 +45,8 @@ my %ERRORS = ('UNKNOWN' , '-1', | |||
| 40 | 'CRITICAL', '2'); | 45 | 'CRITICAL', '2'); |
| 41 | 46 | ||
| 42 | my $state = "UNKNOWN"; | 47 | my $state = "UNKNOWN"; |
| 43 | my ($sender,$receiver, $pophost, $popuser, $poppasswd, $smtphost); | 48 | my ($sender,$receiver, $pophost, $popuser, $poppasswd, $smtphost,$keeporphaned); |
| 44 | my ($poptimeout,$smtptimeout,$pinginterval)=(60,60,5); | 49 | my ($poptimeout,$smtptimeout,$pinginterval,$maxmsg)=(60,60,5,50); |
| 45 | my ($lostwarn, $lostcrit,$pendwarn, $pendcrit); | 50 | my ($lostwarn, $lostcrit,$pendwarn, $pendcrit); |
| 46 | 51 | ||
| 47 | # Internal Vars | 52 | # Internal Vars |
| @@ -73,10 +78,12 @@ my $status = GetOptions( | |||
| 73 | "smtptimeout=i",\$smtptimeout, | 78 | "smtptimeout=i",\$smtptimeout, |
| 74 | "statfile=s",\$statfile, | 79 | "statfile=s",\$statfile, |
| 75 | "interval=i",\$pinginterval, | 80 | "interval=i",\$pinginterval, |
| 76 | "lostwarr=i",\$lostwarn, | 81 | "lostwarn=i",\$lostwarn, |
| 77 | "lostcrit=i",\$lostcrit, | 82 | "lostcrit=i",\$lostcrit, |
| 78 | "pendwarn=i",\$pendwarn, | 83 | "pendwarn=i",\$pendwarn, |
| 79 | "pendcrit=i",\$pendcrit, | 84 | "pendcrit=i",\$pendcrit, |
| 85 | "maxmsg=i",\$maxmsg, | ||
| 86 | "keeporphaned=s",\$keeporphaned, | ||
| 80 | ); | 87 | ); |
| 81 | usage() if ($status == 0 || ! ($pophost && $popuser && $poppasswd && | 88 | usage() if ($status == 0 || ! ($pophost && $popuser && $poppasswd && |
| 82 | $smtphost && $receiver && $sender )); | 89 | $smtphost && $receiver && $sender )); |
| @@ -127,10 +134,12 @@ $statinfo="$msgcount mails on POP3"; | |||
| 127 | 134 | ||
| 128 | nsexit("POP3 login failed (user:$popuser)",'CRITICAL') if (!defined($msgcount)); | 135 | nsexit("POP3 login failed (user:$popuser)",'CRITICAL') if (!defined($msgcount)); |
| 129 | 136 | ||
| 137 | # Check if more than maxmsg mails in pop3-box | ||
| 138 | nsexit(">$maxmsg Mails ($msgcount Mails on POP3); Please delete !",'WARNING') if ($msgcount > $maxmsg); | ||
| 139 | |||
| 130 | # Count messages, that we are looking 4: | 140 | # Count messages, that we are looking 4: |
| 131 | while ($msgcount > 0) { | 141 | while ($msgcount > 0) { |
| 132 | @msglines = @{$pop->get($msgcount)}; | 142 | @msglines = @{$pop->top($msgcount,1)}; |
| 133 | |||
| 134 | for (my $i=0; $i < scalar @messageids; $i++) { | 143 | for (my $i=0; $i < scalar @messageids; $i++) { |
| 135 | if (messagematchsid(\@msglines,$messageids[$i])) { | 144 | if (messagematchsid(\@msglines,$messageids[$i])) { |
| 136 | $matchcount++; | 145 | $matchcount++; |
| @@ -138,11 +147,18 @@ while ($msgcount > 0) { | |||
| 138 | $newestid = $messageids[$i] if ($messageids[$i] > $newestid || !defined $newestid); | 147 | $newestid = $messageids[$i] if ($messageids[$i] > $newestid || !defined $newestid); |
| 139 | $pop->delete($msgcount); # remove E-Mail from POP3 server | 148 | $pop->delete($msgcount); # remove E-Mail from POP3 server |
| 140 | splice @messageids, $i, 1;# remove id from List | 149 | splice @messageids, $i, 1;# remove id from List |
| 141 | last; # stop looking in list | 150 | last; # stop looking in list |
| 142 | } | 151 | } |
| 143 | } | 152 | } |
| 144 | 153 | # Delete orphaned Email-ping msg | |
| 145 | $msgcount--; | 154 | my @msgsubject = grep /^Subject/, @msglines; |
| 155 | chomp @msgsubject; | ||
| 156 | # Scan Subject if email is an Email-Ping. In fact we match and delete also successfully retrieved messages here again. | ||
| 157 | if (!defined $keeporphaned && $msgsubject[0] =~ /E-Mail Ping \[/) { | ||
| 158 | $pop->delete($msgcount); # remove E-Mail from POP3 server | ||
| 159 | } | ||
| 160 | |||
| 161 | $msgcount--; | ||
| 146 | } | 162 | } |
| 147 | 163 | ||
| 148 | $pop->quit(); # necessary for pop3 deletion! | 164 | $pop->quit(); # necessary for pop3 deletion! |
| @@ -194,7 +210,7 @@ nsexit($statinfo); | |||
| 194 | # ---------------------------------------------------------------------- | 210 | # ---------------------------------------------------------------------- |
| 195 | 211 | ||
| 196 | sub usage { | 212 | sub usage { |
| 197 | print "check_email_loop 1.0 Nagios Plugin - Real check of a E-Mail system\n"; | 213 | print "check_email_loop 1.1 Nagios Plugin - Real check of a E-Mail system\n"; |
| 198 | print "=" x 75,"\nERROR: Missing or wrong arguments!\n","=" x 75,"\n"; | 214 | print "=" x 75,"\nERROR: Missing or wrong arguments!\n","=" x 75,"\n"; |
| 199 | print "This script sends a mail with a specific id in the subject via an given\n"; | 215 | print "This script sends a mail with a specific id in the subject via an given\n"; |
| 200 | print "smtp-server to a given email-adress. When the script is run again, it checks\n"; | 216 | print "smtp-server to a given email-adress. When the script is run again, it checks\n"; |
| @@ -210,19 +226,21 @@ sub usage { | |||
| 210 | print " -smtphost=text IP oder name of the SMTP host\n"; | 226 | print " -smtphost=text IP oder name of the SMTP host\n"; |
| 211 | print " -smtptimeout=num Timeout in seconds for the SMTP-server\n"; | 227 | print " -smtptimeout=num Timeout in seconds for the SMTP-server\n"; |
| 212 | print " -statfile=text File to save ids of messages ($statfile)\n"; | 228 | print " -statfile=text File to save ids of messages ($statfile)\n"; |
| 213 | # print " -interval=num Time (in minutes) that must pass by before sending\n" | 229 | print " -interval=num Time (in minutes) that must pass by before sending\n"; |
| 214 | # print " another Ping-mail (gibe a new try);\n"; | 230 | print " another Ping-mail (gibe a new try);\n"; |
| 215 | print " -lostwarn=num WARNING-state if more than num lost emails\n"; | 231 | print " -lostwarn=num WARNING-state if more than num lost emails\n"; |
| 216 | print " -lostcrit=num CRITICAL \n"; | 232 | print " -lostcrit=num CRITICAL \n"; |
| 217 | print " -pendwarn=num WARNING-state if more than num pending emails\n"; | 233 | print " -pendwarn=num WARNING-state if more than num pending emails\n"; |
| 218 | print " -pendcrit=num CRITICAL \n"; | 234 | print " -pendcrit=num CRITICAL \n"; |
| 235 | print " -maxmsg=num WARNING if more than num emails on POP3 (default 50)\n"; | ||
| 236 | print " -keeporphaned Set this to NOT delete orphaned E-Mail Ping msg from POP3\n\n"; | ||
| 219 | print " Options may abbreviated!\n"; | 237 | print " Options may abbreviated!\n"; |
| 220 | print " LOST mails are mails, being sent before the last mail arrived back.\n"; | 238 | print " LOST mails are mails, being sent before the last mail arrived back.\n"; |
| 221 | print " PENDING mails are those, which are not. (supposed to be on the way)\n"; | 239 | print " PENDING mails are those, which are not. (supposed to be on the way)\n"; |
| 222 | print "\nExample: \n"; | 240 | print "\nExample: \n"; |
| 223 | print " $0 -poph=host -pa=pw -popu=popts -smtph=host -from=root\@me.com\n "; | 241 | print " $0 -poph=host -pa=pw -popu=popts -smtph=host -from=root\@me.com\n "; |
| 224 | print " -to=remailer\@testxy.com -lostc=0 -pendc=2\n"; | 242 | print " -to=remailer\@testxy.com -lostc=0 -pendc=2\n"; |
| 225 | print "\nCopyleft 19.10.2000, Benjamin Schmid\n"; | 243 | print "\nCopyleft 19.10.2000, Benjamin Schmid / 2003 Michael Markstaller, mm\@elabnet.de\n"; |
| 226 | print "This script comes with ABSOLUTELY NO WARRANTY\n"; | 244 | print "This script comes with ABSOLUTELY NO WARRANTY\n"; |
| 227 | print "This programm is licensed under the terms of the "; | 245 | print "This programm is licensed under the terms of the "; |
| 228 | print "GNU General Public License\n\n"; | 246 | print "GNU General Public License\n\n"; |
| @@ -247,7 +265,7 @@ sub messagematchsid { | |||
| 247 | 265 | ||
| 248 | # ID | 266 | # ID |
| 249 | $id =~ s/^LI/ID/; # evtl. remove lost mail mark | 267 | $id =~ s/^LI/ID/; # evtl. remove lost mail mark |
| 250 | @tmp = grep /Subject: E-Mail Ping \[/, @$mailref; | 268 | @tmp = grep /E-Mail Ping \[/, @$mailref; |
| 251 | chomp @tmp; | 269 | chomp @tmp; |
| 252 | if (($tmp[0] =~ /$id/)) | 270 | if (($tmp[0] =~ /$id/)) |
| 253 | { $match = 1; } | 271 | { $match = 1; } |
