#!/bin/sh
# 
# Init script for vblade (ATA over Ethernet daemon)
# 
# chkconfig: - 30 70
# description: vblade AoE daemon
# 
# processname: vblade
# config: /etc/vblade.conf
# 
# Shamelessly hacked together from other init scripts (sshd, mostly)
# integrate vblade.init from Fedora's vblade-14-6.fc12.src.rpm
# 

RETVAL=0
prog=vblade

spawn_vblade() {
  ALLOWMACS=""
  [ -n "$5" ] && ALLOWMACS="-m $5"
  ID="$1-e$2.$3"
  if [ ! -d "/var/run/$prog" ]; then
    mkdir /var/run/$prog
  fi
  PID_FILE=/var/run/$prog/${ID}.pid
  $prog $ALLOWMACS $2 $3 $1 $4 >> /var/log/$prog.log 2>&1 &
  pid=$!
  RETVAL=$?
  echo $pid > $PID_FILE
  echo -n $"$4 (e$2.$3@$1) [pid $pid]"
  [ "$RETVAL" = 0 ] && echo "success" || echo "failure"
  echo
}

start() {
  local ret

  echo $"Starting up $prog: "
  
  #/var/lock/subsys/$prog exists?
  status $prog 2>&1 > /dev/null
  ret=$?

  if [ "$ret" = "2" ]; then
    echo "$prog dead but subsys locked"
    echo
    return 2
  else 
    if [ "$ret" = "0" ]; then
      #is running
      echo "already running"
      return 0
    fi
  fi

  if [ 0 -ne `grep -vc '^#\|^$' /etc/$prog.conf` ]
  then
    grep -v '^#' /etc/$prog.conf | sed -e 's/	/ /g' -e 's/  / /g' | while read line
    do
      spawn_vblade $line
    done
    touch /var/lock/subsys/$prog
  else
    echo -n "empty $prog.conf?"
    echo " passed"
    echo
  fi
}

stop() {
  echo -n $"Shutting down $prog: "
  for pidfile in `ls /var/run/$prog/*.pid 2>/dev/null`
  do
    kill -TERM `cat $pidfile`
    rm -f $pidfile
  done
  echo "success"
  echo
  rm -f /var/lock/subsys/$prog
}

__pids_var_run() {
        local base=${1##*/}
        local pid_file=${2:-/var/run/$base.pid}

        pid=
        if [ -f "$pid_file" ] ; then
                local line p

                while : ; do
                        read line
                        [ -z "$line" ] && break
                        for p in $line ; do
                                [ -z "${p//[0-9]/}" -a -d "/proc/$p" ] && pid="$pid $p"
                        done
                done < "$pid_file"

                if [ -n "$pid" ]; then
                        return 0
                fi
                return 1 # "Program is dead and /var/run pid file exists"
        fi
        return 3 # "Program is not running"
}

__pids_pidof() {
        pidof "$1" || pidof "${1##*/}"
}

status() {
        local base pid lock_file= pid_file=

        # Test syntax.
        if [ "$#" = 0 ] ; then
                echo $"Usage: status [-p pidfile] {program}"
                return 1
        fi
        if [ "$1" = "-p" ]; then
                pid_file=$2
                shift 2
        fi
        if [ "$1" = "-l" ]; then
                lock_file=$2
                shift 2
        fi
        base=${1##*/}

        # First try "pidof"
        __pids_var_run "$1" "$pid_file"
        RC=$?
        if [ -z "$pid_file" -a -z "$pid" ]; then
                pid="$(__pids_pidof "$1")"
        fi
        if [ -n "$pid" ]; then
                echo $"${base} (pid $pid) is running..."
                return 0
        fi

        case "$RC" in
                0)
                        echo $"${base} (pid $pid) is running..."
                        return 0
                        ;;
                1)
                        echo $"${base} dead but pid file exists"
                        return 1
                        ;;
        esac
        if [ -z "${lock_file}" ]; then
                lock_file=${base}
        fi
        # See if /var/lock/subsys/${lock_file} exists
        if [ -f /var/lock/subsys/${lock_file} ]; then
                echo $"${base} dead but subsys locked"
                return 2
        fi
        echo $"${base} is stopped"
        return 3
}

case "$1" in
	start)
		start
		;;
	stop)
		stop
		;;
	restart)
		stop
		start
		;;
	reload)
		# yes, this sucks, but the vblade processes die on SIGHUP
		stop
		start
		;;
	condrestart)
		if [ -f /var/lock/subsys/$prog ]; 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
