#! /bin/sh
# This script can be used to start/stop smsd
# as a daemon in Linux, Solaris, Cygwin, FreeBSD
# and MAC OS X Terminal window (Darwin).
# This script is to be used with smsd version >= 3.0.3. 

### BEGIN INIT INFO
# Provides:          smstools
# Required-Start:    $syslog
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts smstools
### END INIT INFO

# Set USER and GROUP, if necessary:
USER=""
GROUP=""

# If an unpriviledged user is selected, make sure that next two
# files are writable by that user:
PIDFILE="/var/run/smsd.pid"
INFOFILE="/var/run/smsd.working"
# Logfile can also be defined in here:
LOGFILE="/var/log/smsd.log"

DAEMON=/usr/local/bin/smsd
# A program which turns power off for couple of seconds:
RESETMODEMS=/usr/local/bin/smsd_resetmodems
NAME=smsd
PSOPT="-e"
ECHO=echo
case `uname` in
  *BSD|Darwin)
    PSOPT="axc"
    ;;
  SunOS)
    ECHO=/usr/ucb/echo
    ;;
esac

# Maximum time to stop smsd, after that it gets killed hardly:
MAXWAIT=45

case "$1" in
  start)
	test -x $DAEMON || exit 0
	$ECHO -n "Starting SMS Daemon: "
	MSG="."
	ARGS="-n MAINPROCESS -p$PIDFILE -i$INFOFILE"
	[ "x$USER" != x ] && ARGS="$ARGS -u$USER"
	[ "x$GROUP" != x ] && ARGS="$ARGS -g$GROUP"
	[ "x$LOGFILE" != x ] && ARGS="$ARGS -l$LOGFILE"
	PID=`cat $PIDFILE 2>/dev/null`
	if [ "x$PID" != x ]; then
	  if kill -0 $PID 2>/dev/null; then
	    MSG=" already running ($PID)."
	  else
	    PID=""
	  fi
	fi
	if [ "x$PID" = x ]; then
	  if ps $PSOPT | grep $NAME | grep -v grep >/dev/null; then
	    MSG=" already running."
	  else
	    $DAEMON $ARGS
	    sleep 1
	    PIDS=`ps $PSOPT | grep $NAME | grep -v grep`
	    [ "x$PIDS" = x ] && MSG=" failed."
	  fi
	fi
	echo "$NAME$MSG"
	;;

  stop)
	if ps $PSOPT | grep $NAME | grep -v grep >/dev/null; then
	  PID=`cat $PIDFILE 2>/dev/null`
	  if [ "x$PID" != x ]; then
	    P=`kill -0 $PID 2>/dev/null`
	    [ "x$P" != x ] && PID=""
	  fi
	  if [ "x$PID" != x ]; then
	    kill $PID
	  else
	    kill `ps $PSOPT | grep $NAME | grep -v grep | awk '{print $1}'` >/dev/null 2>&1
	  fi
	  sleep 1
	  if ps $PSOPT | grep $NAME | grep -v grep >/dev/null; then
	    echo "Allowing $NAME to terminate gracefully within $MAXWAIT seconds"
	    infofound=0
	    dots=0
	    seconds=0
	    while ps $PSOPT | grep $NAME | grep -v grep >/dev/null; do
	      if [ $infofound -lt 1 ]; then
	        if [ -f $INFOFILE ]; then
	          infofound=1
	          if [ $dots -gt 0 ]; then
	            echo ""
	            dots=0
	          fi
	          $ECHO -n "$NAME is currently "
	          cat $INFOFILE
	          echo "Time counting is now disabled and we will wait until this job is complete."
	          echo "If you are very hasty, use \"$0 force-stop\" to kill $NAME hardly (not recommended)."
	        fi
	      fi
	      [ $infofound -lt 1 ] && seconds=`expr $seconds + 1`
	      $ECHO -n "."
	      dots=`expr $dots + 1`
	      if [ "$seconds" -ge $MAXWAIT ]; then
	        if [ $dots -gt 0 ]; then
	          echo ""
	          dots=0
	        fi
	        echo "Timeout occured, killing $NAME hardly."
	        kill -9 `ps $PSOPT | grep $NAME | grep -v grep | awk '{print $1}'` >/dev/null 2>&1
	        [ -f $PIDFILE ] && rm $PIDFILE
	        seconds=0
	      fi
	      sleep 1
	    done
	    [ $dots -gt 0 ] && echo ""
	    #echo "$NAME is stopped."
	  fi
	fi
	;;

  restart|reload)
	$0 stop
	$0 start
	;;

  force-stop)
	if ps $PSOPT | grep $NAME | grep -v grep >/dev/null; then
	  echo "Killing $NAME."
	  kill -9 `ps $PSOPT | grep $NAME | grep -v grep | awk '{print $1}'` >/dev/null 2>&1
	fi
	[ -f $PIDFILE ] && rm $PIDFILE
	;;

  reset)
	$0 stop
	[ -f "$RESETMODEMS" ] && "$RESETMODEMS"
	sleep 30
	$0 start
	;;

  *)
	echo "Usage: $0 {start|stop|restart|force-stop|reset}"
	exit 1
esac
