#!/bin/bash
#
# chkconfig: 345 90 10
# description: SLURMDBD is a database server interface for \
#              SLURM (Simple Linux Utility for Resource Management).
#
# processname: @sbindir@/slurmdbd
# pidfile: /var/run/slurmdbd.pid
#
# config: /etc/sysconfig/slurm
#
### BEGIN INIT INFO
# Provides:          slurmbd
# Required-Start:    $remote_fs $syslog $network munge
# Required-Stop:     $remote_fs $syslog $network munge
# Should-Start:      $named
# Should-Stop:       $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: SLURM database daemon
# Description:       Start slurm to provide database server for SLURM
### END INIT INFO

CONFDIR="@sysconfdir@"
LIBDIR="@libdir@"
SBINDIR="@sbindir@"

#Source function library.
if [ -f /etc/rc.status ]; then
   . /etc/rc.status
   SUSE=1
   STARTPROC=startproc

   rc_reset
else
   if [ ! -f /etc/rc.d/init.d/functions ]; then
      echo "Could not find /etc/rc.d/init.d/functions. Is some other daemon launch mechanism used?"
      exit 1
   fi
   . /etc/rc.d/init.d/functions
   SUSE=0
   STARTPROC=daemon

   function rc_status() {
      RETVAL=$?
   }
   function rc_exit () {
      exit $RETVAL
   }
   RETVAL=0
fi

# We can not use a starter program without losing environment
# variables that are critical on Blue Gene systems
if [ -d /bgl/BlueLight/ppcfloor ]; then
   STARTPROC=""
fi

# Source slurm specific configuration
# SLURMDBD_OPTIONS defines slurmdbd command line options. See "man slurmdbd"
if [ -f /etc/sysconfig/slurm ] ; then
    . /etc/sysconfig/slurm
else
    SLURMDBD_OPTIONS=""
fi

if [ ! -f $CONFDIR/slurmdbd.conf ]; then
   echo "Could not find $CONFDIR/slurmdbd.conf. Bad path?"
   exit 1
fi

# setup library paths for slurm and munge support
export LD_LIBRARY_PATH=$LIBDIR${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}

start() {
    prog=$1
    shift
    echo -n "starting $prog: "
    unset HOME MAIL USER USERNAME
    $STARTPROC $SBINDIR/$prog $SLURMDBD_OPTIONS
    rc_status -v
    echo
    touch /var/lock/subsys/slurmdbd
}

stop() {
    echo -n "stopping $1: "
    killproc $1 -TERM
    rc_status -v
    echo
    rm -f /var/lock/subsys/slurmdbd
}

slurmstatus() {
    local base=${1##*/}
    local pid
    local rpid
    local pidfile

    pidfile=`grep -i pidfile $CONFDIR/slurmdbd.conf | grep -v '^ *#'`
    if [ $? = 0 ]; then
	pidfile=${pidfile##*=}
	pidfile=${pidfile%#*}
	pidfile=${pidfile//\"/}
    else
	pidfile=/var/run/slurmdbd.pid
    fi

   pid=`pidof -o $$ -o $$PPID -o %PPID -x $1 || \
	 pidof -o $$ -o $$PPID -o %PPID -x ${base}`

    if [ -f $pidfile ]; then
	read rpid < $pidfile
	if [ "$rpid" != "" -a "$pid" != "" ]; then
	    for i in $pid ; do
		if [ "$i" = "$rpid" ]; then
		    echo $"${base} (pid $pid) is running..."
		    return 0
		fi
	    done
	elif [ "$rpid" != "" -a "$pid" = "" ]; then
		echo $"${base} dead but pid file exists"
		return 1
	fi

    fi

    if [ "$base" = "slurmdbd" -a "$pid" != "" ] ; then
	echo $"${base} (pid $pid) is running..."
	return 0
    fi

    echo $"${base} is stopped"

    return 3
}

#
# stop slurm daemons,
# wait for termination to complete (up to 10 seconds) before returning
#
slurmstop() {
	stop $1

	for i in 1 2 3 4
	do
		sleep $i
		slurmstatus $1
		if [ $? != 0 ]; then
			break
		fi
	done
}
#
# The pathname substitution in daemon command assumes prefix and
# exec_prefix are same.  This is the default, unless the user requests
# otherwise.
#
# Any node can be a slurm controller and/or server.
#
case "$1" in
    start)
	start slurmdbd
	;;
    stop)
	slurmstop slurmdbd
	;;
    status)
	slurmstatus slurmdbd
	rc_status -v
	;;
    restart)
	$0 stop
	$0 start
	;;
    condrestart)
	if [ -f /var/lock/subsys/slurm ]; then
		 stop slurmdbd
		 start slurmdbd
	fi
	;;
    reconfig|reload)
	echo -n $"Reloading slurmdbd daemon configuration: "
	killproc slurmdbd -HUP
	echo
	;;
    *)
	echo "Usage: $0 {start|stop|status|restart|condrestart|reconfig}"
	exit 1
	;;
esac

rc_exit
