#!/bin/bash
# Etersoft, 2011
# 2010 (c) Devaev Maxim <mdevaev@etersoft.ru>
# 2011 (c) Evgeny Sinelnikov <sin@etersoft.ru>
#
# rtorrent - init script for autorun rtorrent on boot
#
#####

# chkconfig: 235 98 55
# description: Shared rtorrent daemon
#
### BEGIN INIT INFO
# Provides: rtorrentd
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Shared rtorrent daemon
### END INIT INFO


WITHOUT_RC_COMPAT="1"
. /etc/rc.d/init.d/functions

[ -r "/etc/sysconfig/network" ] && . /etc/sysconfig/network
[ "$NETWORKING" == "no" ] && exit

[ -r "/etc/sysconfig/rtorrent" ] && . /etc/sysconfig/rtorrent
for var in RTORRENTD_USER RTORRENTD_DOWNLOADS RTORRENTD_SESSION RTORRENTD_TMP; do
	[ -n "`eval echo \\$"$var"`" ] || { echo "Variable \$$var is not defined"; exit 1; }
done

SESSION_NAME=rtorrent
PROGRAM_NAME=/usr/bin/rtorrent

#####
rtorrentd_start()
{
	echo -n "Starting rtorrentd: "

	get_rtorrent_pid
	if [ -z "$rtorrent_pid" ]; then
		rm -rf "$RTORRENTD_SESSION/$SESSION_NAME.lock"
	else
		passed; echo
		exit 0
	fi

	if [ -n "$RTORRENT_SOCKET" ]; then
		RTORRENT_OPTIONS="$RTORRENT_OPTIONS -O scgi_local=\"$RTORRENT_SOCKET\""
		rm -f "$RTORRENT_SOCKET"
	elif [ -n "$RTORRENT_PORT" ]; then
		RTORRENT_OPTIONS="$RTORRENT_OPTIONS -O scgi_port=\"$RTORRENT_PORT\""
	fi

	RTORRENT_OPTIONS="$RTORRENT_OPTIONS -d \"$RTORRENTD_DOWNLOADS\" -s \"$RTORRENTD_SESSION\""

	if [ -f "$RTORRENT_CONFIG" ]; then
		RTORRENT_OPTIONS="$RTORRENT_OPTIONS -O try_import=\"$RTORRENT_CONFIG\""
	fi

	su - "$RTORRENTD_USER" -c "SCREENDIR=\"$RTORRENTD_TMP/screen\" /usr/bin/screen -qS \
		$SESSION_NAME -wipe"

	su - "$RTORRENTD_USER" -c "SCREENDIR=\"$RTORRENTD_TMP/screen\" /usr/bin/screen -dmS \
		$SESSION_NAME $PROGRAM_NAME -n $RTORRENT_OPTIONS"
	RETVAL="$?"
	if start_wait 5; then
		if [ -n "$RTORRENT_SOCKET" ]; then
			[ -z "$RTORRENT_SOCKET_OWNER" ] || chown "$RTORRENT_SOCKET_OWNER" "$RTORRENT_SOCKET"
			[ -z "$RTORRENT_SOCKET_PERMISSIONS" ] || chmod "$RTORRENT_SOCKET_PERMISSIONS" "$RTORRENT_SOCKET"
		fi
	else
		screen_try_stop
		RETVAL=255
	fi

	if [ "$RETVAL" == "0" ]; then
		success; echo
	else
		failure; echo;
		if [ "$RETVAL" == "255" ]; then
			screen_try_stop
		fi
		exit 1
	fi
}

print_wait()
{
	printf 'Waiting for %1s seconds' "$1"
	sleep 1
	printf "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b                      \b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"
}

start_wait()
{
	for (( i=$1; $i>0; i=(($i-1)) )); do
		get_rtorrent_pid
		[ -z "$rtorrent_pid" ] || return 0
		print_wait $i
	done
	return 255
}

stop_wait()
{
	for (( i=$1; $i>0; i=(($i-1)) )); do
		get_rtorrent_pid
		[ -n "$rtorrent_pid" ] || return 0
		print_wait $i
	done
	return 255
}

rtorrentd_enter()
{
	echo "Enter to rtorrentd"

	su - "$RTORRENTD_USER" -c "SCREENDIR=\"$RTORRENTD_TMP/screen\" /usr/bin/screen -mrS $SESSION_NAME"
}

rtorrentd_try_stop()
{
	echo -n "Stopping rtorrentd: "

	get_rtorrent_pid
	if [ -n "$rtorrent_pid" ]; then
		kill "$rtorrent_pid"
		RETVAL="$?"
	fi
	if ! stop_wait 5; then
		RETVAL=255
	fi
}

screen_try_stop()
{
	echo -n "Stopping screen: "

	su - "$RTORRENTD_USER" -c "SCREENDIR=\"$RTORRENTD_TMP/screen\" /usr/bin/screen -qmrS \
		$SESSION_NAME -X quit" 2>/dev/null
	SCREEN_STOP_RETVAL="$?"
	if [ "$SCREEN_STOP_RETVAL" == "0" ]; then
		success; echo
	else
		passed; echo
	fi
}

rtorrentd_stop()
{
	screen_try_stop
	rtorrentd_try_stop

	if [ "$RETVAL" == "0" -a -n "$rtorrent_pid" ]; then
		success; echo
	else
		if [ "$SCREEN_STOP_RETVAL" == "0" ]; then
			passed; echo;
		else
			failure; echo;
			exit 1
		fi
	fi

}

rtorrentd_condstop()
{
	screen_try_stop
	rtorrentd_try_stop

	if [ "$RETVAL" == "0" -a -n "$rtorrent_pid" ]; then
		success; echo
	else
		passed; echo
	fi

}

rtorrentd_restart()
{
	rtorrentd_condstop
	rtorrentd_start
}

get_rtorrent_pid()
{
	rtorrent_pid=
	if [ -f "$RTORRENTD_SESSION/$SESSION_NAME.lock" ]; then
		local lock_file=$(cat $RTORRENTD_SESSION/$SESSION_NAME.lock)
		local pid=${lock_file#*:+}
		if [ -n "$pid" ]; then
			rtorrent_pid=`ps "-au$RTORRENTD_USER" 2>/dev/null | awk '{print $1}' | grep "$pid"`
		fi
	fi
}

rtorrentd_status()
{
	get_rtorrent_pid
	if [ -n "$rtorrent_pid" ]; then
		echo "rtorrent is running at $rtorrent_pid"
	else
		rtorrent_pid=`ps "-au$RTORRENTD_USER" 2>/dev/null | grep "$PROGRAM_NAME" | awk '{print $1}' | head -1`
		if [ -n "$rtorrent_pid" ]; then
			echo "session pid not active, but rtorrent process running with pid $rtorrent_pid";
			exit 2
		fi

		echo "rtorrent is not running";
		exit 1
	fi
}


#####
case "$1" in
	"start") rtorrentd_start;;
	"stop") rtorrentd_stop;;
	"restart") rtorrentd_restart;;
	"status") rtorrentd_status;;
	"enter") rtorrentd_enter;;
	*) msg_usage "${0##*/} {start|stop|restart|status|enter}"; exit 1;;
esac

