#!/usr/bin/bash
#
# Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
# Licensed under the Universal Permissive License v 1.0 as shown
# at http://oss.oracle.com/licenses/upl.
#
# creates a user with given name and id, create the structure to run automated tests.
#
EXPECTEDNBPAR=5
USERADD=$(command -v useradd)
GETENT=$(command -v getent)
PASSWD=$(command -v passwd)
SU=$(command -v su)
SED=$(command -v sed)
COPY=$(command -v cp)
CAT=$(command -v cat)
CHDIR="cd"
MKDIR=$(command -v mkdir)
DELETE="$(command -v rm) -rf"
CHMOD=$(command -v chmod)
CHOWN=$(command -v chown)
GROUPID=1000
USERSHELL="/bin/bash"
BINDIR="bin"
TESTDIR="autotests"
CONFIGDIR="configuration"
GITDIR="git_repo"
WORKDIR="oci_operations/tests/automation/configuration"
# DIRLIST=( "${BINDIR}" "${TESTDIR}" "${CONFIGDIR}" "${GITDIR}")
DIRLIST=( "${BINDIR}" "${TESTDIR}" "${GITDIR}")
GITCLONE="cloneociutils"
TESTINSTANCE="oci_utils_test_instance"
CONFIGURETESTS="oci_utils_configure_tests"
ISCSIDATA="oci_utils_iscsi_data"
NETWORKDATA="oci_utils_network_data"
POOLDATA="oci_utils_pool_data"
BINLIST=( "${TESTINSTANCE}" "${CONFIGURETESTS}" "${ISCSIDATA}" "${NETWORKDATA}" "${POOLDATA}" )
KEYFILENAME="oci_api_key.pem"
#
# todo:
# hardcode github link to automation.
GIT=$(command -v git)
# GITHUBURL="https://github.com/oracle/oci-utils.git"
GITHUBURL="https://github.com/guidotijskens/oci-utils.git"
#
# https proxy
HTTPSPROXY="http://www-proxy-hqdc.us.oracle.com:80"

Usage() {
  echo ""
  echo "Usage:"
  echo ""
  echo "${0} <username> <userid> <sdk config> <key file> <branch>"
  echo ""
  echo "  <username>   : the name of the user to be created."
  echo "  <userid>     : the userid for the user."
  echo "  <sdk config> : the sdk config file."
  echo "  <key file>   : the sdk key file."
  echo "  <branch>     : the branch to be used with test list and automation code."
  echo ""
  echo " Creates a user with name <username> and userid <userid>"
  echo " with groupid 1000 and in group wheel with home"
  echo " directory /home/<username>; configures the oci-sdk for direct authentication;"
  echo " clones github oci-utils repository and checks out a branch."
  echo ""
}

MessageStd() {
 local MSGNOW=$(date '+%d-%b-%Y %H:%M:%S')
 echo "${MSGNOW} --- MSG --- ${1}"
}

MessageErrBase() {
 local MSGNOW=$(date '+%d-%b-%Y %H:%M:%S')
 echo "${MSGNOW} --- ERR --- ${1}"
}

MessageErrFatal() {
  RETVAL="${1}"
  MSG="${2}"
  if [ "${RETVAL}" -ne 0 ]; then
    MessageErrBase "${MSG}: ${RETVAL}"
    exit 1
  fi
}

ExitOnError() {
  RETV="${1}"
  ERRORMESSAGE="${2}"
  SUCCESSMESSAGE="${3}"
  MessageErrFatal "${RETV}" "${ERRORMESSAGE}"
  MessageStd "${SUCCESSMESSAGE}"
}

NBPAR="${#}"
if [ ${NBPAR} -ne ${EXPECTEDNBPAR} ]; then
  MessageErrBase "username, userid, config, key file and/or branch missing"
  Usage
  exit 1
fi

