#!/usr/bin/perl -w
# This script is intended to make expire file for innd from existing
# active innd file.
# May be useful for others but NO WARRANTY - tested only w/ mine configs.
# License: GNU.
# Tested only w/ my configs. May work WRONG w/ yours!
# Howto: Change vars to satisfy Ur needs & system, then run (on a system 
# already running innd - it will read active & make expire.ctl. Edit result &
# replace innd expire file w/ it. Don't forget to run inncheck before restart! 
# (c) Olli (olli@digger.org.NOSPAMru,remove NOSPAM before mailing)
# greetz: i_L, Corvin, Vika
# Thanx : Peter V. Chernikoff (peter@digger.org.NOSPAMru,remove NOSPAM before mailing)
# for help in moving my node to Linux. =)

$news_lib="/var/lib/news";
#$news_lib="/tmp";
$active="$news_lib/active";
$outdir="/tmp/news";
$innd_expire="$outdir/expire.ctl";
$remember="64"; # Keep headers (days) - not asked by the script.
# Default expire values you will be asked about:
$keep="2";      # Default for "keep" value (min days article will live) 
$middle="3";    # Default for "default" value (if slight tight in space)
$purge="7";     # Default for "purge" value (no article will live more)
$never="never"; # Some areas may be kept forever.
# Advanced abilities - group dependent expire values:
local (%e_deps_l,%e_deps_m,%e_deps_p);

$e_deps_l{node}=10;
$e_deps_m{node}=15;
$e_deps_p{node}=30;

$e_deps_l{pascal}=1;
$e_deps_m{pascal}=7;
$e_deps_p{pascal}=14;

$e_deps_l{forward}=1;
$e_deps_m{forward}=5;
$e_deps_p{forward}=10;

$e_deps_l{fwd}=1;
$e_deps_m{fwd}=5;
$e_deps_p{fwd}=10;

$e_deps_l{drink}=1;
$e_deps_m{drink}=3;
$e_deps_p{drink}=4;

$e_deps_l{talks}=1;
$e_deps_m{talks}=3;
$e_deps_p{talks}=4;

$e_deps_l{unix}=60;
$e_deps_m{unix}=90;
$e_deps_p{unix}=120;

$e_deps_l{novell}=20;
$e_deps_m{novell}=65;
$e_deps_p{novell}=120;

$e_deps_l{chainik}=3;
$e_deps_m{chainik}=5;
$e_deps_p{chainik}=7;

$e_deps_l{virus}=10;
$e_deps_m{virus}=30;
$e_deps_p{virus}=31;

$e_deps_l{faq}=7;
$e_deps_m{faq}=21;
$e_deps_p{faq}=22;

$e_deps_l{saved}=$never;
$e_deps_m{saved}=$never;
$e_deps_p{saved}=$never;

$e_deps_l{linux}=60;
$e_deps_m{linux}=90;
$e_deps_p{linux}=120;

$e_deps_l{uue}=7;
$e_deps_m{uue}=7;
$e_deps_p{uue}=7;

$e_deps_l{club}=3;
$e_deps_m{club}=7;
$e_deps_p{club}=10;

$e_deps_l{hacker}=60;
$e_deps_m{hacker}=90;
$e_deps_p{hacker}=120;

$e_deps_l{official}=5;
$e_deps_m{official}=10;
$e_deps_p{official}=15;

$e_deps_l{hacknet}=60;
$e_deps_m{hacknet}=90;
$e_deps_p{hacknet}=120;

$e_deps_l{x25}=60;
$e_deps_m{x25}=90;
$e_deps_p{x25}=120;

$e_deps_l{cisco}=60;
$e_deps_m{cisco}=90;
$e_deps_p{cisco}=120;

$e_deps_l{humor}=2;
$e_deps_m{humor}=7;
$e_deps_p{humor}=10;

$e_deps_l{anekdot}=2;
$e_deps_m{anekdot}=7;
$e_deps_p{anekdot}=10;

$e_deps_l{cars}=5;
$e_deps_m{cars}=10;
$e_deps_p{cars}=20;

$e_deps_l{wanted}=5;
$e_deps_m{wanted}=7;
$e_deps_p{wanted}=10;

$e_deps_l{job}=20;
$e_deps_m{job}=40;
$e_deps_p{job}=60;

$e_deps_l{lan}=30;
$e_deps_m{lan}=60;
$e_deps_p{lan}=90;

$e_deps_l{party}=5;
$e_deps_m{party}=10;
$e_deps_p{party}=14;

$e_deps_l{softexchange}=1;
$e_deps_m{softexchange}=4;
$e_deps_p{softexchange}=5;

$e_deps_l{sources}=30;
$e_deps_m{sources}=60;
$e_deps_p{sources}=60;

$e_deps_l{nethack}=60;
$e_deps_m{nethack}=90;
$e_deps_p{nethack}=120;

$e_deps_l{exch}=10;
$e_deps_m{exch}=30;
$e_deps_p{exch}=30;

$e_deps_l{perl}=60;
$e_deps_m{perl}=90;
$e_deps_p{perl}=120;

$e_deps_l{crypt}=30;
$e_deps_m{crypt}=60;
$e_deps_p{crypt}=90;

$e_deps_l{profy}=30;
$e_deps_m{profy}=60;
$e_deps_p{profy}=90;

$e_deps_l{guitar}=15;
$e_deps_m{guitar}=20;
$e_deps_p{guitar}=20;

