| #!/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. | |
| #### CATEGORY=Software delivery | |
| ### start the update server and attach to a running fuchsia device | |
| ## usage: fx serve-updates [-v] [-l host[:port]] | |
| ## -l host:port for "pm serve" to listen on | |
| ## --no-auto-config do not configure this host as a package server on the device | |
| ## -v verbose (do not suppress `pm serve` output) | |
| source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $? | |
| fx-config-read | |
| function usage { | |
| fx-command-help serve-updates | |
| } | |
| fx-standard-switches "$@" | |
| set -- "${FX_ARGV[@]}" | |
| port="8083" | |
| serve_flags=() | |
| verbose=false | |
| auto_config=true | |
| while (($#)); do | |
| case "$1" in | |
| -l) | |
| shift | |
| port="${1##*:}" | |
| serve_flags+=(-l "$1") | |
| ;; | |
| --no-auto-config) | |
| auto_config=false | |
| ;; | |
| -v|--verbose) | |
| verbose=true | |
| ;; | |
| *) | |
| echo "Unrecognized option: $1" | |
| usage | |
| exit 1 | |
| ;; | |
| esac | |
| shift | |
| done | |
| if [[ "${verbose}" != true ]]; then | |
| serve_flags+=("-q") | |
| fi | |
| pm_srv_pid= | |
| cleanup() { | |
| if [[ -n "${pm_srv_pid}" ]]; then | |
| if kill -0 "${pm_srv_pid}" 2> /dev/null; then | |
| kill -TERM "${pm_srv_pid}" 2> /dev/null | |
| wait "${pm_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 [[ "${auto_config}" == false ]]; then | |
| log "Flag '--no-auto-config' used, automatic device configuration disabled." | |
| log "Use 'fx -d DEVICE add-update-source --port ${port}' to reconfigure devices as needed, since it is not persistent accross reboots." | |
| log "Serving packages on port ${port}..." | |
| exec "${FUCHSIA_BUILD_DIR}/host_x64/pm" serve -repo "${FUCHSIA_BUILD_DIR}/amber-files" "${serve_flags[@]}" | |
| fi | |
| if [[ -z "${pm_srv_pid}" ]]; then | |
| # The use of host_x64/ is deliberate over tools/. | |
| "${FUCHSIA_BUILD_DIR}/host_x64/pm" serve -repo "${FUCHSIA_BUILD_DIR}/amber-files" "${serve_flags[@]}" & | |
| pm_srv_pid=$! | |
| fi | |
| # Allow a little slack for pm serve to startup, that way the first kill -0 will catch a dead server | |
| sleep 0.1 | |
| if ! kill -0 "${pm_srv_pid}" 2> /dev/null; then | |
| log "Server died, exiting" | |
| wait | |
| exit $? | |
| fi | |
| log "Discovery..." | |
| # State is used to prevent too much output | |
| state="discover" | |
| while true; do | |
| if ! kill -0 "${pm_srv_pid}" 2> /dev/null; then | |
| log "Server died, exiting" | |
| pm_srv_pid= | |
| exit 1 | |
| fi | |
| if [[ "$state" == "discover" ]]; then | |
| fx-command-run shell exit 2>/dev/null | |
| ping_result=$? | |
| else | |
| fx-command-run shell -O check > /dev/null 2>&1 | |
| ping_result=$? | |
| fi | |
| if [[ "$state" == "discover" && "$ping_result" == 0 ]]; then | |
| log "Device up" | |
| state="config" | |
| fi | |
| if [[ "$state" == "config" ]]; then | |
| log "Registering devhost as update source" | |
| if fx-command-run add-update-source --port "${port}"; then | |
| log "Ready to push packages!" | |
| # Log the uptime so that it is clear(er) from fx serve if the device rebooted. | |
| # The tr is present as the output sometimes contains spurious control characters. | |
| clock=$(fx-command-run shell clock --monotonic ) | |
| if [[ -n ${clock} ]]; then | |
| uptime=$(echo $clock | tr '[[:cntrl:]]' ' ' ) | |
| log "Target uptime: $(( $uptime / 1000000000 ))" | |
| state="ready" | |
| else | |
| log "Device lost while checking uptime" | |
| state="discover" | |
| fi | |
| else | |
| log "Device lost while configuring update source" | |
| state="discover" | |
| fi | |
| fi | |
| if [[ "$state" == "ready" ]]; then | |
| if [[ "$ping_result" != 0 ]]; then | |
| log "Device lost" | |
| state="discover" | |
| else | |
| sleep 1 | |
| fi | |
| fi | |
| done | |
| # See EXIT trap above for cleanup that occurs |