#!/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
##  --no-pave            do not start the paver, just pull the artifacts
##  --no-check-ssh-keys  do not verify that the default SSH credentials are the
##                       same before paving.
##  --                   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
host=""
dir=""
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
    ;;
  --)
    shift
    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 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"
fetch_remote_build_artifacts "${host}" "${dir}" "${artifact_dir}" pave $build

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

  fetch_or_build_tool "${host}" "${dir}" "${artifact_dir}" bootserver
  cd "${artifact_dir}"
  ./pave.sh --authorized-keys "${authkeys_path}" "${args[@]}"
fi
