#!/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
