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

: << =cut

=head1 NAME

postfix_mailqueue_ - Plugin to monitor postfix mail spools per running postfix

=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

Uses the last part of the symlink name to get the postfix queue directory for the config file.
It then extract the queue path from the configuration file and uses it as a spooldir.
A environment spooldir can be set as a fallback.

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

=head1 AUTHOR

Unknown.

Extended to multiple queue use by Clemens Schwaighofer (gullevek@gullevek.org) in 2010.

=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.
CONFIG=${0##*postfix_mailqueue_}
CONFIG="/etc/"$CONFIG"/"
POSTCONFSPOOL="$(postconf -c $CONFIG -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)
		echo "graph_title Postfix Mailqueue $CONFIG";
		cat <<'EOF'
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
active.draw AREA
deferred.draw STACK
maildrop.draw STACK
incoming.draw STACK
corrupt.draw STACK
hold.draw STACK
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
