#!/bin/bash 

###################################################################

#Script Name    : Aiops Core 
#Description    : RCA Backend
#Args           : 0-Verbose, 1-Restart, 2-FindPids, 3-Start
#Author         : Vaibhav Sharma

###################################################################

ipArr=()
processName=AutoRca
workDir=$(dirname $(dirname $(dirname $(realpath $0))))
scriptDir=$workDir/utility/bin
rcaLogDir=$workDir/logs/rcalogs
rcaLibDir=$workDir/core
rcaConfigDir=$workDir/config
sysConfigDir=$workDir/config/sysConfig
hostFile=$sysConfigDir/hostRCAMon.conf
CONFIG=$sysConfigDir/hostDetails.conf
count=$(ps -ef | grep -v grep| grep -c $processName.jar)
pids=$(ps -ef | grep $processName.jar | grep -v grep | awk '{print $2}')
initime=`date '+%m/%d/%Y_%H:%M:%S'`
max_mem_mb=1024

find_pids(){
	sleep 1s
	count=$(ps -ef | grep -v grep| grep -c $processName.jar)
	pids=$(ps -ef | grep $processName.jar | grep -v grep | awk '{print $2}')
	if [ $count -gt 0 ]
	then
		echo "Found $count process of [$processName]" 
		echo "with pid(s): "$pids
	else
		echo "[$processName]: Process ids not available!"
	fi
}

run_cleanup(){
	echo "Cleaning logs..."
	rm -rf $rcaLogDir
	#rm nohup*
	echo "Cleaning Cache..."
	if psql -U postgres -lqt | cut -d \| -f 1 | grep -qw $dbName; then
		psql -U postgres -d $dbName -c "delete from activeincident"
		psql -U postgres -d $dbName -c "delete from priorityincidentids"
	else
		echo "[$dbName] database not available for clean up!"
	fi
}

run_kill(){
	echo "Checking running [$processName] process!"
	find_pids
	if [ $count -gt 0 ]
	then
		echo "Terminating [$processName]..."
		for pid in $(ps -ef | grep ${processName}.jar | grep -v grep | awk '{print $2}'); do kill -9 $pid; done
	fi
    # remove aiops cron jobs
    sh $scriptDir/aiops_cronjobs.sh 1
}

read_ip(){
	ipArr=()
	echo -n "Enter ND Machine Count :"
	read n
	echo "Enter ND Machine(s) IP Address (IP:Port)  :"
	i=0
	while [ $i -lt $n ] 
	do
		read ipArr[$i]
		i=`expr $i + 1`
	done
	#echo "[${#ipArr[@]}] ND Machine Found!"
	mkdir -p $(dirname $hostFile)
	printf "%s\n" "${ipArr[@]}" > $hostFile
}

read_hostfile(){
	ipArr=()
	echo -n "Checking Configuration :"
	if [ ! -f "$hostFile" ]; then
		echo "[Configuration file is missing!]"
	else
		while IFS= read -r line
		do
			no_ws_line="$(echo -e "${line}" | tr -d '[:space:]')"
			if [[ -n $no_ws_line ]]; then
				confArr=($(echo $no_ws_line | tr "|" "\n"))
				ipArr+=("${confArr[0]}")
			fi
			#ipArr+=("$line")
		done < "$hostFile"
		echo "[${#ipArr[@]}] ND Machine Found!"
	fi
}

