#!/bin/sh -e
#
# $Header$

### BEGIN INIT INFO
# Provides:		orange
# Required-Start:	$all
# Required-Stop:	$sshd
# Default-Start:	2 3 4 5
# Default-Stop:		0 1 6
# Short-Description:	Orange Crawler
### END INIT INFO

. /lib/lsb/init-functions

export PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"

name=$(basename $(realpath $0))

orange_cfg_file="/etc/default/${name}"
if [ -f $orange_cfg_file ]; then
	. $orange_cfg_file
fi

: ${orange_user:="crawler"}
: ${orange_dir:="/Berkanavt/orange"}
: ${orange_release_dir:="${orange_dir}/release"}
: ${orange_command:="${orange_release_dir}/start.py"}
: ${orange_cfg:="${orange_dir}/orange.cfg"}
: ${orange_flags_start:="-f ${orange_cfg} --setlive=all --from=release"}
: ${orange_flags_stdstart:="-f ${orange_cfg} --setlive=std --from=release"}
: ${orange_flags_stop:="-f ${orange_cfg} --fullstop"}
: ${orange_flags_status:="-f ${orange_cfg} --check"}
: ${orange_safe_timeout:=15}

usage()
{
	log_action_msg "Usage: ${name} (start|stop|restart|stdrestart|status)"
	exit 1
}

# Are we running from init?
run_by_init() {
    ([ "$previous" ] && [ "$runlevel" ]) || [ "$runlevel" = S ]
}

orange_ctl()
{
	local _mode _doit _flags _info_msg

	_mode="$1"
	
	if [ -z "${_mode}" ]; then
		log_failure_msg "Internal error: mode is not defined !"
		return 1
	fi

	if [ ! -d $orange_dir ]; then
		log_failure_msg "Directory ${orange_dir} doesn't exist !"
		return 1
	fi

	case "${_mode}" in
	start)
		_flags="${orange_flags_start}"
		_info_msg="Starting ${name}."
		;;
	stdrestart)
		_flags="${orange_flags_stdstart}"
		_info_msg="Starting ${name} (std mode)."
		;;
	stop)
		_flags="${orange_flags_stop}"
		_info_msg="Stopping ${name}."
		;;
	status)
		_flags="${orange_flags_status}"
		_info_msg=""
		;;
	esac

	_doit="test -s /etc/default/${name}.env && { set -a ; . /etc/default/${name}.env ; } ; cd ${orange_dir} && ${orange_command} ${_flags}"
	if run_by_init; then
		# Orange node must known its hostname to start applications.
		# Now hostname can be obtained just by reverse DNS request so
		# we need network working at the moment of starting orange.
		_doit="sleep ${orange_safe_timeout}; ${_doit}"
	fi
	if [ -n "${orange_user}" ]; then
		_doit="su -l ${orange_user} -c \"${_doit}\""
	fi

	if [ -n "${_info_msg}" ]; then
		log_success_msg "${_info_msg}"
	fi

	if ! eval "${_doit}"; then
		if [ "${_mode}" != "status" ]; then
			log_failure_msg "Can't do \"${name} ${_mode}\" !"
		fi
		return 1
	fi

	return 0
}

case "$1" in
start|stop|stdrestart|status)
	orange_ctl $1
	;;
restart)
	orange_ctl stop
	orange_ctl start
	;;
*)
	usage
	;;
esac

