blob: c3dfc20e6be67d14bee70c83491d549468c10be0 [file] [log] [blame]
#!/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
fx-warn "DEPRECATION WARNING"
fx-warn "\`fx pave-remote\` is deprecated and will be removed soon, please use \`fx flash-remote\`."
fx-warn "See https://fxbug.dev/42081363.\n"
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