composer@bucsf.bu.edu (Jeff Kellem) (03/19/90)
Here's a little utility (in perl, of course ;-) that I whipped up the other
day. It basically displays direct sendmail aliases for some user/aliasname.
Think of it like `groups somename', but for sendmail aliases. For example,
if you have the following in your sendmail aliases file, either
/usr/lib/aliases or /etc/aliases, usually:
# just a made-up example, that's all..
root: composer
bugs: composer
postmaster: root
then, you did ...
from-some-shell$ aliases.pl composer
composer: root bugs
would be your output.
It does not follow indirect aliases, such as not recognizing that
"postmaster", above, really points to "composer", though indirectly through
"root".
`aliases.pl -help' will give a ~24 line description. There are also a
number of comments at the top of the code about certain assumptions, etc.
This is just something I hacked up quickly, so feel free to send me any
comments/fixes/whatever...it definitely doesn't cover all possibilities, but
it does also look though :include: files for aliases and can be useful to
see what direct aliases you (or someone else) may be included in.
Enjoy...
-jeff
Jeff Kellem
INTERNET: composer@cs.bu.edu (or composer@bu.edu)
UUCP: ...!harvard!bu-cs!composer
p.s. you may also want to change "#!/usr/local/bin/perl -s" to
"#!/your/path/to/perl -s", of course. :-)
===CUT HERE===aliases.shar===
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: aliases.pl
# Wrapped by composer@bucsf on Sun Mar 18 18:26:51 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f aliases.pl -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"aliases.pl\"
else
echo shar: Extracting \"aliases.pl\" \(4589 characters\)
sed "s/^X//" >aliases.pl <<'END_OF_aliases.pl'
X#!/usr/local/bin/perl -s
X# simple argument parsing, need to finish my getopt first. :-)
X#
X# Please refer any modifications/fixes/comments back to me.
X#
X# Jeff Kellem
X# INTERNET: composer@cs.bu.edu
X# UUCP: ...!harvard!bu-cs!composer
X#
X# file: aliases.pl
X# (or aliases, but tcsh 5.1x [at least] has `aliases' as a builtin, argh!
X# and, it is the same as alias!!! (well, w/o an arg it is))
X# author: Jeff Kellem <composer@cs.bu.edu>
X# date: 17 March 1990
X# description: finds sendmail aliases that a user is in immediately. It
X# currently does not recurse to see if other aliases will
X# indirectly point to the user.
X#
X# limitations: * options must come first
X# * for :include: files, assumes comment delims match, '(' and ')'
X# * if there are no matches for USER, it just prints "USER:\n"
X# * does not currently deal with uucp ! syntax or % ...
X# it's simple... :-)
X# assumptions: * currently assumes that :include: file has one user per line
X# * tries to skip comments, as in "(comment)" in :include: file
X#
X# possible future enhancements:
X# * hash aliases info, to speed up searches for multiple users
X# during one run.
X# * speed up match, this was just a quick hack, don't grep each time
X# * warning of mismatched comment delims, probably for another
X# day (or program)
X#
X# notes: * maybe -partial should just match USERNAME as a prefix without
X# the '@' (currently matches "USERNAME@"), so you could do
X# `aliases.pl -partial user@host-without-domain' to match against
X# user@host.any.domain. Comments?
X# * but, then, do we want `aliases.pl -partial a' to match every
X# alias that has an entry beginning with 'a'? Comments?
X# * or both ways, hmm...
X#
X# usage info: aliases.pl -help
X#
X
Xexit !print <<EOU if $help;
Xusage: $0 [-help] [-debug] [-verbose] [-partial] [-sort] [username ...]
X Displays immediate sendmail aliases for USERNAME, somewhat in the
X same vain as `groups'. Does NOT display indirect aliases.
X i.e. if mail is sent to the displayed aliases, it will go to
X USERNAME.
X Note: this does not find every possible alias that might point to
X USERNAME, such as alias->different->USERNAME.
X So, if you have an aliases file such as:
X foo: bar
X bar: user
X and you do `$0 user', it will display
X user: bar
X NOT
X user: bar foo
X
X Options:
X -help display this message
X -debug show small amount of debugging info
X -verbose show error msgs on opening :include: files
X -partial check for partial match, will find "user@host"
X and "user" for `$0 -partial user'
X will NOT find "foouserbar" or "userfoo"!
X -sort sorts list of aliases before printing
XEOU
X
Xdbmopen(aliases,'/usr/lib/aliases',0444)
X || dbmopen(aliases,'/etc/aliases',0444)
X || die "$0: can't dbmopen aliases: $!\n";
X
X($ARGV[0] = getlogin) || (($ARGV[0]) = getpwuid($<)) if $#ARGV == -1;
X
Xwhile ($user = shift) {
X @list = &list_aliases($user);
X print "$user:";
X &print_array(@list);
X}
X
Xsub list_aliases {
X local($user) = @_;
X local($key,$value,@list);
X
X print "USER=$user.\n" if $debug;
X while (($key,$value) = each %aliases) {
X chop($value, $key);
X @values = split(/[\s,]+/o, $value);
X push(@list,$key) && next
X if (grep(/^$user$/, @values)
X || ($partial && grep(/^$user@/, @values))
X || (($value =~ /^\s*:include:(.*)/io) && &in_file($user,$1)));
X# if ($value =~ /^\s*:include:(.*)/i) {
X# push(@list,$key)
X# if &in_file($user,$1);
X# }
X }
X return @list;
X}
X
X# "poor man's grep" -lwall, perl man page ... ;-)
X# there are probably better ways of doing this, but it's just a quick hack
X# maybe chg to read in entire file and split/grep on it
Xsub in_file {
X local($pat,$file) = @_;
X
X open(file) || $verbose && print STDERR "$0: can't open $file: $!\n";
X while (<file>) {
X chop;
X # remove comments stupidly, will leave mismatched parens
X while (s/\([^()\n]*\)//go) {}
X # return TRUE if PAT in FILE
X return (1) if ((/^\s*$pat\s*$/)
X || ($partial && /^\s*$pat@/));
X }
X return 0; # PAT not in file
X}
X
X# stupid sub to print array .. duh ...
X# sorts array before printing if -sort option was given
Xsub print_array {
X local(@list) = @_;
X local($elt);
X
X @list = sort @list if $sort;
X while ($elt=shift @list) {
X print " $elt";
X }
X print "\n";
X}
END_OF_aliases.pl
if test 4589 -ne `wc -c <aliases.pl`; then
echo shar: \"aliases.pl\" unpacked with wrong size!
fi
chmod +x aliases.pl
# end of overwriting check
fi
echo shar: End of shell archive.
exit 0