USERNAME=${1}
USERID=${2}
SDKCONFIG=${3}
KEYFILE=${4}
GITBRANCH=${5}
MessageStd "Username is ${USERNAME}"
MessageStd "UserID is ${USERID}"
MessageStd "SDK config file is ${SDKCONFIG}"
MessageStd "Key file ${KEYFILE}"
MessageStd "git branch ${GITBRANCH}"
#
HOMEDIR="/home/${USERNAME}"
MessageStd "user home directory is ${HOMEDIR}"
HOMEBINDIR="${HOMEDIR}/bin"
MessageStd "user bin directory is ${HOMEBINDIR}"
HOMEOCI="${HOMEDIR}/.oci"
MessageStd ".oci is ${HOMEOCI}"
HOMEOCICONFIG="${HOMEOCI}/config"
MessageStd "config file is ${HOMEOCICONFIG}"
HOMESDKKEY="${HOMEOCI}/${KEYFILENAME}"
MessageStd "sdk key file is ${HOMESDKKEY}"
HOMEGITDIR=${HOMEDIR}/${GITDIR}
MessageStd "git repositroy directory is ${HOMEGITDIR}"
HOMEAUTOMATION=${HOMEGITDIR}/tests/automation
MessageStd "automation directory is ${HOMEAUTOMATION}"
MASTERMAKE=${HOMEAUTOMATION}/Makefile
MessageStd "Makefile location is ${MASTERMAKE}"
#
#
${GETENT} passwd "${USERNAME}" > /dev/null 2>&1
RETVAL=${?}
if [ ${RETVAL} -eq 0 ]; then
  MessageErrFatal "${USERNAME} already exists"
fi
#
# add user
${USERADD} -c "user ${USERNAME}" -d "${HOMEDIR}" -g ${GROUPID} -G wheel -m -s "${USERSHELL}" -u "${USERID}" "${USERNAME}"
ExitOnError "${?}" "Failed to create user ${USERNAME}" "${USERNAME} created successfully."
${PASSWD} "${USERNAME}"
ExitOnError "${?}" "Failed to set password for ${USERNAME}" "Password for ${USERNAME} set successfully."
#
# create automation directories
for thisdir in  "${DIRLIST[@]}"
do
  ${SU} -l "${USERNAME}" -c "${MKDIR} -p ${thisdir}"
  ExitOnError ${?} "Failed to create ${thisdir}" "Created ${thisdir} successfully."
