| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- #!/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
- # ------------------------------------------------------------------------------
- # Copyright 1999 (c) Richard Mayhew
- # Credits go to Ethan Galstad for coding Nagios
- # If any changes are made to this script, please mail me a copy of the
- # 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!!
- # 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 ]--
- require 5.004;
- # --------------------------------------------------------------------[ Uses ]--
- use Socket;
- use strict;
- # --------------------------------------------------------------[ Enviroment ]--
- $ENV{PATH} = "/bin";
- $ENV{BASH_ENV} = "";
- $|=1;
- # ------------------------------------------------------------------[ Global ]--
- my $TIMEOUT = 60;
- # -------------------------------------------------------------------[ usage ]--
- sub usage
- {
- print "Minimum arguments not supplied!\n";
- print "\n";
- print "Perl Check POP3 plugin for Nagios\n";
- print "Copyright (c) 2000 Richard Mayhew\n";
- print "\n";
- print "Usage: check_pop3.pl <host> <username> <password> [port]\n";
- print "\n";
- print "<port> = Port that the pop3 daemon is running on <host>. Defaults to 110.\n";
- exit -1;
- }
- # --------------------------------------------------------------[ bindRemote ]--
- sub bindRemote
- {
- my ($in_remotehost, $in_remoteport, $in_hostname) = @_;
- my $proto;
- my $sockaddr;
- my $this;
- my $thisaddr;
- my $that;
- my ($name, $aliases,$type,$len,$thataddr) = gethostbyname($in_remotehost);
- if (!socket(ClientSocket,AF_INET, SOCK_STREAM, $proto)) { die $!; }
- $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\n"; exit 2; }
- if (!connect(ClientSocket, $that)) { print "Connection Refused\n"; exit 2; }
- select(ClientSocket); $| = 1; select(STDOUT);
- return \*ClientSocket;
- }
- # ====================================================================[ MAIN ]==
- MAIN:
- {
- my $hostname;
- my $remotehost = shift || &usage;
- my $username = shift || &usage;
- my $password = shift || &usage;
- my $remoteport = shift || 110;
- # Just in case of problems, let's not hang Nagios
- $SIG{'ALRM'} = sub {
- print "Something is Taking a Long Time, Increase Your TIMEOUT (Currently Set At $TIMEOUT Seconds)\n";
- exit -1;
- };
-
- alarm($TIMEOUT);
- chop($hostname = `hostname`);
- my ($name, $alias, $proto) = getprotobyname('tcp');
- my $ClientSocket = &bindRemote($remotehost,$remoteport,$hostname);
-
- &err("no welcome banner\n") unless $_ = <ClientSocket>;
- &err("bad welcome banner: " . $_) unless $_ =~ /^\+OK/;
- print ClientSocket "USER $username\r\n";
- &err("no response to USER command\n") unless $_ = <ClientSocket>;
- &err("bad response to USER: " . $_) unless $_ =~ /^\+OK/;
- print ClientSocket "PASS $password\r\n";
- &err("no response to PASS command\n") unless $_ = <ClientSocket>;
- &err("bad response to PASS: " . $_) unless $_ =~ /^\+OK/;
- print ClientSocket "LIST\r\n";
- 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 $msg = shift;
- alarm(0);
- print ClientSocket "QUIT\r\n";
- print "POP3 OK - Total Messages On Server: $msg";
- exit 0;
- }
- sub err
- {
- my $msg = shift;
- alarm(0);
- print ClientSocket "QUIT\r\n";
- print "POP3 Error: $msg";
- exit 2;
- }
|