#!/bin/sh

: << =cut

=head1 NAME

postfix_mailqueue - Plugin to monitor postfix mail spools

=head1 ABOUT

A guide to postfix mail queue management 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 Mailqueue
graph_vlabel Mails in queue
graph_category mail
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 $( { test -d deferred && find deferred -type f; } | wc -l)
active.value $( { test -d active && find active -type f; } | wc -l)
maildrop.value $( { test -d maildrop && find maildrop -type f; } | wc -l)
incoming.value $( { test -d incoming && find incoming -type f; } | wc -l)
corrupt.value $( { test -d corrupt && find corrupt -type f; } | wc -l)
hold.value $( { test -d hold && find hold -type f; } | wc -l)
EOF
