1#!/bin/bash 2 3### BEGIN INIT INFO 4# Provides: chrome-remote-desktop 5# Required-Start: $remote_fs $syslog 6# Required-Stop: $remote_fs $syslog 7# Default-Start: 2 3 4 5 8# Default-Stop: 0 1 6 9# Short-Description: Chrome Remote Desktop service 10### END INIT INFO 11 12# /etc/init.d/chrome-remote-desktop: Start and stop Chrome Remote Desktop host daemon. 13 14HOST_PATH=/opt/google/chrome-remote-desktop/chrome-remote-desktop 15 16# Group of users for which Chrome Remote Desktop is enabled. Users are added 17# to that group when they start the host for the first time. 18CHROME_REMOTING_GROUP=chrome-remote-desktop 19 20test -x $HOST_PATH || exit 0 21 22. /lib/lsb/init-functions 23 24if [ "$(whoami)" = "root" ]; then 25 # Extract list of users in the chrome-remoting group. 26 USERS=$(getent group $CHROME_REMOTING_GROUP | 27 awk -F ':' '{ gsub(",", " ", $4); print $4 }') 28else 29 USERS=$(whoami) 30fi 31 32# Tries to wait for 10 seconds until specified command exits and then kills it. 33run_with_timeout() { 34 "$@" & 35 pid=$! 36 local time_left=10 37 while [ $time_left -gt 0 ]; do 38 (kill -0 $pid 2>/dev/null) || return `wait $pid` 39 sleep 1 40 time_left=$((time_left - 1)) 41 done 42 (kill -0 $pid 2>/dev/null) || return `wait $pid` 43 44 echo command \"$@\" has timed out >&2 45 kill $pid 46 return 1 47} 48 49# Usage: run_and_ignore_error [--login] user program [args...] 50# --login: 51# Run program in a clean login shell. This requires backgrounding, since 52# the user's .profile or .login script might be run, which might contain 53# blocking commands. 54run_and_ignore_error() { 55 login_options="" 56 if [ "$1" = "--login" ]; then 57 login_options="-b -i" 58 shift 59 fi 60 61 user=$1 62 shift 63 64 set +e 65 if [ "$(whoami)" = "$user" ]; then 66 "$@" 67 else 68 sudo -u "$user" $login_options "$@" 69 fi 70} 71 72do_start() { 73 log_begin_msg "Starting Chrome Remote Desktop host for $1..." 74 run_and_ignore_error --login $1 "$HOST_PATH" --start 75 log_end_msg $? 76} 77 78do_stop() { 79 log_begin_msg "Stopping Chrome Remote Desktop host for $1..." 80 run_with_timeout run_and_ignore_error $1 "$HOST_PATH" --stop 81 log_end_msg $? 82} 83 84do_reload() { 85 log_begin_msg "Reloading Chrome Remote Desktop host configuration for $1..." 86 run_and_ignore_error $1 "$HOST_PATH" --reload 87 log_end_msg $? 88} 89 90do_restart() { 91 log_begin_msg "Restarting Chrome Remote Desktop host for $1..." 92 run_and_ignore_error $1 "$HOST_PATH" --stop 93 run_and_ignore_error --login $1 "$HOST_PATH" --start 94 log_end_msg $? 95} 96 97for_each_user() { 98 for user in $USERS; do 99 $1 $user 100 done 101} 102 103case "$1" in 104 start) 105 for_each_user do_start 106 ;; 107 108 stop) 109 for_each_user do_stop 110 ;; 111 112 reload|force-reload) 113 for_each_user do_reload 114 ;; 115 116 restart) 117 for_each_user do_restart 118 ;; 119 120 *) 121 log_success_msg "Usage: /etc/init.d/chrome-remote-desktop" \ 122 "{start|stop|reload|force-reload|restart}" 123 exit 1 124esac 125 126exit 0 127