summaryrefslogtreecommitdiffstats
path: root/contrib/check_email_loop.pl
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/check_email_loop.pl')
-rw-r--r--contrib/check_email_loop.pl46
1 files changed, 32 insertions, 14 deletions
diff --git a/contrib/check_email_loop.pl b/contrib/check_email_loop.pl
index 733406d..965f851 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
28use Net::POP3; 33use Net::POP3;
29use Net::SMTP; 34use Net::SMTP;
@@ -40,8 +45,8 @@ my %ERRORS = ('UNKNOWN' , '-1',
40 'CRITICAL', '2'); 45 'CRITICAL', '2');
41 46
42my $state = "UNKNOWN"; 47my $state = "UNKNOWN";
43my ($sender,$receiver, $pophost, $popuser, $poppasswd, $smtphost); 48my ($sender,$receiver, $pophost, $popuser, $poppasswd, $smtphost,$keeporphaned);
44my ($poptimeout,$smtptimeout,$pinginterval)=(60,60,5); 49my ($poptimeout,$smtptimeout,$pinginterval,$maxmsg)=(60,60,5,50);
45my ($lostwarn, $lostcrit,$pendwarn, $pendcrit); 50my ($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 );
81usage() if ($status == 0 || ! ($pophost && $popuser && $poppasswd && 88usage() 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
128nsexit("POP3 login failed (user:$popuser)",'CRITICAL') if (!defined($msgcount)); 135nsexit("POP3 login failed (user:$popuser)",'CRITICAL') if (!defined($msgcount));
129 136
137# Check if more than maxmsg mails in pop3-box
138nsexit(">$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:
131while ($msgcount > 0) { 141while ($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
196sub usage { 212sub 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; }