#!/bin/bash
#
#
#	A wrapper script for the OGP agent perl script.
#	Performs auto-restarting of the agent on crash. You can
#	extend this to log crashes and more.
#
# The ogp_agent script should be at the top level of the agent tree
# Make sure we are in that directory since the script assumes this is the case

#####################
#  Important VARS   #
#####################

AGENTDIR="/OGP"
BASH_PREFS_CONF="$AGENTDIR/Cfg/bash_prefs.cfg"
REPONAME=OGP-Agent-Windows
GitHubUsername="OpenGamePanel"

#####################
#     FUNCTIONS     #
#####################

setupOGPAndReadBashPrefs(){

	# Find CURL
	if [ -z "$CURL" -o -z "$UNZIP" ]; then
		checkDepends
	fi

	chmod -Rf 770 $AGENTDIR
	find $AGENTDIR -type f -print | xargs chmod ug=rw 
	if [ -d "$AGENTDIR/steamcmd" ]; then
		find $AGENTDIR/steamcmd -iname \*.dll -exec chmod +x {} \;
		find $AGENTDIR/steamcmd -iname \*.exe -exec chmod +x {} \;
	fi
	if [ -d "$AGENTDIR/screenlogs" ]; then
		chmod -Rf ug=rwx $AGENTDIR/screenlogs
	fi
	chmod +x $AGENTDIR/ogp_agent.pl &> /dev/null
	chmod +x $AGENTDIR/agent_conf.sh &> /dev/null
	chmod +x /usr/bin/ogp_agent &> /dev/null

	# Should we perform an automatic update?
	if [ -e $BASH_PREFS_CONF ]
	then
		source "$BASH_PREFS_CONF"
		if [ "X$agent_auto_update" == "X1" ]
		then
			AUTO_UPDATE="yes"
		fi
		
		if [ "X$run_pureftpd" == "X0" ]
		then
			RUN_PUREFTPD="no"
		else
			RUN_PUREFTPD="yes"
		fi
		
		if [ "X$ftp_ip" != "X" ]
		then
			FTP_IP="$ftp_ip"
		else
			FTP_IP="0.0.0.0"
		fi
		
		if [ "X$ftp_port" != "X" ]
		then
			FTP_PORT="$ftp_port"
		else
			FTP_PORT="21"
		fi
		
		if [ "X$ftp_pasv_range" != "X" ]
		then
			FTP_PASV_STRING="-p $ftp_pasv_range"
		else
			FTP_PASV_STRING=""
		fi
		
		# Use custom github update address
		if [ ! -z "$github_update_username" ]; then
			if [ -f "$CURL" -a -x "$CURL" ] && [ -f "$UNZIP" -a -x "$UNZIP" ]; then
				REVISIONTest=`curl -Lks https://github.com/${github_update_username}/${REPONAME}/commits/master.atom | grep -Eo "([a-f0-9]{40})" | head -n 1`
				if [ ! -z "$REVISIONTest" ]; then
					GitHubUsername=${github_update_username}
				fi
			fi
		fi
		
	else
		AUTO_UPDATE="yes"
		RUN_PUREFTPD="yes"
		FTP_IP="0.0.0.0"
		FTP_PORT="21"
		FTP_PASV_STING=""
	fi

	if test `id -u` -eq 0; then
		echo
		echo
		echo "************** WARNING ***************"
		echo "Running the OGP agent as root  "
		echo "is highly discouraged. It is generally"
		echo "unnecessary to use root privileges to "
		echo "execute the agent.         "
		echo "**************************************"
		echo
		echo
		timeout=10
		while test $timeout -gt 0; do
			echo -n "The agent will continue to launch in $timeout seconds\r"
			timeout=`expr $timeout - 1`
			sleep 1
		done
	fi
}

ogpGitCleanup(){
	echo "Cleaning up..."
	rm -Rf ${REPONAME}-* &> /dev/null
	if [ -e "ogp_agent_latest.zip" ]; then
		rm -f "ogp_agent_latest.zip"
	fi
}

init() {
	RESTART="yes"
	AGENT="$AGENTDIR/ogp_agent.pl"
	TIMEOUT=10 # time to wait after a crash (in seconds)
	PID_FILE=""
	while test $# -gt 0; do
		case "$1" in
		"-pidfile")
			PID_FILE="$2"
			PID_FILE_SET=1
			echo $$ > $PID_FILE
			shift ;;			
		esac
		shift
	done

	if test ! -f "$AGENT"; then
		echo "ERROR: '$AGENT' not found, exiting"
		quit 1
	elif test ! -x "$AGENT"; then
		# Could try chmod but dont know what we will be
		# chmoding so just fail.
		echo "ERROR: '$AGENT' not executable, exiting"
		quit 1
	fi
}

syntax () {
	# Prints script syntax

	echo "Syntax:"
	echo "$0"
}

checkDepends() {
	CURL=`which curl 2>/dev/null`
	if test "$?" -gt 0; then
		echo "WARNING: Failed to locate curl binary."
	else
		echo "INFO: Located curl: $CURL"
	fi
	UNZIP=`which unzip 2>/dev/null`
	if test "$?" -gt 0; then
		echo "WARNING: Failed to locate unzip binary."
	else
		echo "INFO: Located unzip: $UNZIP"
	fi
}

