#!/bin/bash /etc/rc.common

START=99
APP=seahub
EXTRA_HELP="	clearsessions	Clears expired sessions from database"
EXTRA_COMMANDS="clearsessions"

SEAHUB_FASTCGI=0
SEAHUB_PORT=8000
SEAHUB_METHOD=threaded
SEAHUB_WORKERS=3

[ -f /etc/config/seafile ] && \
	. /etc/config/seafile

INSTALLPATH=/usr/share/seafile/seafile-server
TOPDIR=$(dirname "${INSTALLPATH}")
default_ccnet_conf_dir=${TOPDIR}/ccnet
central_config_dir=${TOPDIR}/conf

manage_py=${INSTALLPATH}/seahub/manage.py
gunicorn_conf=${INSTALLPATH}/runtime/seahub.conf
pidfile=/var/run/seafile/seahub.pid
errorlog=${INSTALLPATH}/runtime/error.log
accesslog=${INSTALLPATH}/runtime/access.log
gunicorn_exe=/usr/bin/gunicorn

function check_python_executable() {
	if [[ "$PYTHON" != "" && -x $PYTHON ]]; then
		return 0
	fi

	if which python2.7 2>/dev/null 1>&2; then
		PYTHON=python2.7
	elif which python27 2>/dev/null 1>&2; then
		PYTHON=python27
	else
		echo
		echo "Can't find a python executable of version 2.7 or above in PATH"
		echo "Install python 2.7+ before continue."
		echo "Or if you installed it in a non-standard PATH, set the PYTHON enviroment varirable to it"
		echo
		exit 1
	fi
}

function validate_ccnet_conf_dir() {
	if [[ ! -d ${default_ccnet_conf_dir} ]]; then
		echo "Error: there is no ccnet config directory."
		echo "Have you run '/etc/init.d/seafile setup'?"
		echo ""
		exit 1
	fi
}

function read_seafile_data_dir() {
	seafile_ini=${default_ccnet_conf_dir}/seafile.ini
	if [[ ! -f ${seafile_ini} ]]; then
		echo "Error: ${seafile_ini} not found."
		exit 1
	fi
	seafile_data_dir=$(cat "${seafile_ini}")
	if [[ ! -d ${seafile_data_dir} ]]; then
		echo "Your seafile server data directory \"${seafile_data_dir}\" is invalid or doesn't exits."
		echo "Please check it first, or create this directory yourself."
		echo ""
		exit 1
	fi
}

function validate_seahub_running() {
	if pid=$(pgrep -f "${manage_py}" 2>/dev/null); then
		return 1
	elif pid=$(pgrep -f "seahub.wsgi:application" 2>/dev/null); then
		return 1
	fi
}

function validate_port() {
	if ! [[ ${SEAHUB_PORT} =~ ^[1-9][0-9]{1,4}$ ]] ; then
		printf "\033[033m${SEAHUB_PORT}\033[m is not a valid port number\n"
		exit 1
	fi
}

function warning_if_seafile_not_running() {
	if ! pgrep -f "seafile-controller -F ${central_config_dir}" 2>/dev/null 1>&2; then
		echo
		echo "Error: seafile-controller not running. Have you run \"/etc/init.d/seafile start\"?"
		echo
		exit 1
	fi
}

function prepare_seahub_log_dir() {
	logdir="${TOPDIR}/logs"
	if ! [[ -d "${logsdir}" ]]; then
		if ! mkdir -p "${logdir}"; then
		    echo "Error: failed to create log dir \"${logdir}\""
		    exit 1
		fi
	fi
	export SEAHUB_LOG_DIR="${logdir}"
}

function before_start() {
	prepare_env
	warning_if_seafile_not_running
	if ! validate_seahub_running; then
		echo "Seahub is already running."
		exit 1
	fi
	prepare_seahub_log_dir
	validate_port
}

function start_seahub() {
	before_start
	echo "Starting seahub at port ${SEAHUB_PORT} ..."
	check_init_admin
	$PYTHON $gunicorn_exe seahub.wsgi:application -c "${gunicorn_conf}" -b "0.0.0.0:${SEAHUB_PORT}" --preload

	# Ensure seahub is started successfully
	retry=1
	while ! validate_seahub_running && [[ ! -f "${pidfile}"  ]] && [[ $retry -lt 120 ]]; do sleep 1; ((retry++)); done
	if ! validate_seahub_running && [[ -f "${pidfile}" ]]; then
		echo
		echo "Seahub is started"
		echo
	else
		printf "\033[33mError: Seahub failed to start.\033[m\n"
		exit 1
	fi
}

function start_seahub_fastcgi() {
	before_start

	# Returns 127.0.0.1 if SEAFILE_FASTCGI_HOST is unset or hasn't got any value,
	# otherwise returns value of SEAFILE_FASTCGI_HOST environment variable
	address=`(test -z "$SEAFILE_FASTCGI_HOST" && echo "127.0.0.1") || echo $SEAFILE_FASTCGI_HOST`

	echo "Starting seahub (fastcgi) at ${address}:${SEAHUB_PORT} ..."
	check_init_admin
	$PYTHON "${manage_py}" runfcgi host=${address} port=${SEAHUB_PORT} pidfile=${pidfile} \
		outlog=${accesslog} errlog=${errorlog} maxchildren=${SEAHUB_WORKERS} method=${SEAHUB_METHOD}

	# Ensure seahub is started successfully
	retry=1
	while ! validate_seahub_running && [[ ! -f "${pidfile}"  ]] && [[ $retry -lt 120 ]]; do sleep 1; ((retry++)); done
	if ! validate_seahub_running && [[ -f "${pidfile}" ]]; then
		echo
		echo "Seahub is started"
		echo
	else
		printf "\033[33mError: Seahub failed to start.\033[m\n"
		exit 1
	fi
}

function prepare_env() {
	check_python_executable
	validate_ccnet_conf_dir
	read_seafile_data_dir

	export CCNET_CONF_DIR=${default_ccnet_conf_dir}
	export SEAFILE_CONF_DIR=${seafile_data_dir}
	export SEAFILE_CENTRAL_CONF_DIR=${central_config_dir}
	export PYTHONPATH="${INSTALLPATH}/seahub:${INSTALLPATH}/seahub/thirdpart:${PYTHONPATH}"
}

function clear_sessions() {
	prepare_env

	echo "Start clear expired session records ..."
	$PYTHON "${manage_py}" clearsessions

	echo
	echo "Done"
	echo
}

function stop_seahub() {
	if [[ -f ${pidfile} ]]; then
		pid=$(cat "${pidfile}")
		echo "Stopping seahub ..."
		kill ${pid}
		rm -f ${pidfile}
		retry=1
		while ! validate_seahub_running && [ $retry -lt 60 ]; do sleep 1; ((retry++)); done
		if ! validate_seahub_running; then
			echo "Error: seahub cannot be stopped. Please try stopping it manually by running \"kill $(echo "$pid" | tr '\n' ' ')\"."
			echo "To force killing the processes, use \"kill -9 $(echo "$pid" | tr '\n' ' ')\"."
		fi
	else
		echo "Seahub is not running"
	fi
}

function check_init_admin() {
	check_init_admin_script=${INSTALLPATH}/check_init_admin.py
	if ! $PYTHON $check_init_admin_script; then
		exit 1
	fi
}

function start() {
	if [ "$SEAHUB_FASTCGI" == "1" ]; then
		start_seahub_fastcgi
	else
		start_seahub
	fi
}

function stop() {
	stop_seahub
}

function restart() {
	stop
	start
}

function clearsessions() {
	clear_sessions
}
