#!/bin/sh

# Girar builder service
#
# chkconfig: 2345 54 26
# description: Girar builder service
#
# processname: gb-toplevel-build
# pidfile: /var/run/girar-builder/builder-$REPO.pid

WITHOUT_RC_COMPAT=1

# Source function library.
. /etc/init.d/functions-gb

HOME=/var/lib/girar-builder
USER=girar-builder
NAME=girar-builder
PIDFILEDIR=/var/run/girar-builder
REPOSITORIES=/etc/girar-builder/repositories
STOPDIR=/etc/girar-builder/stop
LOCKFILE=/var/lock/subsys/gb
BUILDER=/usr/libexec/girar-builder/gb-toplevel-build
BUILDERNAME=gb-toplevel-build
COMMITER=/usr/libexec/girar-builder/gb-toplevel-commit
COMMITERNAME=gb-toplevel-commit

# Source config.
SourceIfNotEmpty /etc/sysconfig/$NAME

RETVAL=0
REPOLIST=$(cat $REPOSITORIES)

start_builder()
{
	local REPO=$1
	start_script_daemon --background --pidfile "$PIDFILEDIR/builder-$REPO.pid" --lockfile "$LOCKFILE-builder-$REPO" --name $BUILDERNAME-$REPO --displayname $BUILDERNAME-$REPO --user "$USER" -- "$BUILDER" $REPO
	RETVAL=$?
}

stop_builder()
{
	local REPO=$1
	stop_daemon --displayname "$BUILDERNAME-$REPO" --pidfile "$PIDFILEDIR/builder-$REPO.pid" --lockfile "$LOCKFILE-builder-$REPO" -- /bin/sh
	RETVAL=$?
}

status_builder()
{
	local REPO=$1
	status --displayname $BUILDERNAME-$REPO --pidfile "$PIDFILEDIR/builder-$REPO.pid" -- /bin/sh
	RETVAL=$?
}

start_commiter()
{
	local REPO=$1
	start_script_daemon --background --pidfile "$PIDFILEDIR/commiter-$REPO.pid" --lockfile "$LOCKFILE-commiter-$REPO" --name $COMMITERNAME-$REPO --displayname $COMMITERNAME-$REPO --user "$USER" -- "$COMMITER" $REPO
	RETVAL=$?
}

stop_commiter()
{
	local REPO=$1
	stop_daemon --displayname "$COMMITERNAME-$REPO" --pidfile "$PIDFILEDIR/commiter-$REPO.pid" --lockfile "$LOCKFILE-commiter-$REPO" -- /bin/sh
	RETVAL=$?
}

status_commiter()
{
	local REPO=$1
	status --displayname $COMMITERNAME-$REPO --pidfile "$PIDFILEDIR/commiter-$REPO.pid" -- /bin/sh
	RETVAL=$?
}

restart_builder()
{
	local REPO=$1
	stop_builder $REPO
	start_builder $REPO
}

restart_commiter()
{
	local REPO=$1
	stop_commiter $REPO
	start_commiter $REPO
}

start()
{
	for R in $REPOLIST; do
		rm -f $STOPDIR/$USER-$R
		start_builder $R
		start_commiter $R
	done

	return $RETVAL
}

stop()
{
	for R in $REPOLIST; do
		stop_builder $R
		stop_commiter $R
	done

	return $RETVAL
}

condstop()
{
	for R in $REPOLIST; do
		if [ -e "$LOCKFILE-builder-$R" ]; then
			stop_builder $R
		fi
		if [ -e "$LOCKFILE-commiter-$R" ]; then
			stop_commiter $R
		fi
	done

	return $RETVAL
}

restart()
{
	stop
	start
}

condrestart()
{
	for R in $REPOLIST; do
		local builder_restart=
		local commiter_restart=
		if [ -e "$LOCKFILE-builder-$R" ]; then
			stop_builder $R
			builder_restart=1
		fi
		if [ -e "$LOCKFILE-commiter-$R" ]; then
			stop_commiter $R
			commiter_restart=1
		fi
		if [ -n "$builder_restart" ]; then
			start_builder $R
		fi
		if [ -n "$commiter_restart" ]; then
			start_commiter $R
		fi
	done
}

status_list()
{
	for R in $REPOLIST; do
		status_builder $R
		status_commiter $R
	done
}

CMD=$1
if [ $# -gt 1 ]; then
	shift
	REPOLIST=
	for R in "$@"; do
		if grep -q "^$R\$" $REPOSITORIES; then
			REPOLIST="$REPOLIST $R"
		else
			echo "Repository $R not exists at $REPOSITORIES"
			exit 1
		fi
	done
fi

# See how we were called.
case "$CMD" in
	start)
		start
		;;
	start-builder)
		start_builder "$1"
		;;
	start-commiter)
		start_commiter "$1"
		;;
	stop)
		stop
		;;
	stop-builder)
		stop_builder "$1"
		;;
	stop-commiter)
		stop_commiter "$1"
		;;
	restart|reload)
		restart
		;;
	restart-builder)
		restart_builder "$1"
		;;
	restart-commiter)
		restart_commiter "$1"
		;;
	condstop)
		condstop
		;;
	condrestart|condreload)
		condrestart
		;;
	status)
		status_list
		;;
	*)
		msg_usage "${0##*/} {start|stop|restart|reload|condstop|condrestart|condreload|status}"
		RETVAL=1
esac

exit $RETVAL
