]>
pere.pagekite.me Git - homepage.git/blob - mrtg/mailstats
1 #!/usr/local/bin/perl -w
3 # Author: Petter Reinholdtsen <pere@td.org.uit.no>
5 # The original was written by Rachel Polanskis <rachel@juno.virago.org.au>
7 # Fetches output from mailstats(1) either via TCP or via exec and
8 # feeds changes on smtp to mrtg.
10 # Irix 6.x seems to lack mailstats
12 # Usage mailstats [host]
13 # if host is missing, localhost is used
18 my($datafile, $source, $sourceport, @mailstatspaths,
20 $newfrm, $newto, $uptime);
22 # Adjust this to your own mailserver. Uses local `mailstats` if set
24 $source = $ARGV[0] || "localhost";
27 $datafile = "/tmp/mailstat-$source.old";
28 @mailstatspaths = ( "/usr/sbin/mailstats", "/usr/bin/mailstats" );
30 ($oldfrm, $oldto) = getOldStats
($datafile);
32 ($newfrm, $newto, $uptime) = getStats
($source, $sourceport);
34 putOldStats
($datafile, $newfrm, $newto) || warn "$0: Unable to save stats to $datafile";
36 print $newfrm-$oldfrm,"\n",$newto-$oldto,"\n","$uptime\n$source\n" if ($oldfrm);
39 # Returns first line of file given as param splittet on space
42 open(OLD
, $filename) || warn "$0: Unable to open $filename for reading";
45 return split(/ /, $line);
48 sub findFirstExecutable
{
50 foreach $filename (@_) {
51 return $filename if ( -x
$filename && ! -d
$filename );
56 my($source, $sourceport) = @_;
57 my(@output, $port, $proto, $iaddr, $paddr);
58 if ( $source eq "localhost" ) {
59 my($progpath) = findFirstExecutable
(@mailstatspaths);
60 @output = `$progpath`;
64 $port = getservbyname ($sourceport, 'tcp') if ($sourceport =~ /\D/);
65 die "$0: Bad port \"$sourceport\"" unless ($port);
66 $proto = getprotobyname ('tcp') || die "$0: Bad prototype tcp";
68 $iaddr = inet_aton($source) or die "$0: no host \"$source\"";
69 $paddr = sockaddr_in($port, $iaddr);
71 socket (SOCK, PF_INET, SOCK_STREAM, $proto) or die "$0: socket error $!";
72 connect (SOCK, $paddr) or die "$0: connect error $!";
77 close(SOCK) || warn "$0: socket close error $!";
79 my($curfrm, $curto, $uptime);
81 # Our sendmail reports smtp as uucp (stupid admin... :-)
82 ($curfrm, $curto) = (split(/ +/))[2,4] if (/uucp|e?smtp/);
83 ($uptime) = m/Statistics from (.*)/ if (/Stati/);
85 return ($curfrm, $curto, $uptime);
89 my($filename, $frm, $to) = @_;
90 open(STAT, ">$filename") || return "";
91 print STAT "$frm $to\n";