|
Packit |
667938 |
#!/usr/local/bin/perl
|
|
Packit |
667938 |
#
|
|
Packit |
667938 |
# Author: Petter Reinholdtsen <pere@td.org.uit.no>
|
|
Packit |
667938 |
# Date: 1997-07-09
|
|
Packit |
667938 |
# The original was written by Rachel Polanskis <rachel@juno.virago.org.au>
|
|
Packit |
667938 |
#
|
|
Packit |
667938 |
# Fetches output from mailstats(1) either via TCP or via exec and
|
|
Packit |
667938 |
# feeds changes on smtp to mrtg.
|
|
Packit |
667938 |
#
|
|
Packit |
667938 |
# Irix 6.x seems to lack mailstats
|
|
Packit |
667938 |
#
|
|
Packit |
667938 |
# Usage mailstats [host]
|
|
Packit |
667938 |
# if host is missing, localhost is used
|
|
Packit |
667938 |
|
|
Packit |
667938 |
use strict;
|
|
Packit |
667938 |
use Socket;
|
|
Packit |
667938 |
|
|
Packit |
667938 |
my($datafile, $source, $sourceport, @mailstatspaths,
|
|
Packit |
667938 |
$oldfrm, $oldto,
|
|
Packit |
667938 |
$newfrm, $newto, $uptime);
|
|
Packit |
667938 |
|
|
Packit |
667938 |
# Adjust this to your own mailserver. Uses local `mailstats` if set
|
|
Packit |
667938 |
# to 'localhost'
|
|
Packit |
667938 |
$source = $ARGV[0] || "localhost";
|
|
Packit |
667938 |
$sourceport = "7256";
|
|
Packit |
667938 |
|
|
Packit |
667938 |
$datafile = "/tmp/mailstat-$source.old";
|
|
Packit |
667938 |
@mailstatspaths = ( "/usr/sbin/mailstats", "/usr/bin/mailstats" );
|
|
Packit |
667938 |
|
|
Packit |
667938 |
($oldfrm, $oldto) = getOldStats($datafile);
|
|
Packit |
667938 |
|
|
Packit |
667938 |
($newfrm, $newto, $uptime) = getStats($source, $sourceport);
|
|
Packit |
667938 |
|
|
Packit |
667938 |
putOldStats($datafile, $newfrm, $newto) || warn "$0: Unable to save stats to $datafile";
|
|
Packit |
667938 |
|
|
Packit |
667938 |
print $newfrm-$oldfrm,"\n",$newto-$oldto,"\n","$uptime\n$source\n" if ($oldfrm);
|
|
Packit |
667938 |
|
|
Packit |
667938 |
##
|
|
Packit |
667938 |
# Returns first line of file given as param splittet on space
|
|
Packit |
667938 |
sub getOldStats {
|
|
Packit |
667938 |
my($filename) = @_;
|
|
Packit |
667938 |
open(OLD, $filename) || warn "$0: Unable to open $filename for reading";
|
|
Packit |
667938 |
my($line) = <OLD>;
|
|
Packit |
667938 |
close(OLD);
|
|
Packit |
667938 |
return split(/ /, $line);
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
|
|
Packit |
667938 |
sub findFirstExecutable {
|
|
Packit |
667938 |
my($filename);
|
|
Packit |
667938 |
foreach $filename (@_) {
|
|
Packit |
667938 |
return $filename if ( -x $filename && ! -d $filename );
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
|
|
Packit |
667938 |
sub getStats {
|
|
Packit |
667938 |
my($source, $sourceport) = @_;
|
|
Packit |
667938 |
my(@output, $port, $proto, $iaddr, $paddr);
|
|
Packit |
667938 |
if ( $source eq "localhost" ) {
|
|
Packit |
667938 |
my($progpath) = findFirstExecutable(@mailstatspaths);
|
|
Packit |
667938 |
@output = `$progpath`;
|
|
Packit |
667938 |
chomp(@output);
|
|
Packit |
667938 |
} else {
|
|
Packit |
667938 |
$port = getservbyname ($sourceport, 'tcp') if ($sourceport =~ /\D/);
|
|
Packit |
667938 |
die "$0: Bad port \"$sourceport\"" unless ($port);
|
|
Packit |
667938 |
$proto = getprotobyname ('tcp') || die "$0: Bad prototype tcp";
|
|
Packit |
667938 |
|
|
Packit |
667938 |
$iaddr = inet_aton($source) or die "$0: no host \"$source\"";
|
|
Packit |
667938 |
$paddr = sockaddr_in($port, $iaddr);
|
|
Packit |
667938 |
|
|
Packit |
667938 |
socket (SOCK, PF_INET, SOCK_STREAM, $proto) or die "$0: socket error $!";
|
|
Packit |
667938 |
connect (SOCK, $paddr) or die "$0: connect error $!";
|
|
Packit |
667938 |
|
|
Packit |
667938 |
while (<SOCK>) {
|
|
Packit |
667938 |
push(@output);
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
close(SOCK) || warn "$0: socket close error $!";
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
my($curfrm, $curto, $uptime);
|
|
Packit |
667938 |
foreach (@output) {
|
|
Packit |
667938 |
($curfrm, $curto) = (split(/ +/))[2,4] if (/e?smtp/);
|
|
Packit |
667938 |
($uptime) = m/Statistics from (.*)/ if (/Stati/);
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
return ($curfrm, $curto, $uptime);
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
|
|
Packit |
667938 |
sub putOldStats {
|
|
Packit |
667938 |
my($filename, $frm, $to) = @_;
|
|
Packit |
667938 |
open(STAT, ">$filename") || return "";
|
|
Packit |
667938 |
print STAT "$frm $to\n";
|
|
Packit |
667938 |
close(STAT);
|
|
Packit |
667938 |
return "1";
|
|
Packit |
667938 |
}
|