#!/usr/bin/perl -w use strict (qw(vars)); use IO::Handle; our %f; my $publish_rejections= 0; if ($ARGV[0] eq '-P') { $publish_rejections= 1; shift @ARGV; } our ($how) = @_; my $dir= $0; $dir =~ s,/[^/]+$,,; $dir =~ s,/bin$,/log,; $dir .= "/$ARGV[1]"; my $message; sub parse__headerline () { $f{Subject}= $' if m/^Subject:\s*/i; #'; $f{MessageID}= $' if m/^Message\-ID:\s*/i; #'; $f{From}= $' if m/^From:\s*/i; #'; } sub parse__stumpsubject () { $f{MessageNum}=$1 if m/^Subject:.*\:\:\w+\/(\d+)$/i; } sub parse_posted () { while () { chomp; parse__headerline(); last if m/^$/; } $f{Event}= 'post'; } sub parse_submission () { my $hadng=0; my %oldf; my $had2=0; while () { chomp; print STDERR "$hadng $had2|$_|\n"; $hadng++ if m/^Newsgroups:/i; if (m/^$/) { last if $hadng; last if $had2++; %oldf= %f; undef %f; } last unless m/^\S+\:|^\s|^$|^From /; parse__headerline(); } if ($hadng) { $f{Event}= $had2 ? 'receive newstyle' : 'receive'; } else { %f= %oldf if $had2; $f{Subject}= '[suppressed]'; $f{Event}= 'receive junk'; } } sub parse_stump2webstump () { while () { chomp; parse__stumpsubject() unless exists $f{'MessageNum'}; last if m/^\@{40,}$/; } while () { chomp; last if m/^$/; parse__headerline(); } $f{Event}= 'enqueue'; } sub parse_webstump2stump () { while () { chomp; parse__stumpsubject(); last if m/^$/; } while () { chomp; next unless m/^reject|^approve|^preapprove/; $f{Event}= $_; last; } } sub parse_mailout () { my $keepheader= 1; while () { $keepheader= 1 unless m/^[ \t]/; $keepheader= 0 if m/^(?: received | envelope-to )/ix; $keepheader= 'mangle' if m/^(?: to | from | return-path | reply-to | errors-to )/ix; if ($keepheader) { my $line= $_; $line =~ s/\@.{0,2}/ at ../g if $keepheader eq 'mangle'; $message .= $line; } chomp; if (m/^X-Webstump-Event:\s*(?:\[(\d+)\])?\s*/i) { #'; $f{Event}= "notify $'"; $f{MessageNum}= $1 if defined $1; } last if m/^$/; } while () { $message .= $_; chomp; next unless s/^\> //; last if m/^$/; parse__headerline(); } } $f{Event}= '?'; &{"parse_$ARGV[0]"}; while () { $message .= $_; } STDIN->error and die $!; $f{Now}= time; if ($publish_rejections && $f{Event} =~ m/^notify reject /) { $f{CopyRef}= $f{MessageNum} || $f{MessageID}; $f{CopyRef} =~ s/\W/ sprintf '-%02x', ord($&) /ge; open I, ">$dir/public/nr-$f{CopyRef}.txt" or die $!; print I $message or die $!; close I or die $!; } open L, ">>$dir/event.log" or die $!; my @s= map { my $v= $f{$_}; $v= '' unless defined $v; $v =~ s/\t/ /g; $v =~ s/[\r\n]/?/g; $v; } qw(Now MessageNum MessageID From Subject Event CopyRef); print L join("\t",@s)."\n" or die $!; close L or die $!;