update() {
	# Run the git update
	if test -n "$AUTO_UPDATE"; then
		if [ -f "$CURL" -a -x "$CURL" ] && [ -f "$UNZIP" -a -x "$UNZIP" ]; then
			cd $AGENTDIR
			if [ ! -d tmp ]; then
				mkdir tmp
			fi
			cd tmp
			REVISION=`curl -Lks https://github.com/${GitHubUsername}/${REPONAME}/commits/master.atom | grep -Eo "([a-f0-9]{40})" | head -n 1`
			curl -Os https://raw.githubusercontent.com/${GitHubUsername}/${REPONAME}/${REVISION}/bin/ogp_agent
			currentOGPAgentRunContent=$(cat "./ogp_agent")
			# Check to make sure ogp_agent downloaded successfully from GitHub before we attempt to replace it.
			# This should fix random 404 people have been experiencing
			if [ -s "./ogp_agent" ] && [ "$(echo "$currentOGPAgentRunContent" | head -n 1)" != "404: Not Found" ] && [ ! -z "$(echo "$currentOGPAgentRunContent" | grep "ogp_agent.pl")" ]; then
				diff ./ogp_agent /bin/ogp_agent &>/dev/null
				if test $? -ne 0; then
					cp -f ./ogp_agent /bin/ogp_agent &> /dev/null
					if test $? -eq 0; then
						cd /bin
						chmod ugo+x ogp_agent 2>/dev/null
						echo "`date`: The agent updater has been changed, relaunching..."
						rm -Rf tmp
						/bin/ogp_agent
						exit 0
					fi
				fi
			fi
			CURRENT=$(cat $AGENTDIR/Cfg/Config.pm | grep version | grep -Eo '[0-9a-f]{40}')
			if [ "$CURRENT" == "$REVISION" ]; then
				echo "The agent is up to date."
			else
				URL=https://github.com/${GitHubUsername}/${REPONAME}/archive/${REVISION}.zip
				HEAD=$(curl -L -Os --head -w "%{http_code}" "$URL")
				if [ "$HEAD" == "200" ]; then
					echo "Updating agent using curl."
					curl -L -s "$URL" -o "ogp_agent_latest.zip"
					if test $? -ne 0; then
						echo "`date`: curl failed to download the update package."
					else
						unzip -oq "ogp_agent_latest.zip"
						if test $? -ne 0; then
							echo "`date`: Unable to unzip the update package."
							ogpGitCleanup
						else
							cd ${REPONAME}-${REVISION}
							cp -avf OGP/* $AGENTDIR/. &> /dev/null
							CP_APP_RET=$?
							cp -avf bin/* /usr/bin/. &> /dev/null
							CP_BIN_RET=$?
							if [ $CP_APP_RET -ne 0 -o $CP_BIN_RET -ne 0 ]; then
								echo "`date`: The agent files cannot be overwritten."
								cd ..
								ogpGitCleanup
								echo "Agent update failed."
							else
								if test ! -e "$AGENTDIR/Cfg/Preferences.pm"; then
									cp -f Cfg/Preferences.pm $AGENTDIR/Cfg/Preferences.pm &> /dev/null
								fi
								echo "Fixing permissions..."
								chmod +x $AGENTDIR/ogp_agent.pl &> /dev/null
								chmod +x $AGENTDIR/agent_conf.sh &> /dev/null
								chmod +x /usr/bin/ogp_agent &> /dev/null
								cd ..
								ogpGitCleanup
								sed -i "s/version.*/version => '${REVISION}',/" $AGENTDIR/Cfg/Config.pm
								echo "Agent updated successfully."
							fi
						fi
					fi
				else
					echo "There is a update available (${REVISION}) but the download source is not ready.";
					echo "Try again later."
				fi
			fi
			
		else
			echo "Update failed."
		fi
	fi
	
	return 0
}
	
run() {
	# Runs the update and agent
	update
	if test -n "$RESTART" ; then
		echo "Agent will auto-restart if there is a crash."
		#loop forever
		while true
		do
			# Run
			cd $AGENTDIR
			./ogp_agent.pl
			echo "`date`: Agent restart in $TIMEOUT seconds"
			# don't thrash the hard disk if the agent dies, wait a little
			sleep $TIMEOUT
		done # while true
	else
		cd $AGENTDIR
		./ogp_agent.pl
	fi
}

quit() {
	# Exits with the give error code, 1
	# if none specified.
	# exit code 2 also prints syntax
	exitcode="$1"

	# default to failure
	if test -z "$exitcode"; then
		exitcode=1
	fi

	case "$exitcode" in
	0)
		echo "`date`: OGP Agent Quit" ;;
	2)
		syntax ;;
	*)
		echo "`date`: OGP Agent Failed" ;;
	esac

	# Remove pid file
	if test -n "$PID_FILE" && test -f "$PID_FILE" ; then
		# The specified pid file
		rm -f $PID_FILE
	fi

	# reset SIGINT and then kill ourselves properly
	trap - 2
	kill -2 $$
}

#####################
#   MAIN APP CODE   #
#####################

PATH=/usr/local/bin:/usr/bin:${PATH}

# Start PureFTPD if OGP has been configured to manage FTP users
if [ ! -z "$RUN_PUREFTPD" ] && [ "$RUN_PUREFTPD" == "yes" ]; then
	/usr/sbin/pure-ftpd.exe -S ${FTP_IP},${FTP_PORT} ${FTP_PASV_STRING} -lpuredb:/etc/pureftpd.pdb -g /var/run/pure-ftpd.pid &
fi

# Setup OGP and Read Preferences
setupOGPAndReadBashPrefs

# Initialise
init $*

# Run
run

# Quit normally
quit 0
