| #!/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}" "$@" |