#!/usr/bin/perl #------------------------------------------------------------------ # getrejectsbypeer v1.1 elmi@newsfeeds.de 2000 02 10 # # Call as a filter with # getrejectsbypeer [-q] [-i ] # # where limits the number of groups listed per peer # ("top rejected groups"). # # -q sets quiet (non-debug) mode # -i sets a to-be-ignored groupname pattern # # Input on STDIN: news log file # # Feb 3 01:00:57.028 - news-in.ivm.net <389dbf76.22284799@news.pacbell.net> 437 Unwanted newsgroup "us.jobs" # Feb 3 01:00:59.391 - news-in.ivm.net 437 Duplicate # Feb 3 01:00:57.560 + news-in.ivm.net <87ag7l$1r$1@nslave2.tin.it> 2200 INFLOW news # # Output on STDOUT: # # +------------------------------------------------------+ # | | # |Rejected articles from (top ) | # | | # | | # | ... | # | | # | | # |Rejected articles from (top ) | # | | # | ... | # | | # +------------------------------------------------------+ # #------------------------------------------------------------------ %peergroup = (); # list of "unwanted newsgroups" per peer as "$peergroup{peer:group}=count" %peerduplicate = (); %peersum = (); $debug = 1; $|=1; $ignore = ""; $limit = 99999999; while ($#ARGV >= 0) { $opt = shift @ARGV; if ($opt =~ /^-/) { if ($opt eq "-q") { $debug=0; } elsif ($opt eq "-i") { $ignore=shift @ARGV; } } else { $limit = $opt; } } print "Limit: $limit\n"; print "Debug: $debug\n"; print "Ignore: $ignore\n"; $i=0; while () { print STDERR "$i\r" if ((($i % 100)==0) && ($debug)); $i++; $line = $_; chomp($line); if ($line =~ /\s*[a-zA-Z]+\s+[0-9]+\s+[.:0-9]+\s+-\s+(\S+)\s+<\S+>\s+([0-9]+)\s+([^"]+)\s+"([^"]+)"/) { $peer = $1; $errnum = $2; $reason = $3; $group = $4; $peersum{$peer}=0 if (!defined $peersum{$peer}); $peersum{$peer} += 1; $ignored{$peer} = 0 if (!defined $ignored{$peer}); if (($ignore ne "") && ($group =~ /$ignore/i)) { $ignored{$peer} += 1; } else { $key = "$peer:$group"; if ($reason =~ /unwanted newsgroup/i) { if (!defined $peergroup{$key}) { $peergroup{$key} = 1; } else { $peergroup{$key} += 1; } } elsif ($reason =~ /duplicate/i) { if (!defined $peergroup{$key}) { $peergroup{$key} = 1; } else { $peergroup{$key} += 1; } } } } } print STDERR "$i\r" if ($debug); # resort that stuff now... @result = (); foreach $key (keys %peergroup) { my ($peer,$group) = split(":",$key); my $num = $peergroup{$key}; my $s = sprintf("%s %05d %s %s",$peer,$num,$group,$num); push @result,$s; } $currentpeer = ""; $counter=0; foreach $line (reverse sort @result) { my ($peer,$snum,$group,$num) = split(" ",$line); if ($peer !~ /^$currentpeer$/) { print "\n"; print "Rejected $peersum{$peer} (ignored $ignored{$peer}) articles from $peer (top $limit):\n"; $currentpeer = $peer; $counter=0; } print sprintf(" %5d %s\n",$num,$group) if ($counter < $limit); $counter++; }