#!/usr/bin/perl # # spamstats.pl -- pull spam statistics from # spamd server, parse for MRTG # # usage: $0 host [spam|nonspam] # # returns the number of [spam|nonspam] and total spam messages # # rpuhek@etnsystems.com # # updated 7/30/03 -- added uptime and hostname vars. # use Socket; #$sourceport="7300"; $sourceport="spam-stats"; #Behaving oddly, but seems to work... if ( ( $#ARGV != 1 ) or ( $ARGV[1] !~ /spam|nonspam|skipped/) ){ die "\nUsage: $0 host [spam|nonspam|skipped]\n"; }; $host=$ARGV[0]; $type=$ARGV[1]; $type = "clean" if ($type eq "nonspam"); $port = getservbyname ($sourceport, 'tcp'); die "$0: Bad port \"$sourceport\"" unless ($port); $proto = getprotobyname ('tcp') || die "$0: Bad prototype tcp"; $iaddr = inet_aton($host) or die "$0: no host \"$host\""; $paddr = sockaddr_in($port, $iaddr); socket (SOCK, PF_INET, SOCK_STREAM, $proto) or die "$0: socket error $!"; connect (SOCK, $paddr) or die "$0: connect error $!"; $output_lines=0; while () { push @output, $_; } close(SOCK) || warn "$0: socket close error $!"; foreach (@output) { #print "line: $_"; chomp; ($key,$value) = split / /, $_, 2; if (( $key =~ /$type/ ) or ($key =~ /^uptime:/) or ($key =~ /^hostname:/) or ( ($type eq "skipped") ? ($key =~ /total/) :($key =~ /processed/) ) ) { print "$value\n"; $output_lines++; }; #Handle status line, name... }; for (;$output_lines < 4; $output_lines++) { print "\n"; };