$e_deps_l{internet}=10;
$e_deps_m{internet}=30;
$e_deps_p{internet}=60;

$e_deps_l{secur}=30;
$e_deps_m{secur}=60;
$e_deps_p{secur}=90;

$e_deps_l{java}=30;
$e_deps_m{java}=60;
$e_deps_p{java}=90;

$e_deps_l{lisp}=30;
$e_deps_m{lisp}=60;
$e_deps_p{lisp}=90;

$e_deps_l{lisp}=30;
$e_deps_m{lisp}=60;
$e_deps_p{lisp}=90;

$e_deps_l{music}=10;
$e_deps_m{music}=15;
$e_deps_p{music}=20;

$e_deps_l{news}=5;
$e_deps_m{news}=7;
$e_deps_p{news}=15;

$e_deps_l{video}=10;
$e_deps_m{video}=20;
$e_deps_p{video}=30;

$e_deps_l{video}=10;
$e_deps_m{video}=20;
$e_deps_p{video}=30;

$e_deps_l{windows}=5;
$e_deps_m{windows}=20;
$e_deps_p{windows}=30;

$e_deps_l{radio}=5;
$e_deps_m{radio}=20;
$e_deps_p{radio}=30;

$e_deps_l{point}=15;
$e_deps_m{point}=30;
$e_deps_p{point}=50;

######### internal vars. DO NOT edit below:
$area="";
$tmp=undef;
$found=0;
$contain="";
############### proggie goes:
system `mkdir $outdir 2>/dev/null`;
open( EXPIRE, ">$innd_expire" ) || die "Can't write to $innd_expire: $!.\n";
open( ACTIVE, "<$active" ) || die "Can't read $active: $!.\n";
print "\n\n\nNew news expire file will be in $innd_expire\n";
print "Any time - Ctrl-C to quit.\n";
print "\n\t\t\t.USE WITH CARE.\n\n";
print EXPIRE "\# Generated w/ make_expire.pl by Olli.\n";
print EXPIRE "\#\n\# How many days keep heeaders:\n";
print EXPIRE "/remember/:$remember\n";
print EXPIRE "\#All areas that have no specific rules will expire w/:\n";
print EXPIRE "*:A:$keep:$middle:$purge\n";
print EXPIRE "\# Begin per-area expire configuration:\n";
while(<ACTIVE>) 
{chomp;
 next unless (/^\S+\s/);
 /^(\S+)\s+/;
 $area=$1;
 next if ("$area" eq "junk");
 next if ("$area" eq "control");
 next if ("$area" eq "test");
 next if ("$area" eq "to");
 $found=0; # reset switch. (user input check)
label_reenter:
 foreach $tmp (keys %e_deps_l)
 { if ($contain=($area=~/$tmp/))
   {$keep=$e_deps_l{$tmp};
    $middle=$e_deps_m{$tmp};
    $purge=$e_deps_p{$tmp};
   }
 }
label_changed:
 print "\"$area\" defaults:\n\tlower :\t\t$keep\n\tmiddle:\t\t$middle\n\tpurge :\t\t$purge\n\n";
 print "  ---------------------------------\n";
 print "<Enter>\t\t=\tAccept\nl\t\t=\tchange lower\nm\t\t=\tchange middle\np\t\t=\tchange purge\n";
 print "lmp,pml,lpm\t=\tchange all\nlm,mp,lp\t=\tchange 2 of 3 avaliable parameters\n";
 print "s\t\t=\tskip this area\n";
 print "n\t\t=\t never expire articles in this area.";
 print "r\t\t=\trewrite this area to another(i.e add wildcard) & change\n";
 print "\t\t\tor apply vars for it.You will be not asked for this area\n";
 print "\t\t\tagain(exactly).\n";
 print "\n\tYour choice: ";
 $choice=<STDIN>;
 chomp $choice;
 print "\n";
 if ($choice eq "")
 {print "\n\nWriting: ";
  print "$area:A:$keep:$middle:$purge\n\n\n\n";
  print EXPIRE "$area:A:$keep:$middle:$purge\n";
  next;
 }
 if ($tmp=($choice=~/[sS]/))
 {print "\nOK, skipping $area .\n\n";
  next;
 }
 if ($tmp=($choice=~/[rR]/))
  {print "Enter replacement for $area : ";
   $area=<STDIN>;
   chomp $area;
   print "Please choose or confirm expire values for it:\n\n";
   goto label_reenter;
  }
   
 if ($tmp=($choice=~/[lL]/))
 {print "New lower value: ";
  $keep=<STDIN>;
  chomp $keep;
  $found=1;
 }
 if ($tmp=($choice=~/[mM]/))
 {print "New middle value: ";
  $middle=<STDIN>;
  chomp $middle;
  $found=1;
 }
 if ($tmp=($choice=~/[pP]/))
  {print "New purge value: ";
   $purge=<STDIN>;
   chomp $purge;
   $found=1;
  }
 if ($tmp=($choice=~/[nN]/))
  {$keep=$never;
   $middle=$never;
   $purge=$never;
   $found=1;
  }
 if ($found==1)
 {print "\nPlease confirm w/ enter if OK:\n\n";
  goto label_changed;}
 else 
  {print "\n\n\n\tUnknown answer \"$choice\". Ctrl-C to quit or try again:\n\n\n\n"; 
  }
} # EOF <ACTIVE>
close(EXPIRE);
close(ACTIVE);
exit;