run_process(){

	mkdir -p $rcaLogDir/nohuplogs

    chmod +x $workDir/config/mailConfig/phantomjs-linux/bin/phantomjs
    chmod +x $workDir/config/mailConfig/PhantomScript/Phantomscript2.js
    chmod +x $workDir/config/mailConfig/PhantomScript/Phantomscript.js

    avail_mem_kb=`grep MemAvailable /proc/meminfo | awk '{print $2}'`
    avail_mem_mb=$(( $avail_mem_kb / 1000 ))
    max_mem_alloc_mb=`echo "x=l($(( $avail_mem_mb / 2 )))/l(2); scale=0; 2^((x+0.5)/1)" | bc -l`
   

    if [ "$max_mem_alloc_mb" -gt "$max_mem_mb" ]; then
	    max_mem_alloc_mb="$max_mem_mb"
    fi

    last_pt="${JAVA_HOME##*/}"
    if [ "$last_pt" != "java" ];
    then
       	java_start=java
    else
   	java_start=$JAVA_HOME
    fi

    nohup $java_start -Xmx${max_mem_alloc_mb}m -Dlog4j2.configurationFile=$rcaConfigDir/rcaConfig/log4j2.xml -cp $rcaLibDir/$processName.jar:$rcaLibDir/Commons.jar:$rcaLibDir/txnflowmap.jar:$rcaLibDir/CavSecureRestHandler.jar:$rcaLibDir/log4j-api-2.17.1.jar:$rcaLibDir/log4j-core-2.17.1.jar:$rcaLibDir/httpclient-4.5.5.jar:$rcaLibDir/httpcore-4.4.9.jar:$rcaLibDir/DataMigration.jar:$rcaLibDir/commons-logging-1.2.jar:$rcaLibDir/apache-commons-lang.jar:$rcaLibDir/Extensions.jar:$rcaLibDir/UserExperience.jar:$rcaLibDir/gson-2.6.2.jar:$rcaLibDir/weka.jar:$rcaLibDir/IncidentMail.jar:$rcaLibDir/java-json.jar:$rcaLibDir/javax.mail-1.5.0.jar:$rcaLibDir/jackson-annotations-2.9.4.jar:$rcaLibDir/jackson-core-2.9.4.jar:$rcaLibDir/jackson-databind-2.9.4.jar:$rcaLibDir/opencsv-1.7.jar:$rcaLibDir/OutlierDetector.jar:$rcaLibDir/Dbservices.jar:$rcaLibDir/org-apache-commons-codec.jar:$rcaLibDir/postgresql-42.2.5.jar:$rcaLibDir/HikariCP-3.3.1.jar:$workDir/core/slf4j-api-1.7.26.jar:$workDir/core/slf4j-simple-1.7.26.jar:$workDir/core/kotlin-stdlib-1.3.61.jar:$workDir/core/kotlin-stdlib-common-1.3.61.jar:$workDir/core/okhttp-4.4.0.jar:$workDir/core/okio-2.4.3.jar:$workDir/core/event-rule-dto.jar:$workDir/core/jackson-all-1.9.0.jar:$workDir/core/javax.ws.rs-api-2.0.jar:$workDir/core/gson-2.2.2.jar:$workDir/core/tsdbdtos.jar:$workDir/core/jackson-annotations-2.7.5.jar com.cavisson.autoRca.Main $rcaConfigDir/ > $rcaLogDir/nohuplogs/nohup.out 2>&1&

    : '
	if [ ${#ipArr[@]} -eq 0 ]; then
		echo "No ND Machine Found!"
	else
		echo "Starting [$processName] @ [$initime]"
		for hostip in "${ipArr[@]}"
		do
			echo "Host : "$hostip
			nohup java -Xmx3092m -cp $rcaLibDir/$processName.jar:$rcaLibDir/Commons.jar:$rcaLibDir/apache-commons-lang.jar:$rcaLibDir/Extensions.jar:$rcaLibDir/UserExperience.jari:$rcaLibDir/txnflowmap.jar:$rcaLibDir/gson-2.6.2.jar:$rcaLibDir/weka.jar:$rcaLibDir/IncidentMail.jar:rcaLibDir/DataMigration.jar:$rcaLibDir/java-json.jar:$rcaLibDir/javax.mail-1.5.0.jar:$rcaLibDir/jackson-annotations-2.9.4.jar:$rcaLibDir/jackson-core-2.9.4.jar:$rcaLibDir/jackson-databind-2.9.4.jar:$rcaLibDir/opencsv-1.7.jar:$rcaLibDir/OutlierDetector.jar:$rcaLibDir/Dbservices.jar:$rcaLibDir/org-apache-commons-codec.jar:$rcaLibDir/postgresql-42.2.5.jar:$rcaLibDir/HikariCP-3.3.1.jar:$workDir/core/slf4j-api-1.7.26.jar:$workDir/core/slf4j-simple-1.7.26.jar:$workDir/core/kotlin-stdlib-1.3.61.jar:$workDir/core/kotlin-stdlib-common-1.3.61.jar:$workDir/core/okhttp-4.4.0.jar:$workDir/core/okio-2.4.3.jar com.cavisson.autoRca.Main $rcaConfigDir/ $hostip > $rcaLogDir/nohuplogs/nohup_$hostip.out 2>&1&
			#sh $scriptDir/runPod.sh
		done
	fi
    '

    # add aiops cron jobs
    sh $scriptDir/aiops_cronjobs.sh 0
}

show_verbose(){
     : '
	if [ $count -gt 0 ]
	then
		echo "Process [$processName] currently running..." 
		#	echo "with pid(s) $pids"
		while true; do
			read -ep "Do you wish to kill these process? [Y/N] : " yn
			case $yn in
				[Yy]* ) echo "Entered:"$yn
					run_kill
					while true; do
						read -ep "Do you wish to start [$processName]? [Y/N] : " yn
						case $yn in
							[Yy]* ) echo "Entered:"$yn
								read_hostfile
								if [ ${#ipArr[@]} -eq 0 ]; then
									return
									#read_ip
								fi
								run_cleanup
								run_process
								find_pids
								break
								;;
							[Nn]* ) echo "Entered:"$yn
								break
								;;
							* ) echo "Please answer yes or no ! : ";;
						esac
					done

					break
					;;
				[Nn]* ) echo "Entered:"$yn
					break
					;;
				* ) echo "Please answer yes or no ! : ";;
			esac
		done

	else
