blob: ffa05f1a5ce25a92259444cbf45e6b75d4adf833 [file] [log] [blame]
#!/bin/bash
# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
### start the update server and attach to a running fuchsia device
## usage: fx serve-updates [-v] [-d <device>] [--direct]
## -v verbose (do not suppress amber-srv output)
## -d <device> to specify a specific target device
## --no-direct configure target to use an SSH tunnel as transport (deprecated)
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"/lib/vars.sh
fx-config-read
function usage {
fx-command-help serve-updates
}
fx-standard-switches "$@"
set -- "${FX_ARGV[@]}"
verbose=false
device=""
device_arg=""
direct=true
while (($#)); do
case "$1" in
-v|--verbose)
verbose=true
;;
-d|--device)
device="$2"
device_arg="-d $2"
shift
;;
--no-direct)
direct=false
;;
--direct)
direct=true
;;
*)
echo "Unrecognized option: $1"
usage
exit 1
;;
esac
shift
done
# Recover from present situation by finding any already-running amber-srv
amber_srv_pid=$(pgrep amber-srv)
cleanup() {
if [[ -n "${amber_srv_pid}" ]]; then
if kill -0 "${amber_srv_pid}" 2> /dev/null; then
kill -TERM "${amber_srv_pid}" 2> /dev/null
wait "${amber_srv_pid}" 2> /dev/null
fi
fi
}
trap cleanup EXIT
log() {
# This format matches bootserver so that `fx serve` ui is easier to read.
echo "$(date '+%Y-%m-%d %H:%M:%S') [serve-updates] $@"
}
if [[ -z "${amber_srv_pid}" ]]; then
if [[ "${verbose}" = true ]]; then
${FUCHSIA_BUILD_DIR}/host_x64/amber-srv -d ${FUCHSIA_BUILD_DIR} &
else
${FUCHSIA_BUILD_DIR}/host_x64/amber-srv -d ${FUCHSIA_BUILD_DIR} > /dev/null &
fi
amber_srv_pid=$!
fi
# Allow a little slack for amber-srv to startup, that way the first kill -0 will catch a dead amber-srv.
sleep 0.1
if ! kill -0 "${amber_srv_pid}" 2> /dev/null; then
log "Amber Server died, exiting"
wait
exit $?
fi
device_addr=
update_device_addr() {
device_addr="$(fx-command-run netaddr --nowait --timeout=1000 --fuchsia "$@" 2>/dev/null)"
}
# State is used to prevent too much output
state="discover"
while true; do
if ! kill -0 "${amber_srv_pid}" 2> /dev/null; then
log "Amber Server died, exiting"
amber_srv_pid=
exit 1
fi
update_device_addr $device_arg
if [[ -z "${device_addr}" ]]; then
if [[ "${state}" != "discover1" ]]; then
log "No device found, waiting..."
state="discover1"
fi
sleep 1
continue
fi
if [[ "$state" == "discover" || "$state" == "discover1" ]]; then
log "SSH Tunnel connecting to ${device_addr}..."
if fx-command-run ssh -f -o LogLevel=ERROR -o ExitOnForwardFailure=yes -R 8083:localhost:8083 "${device_addr}" "echo -n"; then
log "SSH Tunnel connected"
state="config"
else
sleep 1
fi
fi
if [[ "$state" == "config" ]]; then
if $direct; then
log "Registering devhost as update source"
if fx-command-run add-update-source --remove-localhost $device_arg; then
log "Ready to push packages!"
state="ready"
fi
else
log "Ready to push packages!"
state="ready"
fi
sleep 1
fi
if [[ "$state" == "ready" ]]; then
if fx-command-run ssh -O check "${device_addr}" 2> /dev/null; then
sleep 1
else
log "SSH Tunnel lost, restarting..."
state="discover"
fi
fi
done
# See EXIT trap above for cleanup that occurs