#! /bin/bash

### BEGIN INIT INFO
# Provides:          oversip
# Required-Start:    $syslog $network $remote_fs
# Required-Stop:     $syslog $network $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start/stop OverSIP
# Description:       Start/stop OverSIP
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/var/lib/gems/1.9.1/bin
NAME=oversip
DESC=OverSIP
HOMEDIR=/var/run/$NAME
PIDFILE_NAME=$NAME.pid
RUN=no
RUBY_GEM=$NAME
RUBY_EXE=ruby1.9.1


. /lib/lsb/init-functions

# Debian LSB functions don't add \n in function log_begin_msg().
# In Ubuntu such function is overriden in /etc/lsb-base-logging.sh.
UBUNTU_LOGGING=0
[ -r /etc/lsb-base-logging.sh ] && UBUNTU_LOGGING=1

[ -r /etc/default/$NAME ] && . /etc/default/$NAME


# Checks for the start action.
if [ "$1" == "start" ] || [ "$1" == "restart" ] || [ "$1" == "force-reload" ] ; then

  # Ensure that the admin has set RUN=yes in /etc/default/$NAME file.
  if [ "$RUN" != "yes" ] ; then
    log_failure_msg "$DESC ($NAME) not yet configured. Set RUN=yes in /etc/default/$NAME."
    exit 0
  fi

  # Ensure Ruby executable is installed.
  which $RUBY_EXE >/dev/null
  if [ $? -ne 0 ] ; then
    log_failure_msg "ruby1.9.1 is not installed, exiting."
    log_end_msg 5
    exit 5
  fi

  # Check whether OverSIP Ruby Gem is installed and get the executable location.
  DAEMON=$(which $NAME)
  if [ $? -ne 0 ] ; then
    log_failure_msg "$DESC ($NAME): Ruby Gem '$RUBY_GEM' is not installed, exiting."

    case "$1" in
    status)
      # LSB - 4: program or service status is unknown.
      log_end_msg 4
      exit 4
      ;;
    *)
      # LSB - 5: program is not installed.
      log_end_msg 5
      exit 5
      ;;
    esac
  fi

fi


PIDFILE="${HOMEDIR}/${PIDFILE_NAME}"
OPTIONS="-P ${PIDFILE}"
if [ -n "$USER" ] ; then
 OPTIONS="${OPTIONS} -u ${USER}"
fi
if [ -n "$GROUP" ] ; then
 OPTIONS="${OPTIONS} -g ${GROUP}"
fi


check_homedir()
{
  # Create HOMEDIR directory in case it doesn't exist.
  # Useful in Ubuntu as /var/run/ content is deleted in shutdown.
  if [ ! -d $HOMEDIR ] ; then mkdir $HOMEDIR ; fi

  # Set the appropiate owner and group
  if [ -n "$USER" ] ; then chown ${USER} $HOMEDIR ; fi
  if [ -n "$GROUP" ] ; then chgrp ${GROUP} $HOMEDIR ; fi
}


# Return values:
# - 3: oversip is not running.
# - 0: oversip is running.
# - 1: oversip is not running but PID file exists.
get_status() {
  if [ ! -r "$PIDFILE" ]; then
    return 3
  fi
  if read pid < "$PIDFILE" && ps -p "$pid" > /dev/null 2>&1; then
    return 0
  else
    return 1
  fi
}


start() {
  set +e
  get_status
  case $? in
    0)  # Already running, do nothing.
      log_warning_msg "already running."
      exit 0
      ;;
    3)  # Not running, start it.
      ;;
    1)  # Not running but PID file exists, remove it and start.
      log_warning_msg "not running but PID file '$PIDFILE' exists, deleting it."
      rm "$PIDFILE"
      ;;
  esac

  start-stop-daemon --start --quiet --pidfile $PIDFILE --quiet \
    --exec $DAEMON -- $OPTIONS
  res=$?

  if [ $res -eq 0 ] ; then
    log_end_msg 0
    exit 0
  else
    if [ ! -r "$PIDFILE" ]; then
      log_failure_msg "error, failed to start."
      log_end_msg 1
      exit 1
    else
      log_failure_msg "error, failed to start (and PID file '$PIDFILE' exists)."
      log_end_msg 1
      exit 1
    fi
  fi
}


set -e

case "$1" in

  start)
    check_homedir
    log_daemon_msg "Starting $DESC ($NAME)"
    echo
    set +e

    start
    ;;

  stop)
    log_daemon_msg "Stopping $DESC ($NAME)"
    echo
    set +e

    start-stop-daemon --oknodo --stop --pidfile $PIDFILE --quiet \
      --name $NAME
    res=$?

    if [ $res -eq 0 ] ; then
      log_end_msg 0
      # Posix MQueue for syslogging is created with owner root (to ensure
      # rlimits and so) so it cannot be deleted by a non root user when
      # stopping the server. This command removes the mqueue when performing
      # the "stop" action.
      $DAEMON --remove-mqueue "/${NAME}_syslogger" 2>/dev/null
      exit 0
    else
      log_failure_msg "error, failed to stop."
      log_end_msg 1
      exit 1
    fi
    ;;

  restart|force-reload)
    log_daemon_msg "Restarting $DESC ($NAME)"
    echo
    set +e

    start-stop-daemon --oknodo --stop --pidfile $PIDFILE --retry=5 --quiet \
      --name $NAME

    if [ $? -ne 0 ] ; then
      log_failure_msg "error, failed to stop."
      log_end_msg 1
      exit 1
    fi

    check_homedir
    start
    ;;

  status)
    set +e
    get_status
    case $? in
      3)  # Not running.
        log_begin_msg "$DESC ($NAME) is not running."
        [ $UBUNTU_LOGGING -eq 0 ] && echo
        exit 3
        ;;
      0)  # Running.
        log_begin_msg "$DESC ($NAME) is running."
        [ $UBUNTU_LOGGING -eq 0 ] && echo
        exit 0
        ;;
      1)  # Not running but PID file exists.
        log_warning_msg "$DESC ($NAME) is not running but PID file '$PIDFILE' exists."
        exit 1
        ;;
    esac
    ;;

  *)
    log_failure_msg "Usage: /etc/init.d/$NAME {start|stop|restart|force-reload|status}."
    exit 1
    ;;

esac