#!/bin/bash
#< Script to change admin password for JBoss JMX and WEB consoles
#
# Kevin Waldron - 20070322

BASENAME="/bin/basename"
CHMOD="/bin/chmod"
CP="/bin/cp"
DATE="/bin/date"
ECHO="/bin/echo"
ID="/usr/xpg4/bin/id"
MV="/bin/mv"
SED="/usr/bin/sed"
STTY="/bin/stty"

JBOSS_ROOT="/usr/local/jboss4"
JBOSS_SERVER_ROOT="${JBOSS_ROOT}/server"
JBOSS_SERVERS=( "${JBOSS_SERVER_ROOT}/instance1" \
                "${JBOSS_SERVER_ROOT}/instance2" \
                "${JBOSS_SERVER_ROOT}/instance3" )
# we use jmx-console-users.properties for all console auth (WEB and JMX)
JBOSS_PASSWD="conf/props/jmx-console-users.properties"
THIS_PROG=$( ${BASENAME} $0 )
VALID_USER="jboss"

VERBOSE=0

function print_error {
   ${ECHO} "Error: $@" >&2
}

function printv {
   # print if verbose
   (( VERBOSE )) && ${ECHO} "$@"
}

function print_usage {
   {
      ${ECHO} "Usage: ${THIS_PROG} [-hv]"
      ${ECHO} "       -h Display this usage message"
      ${ECHO} "       -v Verbose"
   } >&2
}

function check_user {
   CURRENT_USER=$( ${ID} -un )
   if [ "${CURRENT_USER}" != "${VALID_USER}" ]; then
      print_error "Must be executed as user ${VALID_USER}"
      exit 1
   fi
}

function check_servers {
   ERRORCOUNT=0
   for JBOSS_SERVER in ${JBOSS_SERVERS[@]}; do
      if [ ! -d "${JBOSS_SERVER}" ]; then
         print_error "Server ${JBOSS_SERVER##*/} does not exist"
         (( ERRORCOUNT = ERRORCOUNT + 1 ))
      fi
      if [ ! -f "${JBOSS_SERVER}/${JBOSS_PASSWD}" ]; then
         print_error "Cannot locate ${JBOSS_PASSWD##*/} for server ${JBOSS_SERVER##*/}"
         (( ERRORCOUNT = ERRORCOUNT + 1 ))
      fi
   done
   if [ "${ERRORCOUNT}" -gt "0" ]; then
      printv "${ERRORCOUNT} errors encountered - exiting"
      exit 1
   fi
}

function get_new_passwd {
   ${ECHO} "Please enter new JBoss administrator console password: \c"
   ${STTY} -echo
   read NEW_PASSWD
   ${STTY} echo
   ${ECHO}
   if [ "${NEW_PASSWD}" = "" ]; then
      print_error "Blank password not allowed"
      exit 1
   fi
   ${ECHO} "Please confirm new JBoss administrator console password: \c"
   ${STTY} -echo
   read CONFIRM_PASSWD
   ${STTY} echo
   ${ECHO}
   printv "New passwd: ${NEW_PASSWD} Confirm passwd: ${CONFIRM_PASSWD}"
   if [ "${NEW_PASSWD}" != "${CONFIRM_PASSWD}" ]; then
      print_error "Passwords do not match"
      exit 0
   fi
}

function set_new_passwd {
   for JBOSS_SERVER in ${JBOSS_SERVERS[@]}; do
      THIS_CONF="${JBOSS_SERVER}/${JBOSS_PASSWD}"
      printv "Changing password in ${THIS_CONF} for user admin"
      (( VERBOSE )) && {
         OLD_PASSWD=$( ${SED} -n 's/^admin=\(.*\)$/\1/p' ${THIS_CONF} )
         printv "Old password: ${OLD_PASSWD}"
      }
      BACKUP_FILE="${THIS_CONF}.$( ${DATE} +%Y%m%d-%H%M )"      
      ${CP} -p ${THIS_CONF} ${BACKUP_FILE}
      printv "Backup created @ ${BACKUP_FILE}"
      ${SED} "s/^admin=.*$/admin=${NEW_PASSWD}/" ${THIS_CONF} > ${THIS_CONF}.tmp
      ${MV} ${THIS_CONF}.tmp ${THIS_CONF} 
      ${CHMOD} 770 ${THIS_CONF}
      CURRENT_PASSWD=$( ${SED} -n 's/^admin=\(.*\)$/\1/p' ${THIS_CONF} )
      if [ "${CURRENT_PASSWD}" = "${NEW_PASSWD}" ]; then
         ${ECHO} "Password successfully changed for ${JBOSS_SERVER##*/}"
      fi
   done
}

#
# main()
# 
check_user

while getopts ":hv" OPTION; do
  case ${OPTION} in
     "h")  print_usage && exit 0  ;;
     "v")  VERBOSE=1              ;;
     *  )  print_usage && exit 1  ;;
  esac
done

shift $(( ${OPTIND} - 1 ))

if [ "$#" -ne "0" ]; then
   print_usage && exit 1
fi

check_servers
get_new_passwd
set_new_passwd

exit 0