#!/bin/sh

yawsdir="/usr/lib/erlang/lib/yaws-1.80"
vardir="/var/"
erl="/usr/bin/erl"
run_erl="/usr/lib/erlang/bin//run_erl"
to_erl="/usr/lib/erlang/bin//to_erl"

case `uname` in
    CYGWIN*)
        yawsdir=`cygpath -m $yawsdir`
        werl=""
        delim=/;;
    *)
        delim=/
esac


ENV_PGM=`which env`



help()
{
    echo "usage:  "
    echo ""
    echo
    echo "       yaws -i | --interactive       -- interactive (no daemon) mode"
    echo "       yaws -w | --winteractive      -- cygwin interactive (werl) "
    echo "       yaws --daemon                 -- daemon mode"

    echo ""

    echo ""
    echo "       Auxiliary flags for the daemon: "
    echo "            --id Id          --  set system id"
    echo "            --debug          --  debug mode "
    echo "            --conf File      --  set config file"
    echo "            --tracetraf      --  trace traffic"
    echo "            --tracehttp      --  trace http traffic"
    echo "            --traceout       --  trace output to stdout"
    echo "            --version        --  print version"
    echo "            --pa path        --  add load path"
    echo "            --mnesiadir dir  --  start Mnesia in dir"
    echo "            --proto_dist Mod --  use Mod for distrib"
    echo "            --sname xxx      --  start with sname xxx"
    echo "            --name xxx       --  start with name xxx"
    echo "            --runmod mod     --  call mod:start/0 at startup"
    echo "            --heart          --  auto restart yaws if it crashes"
    echo "            --erlarg X       --  pass argument X to $erl"
    echo "            --setcookie X    --  set an erlang cookie"
    echo "            --run_erl X      --  use run_erl with pipe-id X"
    echo "            --to_erl X       --  connect to pipe-id X"
    echo "            --disable-kpoll  --  pass +K false to erlang"
    echo ""

    echo "ctl functions ... "
    echo "        yaws --hup [--id ID]                 -- hup the daemon, reload conf"
    echo "        yaws --stop [--id ID]                -- stop the daemon "
    echo "        yaws --debug-dump [--id ID]          -- produce a debug dump "
    echo "        yaws --status [--id ID]              -- query the daemon status "
    echo "        yaws --load Modules                  -- load modules "
    echo "        yaws --ls                            -- list Yaws nodes and their status"
    echo "        yaws --ctltrace traffic|http         -- toggle trace of running daemon"
    echo "        yaws --check YawsFile [IncDirs]      -- test compile File "
    echo "        yaws --wait-started[=secs] [--id ID] -- wait for daemon to be ready"
    exit 1
}



debug="";
daemon="";
interactive="";
trace="";
conf="";
runmod="";
sname="";
heart="";
xpath="";
mnesia="";
id="default";
pdist=""
erlarg=""
kpoll=true
call_wait_started=""
program=$0

wait_started() {
    i=0
    count=$1
    while [ $i -lt $count ]; do
        sleep 1
        i=`expr $i + 1`
        ${program}  --id ${id} --status 2>&1 > /dev/null
        if [ $? = 0 ]; then
            exit 0
        fi
    done
    echo "No yaws system responding for id=${id}"
    exit 1
}


now=`date -u +%s`
if [ "$HEART" = true ]; then
    # we were restarted by heart, make sure we haven't reached our restart count
    # if we get 5 restarts within 60 seconds, we exit completely
    timediff=`expr $now - $YAWS_HEART_START`
    if [ $timediff -le 60 ]; then
        if [ $YAWS_HEART_RESTARTS -eq 5 ]; then
            echo 5 restarts attempted within 60 seconds, exiting
            exit 1
        else
            # we haven't reached the restart max count yet, but we're still
            # within the 60 second window so increment the counter
            # but keep the same start time
            restarts=`expr $YAWS_HEART_RESTARTS + 1`
            starttime=$YAWS_HEART_START
        fi
    else
        # the previous restart was outside our 60 second window,
        # so reset both the start time and the restart counter
        restarts=1
        starttime=$now
    fi
else
    restarts=1
    starttime=$now
fi
HEART_COMMAND="${ENV_PGM} HEART=true YAWS_HEART_RESTARTS=$restarts YAWS_HEART_START=$starttime $program "${1+"$@"}
export HEART_COMMAND

