15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/bin/bash
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)### BEGIN INIT INFO
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Provides:             chrome-remote-desktop
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Required-Start:       $remote_fs $syslog
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Required-Stop:        $remote_fs $syslog
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Default-Start:        2 3 4 5
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Default-Stop:         0 1 6
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Short-Description:    Chrome Remote Desktop service
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)### END INIT INFO
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# /etc/init.d/chrome-remote-desktop: Start and stop Chrome Remote Desktop host daemon.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HOST_PATH=/opt/google/chrome-remote-desktop/chrome-remote-desktop
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Group of users for which Chrome Remote Desktop is enabled. Users are added
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# to that group when they start the host for the first time.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CHROME_REMOTING_GROUP=chrome-remote-desktop
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)test -x $HOST_PATH || exit 0
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles). /lib/lsb/init-functions
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)if [ "$(whoami)" = "root" ]; then
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Extract list of users in the chrome-remoting group.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  USERS=$(getent group $CHROME_REMOTING_GROUP |
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          awk -F ':' '{ gsub(",", " ", $4); print $4 }')
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)else
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  USERS=$(whoami)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Tries to wait for 10 seconds until specified command exits and then kills it.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)run_with_timeout() {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "$@" &
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pid=$!
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  local time_left=10
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while [ $time_left -gt 0 ]; do
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (kill -0 $pid 2>/dev/null) || return `wait $pid`
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sleep 1
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    time_left=$((time_left - 1))
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  done
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (kill -0 $pid 2>/dev/null) || return `wait $pid`
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo command \"$@\" has timed out >&2
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kill $pid
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 1
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)# Usage: run_and_ignore_error [--login] user program [args...]
505e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#   --login:
515e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#     Run program in a clean login shell. This requires backgrounding, since
525e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#     the user's .profile or .login script might be run, which might contain
535e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#     blocking commands.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)run_and_ignore_error() {
555e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  login_options=""
565e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  if [ "$1" = "--login" ]; then
575e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    login_options="-b -i"
585e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    shift
595e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  fi
605e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user=$1
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shift
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set +e
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if [ "$(whoami)" = "$user" ]; then
665e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    "$@"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
685e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    sudo -u "$user" $login_options "$@"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fi
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)do_start() {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  log_begin_msg "Starting Chrome Remote Desktop host for $1..."
745e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  run_and_ignore_error --login $1 "$HOST_PATH" --start
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  log_end_msg $?
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)do_stop() {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  log_begin_msg "Stopping Chrome Remote Desktop host for $1..."
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  run_with_timeout run_and_ignore_error $1 "$HOST_PATH" --stop
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  log_end_msg $?
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)do_reload() {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  log_begin_msg "Reloading Chrome Remote Desktop host configuration for $1..."
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  run_and_ignore_error $1 "$HOST_PATH" --reload
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  log_end_msg $?
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)do_restart() {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  log_begin_msg "Restarting Chrome Remote Desktop host for $1..."
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  run_and_ignore_error $1 "$HOST_PATH" --stop
935e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  run_and_ignore_error --login $1 "$HOST_PATH" --start
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  log_end_msg $?
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)for_each_user() {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for user in $USERS; do
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $1 $user
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  done
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case "$1" in
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  start)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for_each_user do_start
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ;;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  stop)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for_each_user do_stop
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ;;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reload|force-reload)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for_each_user do_reload
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ;;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  restart)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for_each_user do_restart
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ;;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    log_success_msg "Usage: /etc/init.d/chrome-remote-desktop" \
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "{start|stop|reload|force-reload|restart}"
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exit 1
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)esac
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit 0
127