#!/bin/sh
### BEGIN INIT INFO
# Provides: glite-lb-bkserverd
# Description: L&B server daemon
# Short-Description: L&B server daemon
# Required-Start: $remote_fs $network $syslog
# Required-Stop: $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
# chkconfig: - 75 25
#
# Copyright (c) Members of the EGEE Collaboration. 2004-2010.
# See http://www.eu-egee.org/partners/ for details on the copyright holders.
# 
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# 
#     http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

GLITE_LOCATION=${GLITE_LOCATION:-'@glite_prefix@'}
GLITE_LOCATION_ETC=${GLITE_LOCATION_ETC:-'@glite_etc@'}
GLITE_JP_LOCATION=${GLITE_JP_LOCATION:-$GLITE_LOCATION}
GLITE_USER=${GLITE_USER:-'glite'}
GLITE_HOME=`getent passwd ${GLITE_USER} | cut -d: -f6`
GLITE_HOST_CERT=${GLITE_HOST_CERT:-"$GLITE_HOME/.certs/hostcert.pem"}
GLITE_HOST_KEY=${GLITE_HOST_KEY:-"$GLITE_HOME/.certs/hostkey.pem"}

KRB5_KTNAME="FILE:$GLITE_HOME/krb5kt_lb"
KRB5CCNAME="FILE:$GLITE_HOME/krb5cc_lb"
LOG4C_RCPATH="$GLITE_LOCATION_ETC/glite-lb"

[ -f /etc/profile.d/grid-env.sh ] && . /etc/profile.d/grid-env.sh
[ -f /etc/glite.conf ] && . /etc/glite.conf
[ -f $GLITE_LOCATION_ETC/glite-wms.conf ] && . $GLITE_LOCATION_ETC/glite-wms.conf
[ -f @defaultdir@/glite-lb ] && . @defaultdir@/glite-lb
[ -f $HOME/.glite.conf ] && . $HOME/.glite.conf

[ -n "$GLITE_LB_SERVER_PIDFILE" ] && BK_PIDFILE=$GLITE_LB_SERVER_PIDFILE ||
	BK_PIDFILE=/var/run/glite/glite-lb-bkserverd.pid
[ -n "$GLITE_JP_IMPORTER_PIDFILE" ] && jp_importer_pidfile=$GLITE_JP_IMPORTER_PIDFILE ||
	jp_importer_pidfile=/var/run/glite/glite-jp-importer.pid

GLITE_LB_TYPE=${GLITE_LB_TYPE:-'server'} # server, proxy, both
GLITE_LB_NOTIF_SOCK=${GLITE_LB_NOTIF_SOCK:-'/var/run/glite/glite-lb-notif.sock'}
GLITE_LB_PROXY_SOCK=${GLITE_LB_PROXY_SOCK:-'/var/run/glite/glite-lb-proxy.sock'}

PROXY_IL_PIDFILE=/var/run/glite/glite-lb-proxy-interlogd.pid
NOTIF_IL_PIDFILE=/var/run/glite/glite-lb-notif-interlogd.pid

msgconf="$GLITE_LOCATION_ETC/glite-lb/msg.conf"
if [ -f "$msgconf" ]; then
	GLITE_LB_NOTIF_IL_OTHER_OPTIONS="$GLITE_LB_NOTIF_IL_OTHER_OPTIONS -F $msgconf"
	GLITE_LB_SERVER_OTHER_OPTIONS="$GLITE_LB_SERVER_OTHER_OPTIONS -F $msgconf"
fi

lockfile=/var/lock/glite-lb-bkserverd

unset creds env bkargs notifargs

start_daemon()
{
	local name="$1"
	local pidfile="$2"
	local cmd="$3"
	local stale="$4"

	if [ -f "$pidfile" ]; then
		if ps p `cat $pidfile` >/dev/null 2>&1; then
			return 0
		fi
		echo "Warning: stale $pidfile for $name"
		rm -f "$pidfile"
		if [ -n "$stale" ]; then
			for file in $stale; do
				echo "Warning: stale $file for $name"
				rm -f "$file"
			done
		fi
	fi
	echo -n "Starting $name ..."
	su - $GLITE_USER -c "$env $cmd"

	if [ $? -eq 0 ]; then
		echo " done"
		touch $lockfile
	else
		echo " FAILED"
	fi
}

