#!/bin/bash

### BEGIN INIT INFO
# Provides:             chrome-remote-desktop
# Required-Start:       $remote_fs $syslog
# Required-Stop:        $remote_fs $syslog
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Chrome Remote Desktop service
### END INIT INFO

# /etc/init.d/chrome-remote-desktop: Start and stop Chrome Remote Desktop host daemon.

HOST_PATH=/opt/google/chrome-remote-desktop/chrome-remote-desktop

# Group of users for which Chrome Remote Desktop is enabled. Users are added
# to that group when they start the host for the first time.
CHROME_REMOTING_GROUP=chrome-remote-desktop

test -x $HOST_PATH || exit 0

. /lib/lsb/init-functions

if [ "$(whoami)" = "root" ]; then
  # Extract list of users in the chrome-remoting group.
  USERS=$(getent group $CHROME_REMOTING_GROUP |
          awk -F ':' '{ gsub(",", " ", $4); print $4 }')
else
  USERS=$(whoami)
fi

# Tries to wait for 10 seconds until specified command exits and then kills it.
run_with_timeout() {
  "$@" &
  pid=$!
  local time_left=10
  while [ $time_left -gt 0 ]; do
    (kill -0 $pid 2>/dev/null) || return `wait $pid`
    sleep 1
    time_left=$((time_left - 1))
  done
  (kill -0 $pid 2>/dev/null) || return `wait $pid`

  echo command \"$@\" has timed out >&2
  kill $pid
  return 1
}

# Usage: run_and_ignore_error [--login] user program [args...]
#   --login:
#     Run program in a clean login shell. This requires backgrounding, since
#     the user's .profile or .login script might be run, which might contain
#     blocking commands.
run_and_ignore_error() {
  login_options=""
  if [ "$1" = "--login" ]; then
    login_options="-b -i"
    shift
  fi

  user=$1
  shift

  set +e
  if [ "$(whoami)" = "$user" ]; then
    "$@"
  else
    sudo -u "$user" $login_options "$@"
  fi
}

do_start() {
  log_begin_msg "Starting Chrome Remote Desktop host for $1..."
  run_and_ignore_error --login $1 "$HOST_PATH" --start
  log_end_msg $?
}

do_stop() {
  log_begin_msg "Stopping Chrome Remote Desktop host for $1..."
  run_with_timeout run_and_ignore_error $1 "$HOST_PATH" --stop
  log_end_msg $?
}

do_reload() {
  log_begin_msg "Reloading Chrome Remote Desktop host configuration for $1..."
  run_and_ignore_error $1 "$HOST_PATH" --reload
  log_end_msg $?
}

do_restart() {
  log_begin_msg "Restarting Chrome Remote Desktop host for $1..."
  run_and_ignore_error $1 "$HOST_PATH" --stop
  run_and_ignore_error --login $1 "$HOST_PATH" --start
  log_end_msg $?
}

for_each_user() {
  for user in $USERS; do
    $1 $user
  done
}

case "$1" in
  start)
    for_each_user do_start
    ;;

  stop)
    for_each_user do_stop
    ;;

  reload|force-reload)
    for_each_user do_reload
    ;;

  restart)
    for_each_user do_restart
    ;;

  *)
    log_success_msg "Usage: /etc/init.d/chrome-remote-desktop" \
        "{start|stop|reload|force-reload|restart}"
    exit 1
esac

exit 0