#!/bin/sh
# -*- sh -*-

: << =cut

=head1 NAME

postfix_mailqueue - Plugin to monitor postfix mail spools

=head1 ABOUT

A guide to postfix mail queue manageent can be found at
L<http://www.postfix.org/QSHAPE_README.html#queues>

A summary:

=over 4

=item maildrop

Messages that have been submitted via the Postfix sendmail(1) command,
but not yet brought into the main Postfix queue by the pickup(8)
service.

=item hold

Messages placed in the "hold" queue stay there until the administrator
intervenes

=item incoming

Inbound mail from the network, or mail picked up by the local
pickup(8) daemon from the maildrop directory.

=item active

Messages that the queue manager has opened for delivery. Only a limited number
of messages is allowed to enter the active queue (leaky bucket strategy, for a
fixed delivery rate).

=item deferred

Mail that could not be delivered upon the first attempt. The queue manager
implements exponential backoff by doubling the time between delivery attempts.

=item corrupt

Unreadable or damaged queue files are moved here for inspection.

=back

=head1 CONFIGURATION

By default "postconf -h queue_directory" is used to determine the
spool directory.  Is postconf is not available in the $PATH then
/var/spool/postfix is assumed.  This can be overridden by the
"spooldir" environment variable like so:

 [postfix_mailqueue]
    env.spooldir /var/spool/postfix

=head1 AUTHOR

Unknown.

=head1 LICENSE

Unknown.

=head1 MAGIC MARKERS

=begin comment

These magic markers are used by munin-node-configure when installing
munin-node.

=end comment

 #%# family=auto
 #%# capabilities=autoconf

=cut

# atempt to get spooldir via postconf, but environment overrides.

# Remember that postconf is not available unless postfix is.
POSTCONFSPOOL="$(postconf -h queue_directory 2>/dev/null || echo /var/spool/postfix)"
SPOOLDIR=${spooldir:-$POSTCONFSPOOL}

. $MUNIN_LIBDIR/plugins/plugin.sh

case $1 in
    autoconf|detect)
	
	if [ -d $SPOOLDIR ] ; then
	    echo yes
	    exit 0
        else
	    echo "no (spooldir not found)"
	    exit 0
        fi;;
    config)
	cat <<'EOF'
graph_title Postfix Queue Size
graph_vlabel KB in Queue
graph_category postfix
graph_total Total
active.label active
deferred.label deferred
maildrop.label maildrop
incoming.label incoming
corrupt.label corrupt
hold.label held
EOF
	for field in active deferred maildrop incoming corrupt hold; do
		print_warning $field
		print_critical $field
	done
	exit 0;;
esac

cd $SPOOLDIR >/dev/null 2>/dev/null || {
     echo "# Cannot cd to $SPOOLDIR"
     exit 1
}

cat <<EOF
deferred.value `du -sb $SPOOLDIR/* | grep deferred | awk '{print $1}'`
active.value `du -sb $SPOOLDIR/* | grep active | awk '{print $1}'`
maildrop.value `du -sb $SPOOLDIR/* | grep maildrop | awk '{print $1}'`
incoming.value `du -sb $SPOOLDIR/* | grep incoming | awk '{print $1}'`
corrupt.value `du -sb $SPOOLDIR/* | grep corrupt | awk '{print $1}'`
hold.value `du -sb $SPOOLDIR/* | grep hold | awk '{print $1}'`
EOF
