blob: baa20b94331bf21d3f29efd3dbf31a7e980beddb [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.
### Run Fuchsia on QEMU in background and runs SSH command after netstack runs.
## Run Fuchsia on QEMU (using standard fx setup) in background and pings the
## target until netstack is up running. If successful, issues the given SSH
## command.
##
## usage: fx net-run [--klog PATH]
## [--run RUN_OPTIONS]
## [--target TARGET]
## [--] SSH_COMMAND
##
## --klog Path where to pipe kernel log. Defaults to stdout.
## stderr will still be visible.
## --run The options to be passed to "fx run". If not set, it will
## attempt to load ${FX_NET_RUN_OPTIONS}. Finally, defaults to
## "-N -u ${FUCHSIA_DIR}/scripts/start-dhcp-server.sh".
## --target IP or hostname to connect to. If not supplied, it will
## attempt to guess it from ${FX_NET_RUN_TARGET}.
##
## SSH_COMMAND Any other argument will be passed directly to "fx ssh".
## If not specified, it will open an interactive SSH session.
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"/lib/vars.sh
# Defaults
# If --run is set, it will overwrite this value
run_options="${FX_NET_RUN_OPTIONS}"
if [[ -z "${run_options}" ]]; then
run_options="-N -u "${FUCHSIA_DIR}"/scripts/start-dhcp-server.sh"
fi
target="${FX_NET_RUN_TARGET}"
# Flag parsing
while [[ "$1" =~ ^- ]]; do
case "$1" in
-h|--help)
fx-command-help
exit 0
;;
--run)
shift
run_options="$1"
;;
--target)
shift
target="$1"
;;
--klog)
shift
klog="$1"
;;
--)
break
;;
*)
break
esac
shift
done
# Error check
if [[ -z "${target}" ]]; then
echo -e "No target found. Use --target or export \$FX_NET_RUN_TARGET."
exit 1
fi
# Run fx run in background. If successful, it will be sent to background.
echo "Using \"${run_options}\" to boot Fuchsia."
echo "You might need to run sudo beforehand."
if [[ -z "$klog" ]]; then
fx-command-run "run" ${run_options} &
else
# Only pipe stdout
fx-command-run "run" ${run_options} > "${klog}" &
echo "Piping Fuchsia output to \"${klog}\"."
fi
fx_pid="$!"
# Wait until netstack is on
ping_count=1
ping_max=120 # 2 Minute
echo "Waiting for device on ${target}."
while true; do
echo "Ping ${ping_count}/${ping_max}"
ping -c1 -W1 "${target}" > /dev/null &
# We wait so we can ctrl-c kill it
wait "$!"
# If the ping is successful, we break
if [[ "$?" -eq 0 ]]; then
break
fi
# Check for exit condition
ping_count=$(expr "${ping_count}" + 1)
if [[ "${ping_count}" -gt "${ping_max}" ]]; then
echo -e "Timed out waiting for Fuchsia. Exiting."
kill "${fx_pid}"
exit 1
fi
done
# Run the SSH command
fx-command-run "ssh" "${target}" "$@"