com 
       ' 
                run_kill
		read_hostfile
		if [ ${#ipArr[@]} -eq 0 ]; then
			return
			#read_ip
		fi
		run_cleanup
		run_process
		find_pids
#	fi
}

restart_process(){
	read_hostfile
	if [ ${#ipArr[@]} -eq 0 ]; then
		echo "Restarting Error: [No ND Machines Found!]"
	else
		run_kill
		run_cleanup
		run_process
		find_pids
	fi
}

pause(){
	read -ep "Press [Enter] key to continue..." fackEnterKey
}

# function to display menus
show_menus() {
	#clear
	echo "~~~~~~~~~~~~~~~~~~~~~~~~~~"	
	echo "       Core Options       "
	echo "~~~~~~~~~~~~~~~~~~~~~~~~~~"
	echo ""
	echo "1. Running Process"
	echo "2. Start Process"
	echo "3. Kill Process"
	echo "4. Restart Process"
	echo "5. Back"
	echo ""
}
back_option(){
        sh $workDir/utility/aiops_installer.sh admin
}
# read input from the keyboard and take a action
read_options(){
	local choice
	read -ep "Enter choice [ 1 - 5 ]: " choice
	case $choice in
		1)  find_pids
			pause;;
		2)  show_verbose
			pause;;
		3)  run_kill
			pause;;
		4)  restart_process
			pause;;
		5) #back_option
                        exit 0;;
		*) echo -e "${RED}Wrong Choice! Please Wait...${STD}" && sleep 1
	esac
}

if [ -f "$CONFIG" ]
then
	source $CONFIG
else
	echo "[Aiops Core] configurations not found!"
	exit
fi

if [ "$1" = 0 ]
then
	while true
	do
		clear
		show_menus
		read_options
	done
elif [ "$1" = 1 ] 
then
	restart_process
elif [ "$1" = 2 ]
then
	find_pids
elif [ "$1" = 3 ]
then
	show_verbose
elif [ "$1" = 4 ]
then
        run_kill
else
	echo "Args Required! [0-Verbose,1-Restart,2-FindPids,3-Start,4-kill]"
fi