while [ $# -gt 0 ]
  do
  arg=$1
  shift;
  case $arg in
      -i|--interactive)
          interactive="true";
          debug=" -yaws debug ";
          daemon="";;
      -w|--winteractive)
          interactive="true";
          debug=" -yaws debug ";
          daemon="";
          erl=$werl;;
      -D|--daemon)
          daemon=" -detached ";;
      --wait-started=*)
          call_wait_started=`echo $arg | sed -e 's/--wait-started=//'`;;
      --wait-started)
          call_wait_started=6;;
      -d|--debug)
          debug=" -boot start_sasl -yaws debug ";;
      -t|--tracetraf)
          trace=" -yaws trace traffic ";;
      -T|--tracehttp)
          trace=" -yaws trace http ";;
      -I|--id)
          id=$1
          shift;;
      -x|--traceout)
          traceoutput=" -yaws traceoutput ";;
      --trace)
          traceoutput=" -yaws traceoutput ";
          trace=" -yaws trace traffic ";;
      -M|--mnesiadir)
          mnesia=" -mnesia dir '\"$1\"' -run mnesia start"
          shift;;
      -c|--conf)
          conf=" -conf $1 "
          shift;;
      -pa|--pa)
          xpath=" ${xpath} -pa $1 "
          shift;;
      -r|--runmod)
          runmod=" -runmod $1 "
          shift;;
      -h|--hup)
          ex="$erl -noshell -pa ${yawsdir}${delim}ebin -s yaws_ctl hup";;
      -s|--stop)
          ex="$erl -noshell -pa ${yawsdir}${delim}ebin -s yaws_ctl stop";;
      -ls|--ls)
          ex="$erl -noshell -pa ${yawsdir}${delim}ebin -s yaws_ctl ls";;
      -S|--status)
          ex="$erl -noshell -pa ${yawsdir}${delim}ebin -s yaws_ctl status";;
      -load|--load)
          $erl -noshell -pa ${yawsdir}${delim}ebin -s yaws_ctl load ${id} $*
          exit 0;;
      --debug-dump)
          $erl -noshell -pa ${yawsdir}${delim}ebin -s yaws_ctl debug_dump ${id}
          exit 0;;
      -j|--ctltrace)
          ex="$erl -noshell -pa ${yawsdir}${delim}ebin -s yaws_ctl trace $1"
          shift;;
      -v|--version)
          exec $erl -noshell -pa ${yawsdir}${delim}ebin -s yaws printversion;
          exit 0;;
      --sname|-sname)
          sname=" -sname $1 "
          shift;;
      -name|--name)
          sname=" -name $1 "
          shift;;
      --disable-kpoll)
          kpoll=false;;
      -heart|--heart)
          heart=" -heart ";;
      -proto_dist|--proto_dist)
          pdist=" -proto_dist $1 "
          shift;;
      -setcookie|--setcookie)
          erlarg="$erlarg -setcookie $1 "
          shift;;
      -erlarg|--erlarg)
          erlarg="$erlarg $1 "
          shift;;
      -check|--check)
          mkdir ${HOME}/.yaws/ 2> /dev/null
          mkdir ${HOME}/.yaws/${ID} 2> /dev/null
          out=`exec $erl -noshell -pa ${yawsdir}${delim}ebin ${xpath} -s yaws_ctl check ${id} $*`
          if [ "$?" = "0" ]; then
              echo "$out"
              echo "$1" ok
              exit 0
          fi
          echo "$out"
          exit 1;;
      --to_erl)
          TO_ERL=yes
          PIPE_DIR="${vardir}/run/yaws/pipe/$1"
          shift;;
      --run_erl)
          RUN_ERL=yes
          daemon=""
          PIPE_DIR="${vardir}/run/yaws/pipe/$1"
          LOG_DIR="${vardir}/log/yaws/erlang-log/$1"
          shift;;
      *)
          help
  esac
done

[ -n "$call_wait_started" ] && wait_started $call_wait_started

if [ ! -z "${ex}" ]; then
    exec ${ex} ${id}
    exit 0
fi

if [ -n "$TO_ERL" ]; then
    $to_erl $PIPE_DIR/
    exit 0
fi

if [ -n "$RUN_ERL" ]; then
    if [ ! -d $LOG_DIR ]; then
        mkdir -p $LOG_DIR
    fi
    if [ ! -d $PIPE_DIR ]; then
        mkdir -p $PIPE_DIR
    fi
    RUN_ERL="$run_erl -daemon $PIPE_DIR/ $LOG_DIR"
else
    RUN_ERL="eval"
fi

if [ ! -z "${id}" ]; then
    id="-yaws id ${id}"
fi

trace="${trace} ${traceoutput}"

[ "$run_erl" = "eval" ] && [ -z "$daemon" ] && [ -z "$interactive" ] && help

XEC="${daemon} ${heart} +K ${kpoll} -pa ${yawsdir}${delim}ebin  ${xpath} ${sname} ${pdist} ${erlarg} ${debug} -run yaws ${trace} ${conf} ${runmod} ${mnesia} ${id}"

if [ -z "$heart" ] || [ -z "$daemon" ]; then
    unset HEART_COMMAND
fi

${RUN_ERL} "exec $erl $XEC"
