[comp.mail.elm] Script for Adding Names

mds@hpfcmgw.HP.COM (Mark Schulz) (10/18/89)

    Here's a little script. It's got comments so you can see what it's all
about. Of course there are many enhancements that could be made to type
of thing if anyone is game.... enjoy.
---------------------------- cut here ---- >-8 --------------------------------
#! /bin/ksh -f
###############################################################################
#  This UNSUPPORTED utility script adds names to your ELM alias file.  It     #
#  searches for names via the "where" command and, if not found there, via    #
#  the "hpdesk" command.  Several possibilities can be dealt with when told   #
#  to add a name:							      #
#									      #
#     o  A single occurrence is found by "where"; it is added.		      #
#     o  The name is not found by "where", but a single occurrence is found   #
#	 by "hpdesk"; it is added.					      #
#     o  Multiple occurrences are found by "where"; the user is presented     #
#	 with a list of possible choices, he makes a selection, and it is     #
#	 added.								      #
#     o  No occurrences are found by "where", but multiple occurrences are    #
#	 found by "hpdesk"; again, the user is asked to make a selection.     #
#     o  No occurrences are found by "where" or by "hpdesk"; the user is      #
#	 notified that the name was not found, and nothing is changed.	      #
#									      #
#  In any case in which a name is found/selected, its address is checked      #
#  against the current alias file.  If it is already there, the user is	      #
#  notified, and the name is not added to the file.			      #
#									      #
#  By default, the "where" directory is searched before the "hpdesk" direc-   #
#  tory.  If you want to add a name that occurs in "hpdesk" but which also    #
#  occurs in the "where" directory, the program will stop searching when it   #
#  finds the name in the "where" directory UNLESS you specify that the pro-   #
#  gram is to search only the "hpdesk" directory.  This is accomplished by    #
#  using the "-hpdesk" option.						      #
#									      #
#  There are three formats of names that can be found: the first two below    #
#  are from "where", the last from "hpdesk".				      #
#									      #
#  Arns,Dave ..................... davea@hpfcmgcf ....... davea@hpfcla	      #
#  Aalbu,Jarl .................... jarl@hp-lsd				      #
#  Arns,Dave ..................... %ux@hp4000				      #
#									      #
#  In the "where" case that contains two addresses, the first one is used.    #
#-----------------------------------------------------------------------------#
#  Author:	Dave Arns (send any bug reports to davea@hpfcmgcf)	      #
#  Written:	October 6, 1989						      #
#-----------------------------------------------------------------------------#
#  Oct 10, '89		Made the alias file name variable for those systems   #
#    (Enhancements)	where it is something other than "$HOME/.alias_text". #
#			Made the alias file delimiter specifiable.  Allows    #
#			user to	specify alias name if desired.		      #
###############################################################################
#------------------------------------------------------------------------------
#--- Explain the usage of the script ------------------------------------------
function usage
{
    echo "Usage:"
    echo "  addtoelm [-where] [-hpdesk] [-help] <name> [<name>]"
    echo ""
    echo "where:"
    echo "  -where  is an option that restricts searching to the \"where\""
    echo "          command only.  Default is both \"where\" and \"hpdesk\"."
    echo "  -hpdesk is an option that restricts searching to the \"hpdesk\""
    echo "          command only.  Default is both \"where\" and \"hpdesk\"."
    echo "  -custom prompts the user for the alias name, rather than using"
    echo "          \"firstname_lastname\"."
    echo "  -help   give this Usage message."
    echo "  <name>  is a string specifying the name of the person whose mail"
    echo "          address you want to add to your alias file."
}
#------------------------------------------------------------------------------
#--- Search for the name ("$Adding") by using the command "$NameSource" -------
function search_for_name
{
    echo ".\c"					# extra period signifies hpdesk
    ($NameSource $Adding > $temp) 2> /dev/null  # ignore any error messages
    Entries=$(echo $(cat $temp | wc -l))	# determine the number of lines
    if [ $Entries -gt 0 ]			# did we find any?
    then
	Found=true				# yes, at least one
    else
	Found=false				# nope, none.
    fi
    if [ $Entries -gt 1 ]			# did we find more than one?
    then
	Ambiguous=true				# yes, user must choose one
    else
	Ambiguous=false				# nope, no ambiguity
    fi
}
#------------------------------------------------------------------------------
#--- Let user select one of multiple possible names ---------------------------
function disambiguate
{
    echo "Multiple entries--\nPlease select the desired entry:"
    cat $temp | awk '{printf "%3d: %s\n", NR, $0}'
    Number=0					# no number selected yet
    Abort=false					# assume a good answer
    while [ \( $Number -lt 1 -o $Number -gt $Entries \) -a "$Abort" = "false" ]
    do
        read Number?"Selection? "		# ask for a selection
        if [ -z "$Number" ]			# user just hit [Return]?
        then
            Number=0				# don't let the "if" blow up
	    Abort="true"			# if so, don't pick anything
	fi
    done
    if [ "$Abort" = "false" ]			# if not [Return], it's a number
    then					# extract specified line
        NewLine="$(cat $temp | awk '{if(NR == '$Number') print $0}')"
    fi
}
#------------------------------------------------------------------------------
#--- Add name and appropriate address to alias file ---------------------------
function add_name_to_alias_file
{
    RealName="$FirstName $LastName"		# "plain-English" name
    if [ "$CustomAliasNames" = "true" ]
    then
        read AliasName?"Alias name? (defaults to \"$FirstField\") "
        if [ -z "$AliasName" ]
        then
	    AliasName="$FirstField"
        fi
    else
	AliasName="$FirstField"
    fi
    if [ "$NameSource" = "where" ]
    then  # (where)
        NewEntry="$AliasName\t$Delim $RealName\t$Delim $Address"
    else  # (hpdesk)
        NewEntry="$AliasName\t$Delim $RealName\t$Delim $HubName!$Address"
    fi
    echo $NewEntry >> $AliasFileName		# append to alias file
    echo "Added:\n  $NewEntry"			# notify user of what was added
    FileChanged=true				# set flag for "newalias"
}
#------------------------------------------------------------------------------
#--- Add name to alias file if it's not already there -------------------------
function compose_and_check_name
{
    typeset -l FirstField			# lowercase variable

    Address="$(echo $NewLine | cut -d" " -f3)"	# 3rd field of line
    Name="$(echo $NewLine | cut -d" " -f1)"	# 1st field of line
    FirstName="$(echo $Name | cut -d, -f2)"	# 1st subfield of $Name
    LastName="$(echo $Name | cut -d, -f1)"	# 2nd subfield of $Name
    FirstField=$FirstName'_'$LastName		# compose ELM token
    if [ "$NameSource" = "hpdesk" ]		# name come from "hpdesk"?
    then
        Address="$FirstField$Address"		# yes, make desk-style address
    fi
    if [ -n "$(grep $Address $AliasFileName)" ]	# already in alias file?
    then
	echo "Already on file."			# yes, tell user
    else
	add_name_to_alias_file			# no, add to alias file
    fi
}
#------------------------------------------------------------------------------
#--- Deal with parameters that are people's names (not options) ---------------
function process_name_parameter
{
    echo "Adding \"$Adding\" to the ELM alias file..\c"
    Found=false					# assume it's not found (yet)
    ((SourceNo=1))
    while [ $SourceNo -le 2 -a $Found = "false" ] # search specified sources
    do
	NameSource=${NameSources[SourceNo]}
	search_for_name				# ...then search again
	((SourceNo=SourceNo+1))
    done
    echo ""					# print tab for alignment
    if [ "$Found" = "true" ]			# did we find one?
    then
        if [ "$Ambiguous" = "true" ]		# yes; but is it ambiguous?
        then
	    disambiguate			# yes; ask user to choose one
        else
	    NewLine="$(cat $temp)"		# not ambiguous; take it
	    Abort=false				# selection not aborted
	fi
	if [ "$Abort" = "false" ]		# if search completed...
	then
            compose_and_check_name		# add to file (if not there)
	else
	    echo "No change."
	fi
    else
	echo "Not found."			# not found; tell user
    fi
}
#------------------------------------------------------------------------------
#-- Set any requested options -------------------------------------------------
function process_option_parameter
{
    case $Option in
	-where)	 NameSources[1]="where"
		 NameSources[2]="";;		# search only "where" directory
	-hpdesk) NameSources[1]="hpdesk"
		 NameSources[2]="";;		# search only "hpdesk" directory
	-custom) CustomAliasNames=true;;	# user-specifiable alias names
	-help)	 Usage;;			# give user instructions
	*)	 echo "Illegal parameter: \"$Option\""; Usage; exit 1;;
    esac
}
#==============================================================================
#=== Main Program =============================================================
temp=/tmp/temp$$				# scratchpad
FileChanged=false				# assume not changed
NameSources[1]="where"				# default: search both places
NameSources[2]="hpdesk"				# default: search both places
HubName="hpfcla"				# prefix for "hpdesk" addresses
AliasFileName="$HOME/.alias_text"		# the file to modify
Delim=":"					# "=" can also be used
CustomAliasNames=false				# ask user for alias names?
echo "ELM alias file: \"$AliasFileName\""	# advise user which file used
while [ $# -gt 0 ]				# for all parameters...
do
    Adding="$1"					# make global variable
    case $Adding in				# what kind is it?
	-*) Option="$1"; process_option_parameter;;	# directive
	*)  Adding="$1"; process_name_parameter;;	# data
    esac
    shift					# get next one
done
if [ "$FileChanged" = "true" ]			# if a name was added...
then
    newalias					# install new aliases
fi
/bin/rm $temp