stop_daemon()
{
	name="$1"
	local pidfile="$2"

	if [ -f "$pidfile" ]; then
		pid=`cat "$pidfile"`
		echo -n Stopping $name \($pid\) ...
		kill $pid
		try=0
		while ps p $pid >/dev/null 2>&1; do 
			sleep 1;
			try=`expr $try + 1`
			if [ $try = 20 ]; then
				kill -9 $pid
				echo " force quit after $try retries"
				rm -f $lockfile
				return 1
			fi
	 	done
		echo " done"
		rm -f $lockfile
		rm -f $pidfile
	else
		echo $name not running
		return 1
	fi
}

status_daemon()
{
	local name="$1"
	local pidfile="$2"
	local enabled="$3"

	if [ -f "$pidfile" ]; then
		pid=`cat "$pidfile"`
		if ps p $pid >/dev/null 2>&1; then
			echo "$name running as $pid"
		else
			echo "$name not running (stale pidfile)"
			return 1
		fi
	else
		if test -n "$enabled" -a x"$enabled" = x"0"; then
			echo "$name not running (disabled)"
			return 0
		else
			echo "$name not running"
			return 1
		fi
	fi

	return 0
}

start()
{
	if [ -n "$LOG4C_RCPATH" ]; then env="$env LOG4C_RCPATH='$LOG4C_RCPATH'"; fi
	if [ -n "$KRB5_KTNAME" ]; then env="$env KRB5_KTNAME='$KRB5_KTNAME'"; fi
	if [ -n "$KRB5CCNAME" ]; then env="$env KRB5CCNAME='$KRB5CCNAME'"; fi

	if [ -n "$GLITE_HOST_CERT" -a -n "$GLITE_HOST_KEY" ]; then
		env="$env X509_USER_CERT=$GLITE_HOST_CERT X509_USER_KEY=$GLITE_HOST_KEY"
		creds=1
	fi

	if test -z "$creds"; then
		if su - $GLITE_USER -c "test -r /etc/grid-security/hostkey.pem -a -r /etc/grid-security/hostcert.pem"; then
			echo "$0: WARNING: /etc/grid-security/hostkey.pem readable by $GLITE_USER"
			env="$env X509_USER_CERT=/etc/grid-security/hostcert.pem X509_USER_KEY=/etc/grid-security/hostkey.pem"
			creds=1
		fi
	fi

	[ -z "$creds" ] && echo $0: WARNING: No credentials specified. Using default lookup which is dangerous. >&2

	policy="$GLITE_LOCATION_ETC/glite-lb/glite-lb-authz.conf"
	lcas_log="LCAS_LOG_FILE='/var/log/glite/glite-lb-server-lcas.log' LCAS_ETC_DIR='$GLITE_LOCATION_ETC/glite-lb'"
	if test -f "$policy"; then
		# lcas not enabled by default yet
		policy="--policy '$policy'"
	else
		unset policy
		unset lcas_log
	fi

	[ -z "$GLITE_LB_EXPORT_DUMPDIR" ] && GLITE_LB_EXPORT_DUMPDIR=$GLITE_HOME/dump
	dumpdir="--dump-prefix $GLITE_LB_EXPORT_DUMPDIR"
	[ -d "$GLITE_LB_EXPORT_DUMPDIR" ] || mkdir -p "$GLITE_LB_EXPORT_DUMPDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_DUMPDIR"

	[ -z "$GLITE_LB_EXPORT_PURGEDIR" ] && GLITE_LB_EXPORT_PURGEDIR=$GLITE_HOME/purge
	purgedir="--purge-prefix $GLITE_LB_EXPORT_PURGEDIR"
	[ -d "$GLITE_LB_EXPORT_PURGEDIR" ] || mkdir -p "$GLITE_LB_EXPORT_PURGEDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_PURGEDIR"

	if [ x"$GLITE_LB_EXPORT_ENABLED" = x"true" ]; then
		if [ ! -x $GLITE_JP_LOCATION/bin/glite-jp-importer ]; then
			echo "glite-jp-importer needed for export to Job Provenace, install glite-jp-client package too."
			exit 1
		fi

		# registrations
		[ -z "$GLITE_LB_EXPORT_JPREG_MAILDIR" ] && GLITE_LB_EXPORT_JPREG_MAILDIR=/var/spool/glite/jpreg
		jpreg_maildir="--reg-mdir $GLITE_LB_EXPORT_JPREG_MAILDIR"
		lbreg_maildir="--jpreg-dir $GLITE_LB_EXPORT_JPREG_MAILDIR"
		[ -d "$GLITE_LB_EXPORT_JPREG_MAILDIR" ] || mkdir -p "$GLITE_LB_EXPORT_JPREG_MAILDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_JPREG_MAILDIR"

		# dumps
		[ -z "$GLITE_LB_EXPORT_JPDUMP_MAILDIR" ] && GLITE_LB_EXPORT_JPDUMP_MAILDIR=/var/spool/glite/jpdump
		jpdump_maildir="--dump-mdir $GLITE_LB_EXPORT_JPDUMP_MAILDIR"
		[ -d "$GLITE_LB_EXPORT_JPDUMP_MAILDIR" ] || mkdir -p "$GLITE_LB_EXPORT_JPDUMP_MAILDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_JPDUMP_MAILDIR"

		# sandboxes
		[ -z "$GLITE_LB_EXPORT_SANDBOX_MAILDIR" ] && GLITE_LB_EXPORT_SANDBOX_MAILDIR=/var/spool/glite/sandbox
		sandbox_maildir="--sandbox-mdir $GLITE_LB_EXPORT_SANDBOX_MAILDIR"
		[ -d "$GLITE_LB_EXPORT_SANDBOX_MAILDIR" ] || mkdir -p "$GLITE_LB_EXPORT_SANDBOX_MAILDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_SANDBOX_MAILDIR"

		# target Job Provenance
		[ -n "$GLITE_LB_EXPORT_JPPS" ] && jpps="--jpps $GLITE_LB_EXPORT_JPPS"
	fi

	[ -n "$GLITE_LB_SERVER_PORT" ] && bkargs="$bkargs -p $GLITE_LB_SERVER_PORT"
	[ -n "$GLITE_LB_SERVER_WPORT" ] && bkargs="$bkargs -w $GLITE_LB_SERVER_WPORT"
	if [ -n "$GLITE_LB_NOTIF_SOCK" ]; then
		bkargs="$bkargs --notif-il-sock=$GLITE_LB_NOTIF_SOCK"
		notifargs="$notifargs -s $GLITE_LB_NOTIF_SOCK"
	fi
	if [ -n "$GLITE_LB_NOTIF_FPREFIX" ]; then
		bkargs="$bkargs --notif-il-fprefix=$GLITE_LB_NOTIF_FPREFIX"
		notifargs="$notifargs -f $GLITE_LB_NOTIF_FPREFIX"
	fi
	if [ -n "$GLITE_LB_SERVER_DEBUG" ] ; then
		GLITE_LB_SERVER_OTHER_OPTIONS="$GLITE_LB_SERVER_OTHER_OPTIONS -d -s 1 >> $GLITE_HOME/lb.log 2>&1 &"
		GLITE_LB_NOTIF_OTHER_OPTIONS="$GLITE_LB_NOTIF_OTHER_OPTIONS -v -d >> $GLITE_HOME/notif-il.log 2>&1 &"
	fi
	if [ -n "$GLITE_LB_PROXY_SOCK" ]; then
		bkproxy="--proxy-il-sock $GLITE_LB_PROXY_SOCK"
		ilproxy="-s $GLITE_LB_PROXY_SOCK"
	fi
	if [ -n "$GLITE_LB_PROXY_FPREFIX" ]; then
		bkproxy="$bkproxy --proxy-il-fprefix $GLITE_LB_PROXY_FPREFIX"
		ilproxy="$ilproxy -f $GLITE_LB_PROXY_FPREFIX"
	fi
	case "$GLITE_LB_TYPE" in
	proxy)
		bkproxy="-P $bkproxy"
		;;
	both)
		bkproxy="-B $bkproxy"
		;;
	*)
		bkproxy=''
		;;
	esac

	start_daemon glite-lb-bkserver "$BK_PIDFILE" "$lcas_log $GLITE_LOCATION/bin/glite-lb-bkserverd \
		$super -i $BK_PIDFILE $bkargs $dumpdir $purgedir $lbreg_maildir $bkproxy $policy\
		$GLITE_LB_SERVER_OTHER_OPTIONS" "/tmp/lb_proxy_serve.sock /tmp/lb_proxy_store.sock"

	if test -x $GLITE_LOCATION/bin/glite-lb-notif-interlogd; then
		start_daemon glite-lb-notif-interlogd "$NOTIF_IL_PIDFILE" "$GLITE_LOCATION/bin/glite-lb-notif-interlogd \
			-i $NOTIF_IL_PIDFILE -M 10485760 \
			$notifargs \
			$GLITE_LB_NOTIF_IL_OTHER_OPTIONS" "$GLITE_LB_NOTIF_SOCK"
	else
		echo Warning: glite-lb-notif-interlogd not installed, LB notifications will not work
	fi

	if test x"$GLITE_LB_EXPORT_ENABLED" = x"true" ; then
		start_daemon glite-jp-importer "$jp_importer_pidfile" "\
		LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GLITE_JP_LOCATION/lib \
		$GLITE_JP_LOCATION/bin/glite-jp-importer \
			-i $jp_importer_pidfile $jpreg_maildir $jpdump_maildir $sandbox_maildir \
			$jpps $GLITE_JP_IMPORTER_ARGS"
	fi

	if test x"$GLITE_LB_TYPE" = x"proxy" -o x"$GLITE_LB_TYPE" = x"both" ; then
		if test -x $GLITE_LOCATION/bin/glite-lb-proxy-interlogd; then
			start_daemon glite-lb-proxy-interlogd "$PROXY_IL_PIDFILE" "$GLITE_LOCATION/bin/glite-lb-proxy-interlogd \
				-i $PROXY_IL_PIDFILE $ilproxy \
				$GLITE_LB_PROXY_IL_OTHER_OPTIONS" "$GLITE_LB_PROXY_SOCK"
		else
			echo Warning: glite-lb-proxy-interlogd not installed, logging to LB proxy will not work
		fi
	fi
}

