#! /bin/sh
### BEGIN INIT INFO
# Provides:          skiacorrectness
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start correctness.
# Description:       Web server for Skia correctness monitoring.
### END INIT INFO

# Author: Joe Gregorio <jcgregorio@google.com>
# Adapted for skiacorrectness by Stephan Altmueller <stephana@google.com>
#
# Copied from /etc/init.d/skeleton and modified only the following
# environment variables and updated the start-stop-daemon calls
# in do_start() to add --make-pidfile, --background, and --chuid.

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="The Skia correctness application."
NAME=skiacorrectness
DATA_DIR="/mnt/pd0/data"
SHARED_DIR="/usr/local/share/skiacorrectness"
APP_DIR="$SHARED_DIR/app"
RESOURCE_DIR="$SHARED_DIR"
IMAGE_STORE="$DATA_DIR/imageStore"
STORAGE_DIR="$DATA_DIR/datastore"
DATABASE_CONFIG="--db_host=<<REPLACE_DATABASE_HOST>> --db_name=<<REPLACE_DATABASE_NAME>>"
GS_CONFIG="--gs_bucket=<<REPLACE_GS_BUCKET>>"
REDIRECT_URL="<<REPLACE_REDIRECT_URL>>"
N_COMMITS_CONFIG="--n_commits=<<REPLACE_N_COMMITS>>"
ADD_FLAGS="<<REPLACE_ADD_FLAGS>>"
DAEMON=/usr/local/bin/$NAME
DAEMON_ARGS="--port=:8001 --log_dir=/var/log/logserver --tile_store_dir=$DATA_DIR/tileStore3 --static_dir=$APP_DIR --image_dir=$IMAGE_STORE --storage_dir=$STORAGE_DIR --redis_host=localhost:6379 --oauth_cache_file=$DATA_DIR/correctness-google_storage_token.data --resources_dir=$RESOURCE_DIR $DATABASE_CONFIG --redirect_url=$REDIRECT_URL $GS_CONFIG $N_COMMITS_CONFIG $ADD_FLAGS"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
	# Return
	#   0 if daemon has been started
	#   1 if daemon was already running
	#   2 if daemon could not be started
	start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON --make-pidfile --background --chuid default --test > /dev/null \
		|| return 1

	start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON --make-pidfile --background --chuid default --exec $DAEMON -- \
		$DAEMON_ARGS \
		|| return 2
	# Add code here, if necessary, that waits for the process to be ready
	# to handle requests from services started subsequently which depend
	# on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
	# Return
	#   0 if daemon has been stopped
	#   1 if daemon was already stopped
	#   2 if daemon could not be stopped
	#   other if a failure occurred
	start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
	RETVAL="$?"
	[ "$RETVAL" = 2 ] && return 2
	# Wait for children to finish too if this is a daemon that forks
	# and if the daemon is only ever run from this initscript.
	# If the above conditions are not satisfied then add some other code
	# that waits for the process to drop all resources that could be
	# needed by services started subsequently.  A last resort is to
	# sleep for some time.
	start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
	[ "$?" = 2 ] && return 2
	# Many daemons don't delete their pidfiles when they exit.
	rm -f $PIDFILE
	return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
	#
	# If the daemon can reload its configuration without
	# restarting (for example, when it is sent a SIGHUP),
	# then implement that here.
	#
	start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
	return 0
}

#
# Function to starts the daemon in the foreground and enables logging to
# standard error. For debugging only.
#
do_debug() {
	# This will run intil the user interrupts it on the command line.
	CMD="$DAEMON $DAEMON_ARGS --logtostderr"
	echo $CMD
	sudo -u default $CMD
}

case "$1" in
  start)
	[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
	do_start
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  stop)
	[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
	do_stop
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  status)
	status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
	;;
  #reload|force-reload)
	#
	# If do_reload() is not implemented then leave this commented out
	# and leave 'force-reload' as an alias for 'restart'.
	#
	#log_daemon_msg "Reloading $DESC" "$NAME"
	#do_reload
	#log_end_msg $?
	#;;
  restart|force-reload)
	#
	# If the "reload" option is implemented then remove the
	# 'force-reload' alias
	#
	log_daemon_msg "Restarting $DESC" "$NAME"
	do_stop
	case "$?" in
	  0|1)
		do_start
		case "$?" in
			0) log_end_msg 0 ;;
			1) log_end_msg 1 ;; # Old process is still running
			*) log_end_msg 1 ;; # Failed to start
		esac
		;;
	  *)
		# Failed to stop
		log_end_msg 1
		;;
	esac
	;;
  # debug
  debug)
	do_debug
	;;
  *)
	#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
	echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload|debug}" >&2
	exit 3
	;;
esac

:
