#!/usr/bin/env bash
# !!! also can be started from cron and on startup !!!

source /etc/environment
export $(cat /etc/environment | grep -vE '^$|^#' | cut -d= -f1) # export all variables from file


LOG="/var/log/hive-agent.log"

# Check for proxy var. Or agent and others started from here will not see it
. http_proxy.sh


screen -wipe agent >/dev/null


function stop_agent() {
	# We have checked for the agent process, but maybe there is a screen with dead agent
	screens=`screen -ls agent | grep -Po "\K[0-9]+(?=\.agent)"`
	if [[ ! -z $screens ]]; then
		echo "Quiting previous screen"
		for pid in $screens; do
			screen -S $pid.agent -X quit
		done
		return 0
	fi
	return 1
}


function restart_agent() {
	stop_agent && sleep 0.5

	echo "Starting new agent screen session"
	screen -dm -S agent

	for i in {1..25}; do
		sleep 0.2 #it needs some time? it happens that you'll have "No screen session found" without sleep
		session_count=`screen -ls agent | grep -c agent`
		[[ $session_count -gt 0 ]] && break
		[[ $i == 25 ]] && echo -e "${RED}screen agent not found in 25 iterations, check logs and maybe flash drive speed${NOCOLOR}"
	done

	screen -S agent -X screen 2 agent.gpu-stats
	sleep 0.2
	screen -S agent -X title "gpu-stats" #set nice title
	sleep 0.2
	screen -S agent -X screen 1 agent
	sleep 0.2
	screen -S agent -X title "agent" #set nice title
	sleep 0.2
	# close bash window #0
	screen -S agent -p bash -X stuff 'exit\n'

	return 0
}


function start_agent() {
	# As we have several processes in screen need to check for actual agent, not just for screen
	running=$(pgrep -cf '/agent run$')
	if [[ $running -eq 0 ]]; then
		screen -ls agent >/dev/null && echo "Screen is running but agent is not, restarting"
		restart_agent
		return
	fi
	# check if agent is alive by checking its log
	local log_ts; log_ts=`stat --printf %Y $LOG 2>/dev/null` || log_ts=0
	local now_ts; now_ts=`date +%s` || now_ts=0
	if [[ $log_ts -lt $(( now_ts - 180 )) ]]; then
		echo "Agent is dead, restarting"
		restart_agent
		return
	fi
	return 0
}


function log_agent() { # log_window
	local log="/tmp/agent$1.log"
	[[ -f $log ]] && rm $log
	screen -S agent -X at $1 hardcopy $log &&
		cat $log
	return
}

case $1 in
	start)
		start_agent
		exit
	;;

	dontattach)
		# prevent agent start from CRON during boot process
		upt=`cat /proc/uptime | awk '{print int($1)}'`
		[[ $upt -lt 300 ]] && echo "Too early" && exit 0
		start_agent
		exit
	;;

	restart)
		restart_agent
		exit
	;;

	stop)
		stop_agent
		exit
	;;

	log)
		tail -n 20 $LOG
		exit
	;;
	
	log1)
		log_agent 1
		exit
	;;
	log2)
		log_agent 2
		exit
	;;

	*)
		start_agent || exit
		screen -x -S agent >/dev/null # attach to screen
		if [[ $? -ne 0 ]]; then
			echo "Restarting agent"
			restart_agent
			screen -x -S agent >/dev/null # attach to screen again
			exit
		fi
	;;
esac


exit 0 #all was running
