#!/bin/bash
# Copyright 2020 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=Other
### Remotely build, fetch and pave

## usage: fx pave-remote HOST [DIR] [--no-pave] [--no-build]
##          [--no-check-ssh-keys] [-- PAVE_ARGS]
##
## Connect to HOST, run a build using fx from DIR, fetch the artifacts and
## start the paver.
##
##  --no-build           do not build, just pull artifacts already present. Defaults to build
##  --no-pave            do not start the paver, just pull the artifacts. Defaults to pave
##  --no-check-ssh-keys  do not verify that the default SSH credentials are the
##                       same before paving. Defaults to check ssh keys
##  --run-once | --keep-running      perform a single pave and exit or keep the bootserver
##                                   running after the first paving. defaults to --run-once
##  --                   pass any arguments after the -- to the fx pave command
##
##  HOST          the hostname to connect to
##  DIR           defaults to ~/fuchsia, the path to the FUCHSIA_DIR on HOST
##  PAVE_ARGS     arguments for the fx pave command
##
## HOST and DIR are persisted in the file //.fx-remote-config and are reused as
## defaults in future invocations of any 'fx *-remote' tools.

set -o errexit

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/fx-remote.sh || exit $?
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/verify-default-keys.sh || exit $?
fx-config-read

build=true
pave=true
check_ssh_keys=true
single_run=true
host=""
dir=""
pave_args=()
while [[ $# -ne 0 ]]; do
  case "$1" in
  --help|-h)
      fx-command-help
      exit 0
      ;;
  --no-build)
    build=false
    ;;
  --no-pave)
    pave=false
    ;;
  --no-check-ssh-keys)
    check_ssh_keys=false
    ;;
  # -1 is here for backward compatibility.
  --run-once | -1)
    single_run=true
    ;;
  --keep-running)
    single_run=false
    ;;
  --)
    shift
    pave_args+=("$@")
    break
    ;;
  -*)
    fx-error "Unknown flag: $1"
    fx-command-help
    exit 1
    ;;
  *)
    if [[ -z "${host}" ]]; then
      host="$1"
    elif [[ -z "${dir}" ]]; then
      dir="$1"
    else
      fx-error "unexpected argument: '$1'"
      exit 1
    fi
    ;;
  esac
  shift
done

if $single_run; then
  pave_args+=( "-1" )
fi

if cached=( $(load_remote_info "$host") ); then
  host="${cached[0]}"
  dir="${cached[1]}"
fi

if [[ -z "${host}" ]]; then
  fx-error "HOST must be specified"
  fx-command-help
  exit 1
fi

if [[ -z "${dir}" ]]; then
  if ssh "$host" ls \~/fuchsia/.jiri_root/bin/fx > /dev/null; then
    dir="~/fuchsia"
  else
    fx-error "failed to find ~/fuchsia on $host, please specify DIR"
    fx-command-help
    exit 1
  fi
fi

# Verify that keys match.
if "${check_ssh_keys}"; then
  verify_default_keys "${FUCHSIA_DIR}" "${host}" "${dir}" || exit $?
fi

save_remote_info "$host" "$dir"

authkeys_path="$(get-ssh-authkeys)" || {
  fx-error "Cannot continue without a valid authorized keys file."
  exit 1
}

artifact_dir="${FUCHSIA_DIR}/out/fetched"
flash_source=$(fetch_remote_flash_source "${host}" "${dir}" "${build}")
case "${flash_source}" in
  flash-manifest:*)
    flash_manifest="${flash_source#flash-manifest:}"
    product_bundle=""
    paving_script="./pave.sh"
    ;;
  product-bundle:*)
    flash_manifest=""
    product_bundle="${flash_source#product-bundle:}"
    paving_script="$(dirname "${product_bundle}")/pave.sh"
    ;;
  *)
    fx-error "failed to find a flash manifest or product bundle on $host."
    exit 1
esac

fx-info "Fetching artifacts from remote host: ${host}"
if [[ -n "${flash_manifest}" ]]; then
  fetch_remote_build_artifacts "${host}" "${dir}" "${artifact_dir}" pave $build
else
  fetch_remote_artifacts "${host}" "${dir}" "${artifact_dir}" "${product_bundle}" "${paving_script}"
fi

if "${pave}"; then
  if [[ -n "$(get-device-name)" ]]; then
    pave_args+=(-n $(get-device-name))
  fi

  if [[ -n "${flash_manifest}" ]]; then
    fetch_or_build_tool "${host}" "${dir}" "${artifact_dir}" bootserver
  fi
  cd "${artifact_dir}"
  "${paving_script}" --authorized-keys "${authkeys_path}" "${pave_args[@]}"
fi
