blob: d56331bd58b8f5142a0e24d17b5ad1f4e89cbe6d [file] [log] [blame]
#!/bin/bash
#
# Copyright 2021 The Cobalt Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Runs Cobalt on the desired platform.
#
# Globals:
# CONTENT
# LOG_PATH
#
# Args:
# URL, path for logging, variable to store Cobalt's pid in, extra arguments.
function start_cobalt() {
if [[ $# -lt 3 ]]; then
log "error" " start_cobalt missing args"
return 1
fi
URL="${1}"
LOG="${2}"
declare -n loader_pid_ref=$3
ARGS="${4}"
stop_cobalt
log "info" " Starting Cobalt with:"
log "info" " --url=${URL}"
for arg in $ARGS; do
log "info" " ${arg}"
done
log "info" " Logs will be output to '${LOG_PATH}/${LOG}'"
# A file name unique to the process, provided by the current time in
# milliseconds, isn't strictly needed but is used out of caution.
declare pid_storage_path="${PID_STORAGE_DIR}/$(date +%s%3N)"
# The stored process ID initially points to a remote shell process but that
# process image is quickly replaced, via exec, with a new one executing the
# loader app. This approach enables the local machine to obtain the loader
# app's process ID without interfering with its stdout/stderr, which must be
# piped to tee.
declare store_pid_cmd="echo \\\\$\\\\$ > ${pid_storage_path}"
declare replace_with_loader_cmd="exec /home/pi/coeg/loader_app --url=\"\"${URL}\"\" ${ARGS}"
eval "${SSH}\"${store_pid_cmd};${replace_with_loader_cmd}\" 2>&1 | tee \"${LOG_PATH}/${LOG}\"" &
# The device's filesystem is polled to avoid a race condition since the
# previous eval command is necessarily run in the background.
eval "${SSH}\"while \[\[ \! -f ${pid_storage_path} \]\] \; do sleep 1 \; done\""
loader_pid_ref=$(eval "${SSH}\"cat ${pid_storage_path}\"" | tr -d '[:space:]')
delete_file "${pid_storage_path}"
log "info" " Cobalt process ID is ${loader_pid_ref}"
}