blob: 0abb94113463b76a35552873c102d1ceb1c498d0 [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. Always kills QEMU before exiting. Redirects kernel logs to out/ and
## by default runs:
##
## `fx run -- -N -u "${FUCHSIA_DIR}"/scripts/start-dhcp-server.sh`
##
## These options can be overridden with the FX_NET_RUN_OPTIONS environment
## variable.
##
## usage: fx net-run [--target TARGET] SSH_COMMAND
##
## --target IP address to connect to on launching. Defaults to the
## value of the FX_NET_RUN_TARGET environment variable.
##
## SSH_COMMAND Any argument will be passed directly to "fx ssh".
## If not specified, it will open an interactive SSH session.
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
# make sure to terminate qemu and any other children when this script exits!
trap 'kill 0 &>/dev/null' INT EXIT TERM
klog="$FUCHSIA_DIR/out/qemu-klog"
# Defaults
# If --run is set, it will overwrite this value
run_options="${FX_NET_RUN_OPTIONS}"
if [[ -z "${run_options}" ]]; then
# NOTE: this script could tell us about the hostname this qemu instance
# is assigned using dnsmasq's leasefile, rather than using --target/envvars
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
;;
--target)
shift
target="$1"
;;
*)
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 "Running sudo now in case the DHCP server asks for it..."
sudo echo "sudo successful."
echo "Using \"${run_options}\" to boot Fuchsia."
echo
echo "To see live kernel logs, run \`tail -f $klog\`."
echo
fx-command-run "run" ${run_options} &> "$klog" &
ping_count=1
ping_max=120
ping_wait=1
max_wait=$((ping_wait * ping_max))
echo "Waiting for device (started at $(date +%X), timeout in ${max_wait}s)."
while ((ping_count <= ping_max)); do
# check for network first, then for ssh-ability
if ping -c1 -W1 "$target" &>/dev/null
then
if fx-command-run ssh "$target" echo &>/dev/null
then
break
fi
fi
ping_count=$((ping_count + 1))
sleep $ping_wait
done
echo "Running \`$*\`:"
echo
fx-command-run "ssh" "${target}" "$@"