#!/bin/bash
#
# Init file for the NorduGrid gridftp-server
#
# chkconfig: 2345 55 25
# description: GridFtp Server
#
# processname: gridftp-server
# config: /etc/gridftp-server.conf
# config: /opt/nordugrid/etc/gridftp-server.conf
# pidfile: /var/run/gridftp-server.pid

# source function library
. /etc/rc.d/init.d/functions

RETVAL=0

export NORDUGRID_LOCATION=${NORDUGRID_LOCATION:-/opt/nordugrid}

# gridftp-server requires GLOBUS_LOCATION to be set too
export GLOBUS_LOCATION=${GLOBUS_LOCATION:-/opt/globus}

# change these values if pbs location is different than in case of installation
export PBS_BIN_PATH=${PBS_BIN_PATH:-/usr/bin}
export PBS_LOG_PATH=${PBS_LOG_PATH:-/var/spool/pbs/server_logs}

export TMP_DIR=${TMP_DIR:-/tmp}

export GNU_TIME="${GNU_TIME:-/usr/bin/time}"

export NODENAME="${NODENAME:-/bin/hostname -f}"

export RUNTIME_CONFIG_DIR=${RUNTIME_CONFIG_DIR:-}

GFS_USER=${GFS_USER:-""}
GFS_PORT=${GFS_PORT:-2811}

SWITCH_USER=yes
if [ '0' != `id -u` ] ; then 
  GFS_USER=`id -un`
  SWITCH_USER=
fi

if [ -z "$GFS_CONFIG" ] ; then
  GFS_CONFIG=/etc/gridftp-server.conf
  if [ ! -r "$GFS_CONFIG" ]; then
    GFS_CONFIG=$NORDUGRID_LOCATION/etc/gridftp-server.conf
  fi
fi
if [ ! -r "$GFS_CONFIG" ]; then
  echo "Missing configuration file"
  exit 1
fi

GFS_CONNECTIONS=${GFS_CONNECTIONS:-}

export LD_LIBRARY_PATH=$NORDUGRID_LOCATION/lib:$GLOBUS_LOCATION/lib
unset X509_USER_CERT
unset X509_USER_KEY
unset X509_USER_PROXY
unset X509_SERVER_CERT
unset X509_SERVER_KEY
export X509_RUN_AS_SERVER=1

prog=gridftp-server

PID_FILE=/var/run/$prog.pid
LOCKFILE=/var/lock/subsys/$prog
LOGFILE=/var/log/$prog.log

if [ ! -z "$GFS_USER" ] ; then
  mkdir -p "$NORDUGRID_LOCATION/var"
  PID_FILE="$NORDUGRID_LOCATION/var/$prog.pid"
  LOCKFILE="$NORDUGRID_LOCATION/var/$prog"
  LOGFILE="$NORDUGRID_LOCATION/var/$prog.log"
  export X509_USER_CERT="$GLOBUS_LOCATION/etc/hostcert.pem"
  export X509_USER_KEY="$GLOBUS_LOCATION/etc/hostkey.pem"
  export X509_CERT_DIR="$GLOBUS_LOCATION/share/certificates"
  export GRIDMAP="$GLOBUS_LOCATION/etc/grid-mapfile"
fi

start()
{
  echo -n "Starting $prog    "
  if [ ! -x $NORDUGRID_LOCATION/bin/gridftp-server ] ; then
    echo "Missing executable"
    exit 1
  fi
  
  CMD="$NORDUGRID_LOCATION/bin/gridftp-server"
  if [ ! -z "$GFS_PORT" ] ; then
    CMD="$CMD -p $GFS_PORT"
  fi
  if [ ! -z "$GFS_CONFIG" ] ; then
    CMD="$CMD -c $GFS_CONFIG"
  fi
  if [ ! -z "$GFS_CONNECTIONS" ] ; then
    CMD="$CMD -n $GFS_CONNECTIONS"
  fi
  
#        ulimit -c 0

  if [ ! -z "$GFS_USER" ] && [ ! -z "$SWITCH_USER" ] ; then 
    su - $GM_USER -c "$CMD 1>>$LOGFILE 2>&1 &"
    echo $! > ${PID_FILE}
    RETVAL=$?
  else 
    $CMD 1>>$LOGFILE 2>&1 &
    echo $! > ${PID_FILE}
    RETVAL=$?
  fi
  
  [ "$RETVAL" = 0 ] && success

  [ "$RETVAL" = 0 ] && touch $LOCKFILE

  echo
}

stop()
{
  echo -n "Stopping $prog"

  if [ -f $PID_FILE ] ; then
    kill `cat $PID_FILE` && success "$prog shutdown" || failure "$prog shutdown"
    rm -f $PID_FILE $LOCKFILE
  else
    failure "$prog shutdown"
  fi

  echo
}

case "$1" in
  	start)
		start
		;;
	stop)
		stop
		;;
	restart|reload)
		stop
		start
		;;
	condrestart)
		if [ -f $LOCKFILE ] ; then
			stop
			# avoid race
			sleep 3
			start
		fi
		;;
	status)
		status $prog
		RETVAL=$?
		;;
	*)
		echo "Usage: $0 {start|stop|restart|reload|condrestart|status}"
		RETVAL=1
esac
exit $RETVAL
