#!/bin/sh
# Start/stop/restart an sccache distributed compilation build server.
# Author: Heinz Wiesinger <pprkut@liwjatan.at>
#
# NOTE: the build server sandboxes compiles with bubblewrap and must run as
# root.
# ---------------------------------------------------------------------------

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

SERVER=/usr/bin/sccache-dist
PIDFILE=/var/run/sccache-server.pid

server_start() {
  if [ ! -x $SERVER ]; then
    echo "$SERVER is not installed or not executable."
    exit 1
  fi
  if [ "$(id -u)" != "0" ]; then
    echo "The sccache-dist build server must be started as root."
    exit 1
  fi
  if [ -s $PIDFILE ] && kill -0 "$(cat $PIDFILE)" 2> /dev/null ; then
    echo "sccache-dist server already running (PID $(cat $PIDFILE))."
    exit 1
  fi
  if [ ! -r "$SCCACHE_SERVER_CONF" ]; then
    echo "Server config $SCCACHE_SERVER_CONF not found. Edit it before starting."
    exit 1
  fi
  echo "Starting distributed compiler build server:  $SERVER server --config $SCCACHE_SERVER_CONF $SCCACHE_SERVER_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_SERVER_LOGFILE" ]; then
    mkdir -p "$(dirname "$SCCACHE_SERVER_LOGFILE")"
    SCCACHE_NO_DAEMON=1 SCCACHE_LOG="${SCCACHE_SERVER_LOG_LEVEL:-info}" \
      $SERVER server --config "$SCCACHE_SERVER_CONF" $SCCACHE_SERVER_EXTRA_OPTIONS \
      >> "$SCCACHE_SERVER_LOGFILE" 2>&1 &
  else
    SCCACHE_NO_DAEMON=1 SCCACHE_LOG="${SCCACHE_SERVER_LOG_LEVEL:-info}" \
      $SERVER server --config "$SCCACHE_SERVER_CONF" $SCCACHE_SERVER_EXTRA_OPTIONS &
  fi
  echo $! > $PIDFILE
}

server_stop() {
  echo "Stopping sccache-dist server."
  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
}

server_restart() {
  server_stop
  sleep 1
  server_start
}

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

case "$1" in
'start')
  server_start
  ;;
'stop')
  server_stop
  ;;
'restart')
  server_restart
  ;;
'status')
  server_status
  ;;
*)
  echo "usage $0 start|stop|restart|status"
esac
