On Wed, Jul 08, 2009 at 02:00:49PM -0400, Wietse Venema wrote:
> Michael Durket:
> > Thanks to all who replied. I'll be trying out the various ideas. But  
> > they all
> > seem awkward. In my MVS days, when we wrote large scale systems
> > like this, we'd keep important statistics in the link pack area,  
> > constantly
> > updated, so monitor programs could just map that area and get the
> > data (or easily create realtime displays for viewing throughout the
> > operations area). Since Postfix knows the queue size, and other  
> > relevant statistics,
> 
> By design, Postfix does not know the size of the queue. All it
> knows is how many messages are in the active queue, and that is a
> limited subset of all mail.

We use this - it's pretty disgusting, but it works fine.

#!/usr/bin/perl -w

use strict;
use warnings;
use Getopt::Std;

my %Opts;
getopts('da', \%Opts);

my $data = GetMqs($Opts{a} or $Opts{d}); # d implies all info!

print "$data->{total}\n";

if ($Opts{d}) {
  print << "__EOF";

Active:   $data->{active}
Held:     $data->{hold}
Incoming: $data->{incoming}
Deferred: $data->{deferred}
__EOF
}

sub GetMqs {
  my $gethold = shift;
  my $basedir = shift || "/var/spool/postfix";

  my $total = 0;
  my $active = 0;
  my $hold = 0;
  my $incoming = 0;
  my $deferred = 0;

  my @dirs = ('active', 'incoming', map { "deferred/$_" } 0..9, 'A'..'F');
  push @dirs, 'hold' if $gethold;
  foreach my $dir (@dirs) {
    opendir(DH, "/var/spool/postfix/$dir") || next;
    my $n = 0;
    while (my $item = readdir(DH)) {
      ++$n unless $item =~ m/^\./;
    }
    $total += $n;
    $active += $n if $dir eq 'active';
    $hold += $n if $dir eq 'hold';
    $incoming += $n if $dir eq 'incoming';
    $deferred += $n if substr($dir, 0, 8) eq 'deferred';
  }

  return {
    total => $total,
    active => $active,
    ($gethold ? (hold => $hold) : ()),
    incoming => $incoming,
    deferred => $deferred,
  };
}

Reply via email to