#!/bin/bash
#
# start/stop cyphesis-cpp game server
#
### BEGIN INIT INFO
# Provides: cyphesis-cpp
# Required-Start: $syslog $remote_fs
# Required-Stop: $syslog $remote_fs
# Should-Start: postgresql
# Should-Stop: postgresql
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Game-Server of the WorldForge project
# Description: Game-Server of the WorldForge project
### END INIT INFO

if ! [ -f /etc/cyphesis/cyphesis.vconf ]; then
	exit 0
fi

if ! [ -x /usr/bin/cyphesis ]; then
	exit 0
fi

. /lib/lsb/init-functions

CYPHESISUSER=cyphesis
POSTGRESUSER=postgres

start() {
	log_daemon_msg "Starting Cyphesis game server" "cyphesis"

	# Ensure that the system PostgreSQL database user exists
	if ! su $POSTGRESUSER -s /bin/sh -c true >/dev/null 2>&1; then
		RET=$?
		log_progress_msg "cannot find system PostgreSQL database user $POSTGRESUSER"
		log_end_msg $RET
	fi

	# Ensure PostgreSQL is running
	if ! su $POSTGRESUSER -s /bin/sh -c "psql -c \"\" template1" >/dev/null 2>&1; then
		RET=$?
		log_progress_msg "PostgreSQL server is not running"
		log_end_msg $RET
	fi

	# Ensure that the system Cyphesis user exists
	if ! su $CYPHESISUSER -s /bin/sh -c true >/dev/null 2>&1; then
		RET=$?
		log_progress_msg "cannot find system Cyphesis user $CYPHESISUSER"
		log_end_msg $RET
	fi

	# Ensure that the system Cyphesis user has a PostgreSQL account
	if ! su $CYPHESISUSER -s /bin/sh -c "psql -c \"\" template1" >/dev/null 2>&1; then
		log_progress_msg "creating PostgreSQL account for user $CYPHESISUSER..."
		if ! su $POSTGRESUSER -s /bin/sh -c "createuser -d -R -S --no-password $CYPHESISUSER" >/dev/null 2>&1; then
			RET=$?
			log_progress_msg "cannot create PostgreSQL account for user $CYPHESISUSER"
			log_end_msg $RET
		fi
	fi

	# Ensure that the Cyphesis database exists
	if ! su $CYPHESISUSER -s /bin/sh -c "psql -c \"\" cyphesis" >/dev/null 2>&1; then
		log_progress_msg "creating PostgreSQL database for user $CYPHESISUSER..."
		if ! su $CYPHESISUSER -s /bin/sh -c "createdb --no-password $CYPHESISUSER" >/dev/null 2>&1; then
			RET=$?
			log_progress_msg "cannot create PostgreSQL database for user $CYPHESISUSER"
			log_end_msg $RET
		fi
	fi

	# Load and refresh database rules
	log_progress_msg "loading and refreshing Cyphesis database rules..."
	if ! su $CYPHESISUSER -s /bin/sh -c "cyloadrules" >/dev/null 2>&1; then
		RET=$?
		log_progress_msg "cannot load rules into $CYPHESISUSER database"
		log_end_msg $RET
	fi

	log_progress_msg "spawning daemon..."
	mkdir -p --mode=775 /var/log/cyphesis/ || true
	chown cyphesis /var/log/cyphesis/
	mkdir -p --mode=775 /run/cyphesis/ || true
	chown cyphesis /run/cyphesis/
	if start-stop-daemon --start --quiet --oknodo --chuid $CYPHESISUSER --exec /usr/bin/cyphesis -- --cyphesis:daemon=true 2>/dev/null; then
		log_progress_msg "spawned"
		log_end_msg 0
	else
		log_progress_msg "failed"
		log_end_msg $?
	fi
}

stop() {
	log_daemon_msg "Stopping Cyphesis game server"
	start-stop-daemon --stop --quiet --oknodo --exec /usr/bin/cyphesis
	log_end_msg $?
}

case "$1" in
	start)
		start
		;;
	stop)
		stop
		;;
	reload)
		$0 restart
		;;
	force-reload)
		$0 restart
		;;
	restart)
		$0 stop
		$0 start
		;;
	try-restart)
		start-stop-daemon --status --quiet --oknodo --exec /usr/bin/cyphesis
		RET=$?
		case $RET in
			0)
				stop
				start
				;;
			1)
				rm /run/cyphesis/cyphesis.pid
				;&
			3)
				return 0
				;;
			*)
				log_daemon_msg "Unable to determine Cyphesis game server status"
				log_end_msg $RET
				;;
		esac
		;;
	status)
		/usr/bin/cycmd localhost stat
		log_end_msg $?
		;;
	*)
		echo "Usage: invoke-rc.d cyphesis-cpp {start|stop|reload|force-reload|restart|try-restart|status}"
		exit 1
		;;
esac

exit $?
