Code

fix loop and \r\n (Jason Burnett - http://sourceforge.net/tracker/index.php?func...
authorKarl DeBisschop <kdebisschop@users.sourceforge.net>
Wed, 3 Mar 2004 04:24:35 +0000 (04:24 +0000)
committerKarl DeBisschop <kdebisschop@users.sourceforge.net>
Wed, 3 Mar 2004 04:24:35 +0000 (04:24 +0000)
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@840 f882894a-f735-0410-b71e-b25c423dba1c

contrib/check_pop3.pl

index c0c2712c783b1e7f31e7138f88991b1c2d382155..37f2ce03ed37eab0545990076d6c3f1e05e461be 100644 (file)
@@ -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
 # 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;
 }
-