#!/store/bin/perl
#
# Name:    aliases2html
# Author:  Petter Reinholdtsen <pere@td.org.uit.no>
# Date:    1997-05-07
# Changed: 1998-08-20
# Version: 1.2
#
# Creates an html overview of the aliases file.
#
# 1998-08-20 v1.2 Added comment about where this program was found
# 1997-08-20 v1.1 added NIS-support using module Net::NIS
# 1997-05-09 v1.0 released

use Getopt::Std;

getopts("f:nv");

if ($opt_n) {
    print STDERR "Reading aliases from NIS\n" if ($opt_v);
    eval 'use Net::NIS::Table;';
    die $@ if ($@);
    $map = Net::NIS::Table->new("mail.aliases");
    $aliases = $map->list();
    for $alias (keys %{$aliases}) {
	chop($$aliases{$alias}) if ($$aliases{$alias} =~ m/\0$/);
	if ("\@\0" ne $alias) {
	    @e = split(/\s*,\s*/, $$aliases{$alias});
	    chop($alias) if ($alias =~ m/\0$/);
	    $aliases{$alias} = [@e];
	}
    }
} else {
    if ($opt_f) {
	print "Reading aliases from $opt_f\n" if ($opt_v);
	%aliases = &parseAliases($opt_f);
    } else {
	%aliases = &parseAliases;
    }
}


&expandAliases();

$date = localtime();

print <<EOF;
<HTML>
<HEAD><TITLE>Aliases</TITLE></HEAD>
<!-- Generated by $0 -->
<BODY>
<H1>Aliases</H1>
Updated $date
<TABLE>
<TR><TD valign="top"><UL>
EOF

for $alias (sort keys %aliases) {
    print "<LI><A HREF=\"\#$alias\">$alias</A>\n";
}
print "</UL></TD><TD>\n";

for $alias (sort keys %aliases) {
    print "<A NAME=\"$alias\"><H2>$alias</H2>\n<UL>\n";
    for $entry (sort @{$aliases{$alias}}) {
	$entry = expandEntry($entry);
	print "<LI>$entry\n";
    }
    print "</UL></A>\n";
}
print <<EOF;
</TD></TR></TABLE></BODY></HTML>
EOF

exit 0;
##
# Expand all aliases to final receivers
sub expandAliases {
    local($expanded) = 1;
    while ($expanded) {
	my($alias);
	$expanded = 0;
	for $alias (keys %aliases) {
	    local(@e) = ();
	    for $entry (@{$aliases{$alias}}) {
		if ($aliases{$entry}) {
		    push(@e, @{$aliases{$entry}});
		    $expanded = 1;
		} elsif ($entry =~ /^:include:(.*)$/) {
		    push(@e, getIncEntries($1));
		} else {
		    push(@e, $entry);
		}
	    }
	    $aliases{$alias} = [@e];
	}
    }
}

##
# Read and expand aliases from alias-file
sub parseAliases {
    if (! @_ ) {
	local($aliases) = "/etc/aliases";
    } else {
	local($aliases) = @_;
    }

    # Read alias-file
    local(%a);
    open(ALIASES, "<$aliases") || die "Unable to open $aliases for reading";
    while (<ALIASES>) {
	chomp;
	next if (/^\#/);
	next if (/^\s*$/);
	local($alias, $content) = m/^\s*([^:]+):\s*(.*)$/;
	local(@content) = split(/\s*,\s*/, $content);
	local(@entries);
	undef @entries;
	while (@content) {
	    local($entry) = pop @content;
	    push(@entries, $entry);
	}
	$a{$alias} = [@entries];
    }
    close(ALIASES);

    return %a;
}

##
# Look up username in passwd
sub expandEntry {
    local($entry) = @_;
    ($name,$passwd,$uid,$gid,
     $quota,$comment,$gcos,$dir,$shell) = getpwnam($entry);
    $gcos =~ s/,.*$//;
    return "$gcos &lt;$entry&gt;";
}

##
# Expand alias include files
sub getIncEntries {
    local($filename) = @_;
    local(@entries);
    if ( !open(INCFILE, "<$filename") ) {
      warn "Unable to open $filename for reading";
      push(@entries, "[file $filename]");
      return @entries;
    }
    while (<INCFILE>) {
	chomp;
	next if (/^\#/);
	next if (/^\s*$/);
	push(@entries, $_);
    }
    close(INCFILE);
    return @entries;
}
