aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/check_pop3.pl94
1 files changed, 49 insertions, 45 deletions
diff --git a/contrib/check_pop3.pl b/contrib/check_pop3.pl
index c0c2712c..37f2ce03 100644
--- a/contrib/check_pop3.pl
+++ b/contrib/check_pop3.pl
@@ -1,12 +1,12 @@
#!/usr/bin/perl
# ------------------------------------------------------------------------------
-# File Name: check_pop3.pl
-# Author: Richard Mayhew - South Africa
-# Date: 2000/01/21
-# Version: 1.0
-# Description: This script will check to see if an POP3 is running
-# and whether authentication can take place.
-# Email: netsaint@splash.co.za
+# File Name: check_pop3.pl
+# Author: Richard Mayhew - South Africa
+# Date: 2000/01/21
+# Version: 1.0
+# Description: This script will check to see if an POP3 is running
+# and whether authentication can take place.
+# Email: netsaint@splash.co.za
# ------------------------------------------------------------------------------
# Copyright 1999 (c) Richard Mayhew
# Credits go to Ethan Galstad for coding Nagios
@@ -14,15 +14,20 @@
# changes :)
# License GPL
# ------------------------------------------------------------------------------
-# Date Author Reason
-# ---- ------ ------
-# 1999/09/20 RM Creation
-# 1999/09/20 TP Changed script to use strict, more secure by
-# specifying $ENV variables. The bind command is
-# still insecure through. Did most of my work
-# with perl -wT and 'use strict'
-# 2000/01/20 RM Corrected POP3 Exit State.
-# 2000/01/21 RM Fix Exit Codes Again!!
+# Date Author Reason
+# ---- ------ ------
+# 1999/09/20 RM Creation
+# 1999/09/20 TP Changed script to use strict, more secure by
+# specifying $ENV variables. The bind command is
+# still insecure through. Did most of my work
+# with perl -wT and 'use strict'
+# 2000/01/20 RM Corrected POP3 Exit State.
+# 2000/01/21 RM Fix Exit Codes Again!!
+# 2003/12/30 CZ Proper CRLF in communication w/server
+# Fixed infinite loop
+# Error checking on welcome banner, USER, PASS commands
+# Better error condition handling
+
# ------------------------------------------------------------------------------
# -----------------------------------------------------------------[ Require ]--
@@ -38,7 +43,7 @@ $ENV{BASH_ENV} = "";
$|=1;
# ------------------------------------------------------------------[ Global ]--
my $TIMEOUT = 60;
-
+
# -------------------------------------------------------------------[ usage ]--
sub usage
{
@@ -69,8 +74,8 @@ sub bindRemote
$sockaddr = 'S n a4 x8';
$this = pack($sockaddr, AF_INET, 0, $thisaddr);
$that = pack($sockaddr, AF_INET, $in_remoteport, $thataddr);
- if (!bind(ClientSocket, $this)) { print "Connection Refused"; exit 2; }
- if (!connect(ClientSocket, $that)) { print "Connection Refused"; exit 2; }
+ if (!bind(ClientSocket, $this)) { print "Connection Refused\n"; exit 2; }
+ if (!connect(ClientSocket, $that)) { print "Connection Refused\n"; exit 2; }
select(ClientSocket); $| = 1; select(STDOUT);
return \*ClientSocket;
}
@@ -97,48 +102,47 @@ MAIN:
my $ClientSocket = &bindRemote($remotehost,$remoteport,$hostname);
-print ClientSocket "user $username\n";
-
-#Debug Server
-#print "user $username\n";
+ &err("no welcome banner\n") unless $_ = <ClientSocket>;
+ &err("bad welcome banner: " . $_) unless $_ =~ /^\+OK/;
-#Sleep or 3 secs, incase server is slow.
-sleep 3;
+ print ClientSocket "USER $username\r\n";
-print ClientSocket "pass $password\n";
+ &err("no response to USER command\n") unless $_ = <ClientSocket>;
+ &err("bad response to USER: " . $_) unless $_ =~ /^\+OK/;
-#Debug Server
-#print "pass $password\n";
+ print ClientSocket "PASS $password\r\n";
-while (<ClientSocket>) {
+ &err("no response to PASS command\n") unless $_ = <ClientSocket>;
+ &err("bad response to PASS: " . $_) unless $_ =~ /^\+OK/;
-print ClientSocket "pass $password\n";
+ print ClientSocket "LIST\r\n";
-#Debug Server
-#print $_;
-
-err($_) if (m/\-ERR\s+(.*)\s+.*/);
-message($_) if (m/\+OK Mailbox open,\s+(.*\d)\s+messages.*/);
-}
+ my $bad = 1;
+ my $msgs = 0;
+ while (<ClientSocket>) {
+ &err(($1||' UNKNOWN')."\n") if (m/\-ERR(.*)/);
+ $bad = 0 if /^\+OK/;
+ $msgs = $1 if /^(\d+)\s+/;
+ last if /^\./;
+ }
+ &message("$msgs\n") unless $bad;
+ &err("missing +OK to LIST command\n");
}
sub message
{
- my $answer = "UNKNOWN";
- $answer = "Pop3 OK - Total Messages On Server :- $1";
+ my $msg = shift;
alarm(0);
- print ClientSocket "quit\n";
- print "$answer";
+ print ClientSocket "QUIT\r\n";
+ print "POP3 OK - Total Messages On Server: $msg";
exit 0;
}
sub err
{
- my $answer = "UNKNOWN";
- $answer = "Pop3 Error :- $1";
+ my $msg = shift;
alarm(0);
- print ClientSocket "quit\n";
- print "$answer";
+ print ClientSocket "QUIT\r\n";
+ print "POP3 Error: $msg";
exit 2;
}
-