#!/bin/ksh

# Copyright (c) 2007, grephead.com, LLC
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above copyright
#       notice, this list of conditions and the following disclaimer in the
#       documentation and/or other materials provided with the distribution.
#     * Neither the name of grephead.com, LLC nor the names of its
#       contributors may be used to endorse or promote products derived from
#       this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY grephead.com, LLC ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL grephead.com, LLC BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# generate random passwords
# inspired by http://foolab.org/node/1436
# thanks to allbery [aT] ece[.]cmu[.]edu for helping with solaris9 compatibility
#
# Thanks to Jesse Trucks for pointing out that ksh is more portable.  I have
# removed the one keyword that ksh barfed on, change 'bash' to 'ksh' above if
# you want to use this with /bin/ksh instead.
# ksh93 works, ksh88 does not /bin/sh on FreeBSD does not.
# 2007-09-10 04:10 : removed |, since it could be confused with 1 or l, added -

PATH=/bin:/usr/bin
LC_ALL=C
LANG=C

# default values
count=1     # how many passwords to generate
length=10   # how long should the password be

print_help() {
cat << EOT
$(basename $0)

By default $(basename $0) will generate one, ten character password.
You can change this with the following options:

    To change the length of the password:
    -l <length>

    To change how many passwords are generated:
    -c <count>

EOT
}

# parse command line arguments
while getopts "l:c:h" Option
do 
    case "${Option}" in 
        l) length="${OPTARG}" ;;
        c) count="${OPTARG}" ;;
        h) print_help;exit ;;
    esac
done

# check to make sure that /dev/urandom exists
if [ -e /dev/urandom ];then

    for ((a=1; a <= count; a++))
    do
        ( dd if=/dev/urandom count=200 bs=1 2>/dev/null |
            tr '\n' ' ' ; echo ) |
            sed 's/[^a-kmnp-zA-HJ-NP-Z2-9\+=@#$%^&*()-]//g' |
            cut -c-"${length}"
    done
else
    echo '/dev/urandom does not exist!'
fi