done
#
# create oci sdk config directory
${SU} -l "${USERNAME}" -c "${MKDIR} ${HOMEOCI}"
ExitOnError "${?}" "Failed to create ${HOMEOCI}" "${HOMEOCI} created successfully."
#
# chmode sdk config directory
${SU} -l "${USERNAME}" -c "${CHMOD} 700 ${HOMEOCI}"
ExitOnError "${?}" "Failed to  ${CHMOD} 700 ${HOMEOCI}" "${HOMEOCI} permission set to 700 successfully."
#
# copy sdk config file
${SU} -l "${USERNAME}" -c "${COPY} ${SDKCONFIG} ${HOMEOCICONFIG}"
ExitOnError "${?}" "Failed to  ${COPY} ${SDKCONFIG} to ${HOMEOCICONFIG}" "Copied ${SDKCONFIG} to ${HOMEOCICONFIG} successfully."
${SU} -l "${USERNAME}" -c "${CHMOD} 600 ${HOMEOCICONFIG}"
ExitOnError "${?}" "Failed to ${CHMOD} 600 ${HOMEOCICONFIG}" "${HOMEOCICONFIG} permissions set to 600 successfully."
#
# copy and update key file
${SU} -l "${USERNAME}" -c "${COPY} ${KEYFILE} ${HOMESDKKEY}" "Copied ${KEYFILE} to ${HOMESDKKEY} successfully."
ExitOnError "${?}"  "Failed to  ${COPY} ${KEYFILE} to ${HOMESDKKEY}"
${SU} -l "${USERNAME}" -c "${CHMOD} 600 ${HOMESDKKEY}"
ExitOnError "${?}" "Failed to ${CHMOD} 600 ${HOMESDKKEY}"
RETVAL="${?}"
MessageErrFatal ${RETVAL} "Failed to ${CHMOD} 600 ${HOMESDKKEY}" "${SED} -i /key_file/c\"key_file=${HOMESDKKEY}\" ${HOMEOCICONFIG}"
${SU} -l "${USERNAME}" -c "${SED} -i /key_file/c\"key_file=${HOMESDKKEY}\" ${HOMEOCICONFIG}"
#
# clone git
#${SU} -l ${USERNAME} -c "https_proxy=${HTTPSPROXY} ${GIT} clone ${GITHUBURL} ${HOMEGITDIR}"
#ExitOnError ${?} "Failed to clone ${GITHUBURL} to  ${HOMEGITDIR}" "${GITHUBURL} cloned to ${HOMEGITDIR} successfully."
#
# checkout branch
#${SU} -l ${USERNAME} -c "${CHDIR} ${HOMEGITDIR} && ${GIT} checkout ${GITBRANCH} && ${CHDIR} ~"
#ExitOnError ${?} "Failed to checkout ${GITBRANCH}" "Checkout ${GITBRANCH} successfully"
#
# create clone script to ${HOME}/bin
${CAT} << EOT > ${HOMEBINDIR}/${GITCLONE}
#!/bin/bash
[ "\$#" -ne 1 ] && echo "Usage: ${0} <git branch>" && exit
THISGITBRANCH="\${1}"
${DELETE} ${HOMEGITDIR}
https_proxy=${HTTPSPROXY} ${GIT} clone ${GITHUBURL} ${HOMEGITDIR}
${CHDIR} ${HOMEGITDIR}
${GIT} checkout \${THISGITBRANCH}
THISBRANCH=\$(${GIT} symbolic-ref --short HEAD)
echo "\"Current branch \${THISBRANCH}\""
EOT
ExitOnError "${?}" "Failed to create ${HOMEDIR}/bin/${GITCLONE}" "Created ${HOMEDIR}/bin/${GITCLONE}} successfully."
#
# chown ${GITCLONE}
${CHOWN} ${USERID}:${GROUPID} ${HOMEDIR}/bin/${GITCLONE}
ExitOnError "${?}" "Failed to change owmer of  ${HOMEDIR}/bin/${GITCLONE}" "Changed owner of ${HOMEDIR}/bin/${GITCLONE} successfully."
#
# chmod 755 ${GITCLONE}
${SU} -l "${USERNAME}" -c "${CHMOD} 755 ${HOMEDIR}/bin/${GITCLONE}"
ExitOnError "${?}" "Failed to  ${CHMOD} 755 ${HOMEDIR}/bin/${GITCLONE}" "${HOMEDIR}/bin/${GITCLONE} permission set to 755 successfully."

# clone git
${SU} -l ${USERNAME} -c "${HOMEDIR}/bin/${GITCLONE} ${GITBRANCH}"
ExitOnError ${?} "Failed to clone ${GITHUBURL} to  ${HOMEGITDIR}" "${GITHUBURL} cloned to ${HOMEGITDIR} successfully."
#
# copy Makefile
${SU} -l ${USERNAME} -c "${COPY} ${MASTERMAKE} ${HOMEDIR}"
ExitOnError ${?} "Failed to copy ${MASTERMAKE} to ${HOMEDIR}" "Copied ${MASTERMAKE} to ${HOMEDIR} successfully."
#
# populate bin
for thisbin in  "${BINLIST[@]}"
do
  ${SU} -l "${USERNAME}" -c "${COPY} ${HOMEAUTOMATION}/${thisbin}.py ${HOMEBINDIR}/${thisbin}"
  ExitOnError "${?}" "Failed to  ${COPY} ${thisbin}.py to ${HOMEBINDIR}/${thisbin}" "Copied ${thisbin}.py to ${HOMEBINDIR}/${thisbin} successfully."
done