#!/usr/bin/perl -w

### Blokowy parser feedw, v0.99-pre5
### 18.04.2000
### Sosnowiec
### GoTaR <gotar@friko5.onet.pl>

use strict;

my $MAINDIR="/var/spool/news/feeder";
my $SLRNDIR="/var/spool/slrnpull";

sub mkdirhier {
    $_=$_[0];
    my $level='';
    until ($level eq $_) {
	/($level\/[\-\w]+).*/;
	$level=$1;
	next if -d $level;
	print "Tworzenie katalogu $level\n";
	mkdir $level,0755 or die "Nie mog utworzy katalogu $level!\n";
    }
}

my @delimiter;
$delimiter[0]="\nXref: ";
$delimiter[1]="\n";
$delimiter[2]="\n\.\n";

opendir FEEDDIR,"$MAINDIR/received" or die "Brak katalogu feedw ($MAINDIR/received)!\n";
foreach (readdir FEEDDIR) {
    my $FEED="$MAINDIR/received/$_";
    next if -d $FEED;
    /(.+)\.\w+\.bz2/;
    my $GROUP=$_=$1;
    s/\./\//g;
    my $TODIR="$SLRNDIR/news/$_";
    mkdirhier "$TODIR" unless -d "$TODIR";
    print "Archiwum: $FEED\n";
    open PIPE,"bunzip2 -c $FEED|";
    my $header;
    my $state=0;
    $/=$delimiter[0];
    while (<PIPE>) {
	$state=0 if $state++==2;
	$/=$delimiter[$state];
	if ($state==1) {
	    $header=$_;
	    next;
	}
	if ($state==2) {
	    /.+ $GROUP:(\d+).*/ && open POST,">$TODIR/$1" or warn "Nie mog utworzy $TODIR/$1!\n";
	    print POST "$header$_";
	    next;
	}
	if ($state==0) {
	    s/\n\.\n/\n/;
	    print POST;
	    close POST or warn "Nie mog zamkn postu!\n";
	}
    }
    close PIPE or warn "Nie mog zamkn potoku!\n";
    unlink "$FEED" or warn "Nie mog usun $FEED!\n";
}
closedir FEEDDIR or warn "Nie mog zamkn katalogu feedw ($MAINDIR/received)!\n";

print "Uaktualnianie pliku active slrnpull'a\n";
open PIPE,">>$SLRNDIR/slrnpull.conf" or die "Nie mog otworzy pliku konfiguracyjnego slrnpulla ($SLRNDIR/slrnpull.conf)!\n";
my $size= -s "$SLRNDIR/slrnpull.conf";
open GROUPS,"$MAINDIR/grupy" or die "Brak pliku grup ($MAINDIR/grupy)!\n";
print PIPE while (<GROUPS>);
close GROUPS or warn "Nie mog zamkn pliku grup ($MAINDIR/grupy)!\n";
close PIPE or warn "Nie mog zamkn pliku konfiguracyjnego slrnpulla ($SLRNDIR/slrnpull.conf)!\n";
system "slrnpull -d $SLRNDIR --expire";
truncate "$SLRNDIR/slrnpull.conf",$size;
print "Uaktualnianie zakoczone.\n";