stop()
{
	stop_daemon "glite-lb-notif-interlogd" $NOTIF_IL_PIDFILE

	stop_daemon "glite-lb-bkserverd" $BK_PIDFILE
	stop_daemon "glite-jp-importer" $jp_importer_pidfile

	stop_daemon "glite-lb-interlogd" $PROXY_IL_PIDFILE

	# for L&B <= 2.0
	LC_ALL=C
	if netstat -an --unix | grep "^unix .* LISTEN.* $GLITE_LB_NOTIF_SOCK" >/dev/null 2>&1 ;then
		killall -9 glite-lb-notif-interlogd
	fi
	if netstat -an --unix | grep "^unix .* LISTEN.* $GLITE_LB_PROXY_SOCK" >/dev/null 2>&1 ;then
		killall -9 glite-lb-interlogd
	fi
}

status()
{
	retval=0
	proxy=0
	jp=0
	test x"$GLITE_LB_TYPE" = x"proxy" -o x"$GLITE_LB_TYPE" = x"both" \
		&& proxy=1
	test x"$GLITE_LB_EXPORT_ENABLED" = x"true" && jp=1

	status_daemon "glite-lb-notif-interlogd" "$NOTIF_IL_PIDFILE" \
		|| retval=1
	status_daemon "glite-lb-interlogd for proxy" "$PROXY_IL_PIDFILE" \
		$proxy || retval=1
	status_daemon "glite-lb-bkserverd" "$BK_PIDFILE" \
		|| retval=1
	status_daemon "glite-jp-importer" "$jp_importer_pidfile" $jp \
		|| retval=1

	return $retval
}

# upgrade from lb.server <= 3.0.1 (L&B <= 4.0.1)
if [ -f /var/glite/glite-lb-bkserverd.pid -a ! -f $BK_PIDFILE ]; then cp -vp /var/glite/glite-lb-bkserverd.pid /var/run/glite; fi
if [ -f /var/glite/glite-lb-notif-interlogd.pid -a ! -f $NOTIF_IL_PIDFILE ]; then cp -vp /var/glite/glite-lb-notif-interlogd.pid /var/run/glite; fi
if [ -f /var/glite/glite-lb-proxy-interlogd.pid -a ! -f $PROXY_IL_PIDFILE ]; then cp -vp /var/glite/glite-lb-proxy-interlogd.pid /var/run/glite; fi

case x$1 in
	xstart)	start;;
	xstop)	stop;;
	xrestart|xforce-reload) stop; start;;
	xstatus) status;;
	xcondrestart|xtry-restart)
		status 2>/dev/null | grep 'running as' >/dev/null 2>&1 || exit 0
		stop; start
		;;
	x*)	echo usage: $0 start,stop,restart,status >&2
		exit 1;;
esac
