Cover v07 i13
Article
Listing 1
Listing 2
Listing 3
Listing 4
Listing 5
Listing 6
Listing 7


Listing 6

#! /bin/bash -
# FILENAME: chtpwd
# DESCRIPTION:  Creates httpd password for relevant usernames, optionally
# updating actual htpasswd file. Data are stored in a file with the following 
# format:
#
#	username:clear_password:crypted_password:mailaddr
#
# USAGE: chtpwd [-H] [-f file] [-h file] [-l lenght ] [-u] [-v]
# OPTIONS:
#       -H - Prints help message
#       -f file - File usernames are stored in
#       -h file - Name of htpasswd file to change
#       -l lenght - Desired password lenght
#       -u - Updates actual htpasswd file
#       -v - Produces verbose output
#
# LABEN S.p.A. - 09-jan-1998
#
# HISTORY:
# 0.0 Luca Salvadori <salvadori.l@laben.it> 09-jan-1998
# 	- Functions and behaviour
#
#
########################## S U B R O U T I N E S ###########################

# Initialization of global variables
# Program Information
AUTHOR="Luca Salvadori <salvadori.l@laben.it>"
VERSION="0.0"
DATE="09-jan-1998"
# End of program information
MKPWD=~/work/utils/mkpwd.pl          # Default utility to create passwords
DEF_FILE=~/work/utils/htpasswd       # Default data file
DEF_HTPASSWD=~httpd/etc/htpasswd     # Default httpd authorization file
DEF_PWDLEN=8                         # Default httpd password lenght
UPDATE=0                             # Don't update htpasswd file
UMASK=077                            # Default mask to create files with
MASK="600"                           # Default protection mask for data file
                                     # WARNING! It contains clear passwords!
TEMP=/tmp                            # Temporary directory
TMPFILE=$TEMP/`basename $0`.$$       # Scratch file
VERBOSE=0                            # Brief output is default
# Options string
OPTS=":-H -f: -h: -l: -u  -v"
# Default options
DEFOPT="-f $DEF_FILE -h $DEF_HTPASSWD -l $DEF_PWDLEN -u"
# End of global variables initialization

##################### E N D  O F  S U B R O U T I N E S ####################

function helpmsg() {
	echo "" 1>&2
	echo " `basename $0` Version $VERSION - $DATE" 1>&2
	echo " Author: $AUTHOR" 1>&2
	echo "" 1>&2
	echo " USAGE: chtpwd [-H] [-f file] [-h file] [-l lenght] [-u] [-v]" 1>&2
	echo " OPTIONS:" 1>&2
	echo "	-H - Prints help message" 1>&2
	echo "	-f file - File usernames are stored in" 1>&2
	echo "	-h file - Name of htpasswd file to change" 1>&2
	echo "	-l lenght - Desired password lenght" 1>&2
	echo "	-u - Updates actual htpasswd file" 1>&2
	echo "	-v - Produces verbose output" 1>&2
	echo "" 1>&2
}

########################## M A I N  P R O G R A M ##########################

# Parsing input parameters and assigning default if needed
options=`echo $*`
[ "$options" = "" ] && { $0 $DEFOPT ; exit }

# Parsing options and setting defaults if needed
while [ $OPTIND -le $# ]
do
	getopts "$OPTS" option
	case $option in
		H)
			helpmsg
			exit 0
			;;
		f)
			FILE=$OPTARG
			;;
		h)
			HTPASSWD=$OPTARG
			;;
		l)
			PWDLEN=$OPTARG
			;;
		u)
			UPDATE=1
			;;
		v)
			VERBOSE=1
			;;
		"?")
			echo "`basename $0` - ERROR: Option -$OPTARG requires an argument or is unknown." 1>&2
			echo "Run `basename $0` -H for help." 1>&2
			exit 3
			;;
		*)
			echo "`basename $0` - ERROR: Unknown option -$OPTARG." 1>&2
			echo "Run `basename $0` -H for help." 1>&2
			exit 2
			;;
	esac
	case $OPTARG in
		-*)
			echo "`basename $0` - ERROR: Option -$option requires an argument." 1>&2
			echo "Invalid argument $OPTARG." 1>&2
			echo "Run `basename $0` -H for help." 1>&2
			exit 3
			;;
	esac
done
# Setting defaults for unselected options
HTPASSWD=${HTPASSWD:-$DEF_HTPASSWD}
FILE=${FILE:-$DEF_FILE}
PWDLEN=${PWDLEN:-$DEF_PWDLEN}
# Perform sanity checks, just in case
[ ! -f $FILE ] && { echo "`basename $0` - ERROR: Data file $FILE does not exist." 1>&2 ; echo "Run `basename $0` -H for help." 1>&2 ; exit 6 }
[ ! -f $MKPWD ] && { echo "`basename $0` - ERROR: Program file $MKPWD does not exist." 1>&2 ; echo "Run `basename $0` -H for help." 1>&2 ; exit 7 }

# Here begins the real stuff
# Setting protection to data file, just in case...
[ -f $FILE ] && chmod $MASK $FILE
# Creating scratch file with proper protections
touch $TMPFILE
chmod $MASK $TMPFILE

# Looping for all usernames
# Displaying startup message in verbose mode
if [ $VERBOSE -eq 1 ]
then
	echo "`basename $0` - Verbose output
--------------------------------------------------------------------------
Invoked with following defaults:
- Desired password lenght: $PWDLEN
- Data file: $FILE
- HTTPD access file: $HTPASSWD"
	if [ $UPDATE -eq 1 ]
	then
		echo "- Update HTTPD access file $HTPASSWD"
	else
		echo "- Don't update HTTPD access file $HTPASSWD"
	fi
	echo "-------------------------------------------------------------"
fi

for line in `cat $FILE`
do
	# Getting parameters
	user=`echo $line | cut -d":" -f1`
	mailaddr=`echo $line | cut -d":" -f4`
	pwdstring=`$MKPWD $PWDLEN`
	# Verbose output
	[ $VERBOSE -eq 1 ] && echo -n "Processing $user ($mailaddr)..."
	# Appending new line to scratch file
	echo $user:$pwdstring:$mailaddr >> $TMPFILE
	# Verbose output
	[ $VERBOSE -eq 1 ] && echo "Done."
done
# Move scratch file to final destination
[ -f $TMPFILE ] && mv $TMPFILE $FILE
# Setting protection to data file, just in case...
[ -f $FILE ] && chmod $MASK $FILE
# If update option is selected, do i
if [ $UPDATE -eq 1 ]
then
	[ $VERBOSE -eq 1 ] && echo -n "Updating $HTPASSWD file..."
	for line in `cat $FILE | cut -d":" -f1,3`
	do
		user=`echo $line | cut -d":" -f1`
		ed -s $HTPASSWD << END
1,\$g;^$user:;s;^.*;$line;
w
q
END
	[ $VERBOSE -eq 1 ] && echo -n "."
	done
	[ $VERBOSE -eq 1 ] && echo  "Done."
fi

# Cleanup and exit
[ -f $TMPFILE ] && rm $TMPFILE
exit

################### E N D  O F  M A I N  P R O G R A M ###################