/usr/share/munin/plugins/courier_mta_mailstats is in munin-plugins-core 2.0.19-3.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | #!/usr/bin/perl -w
# -*- perl -*-
=head1 NAME
courier_mta_mailstats - Plugin to monitor the number of mails
delivered and rejected by courier-mta.
=head1 CONFIGURATION
The following environment variables are used:
logdir - Where to find logfiles (default "/var/log")
logfile - What file to read in logdir (default "mail.log")
courier - Path to "courier" (default "/usr/sbin/courier")
=head1 AUTHOR
Rune Nordbøe Skillingstad <runesk@linpro.no>
=head1 LICENSE
Unknown
=head1 MAGIC MARKERS
#%# family=auto
#%# capabilities=autoconf
=cut
my $statefile = "$ENV{MUNIN_PLUGSTATE}/munin-plugin-courier_mta_mailstats.state";
my $pos = undef;
my $delivered = 0;
my $rejects = {};
my $LOGDIR = $ENV{'logdir'} || '/var/log';
my $LOGFILE = $ENV{'logfile'} || 'mail.log';
my $COURIER = $ENV{'courier'} || '/usr/sbin/courier';
if ( $ARGV[0] and $ARGV[0] eq "autoconf" )
{
my $logfile;
if(-x $COURIER) {
if(-d $LOGDIR) {
$logfile = "$LOGDIR/$LOGFILE";
if(-f $logfile) {
if(-r "$logfile") {
print "yes\n";
exit 0;
} else {
print "no (logfile not readable)\n";
}
} else {
print "no (logfile not found)\n";
}
} else {
print "no (could not find logdir)\n";
}
} else {
print "no (could not find executable)\n";
}
exit 0;
}
my $logfile = "$LOGDIR/$LOGFILE";
my $prevdate = get_prev_date();
if(-f "$logfile.$prevdate") {
$rotlogfile = "$logfile.$prevdate";
} elsif (-f "$logfile.0") {
$rotlogfile = $logfile . ".0";
} elsif (-f "$logfile.1") {
$rotlogfile = $logfile . ".1";
} elsif (-f "$logfile.01") {
$rotlogfile = $logfile . ".01";
} else {
$rotlogfile = $logfile . ".0";
}
if(-f "$statefile") {
open (IN, "$statefile") or exit 4;
if(<IN> =~ /^(\d+):(\d+)/) {
($pos, $delivered) = ($1, $2);
}
while (<IN>) {
if (/^(\d+):(\d+)$/) {
$rejects->{$1} = $2;
}
}
close IN;
}
if(! -f $logfile and ! -f $rotlogfile) {
print "delivered.value U\n";
foreach my $i (keys %{$rejects}) {
print "r$i.value U\n";
}
exit 0;
}
$startsize = (stat $logfile)[7];
if(!defined $pos) {
# Initial run.
$pos = $startsize;
}
if($startsize < $pos) {
# Log rotated
parseLogfile ($rotlogfile, $pos, (stat $rotlogfile)[7]);
$pos = 0;
}
parseLogfile ($logfile, $pos, $startsize);
$pos = $startsize;
if($ARGV[0] and $ARGV[0] eq "config") {
print "graph_title Courier MTA mail throughput\n";
print "graph_args --base 1000 -l 0\n";
print "graph_vlabel mails / \${graph_period}\n";
print "graph_scale no\n";
print "graph_total Total\n";
print "delivered.label delivered\n";
print "delivered.type DERIVE\n";
print "delivered.draw AREA\n";
print "delivered.min 0\n";
foreach my $i (keys %{$rejects}) {
print "r$i.label reject $i\n";
print "r$i.type DERIVE\n";
print "r$i.draw STACK\n";
print "r$i.min 0\n";
}
exit 0;
}
print "delivered.value $delivered\n";
foreach my $i (keys %{$rejects}) {
print "r$i.value ", $rejects->{$i}, "\n";
}
if(-l $statefile) {
die("$statefile is a symbolic link, refusing to touch it.");
}
open (OUT, ">$statefile") or exit 4;
print OUT "$pos:$delivered\n";
foreach my $i (keys %{$rejects}) {
print OUT "$i:", $rejects->{$i}, "\n";
}
close OUT;
sub parseLogfile {
my ($fname, $start, $stop) = @_;
open (LOGFILE, $fname) or exit 3;
seek (LOGFILE, $start, 0) or exit 2;
while (tell (LOGFILE) < $stop) {
my $line =<LOGFILE>;
chomp ($line);
if($line =~ /(?:courierlocal|courieresmtp): id=.*,from=.*,addr=.*,size=\d+,success:.*delivered/) {
$delivered++;
} elsif($line =~ /courieresmtpd: error,relay=.*(?:\d{1,3}\.){3}\d{1,3},from=[^:]+: (\d{3})/) {
$rejects->{$1} ++;
}
}
close(LOGFILE);
}
sub get_prev_date {
my @date = localtime (time - 86400);
my $prevdate = $date[5]+1900 . $date[4]+1 . $date[3];
return $prevdate;
}
|