Article 13129 of comp.lang.perl:
Xref: feenix.metronet.com comp.lang.perl:13129
Path: feenix.metronet.com!news.utdallas.edu!chpc.utexas.edu!cs.utexas.edu!not-for-mail
From: vogelke@c-17igp.wpafb.af.mil (Contr Karl E. Vogel)
Newsgroups: comp.lang.perl
Subject: [SCRIPT] checkaliases
Date: 25 Apr 1994 17:36:28 -0500
Organization: Control Data Systems Inc.
Lines: 114
Sender: daemon@cs.utexas.edu
Message-ID: <199404252236.SAA14931@c-17igp.wpafb.af.mil>
NNTP-Posting-Host: cs.utexas.edu

I read Larry's call to send scripts of work in progress, etc.  Here is
"checkaliases", which does a consistency check of our /usr/lib/aliases file.
Comments/suggestions welcome.

---------------------------- cut here
#!/usr/bin/perl
#
# $Id: checkaliases,v 1.1 1992/05/08 20:13:01 vogel Exp $
#
# NAME:
#	checkaliases
#
# SYNOPSIS:
#	checkaliases [file]
#
# DESCRIPTION:
#	"checkaliases" does consistency checking on a file in the format used
#	by /usr/lib/aliases.  We are looking for any member of a mail group
#	which is not a user or another mail group.
#
#	The script also finds any "blank" userids in the aliases file, i.e.
#	two adjacent commas in the middle of a list of userids.
#
# OPTIONS:
#	"file" is the name of an aliases file to check.  The default file
#	is "/usr/lib/aliases".
#
# AUTHOR:
#	Karl Vogel
#
# BUGS:
#	None noticed yet.
#
# HISTORY:
#	$Log: checkaliases,v $
# Revision 1.1  1992/05/08  20:13:01  vogel
# Initial revision
#
#

if ($#ARGV == -1)   { $alias_file = "/usr/lib/aliases"; }
elsif ($#ARGV == 0) { $alias_file = $ARGV[0]; }
else                { die "usage: $0 [file]\n"; }

#
#	Read the aliases file, and create 2 arrays containing the mail
#	groups and the contents of those groups.  Ignore remote users
#	(@ or %), pipes to programs (|), and direct feeds to files (/).
#

open (ALIAS, "$alias_file") || die "Can't open $alias_file: $!\n";
$line = 0;

while (<ALIAS>)
{
	chop;
	$line++;

	next if /^#/;		# Strip comments.
	next if /^$/;		# Strip blank lines.
	s/\s+//;		# Remove whitespace.

	($grp, $rest) = split (/:/);
	$mailgroups{$grp} = $grp;

	@usr = split (/,/, $rest);

	foreach (@usr)
	{
		next if /@/;
		next if /%/;
		next if /\|/;
		next if /\//;

		if (length() == 0)
		{
			print "ERROR: zero-length alias at line $line.\n";
			next;
		}

		$mailusers{$_} = $line;
	}
}

close (ALIAS);

#
#	Read the passwd file, and create an array holding the users.
#

open (PASSWD, "/etc/passwd") || die "Can't open passwd file: $!\n";

while (<PASSWD>)
{
	($name) = split (/:/);
	$userid{$name} = $name;
}

close (PASSWD);

#
#	For each entry in the mailusers array:  check through the strings
#	holding the mail groups and regular userids.
#

while (($key, $value) = each %mailusers)
{
	if ($userid{$key} !~ $key && $mailgroups{$key} !~ $key)
	{
		print "ERROR: unrecognized user \"$key\" at line $value.\n";
	}
}

exit (0);


