blob: fb4105c1c9683baffef26be37fc0e61a3d142281 [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=Software delivery
### make a zedboot USB key
## usage: fx mkzedboot-remote HOST [DIR] [--no-build] [--no-check-ssh-keys] --usb USB_DEVICE [--force]
## --no-build do not build, just pull artifacts already present
## --no-check-ssh-keys do not verify that the default SSH credentials are the
## same before paving.
##
## HOST the hostname to connect to
## DIR defaults to ${HOME}/fuchsia, the path to the FUCHSIA_DIR on HOST
##
## --force force writing to a non-usb target
##
## 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-mkzedboot.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
# Get build artifacts from remote
host=""
dir=""
build=true
check_ssh_keys=true
force=false
usb_device=""
while [[ $# -ne 0 ]]; do
case "$1" in
--help|-h)
fx-command-help
exit 0
;;
--no-build)
build=false
;;
--no-check-ssh-keys)
check_ssh_keys=false
;;
--usb)
shift
usb_device=$1
;;
--force)
force=true
;;
-*)
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 "\${HOME}/fuchsia/.jiri_root/bin/fx" > /dev/null; then
dir="\${HOME}/fuchsia"
else
fx-error "failed to find \${HOME}/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"
image=""
type=""
# Try to get image for efi, if not found, try to get vboot image for cros
image="$(ssh "${host}" "cd \"${dir}\" && .jiri_root/bin/fx list-build-artifacts --allow-empty --type blk mkzedboot")"
type="efi"
if [[ -z "${image}" ]]; then
image="$(ssh "${host}" "cd \"${dir}\" && .jiri_root/bin/fx list-build-artifacts --allow-empty --type zbi.signed mkzedboot")"
type="vboot"
fi
if [[ -z "${image}" ]]; then
fx-error "Cannot find image to run mkzedboot. Re-check build board and product."
exit 1
fi
remote_build_dir="$(get_remote_build_dir "${host}" "${dir}")"
mkdir -p "${artifact_dir}"
# --relative ensures that the ZBI is copied to out/fetched relative to the
# '/./' (i.e., the build directory).
rsync --compress --partial --progress --relative "${host}:${remote_build_dir}/./${image}" "${artifact_dir}" || exit $?
if [[ -z "${usb_device}" ]]; then
echo >&2 "device argument required"
echo "USB disks:"
fx-command-run list-usb-disks
exit 1
fi
fx-mkzedboot "${usb_device}" "${type}" "${artifact_dir}/${image}" $force