#!/bin/sh
#
# $Header$
#

# PROVIDE: orange
# REQUIRE: LOGIN sshd
# KEYWORD: shutdown

# -----------------------------------------------------------------------------
#
# This script supports running multiple components of orange.
# To run additional component link this script to something like
# % ln -s orange foo
# and define additional foo_* variables in one of
# /etc/rc.conf, /etc/rc.conf.local or /etc/rc.conf.d/foo
#
# Below NAME should be substituted with the name of this script. By default
# it is orange, so read as orange_enable. If you linked the script to
# foo, then read as foo_enable etc.
#
# NAME_enable="NO"		# set to YES to enable component NAME
#

. /etc/rc.subr

case "$0" in
/etc/rc*)
	# during boot (shutdown) $0 is /etc/rc (/etc/rc.shutdown),
	# so get the name of the script from $_file
	name=$(basename "$_file" .sh)
	;;
*)
	name=$(basename "$0" .sh)
	;;
esac

rcvar=$(set_rcvar)

load_rc_config "$name"

eval ": \${${name}_enable=\"NO\"}"
eval ": \${${name}_limits=\"NO\"}"
eval ": \${${name}_user=\"crawler\"}"
eval ": \${${name}_dir=\"/Berkanavt/orange\"}"
eval ": \${${name}_release_link=\"release\"}"
eval ": \${${name}_release_dir=\"\${${name}_dir}/\${${name}_release_link}\"}"
eval ": \${${name}_cfg_dir=\"\${${name}_release_dir}/config\"}"
eval ": \${${name}_cfg=\"\${${name}_dir}/orange.cfg\"}"
eval ": \${${name}_flags=\"-f \${${name}_cfg} --setlive=all --from=\${${name}_release_link}\"}"
eval ": \${${name}_flags_std=\"-f \${${name}_cfg} --setlive=std --from=\${${name}_release_link}\"}"

orange_enable="$(eval echo \${${name}_enable})"
orange_limits="$(eval echo \${${name}_limits})"
orange_user="$(eval echo \${${name}_user})"
orange_dir="$(eval echo \${${name}_dir})"
orange_release_link="$(eval echo \${${name}_release_link})"
orange_release_dir="$(eval echo \${${name}_release_dir})"
orange_cfg_dir="$(eval echo \${${name}_cfg_dir})"
orange_cfg="$(eval echo \${${name}_cfg})"
orange_flags="$(eval echo \${${name}_flags})"
orange_flags_std="$(eval echo \${${name}_flags_std})"

orange_limits_args="-e -U ${orange_user}"

command="${orange_cfg_dir}/start.py"
command_args="${orange_flags}"
command_interpreter="python"
default_procname=$(realpath ${orange_cfg_dir}/watchdog.py)

required_dirs="${orange_dir}"

start_precmd="orange_prestart"
stop_precmd="orange_prestop"
stop_cmd="orange_stop"
extra_commands="stdrestart check rebuild"
stdrestart_precmd="orange_prestdrestart"
stdrestart_cmd="orange_stdrestart"
check_precmd="cd ${orange_dir}"
check_cmd="${command} -f ${orange_cfg} --check"
rebuild_cmd="orange_rebuild"

get_orange_procname()
{
	local _cfg_dir_mask _bn_cmd _cmd_mask _cmd_rp_mask _pos_procname _pids

	_cfg_dir_mask=$(echo ${orange_cfg_dir} | \
		sed -e "s,/${orange_release_link}/,/*/,")
	_bn_cmd=$(basename $default_procname)

	_cmd_mask="${_cfg_dir_mask}/${_bn_cmd}"
	_cmd_rp_mask=$(realpath ${_cmd_mask})

	for _pos_procname in $_cmd_mask $_cmd_rp_mask; do
		_pids=$(check_process $_pos_procname $command_interpreter)
		if [ -n "${_pids}" ]; then
			procname="${_pos_procname}"
			return 0
		fi
	done

	: ${procname:=${default_procname}}
}

orange_prestart()
{
	PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
	export PATH

	cd $orange_dir

	if checkyesno orange_limits; then
		eval $(/usr/bin/limits ${orange_limits_args}) 2>/dev/null
	else
		return 0
	fi
}

orange_prestop()
{
	PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
	export PATH

	cd ${orange_dir}
}

orange_stop()
{
	if [ -z "$rc_pid" ]; then
		[ -n "$rc_fast" ] && return 0
		_run_rc_notrunning
		return 1
	fi

	echo "Stopping ${name}."
	if ! $command --fullstop; then
		return 1
	fi
	return 0
}

orange_prestdrestart()
{
	orange_prestart
}

orange_stdrestart()
{
	echo "Starting ${name}."
	_doit="$command $orange_flags_std"
	if [ -n "$_user" ]; then
		_doit="su -m $_user -c 'sh -c \"$_doit\"'"
	fi
	_run_rc_doit "$_doit" || return 1
}

orange_rebuild()
{
	run_rc_command stop
	while gmirror status -s | grep -qE "DEGRADED.*\([0-9]+%\)"; do
		sleep 5
	done
	run_rc_command start
}

get_orange_procname

run_rc_command "$1"
