#!/usr/bin/perl -w

use strict;
use warnings;

use Getopt::Long qw(GetOptions);
use noris::NetSaint;

GetOptions(
    'max-messages=i' => \my $MaxMessages,
    'min-messages=i' => \my $MinMessages,
    'password=s'     => \my $Password,
    'server=s'       => \my $Server,
    'ssl!'           => \my $Ssl,
    'user=s'         => \my $User,
    'help|?!'        =>
      sub { exec perldoc => -F => $0 or die "exec('perldoc -F $0'): $!\n" },
  )
  or exit 1;

my $netsaint = noris::NetSaint->new;

my $module = 'Net::IMAP::Simple' . ( $Ssl ? '::SSL' : '' );

{
    my @missing_args;
    push @missing_args, 'server'   unless defined $Server;
    push @missing_args, 'user'     unless defined $User;
    push @missing_args, 'password' unless defined $Password;

    die @missing_args
      . ' required argument'
      . ( @missing_args != 1 && 's' )
      . ' missing: '
      . join( ', ', map "-$_", @missing_args ) . "\n"
      if @missing_args;
}

eval "use $module";
die $@ if $@;

unless ( my $imap = $module->new($Server) ) {
    no warnings 'once';
    $netsaint->update(
        Critical => "Cannot connect to server: $Net::IMAP::Simple::errstr" );
}
elsif ( !$imap->login( $User => $Password ) ) {
    $netsaint->update( Critical => 'IMAP login failed: ' . $imap->errstr );
}
elsif ( @ARGV || defined $MinMessages || defined $MaxMessages ) {
    for ( @ARGV ? @ARGV : undef ) {
        my $folder = defined() ? qq(folder "$_") : 'Inbox';

        unless (
            defined( my $messages = $imap->select( defined() ? $_ : () ) ) )
        {
            $netsaint->update(
                Warning => "Cannot get number of messages in $folder: "
                  . $imap->errstr );
        }
        else {
            $netsaint->add_message( "$folder contains $messages message"
                  . ( $messages != 1 && 's' )
                  . '.' );
            $netsaint->atleast('Warning')
              if defined $MaxMessages && $messages > $MaxMessages
              || defined $MinMessages && $messages < $MinMessages;
        }
    }
    $netsaint->atleast('OK');
}
else {
    $netsaint->update( OK => 'Login to mailbox was successful.' );
}

__END__

=head1 NAME

check_imap_mailbox - Nagios-Plugin fr IMAP(S)-Postfcher

=head1 SYNOPSE

    check_imap_mailbox -ssl \
                       -server imap.aim.com \
                       -user NorisTechnik \
                       -password fragfany \
                       -max-messages 9999

=head1 BESCHREIBUNG

Das Plugin berprft die Verfgbarkeit eines IMAP(S)-Postfachs sowie optional
die Anzahl der Nachrichten in frei whlbaren Ordnern dieses Postfachs.

Dazu wird in jedem Fall ein Login ins angegebene Postfach versucht.
Schlgt dieser fehl, beendet sich das Plugin mit einem kritischen Status.

Andernfalls wird jeder auf der Kommandozeile angegebene Ordner des Postfachs
aufgerufen und ggf. berprft, ob die Anzahl der enthaltenen E-Mails innerhalb
der angegebenen Grenzwerte liegt, und andernfalls eine Warnung erzeugt.
Sofern mindestens ein Grenzwert, aber kein Ordner angegeben wurde, wird
automagisch die Inbox untersucht.

=head1 NOTWENDIGE ARGUMENTE

=over 4

=item -server Server

IP-Adresse oder Name sowie optional Port des IMAP(S)-Servers

=item -user IMAP-Username

=item -password IMAP-Kennwort

Zugangsdaten des zu berwachenden Postfachs

=back

=head1 OPTIONEN

=over 4

=item -ssl

IMAPS anschalten

=item -folder Ordner

zur Auswahl eines auszuwhlenden IMAP-Ordners.
Per Default wird die Inbox berwacht.

=item -max-messages Anzahl

Warnung, falls irgendeiner de rauf der Kommandozeile angegebenen Ordner mehr als
die angegebene Anzahl E-Mails enthlt

=item -min-messages Anzahl

Warnung, falls irgendeiner de rauf der Kommandozeile angegebenen Ordner weniger
als die angegebene Anzahl E-Mails enthlt

=item -help

=item -?

Zeigt nur diese Dokumentation an.

=back

=head1 AUTOR

 Martin H. Sluka <fany@noris.net>
 fr die noris network AG

=cut

