#!/usr/bin/perl
# Copyright (c) 1997-1999 UKAI Fumitoshi <ukai@debian.or.jp>
#
# This is free software; You may use it, distribute it and/or modify it
# under the terms of GNU Public Licencense.
# See the file /usr/doc/copyright/GPL for more details.
#
# it should run as root
#
# usage: $0 config ML
#	 $0 remove ML
#        $0 purge ML
#  
$Aliases = '/etc/aliases';
$newaliases = '/usr/bin/newaliases';
$crontab = '/usr/bin/crontab';

$CMD = $ARGV[0];
$ML = $ARGV[1];
unless (defined($CMD) && defined($ML) && $< == 0) {
    print STDERR "usage: $0 (config|remove|purge) ML\n";
    print STDERR " run this as root user, ";
    print STDERR "after `makefml newml ML' and `makefml config ML'\n";
    exit 1;
}
$FML_CONFIG = "/usr/share/fml/.fml/system";
$ML_INC = '/etc/fml';
$Config::ML_DIR = '/var/spool/ml'; # standard dir, overwrite by &loadConfig;

&loadConfig;
$ML_DIR_ML = join('/', $Config::ML_DIR, $ML);
$ML_incdir = join('/', $ML_INC, $ML);
$configph = join('/', $ML_DIR_ML, "config.ph");
$aliases = join('/', $ML_DIR_ML, "aliases");
$crontabfile = join('/', $ML_DIR_ML, "crontab");
$gid = (getgrnam($Config::GROUP))[2];
($adminuid, $adminuser) = &fileowner($configph);

print STDERR "$ML: user=$adminuser [$adminuid], group=$Config::GROUP [$gid]\n";
if ($CMD =~ /remove/i) {
    &removeML;
    exit 0;
} elsif ($CMD =~ /purge/i) {
    &purgeML;
    exit 0;
} elsif ($CMD !~ /config/i) {
    print STDERR "usage: $0 [config|remove|purge] <ML>\n";
    exit 1;
}

# configure new mailing list
if (!-d $ML_DIR_ML) {
    print STDERR "dir: $ML_DIR_ML not found\n";
    exit 1;
}
if (!-d $ML_incdir) {
    mkdir $ML_incdir, 0755;
    chown $adminuid, $gid, $ML_incdir;
}
if (!-f $aliases) {
    print STDERR "aliases: $aliases not found\n";
    exit 1;
}
print STDERR "add aliases for $ML...";
&modAliasesFile($aliases);
print STDERR "done\n";

if (-f $crontabfile) {
    print STDERR "add crontab entry for $ML...";
    &modCrontabFile($crontabfile);
    print STDERR "done\n";
}
exit 0;

sub loadConfig {
    unless (-f $FML_CONFIG) {
	print STDERR "file: $FML_CONFIG not found\n";
	exit 1;
    }
    package Config;
    eval("require \$main'FML_CONFIG;\#'");
    print STDERR $@ if $@;
}

sub modAliasesFile {
    my ($ali) = shift;
    my ($skip) = 0;
    open(ALI, $Aliases) or die "cannot open $Aliases, $!";
    open(NALI, ">$Aliases.new") or die "cannot open $Aliases.new, $!";
    while (<ALI>) {
	if (/^# BEGIN fml $ML:/) {
	    $skip = 1;
	    next;
	}
	if ($skip && /^# END fml $ML:/) {
	    $skip = 0;
	    next;
	}
	next if $skip;
	print NALI $_;
    }
    close(ALI);
    if (defined($ali)) {
	print NALI "# BEGIN fml $ML: -- $0 automatically added\n";
	open(ALI, $ali) or die "cannot open $ali, $!";
	while (<ALI>) {
	    if (s,$ML_DIR_ML/(.*),$ML_incdir/$1,) {
		system('cp', '-p', "$ML_DIR_ML/$1", "$ML_incdir/$1");
	    }
	    print NALI $_;
	}
	close(ALI);
	print NALI "# END fml $ML:\n";
    }
    close(NALI);
    rename($Aliases, "$Aliases.old");
    rename("$Aliases.new", $Aliases);
    system($newaliases);
}


sub modCrontabFile {
    my ($ct) = shift;
    my ($user) = $adminuser;
    print STDERR "update crontab for user $user\n";
    my ($newct) = "/tmp/fml-crontab.$$";
    my ($skip)= 0;
    open(CT, ">$newct") or die "cannot open $newct, $!";
    open(OCT, "$crontab -u $user -l|") or die "cannot open $crontab -u $user, $!";
    while (<OCT>) {
	if (/^# BEGIN fml $ML:/) {
	    $skip = 1;
	    next;
	}
	if (/^# END fml $ML:/) {
	    $skip = 0;
	    next;
	}
	next if $skip;
	print CT $_;
    }
    close(OCT);
    if (defined($ct)) {
	open(OCT, $ct) or die "cannot open $ct, $!";
	print CT "# BEGIN fml $ML: -- $0 automatically added\n";
	while (<OCT>) {
	    print CT $_;
	}
	close(OCT);
	print CT "# END fml $ML:\n";
    }
    close(CT);
    system($crontab, '-u', $user, $newct);
    unlink $newct;
}

sub fileowner {
    my ($file)= shift;
    my ($uid) = (stat($file))[4];
    my ($user) = (getpwuid($uid))[0];
    return ($uid, $user);
}

sub removeML {
    print "Removing aliases and crontab entry...";
    &modAliasesFile();
    &modCrontabFile();
    print "done\n";
}

sub purgeML {
    &removeML;
    print "Purge all of ML data ($ML_incdir and $ML_DIR_ML)...";
    system('/bin/rm', '-rf', $ML_incdir, $ML_DIR_ML);
    print "done\n";
}
