#!/usr/bin/perl -w

chdir("/etc/init.d") || die $!;

my ($ent,$desc,$val,$flags,$dir,$rc1,$rc2,$rc3,$rc4,$rc5);
my %list;

open(TMP,">/tmp/rlve.$$.tmp") || die $!;
print TMP << 'EOT';
#
# ROCK Linux: Run Level Editor
#
# Runlevels:  2+3=default, 1+4+5=undefined
#
# Name          99  12345  Description
#

EOT

open(LS,"ls|") || die $!;
while (<LS>) {
	chomp;    next if /~/ or /#/ or /\.(old|bak|sav|orig|sik)$/;
	next if -d $_ or $_ eq 'rc' or $_ eq 'boot' or $_ eq 'down';
	($ent,$val,$desc)=($_,99,1);
	open(SR,"ls *.d/[SX]*$ent 2>/dev/null |") || die $!;
	while (<SR>) {
		next unless m,rc[\dX].d/[SX](\d+)$ent,;
		$val=sprintf("%02d",$1);
	}
	close SR;
	$list{"$desc-$val-$ent"}=$ent;
}
close LS;

foreach (sort keys %list) {
	($ent,$desc,$val,$rc1,$rc2,$rc3,$rc4,$rc5)=
		($list{$_},"-*-*-*-*-",99,'-','-','-','-','-');
	open(F,"<$ent") || die $!;
	while (<F>) {
		next unless /^#\s+Desc:\s+(.*)/;
		$desc=$1;
	}
	close F;
	open(SR,"ls *.d/[SX]*$ent 2>/dev/null |") || die $!;
	while (<SR>) {
		next unless m,(rc[\dX]).d/[SX](\d+)$ent,;
		$val=$2;
		$rc1='1' if $1 eq 'rc1';
		$rc2='2' if $1 eq 'rc2';
		$rc3='3' if $1 eq 'rc3';
		$rc4='4' if $1 eq 'rc4';
		$rc5='5' if $1 eq 'rc5';
	}
	close SR;
	printf TMP "%-15s %02d  $rc1$rc2$rc3$rc4$rc5  $desc\n",$ent,$val;
}
close TMP;

system("$ENV{'EDITOR'} /tmp/rlve.$$.tmp");

system("rm -rf *.d.old");
rename("rc1.d","rc1.d.old") || die $!;    mkdir("rc1.d",0755) || die $!;
rename("rc2.d","rc2.d.old") || die $!;    mkdir("rc2.d",0755) || die $!;
rename("rc3.d","rc3.d.old") || die $!;    mkdir("rc3.d",0755) || die $!;
rename("rc4.d","rc4.d.old") || die $!;    mkdir("rc4.d",0755) || die $!;
rename("rc5.d","rc5.d.old") || die $!;    mkdir("rc5.d",0755) || die $!;
rename("rcX.d","rcX.d.old") || die $!;    mkdir("rcX.d",0755) || die $!;

open(TMP,"</tmp/rlve.$$.tmp") || die $!;
while (<TMP>) {
	chomp;
	next if /^\s*$/ or /^\s*#/;
	next unless /^(\S+)\s+(\d+)\s+(\S+)/;
	($ent,$val,$flags)=($1,$2,$3);
	$flags=~s/b/-/g if $flags=~/[1-5]/;
	foreach (split //,$flags) {
		$dir="rc$_";
		symlink("../$ent","$dir.d/S$val$ent");
		$_=sprintf("$dir.d/K%02d$ent",100-$val);
		symlink("../$ent",$_);
	}
	open(OUT,">rcX.d/X$val$ent");
	print OUT "The script '$ent' has the priority $val.\n";
	close OUT;
}
close TMP;

system("rm -rf /tmp/rlve.$$.tmp* *.d.old");
