#!/bin/sh
# Start/stop/restart the sccache distributed compilation scheduler.
# Author: Heinz Wiesinger <pprkut@liwjatan.at>
# ---------------------------------------------------------------------------

# Get the configuration information from /etc/rc.d/rc.sccache.conf:
. /etc/rc.d/rc.sccache.conf

SCHEDULER=/usr/bin/sccache-dist
PIDFILE=/var/run/sccache-scheduler.pid

scheduler_start() {
  if [ ! -x $SCHEDULER ]; then
    echo "$SCHEDULER is not installed or not executable."
    exit 1
  fi
  if [ -s $PIDFILE ] && kill -0 "$(cat $PIDFILE)" 2> /dev/null ; then
    echo "sccache-dist scheduler already running (PID $(cat $PIDFILE))."
    exit 1
  fi
  if [ ! -r "$SCCACHE_SCHEDULER_CONF" ]; then
    echo "Scheduler config $SCCACHE_SCHEDULER_CONF not found. Edit it before starting."
    exit 1
  fi
  echo "Starting distributed compiler scheduler:  $SCHEDULER scheduler --config $SCCACHE_SCHEDULER_CONF $SCCACHE_SCHEDULER_EXTRA_OPTIONS"
  # SCCACHE_NO_DAEMON=1 keeps the process in the foreground so this script can
  # track its PID and capture its log output itself.
  if [ -n "$SCCACHE_SCHEDULER_LOGFILE" ]; then
    mkdir -p "$(dirname "$SCCACHE_SCHEDULER_LOGFILE")"
    SCCACHE_NO_DAEMON=1 SCCACHE_LOG="${SCCACHE_SCHEDULER_LOG_LEVEL:-info}" \
      $SCHEDULER scheduler --config "$SCCACHE_SCHEDULER_CONF" $SCCACHE_SCHEDULER_EXTRA_OPTIONS \
      >> "$SCCACHE_SCHEDULER_LOGFILE" 2>&1 &
  else
    SCCACHE_NO_DAEMON=1 SCCACHE_LOG="${SCCACHE_SCHEDULER_LOG_LEVEL:-info}" \
      $SCHEDULER scheduler --config "$SCCACHE_SCHEDULER_CONF" $SCCACHE_SCHEDULER_EXTRA_OPTIONS &
  fi
  echo $! > $PIDFILE
}

scheduler_stop() {
  echo "Stopping sccache-dist scheduler."
  if [ -s $PIDFILE ]; then
    kill "$(cat $PIDFILE)" 2> /dev/null
    for _ in 1 2 3 4 5 6 7 8 9 10 ; do
      kill -0 "$(cat $PIDFILE)" 2> /dev/null || break
      sleep 1
    done
    kill -9 "$(cat $PIDFILE)" 2> /dev/null
    rm -f $PIDFILE
  else
    killall sccache-dist 2> /dev/null
  fi
}

scheduler_restart() {
  scheduler_stop
  sleep 1
  scheduler_start
}

scheduler_status() {
  if [ -s $PIDFILE ] && kill -0 "$(cat $PIDFILE)" 2> /dev/null ; then
    echo "sccache-dist scheduler is running (PID $(cat $PIDFILE))."
  else
    echo "sccache-dist scheduler is not running."
  fi
}

case "$1" in
'start')
  scheduler_start
  ;;
'stop')
  scheduler_stop
  ;;
'restart')
  scheduler_restart
  ;;
'status')
  scheduler_status
  ;;
*)
  echo "usage $0 start|stop|restart|status"
esac
