#!/bin/bash

PATH=/usr/local/bin:/usr/local/sbin:/opt/local/bin:/usr/bin:/usr/sbin:/bin:/sbin
_REL_VERSION=`lsb_release -sc`

randpass() {
  if [ $integer -ge 8 ] ; then
    rkey="$integer"
  else
    rkey=32
  fi
  if [ "$kind" = "graph" ] ; then
    CHAR="[:graph:]"
    cat /dev/urandom | tr -cd "$CHAR" | head -c ${1:-$rkey} | tr -d "\n"
  elif [ "$kind" = "esc" ] ; then
    CHAR="[:graph:]"
    cat /dev/urandom | tr -cd "$CHAR" | head -c ${1:-$rkey} | tr -d "\n" | sed 's/[\\\/\^\?\>\`\#\"\{\(\$\@\&\|\*]//g; s/\(['"'"'\]\)//g'
  elif [ "$kind" = "hash" ] ; then
    CHAR="[:alnum:]"
    if [ "$_REL_VERSION" = "oneiric" ] || [ "$_REL_VERSION" = "trusty" ] || [ "$_REL_VERSION" = "precise" ] ; then
      cat /dev/urandom | tr -cd "$CHAR" | head -c ${1:-$rkey} | openssl md5 | awk '{ print $2}' | tr -d "\n"
    else
      cat /dev/urandom | tr -cd "$CHAR" | head -c ${1:-$rkey} | openssl md5 | tr -d "\n"
    fi
  else
    CHAR="[:alnum:]"
    cat /dev/urandom | tr -cd "$CHAR" | head -c ${1:-$rkey} | tr -d "\n"
  fi
  echo
}

case "$2" in
  alnum) integer="$1"
         kind="$2"
         randpass
  ;;
  graph) integer="$1"
         kind="$2"
         randpass
  ;;
  hash)  integer="$1"
         kind="$2"
         randpass
  ;;
  esc)   integer="$1"
         kind="$2"
         randpass
  ;;
  *)     echo "Usage: randpass {8-32} {alnum|graph|hash|esc}"
         exit 1
  ;;
esac
