#!/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"
fetch_remote_build_artifacts "${host}" "${dir}" "${artifact_dir}" pave $build

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

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