#!/bin/bash
######################################################################
#
#  Name: boomCMD
#
#  Description: Finds out Agent ID of system in boom and executes via
#               boom server CLI "-c ACTION <cmd>" (execute any command). 
#               Provides stripped output result to STDOUT (e.g. "ls").
# 
#               Hint: wildcard related operations must be packed
#               with an additional Shell "sh -c \"<cmd> *\"" 
#
#
#  Author: Solmsdorf (equensWorldline)
#  Version: 2.50
#  Date: 15.7.2021
#
#  Input parameter: <system> <cmd> [<timeout_sec>]
#
#  Return: 0 = Success
#          1 = Warning (System >>${node}<< not available in boom)
#          2 = Error ( >>${ACTION} -cc "${cmd}" -a "${id}" -a 20<< failed! )
#         >3 = Error (>>GET_AGENTS_STATUS<< failed (exit_val=${ret})!)
#
#  Note: requires configuration settings (SRVCLI, SVRCLI_CFG) inside boom_env_ssl.cnf
#  Note: requires configured boom server CLI usage (/opt/boom/server/srv/cli/boom_cli.cfg)

#  Note: Example output "dir \temp" (Header and Footer lines)
#  Action finished. dir \temp
#  Result = Success
#  === Start of Output from m999imoog001d.in.bundesbank.de (2022-05-17 14:28:46) ===
#  Volume in drive C has no label.
#  Volume Serial Number is 3683-2E8E
#  Directory of C:\temp
#  22.02.2022  12:01    <DIR>  
#  ...
#  === End of Output from m999imoog001d.in.bundesbank.de ===
#
#
#  History:
#
#     date    |name| reason
#  ----------------------------------------------------------------
#  15/07/2021 | ps | (1.00) Initial Release
#  14/07/2022 | ps | (2.00) print out NO empty lines
#  20/12/2023 | ps | (2.01) small layout adaptions
#  29/02/2024 | ps | (2.50) optional arg. timeout_sec
#
######################################################################

NAME=$(basename $0)
PID=$$

CNFFIL="boom_env_ssl.cnf"

fil=${0}
fil_short=$(basename ${fil})
if [ `echo ${fil} | egrep "^\/" | wc -l` -eq 0 ]
then
# path not starting with "/"
  if [ `echo ${fil} | egrep "^\.\." | wc -l` -ge 1 ] || [ `echo ${fil} | egrep "\/" | wc -l` -ge 1 ]
  then
# path starting with ".."
    pd=$(realpath ${fil})
    pd=$(dirname ${pd})
    fil="${pd}/${fil_short}"
  else
# path not starting with ".."
    pd=$(pwd)
    fil="${pd}/${fil_short}"
  fi
fi
WORKDIR=$(dirname ${fil})

source "${WORKDIR}/${CNFFIL}"

USAGE="
Usage: ${NAME} <system_name> \"<command>\" [<timeout_sec>]

Note: requires boom server CLI configuration (${SRVCLI}/${SVRCLI_CFG})
"

user=$(id |awk -F"=" '{print $2}' |awk -F"(" '{print $2}' | awk -F")" '{print $1}')

# boom CLI
BOOMCLI="java -jar ${SRVCLI}/boom_cli.jar -f ${SRVCLI}/${SVRCLI_CFG}"
GETSTAT="${BOOMCLI} -c GET_AGENTS_STATUS"
GETCARDS="${BOOMCLI} -c GETAGENTCARDS"
ACTION="${BOOMCLI} -c ACTION"
GETFILE="${BOOMCLI} -c BOOM_AGENT_GETFILE"
PUTFILE="${BOOMCLI} -c BOOM_AGENT_PUTFILE"

OUT_HEAD_FOOT="Action finished.*|Result =*|==="

TIMEOUT_DEF=20 # sec.


OnDie()
{

  ShowT WARNING "(${PID}) [${user}] ${NAME} ${node} aborted!" ${LOGFILE}
  exit 9
}


function Ausgang
{

  local ret=${1}

##  ShowT INFO "(${PID}) [${user}] ${NAME} finished  " 
  exit $ret
}

function ShowT()
{
  local timstmp=$(date "+%d.%m.%Y %T")

   echo -e "${timstmp} ${1}: ${2}"
}


# INIT+++++++++++++++++++++++++++++++++++++++

#  Arguments?
if [ $# -lt 2 ]
then
  printf "${USAGE} \n"
  exit 1
fi
args=("$@")
system=${1}
node=${system}
node_short=$(echo ${node} | cut -f1-1 -d .)

cmd=${2}
to_sec=${3}
if [ -z "${to_sec}" ]
then
  to_sec=${TIMEOUT_DEF}
fi


# MAIN++++++++++++++++++++++++++++++++++++++++++

getstat_all=$(${GETSTAT}) ; ret=$?
if [ ${ret} -ne 0 ]
then
# ALARM
  ShowT ERROR "(${PID}) [${user}] ${node_short} - >GET_AGENTS_STATUS<< failed (exit_val=${ret})!" 
  exit ${ret}
fi
# Get ID
IFS=$'\n'; id=$(echo "${getstat_all}" |grep -w "${node}" |awk '{print $1}'); ret=$?;  unset IFS

if [ -z "${id}" ]
then
# ID=leer
  ShowT WARNING "(${PID}) [${user}] ${node_short} - System >>${node}<< not available in boom " 
  Ausgang 1
fi


# Action
out=$(${ACTION} -cc "${cmd}" -a "${id}" -a ${to_sec})
echo ${out} |grep "Result = Success" >/dev/null
if [ $? -eq 0 ]
then
  echo "${out}" |awk -v m="$OUT_HEAD_FOOT" '/^\s*$/ {next;} {if ($0 !~m){print $0}}'
  Ausgang 0
else
  ShowT ERROR "(${PID}) [${user}] ${node_short} - >>${ACTION} -cc ${cmd} -a ${id} -a ${to_sec}<< failed!" ${LOGFILE}
  Ausgang 2
fi



