#! /usr/local/bin/perl use strict; my $debug=(shift eq '-d'); my $rnews="/usr/local/news/bin/rnews"; my $cdir="/news/tmp/cancelled"; my $edir="/news/tmp/bad"; my $kdir="/news/tmp/bkp"; my $bdir="/news/tmp"; my $msize=200*1024; if(!-e $edir) { mkdir($edir) || die("Mkdir $edir : $!"); } if(!-e $kdir) { mkdir($kdir) || die("Mkdir $kdir : $!"); } opendir(D,$cdir) || die("Opendir : $!"); while(my $d=readdir(D)) { my $s; if(-r "$cdir/$d" && -w _ && !-d _) { $s=-s _; print "$d : " if($debug); if($s>$msize) { if($debug) { print "Fichier trop gros\n"; system("mv $cdir/".quotemeta($d)." $kdir/".quotemeta($d)) && die("mv : $!"); } else { unlink("$cdir/$d"); } } elsif($s==0) { print "Fichier vide\n" if($debug); unlink("$cdir/$d"); } elsif(batch("$d")) { if($debug) { print "Ok\n"; system("mv $cdir/".quotemeta($d)." $kdir/".quotemeta($d)) && die("mv : $!"); } else { unlink("$cdir/$d"); } } else { system("mv $cdir/".quotemeta($d)." $edir/".quotemeta($d)) && die("mv : $!"); } } } if(-e "$bdir/cancel-$$") { system("$rnews $bdir/cancel-$$"); unlink("$bdir/cancel-$$"); } sub batch { my $d=shift; my $m; my($i,$n)=(0,0); open(F,"$cdir/$d") || die("open $d : $!"); $m="Path: cancelled\n"; #$m.="X-Cancelled-By: <$d>\n"; while() { if(/^$/) { last; } elsif(/^Newsgroups:\s+(.*?)\.(.*?)[\r\n]+$/) { $m.="Newsgroups: cancelled.$1\n"; $m.="X-Original-Newsgroups: $1.$2\n"; $n=1; } elsif(/^Path:\s+(.*?)[\r\n]+$/) { $m.="X-Original-Path: $1\n"; } elsif(/^Message-ID:\s+<(.*)>\s*[\r\n]+$/) { $m.="Message-ID: \n"; $i=1; } else { $m.=$_; } } if(!$n) { print "Champ 'Newsgroups' non détecté\n" if($debug); return 0; } elsif(!$i) { print "Champ 'Message-ID' non détecté\n" if($debug); return 0; } $m.="\n".join('',); close(F); open(W,">> $bdir/cancel-$$") || die("open >> $$ : $!"); print W "#! rnews ".length($m)."\n"; print W $m; close(W); return 1; }