blob: 7f405ed24386af83e8004ff05e0f06738edf20bb [file] [log] [blame]
#!/bin/bash
# Copyright 2018 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=Device discovery
### set the default device to interact with
## usage: fx set-device DEVICE[:SSH_PORT]
##
## fx set-device is used to specify the default device to target for
## fx commands that communicate with a Fuchsia device.
## A device is set within the scope of a build directory (i.e. out/arm64 may
## have a different default device than out/x64).
##
## If no device name is given, set-device will attempt to discover devices. If
## one device is found, that device is set as the default for the current build
## directory. If more than one device is found, the user must select one and
## provide it to a subsequent invocation of the command.
##
## If specified, DEVICE may be a Fuchsia device name that will be resolved
## using ffx or an IP address. An IPv4 address must be specified
## directly, while IPv6 need to be surrounded by brackets.
##
## SSH_PORT, if specified, will be used for all commands that rely on SSH to
## connect to the device, instead of the default SSH port (22).
##
## Examples:
## fx set-device strut-wind-ahead-turf
## fx set-device strut-wind-ahead-turf:222
## fx set-device 192.168.1.2
## fx set-device 192.168.3.1:8022
## fx set-device [fe80::7:8%eth0]
## fx set-device [fe80::7:8%eth0]:5222
## fx set-device
##
## To unset, use `fx unset-device`.
set -e
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
fx-standard-switches "$@"
fx-config-read
function select_device() {
IFS=$'\n' read -rd '' -a devices <<<"$1"
select choice in "${devices[@]}"; do
echo "${devices[$((REPLY-1))]}"
break
done
}
# FX_REMOTE_INVOCATION is set by serve-remote to supress the warning
# for that use case.
if is-remote-workflow-device && [[ -z "${FX_REMOTE_INVOCATION}" ]]; then
fx-warn "Local configuration indicates a remote-workflow setup"
fx-warn " 'fx set-device' does not work correctly at this end of a remote setup"
fx-warn "Execute set-device on the local machine in order to change targets in the remote flow"
fi
device="$1"
if [[ -z "$device" ]]; then
devices="$(fx-target-finder-info | cut -d ' ' -f 2)"
if [[ -z "${devices}" ]]; then
fx-error "No devices discovered, please supply a device name"
exit 1
fi
if [[ "$(echo "$devices" | wc -l)" -ge 2 ]]; then
fx-error "Multiple devices found, please pick one from the list:"
device=$(select_device "$devices")
else
device="${devices}"
fi
elif ! is-valid-device "${device}"; then
fx-error "Invalid device: ${device}"
fx-command-help
exit 1
fi
if [[ ! -d "${FUCHSIA_BUILD_DIR}" ]]; then
fx-error "Build directory ${FUCHSIA_BUILD_DIR} does not exist, run \"fx set\" first."
exit 1
fi
echo "New default device for '${FUCHSIA_BUILD_DIR}': ${device}"
echo "$device" > "${FUCHSIA_BUILD_DIR}.device"
json-config-set "${FUCHSIA_BUILD_DIR}.json" target.default "$device"