Blame contrib/mrtg-mail/mailstats

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
}