#!/bin/bash
# Copyright 2017 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=Run, inspect and debug
### start fuchsia in qemu with a FVM disk
## start fuchsia in qemu with a FVM disk
##
## usage: fx qemu [-z <zbi_image>] [--uefi <image>] [--archive <tgt>]
##
##      -z <zbi_image>   use <zbi_image> instead of the default (- for none)
##      -t <boot_shim>   use <boot_shim> instead of the default
##      --uefi <image>   Boot through UEFI and do so with the supplied UEFI filesystem or disk
##                       image. Mutually exclusive with '-z' and '-t'.
##      --archive <tgt>  Don't actually run QEMU.  Instead, create a compressed tarball archive
##                       named "<tgt>.tgz" which contains all of the images needed to run QEMU.
##
##
## When generating an archive, either two or three files are typically included in the
## archive.  They are:
##
## 1) qemu-boot-shim.bin
##    This file is the image to be loaded into RAM and jumped to. When using QEMU,
##    pass this file to the VM instance using the -kernel option.
## 2) fuchsia-ssh.zbi
##    This file is the image to be used as the initial ramdisk for the VM. When using QEMU,
##    pass this file to the VM instance using the -initrd option.
## 3) raw.blk
##    This file is the initial raw image of the block device for the VM.  It is
##    not present in a "bringup" build configuration, but should be present for
##    "core" builds and beyond.  When using QEMU, this file is provided to the
##    VM using the --drive option, but needs to be manifested in the machine as
##    a device using --device options in order for it to be available for the OS
##    to mount.  An example of these flags might looks something like this:
##
##      -drive file=<path_to_fvm_raw.zbi>,format=raw,if=none,id=mydisk
##      -device ich9-ahci,id=ahci
##      -device ide-hd,drive=mydisk,bus=ahci.0
##
## This command delegates to //zircon/scripts/run-zircon. Other flags are
## documented in that script, and can be discovered by passing -h or --help.
##

set -e

declare -a CLEANUP_LIST
function cleanup {
  for i in "${CLEANUP_LIST[@]}"; do
    rm -rf "${i}"
  done
}

trap cleanup EXIT

# shellcheck source=tools/devshell/lib/vars.sh
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
fx-config-read
# shellcheck source=tools/devshell/lib/fvm.sh
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/fvm.sh || exit $?
# shellcheck source=tools/devshell/lib/disktools.sh
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/disktools.sh || exit $?

KERNEL_IMAGE=
ZBI_IMAGE=
UEFI=0
PKG_TARGET=
run_zircon_args=()
while [[ $# -gt 0 ]]; do
  case "$1" in
    -h|--help)
      fx-command-help
      "${FUCHSIA_DIR}/zircon/scripts/run-zircon" -h
      exit 1
      ;;
    --archive)
      shift
      PKG_TARGET="$1.tgz"
      ;;
    -z)
      shift
      ZBI_IMAGE="$1"
      ;;
    -t)
      shift
      KERNEL_IMAGE="$1"
      ;;
    --uefi)
      UEFI=1
      ;;
    -a|--arch)
      shift
      FUCHSIA_ARCH="$1"
      ;;
    --)
      # Stop processing args if we hit a "--" argument.
      break
      ;;
    *)
      run_zircon_args+=("$1")
  esac
  shift
done

authkeys_path="$(get-ssh-authkeys)" || {
  fx-error "Cannot continue without a valid authorized keys file."
  exit 1
}

qemu_dir="${PREBUILT_QEMU_DIR}/bin"

# Not all builds use an FVM or Fxfs image so failing to find a source image is OK.
is_fvm=1
image_source="$(fx-fvm-find-raw-source)"
if [[ -z "${image_source}" ]]; then
  is_fvm=0
  image_source="$(fx-command-run list-build-artifacts --name storage-full --type fxfs-blk --allow-empty images)"
fi

args=(
  -a "${FUCHSIA_ARCH}"
  -q "${qemu_dir}"
)

# Construction of a qcow image prevents qemu from writing back to the
# build-produced image file, which could cause timestamp issues with that file.
# Construction of the new ZBI adds ~/.ssh/fuchsia_authorized_keys for SSH
# access.
imgdir="$(mktemp -d "${FUCHSIA_BUILD_DIR}"/tmp.XXX)"
if [[ ! -d "${imgdir}" ]]; then
  echo >&2 "Failed to create temporary directory"
  exit 1
fi
CLEANUP_LIST+=("$imgdir")

if (( "$UEFI" )); then
  args+=(--uefi)
else
  if [[ -z "${KERNEL_IMAGE}" ]]; then
    KERNEL_IMAGE="$(fx-command-run list-build-artifacts --cpu "$FUCHSIA_ARCH" --type kernel --name qemu-kernel images)"
    KERNEL_IMAGE="${FUCHSIA_BUILD_DIR}/${KERNEL_IMAGE}"
  fi
  if [[ -z "${ZBI_IMAGE}" ]]; then
    ZBI_IMAGE="$(fx-command-run list-build-artifacts --cpu "$FUCHSIA_ARCH" --type zbi --name zircon-a images)"
    ZBI_IMAGE="${FUCHSIA_BUILD_DIR}/${ZBI_IMAGE}"
  fi

  if [[ "${ZBI_IMAGE}" != - ]]; then
    kernelzbi="${imgdir}/fuchsia-ssh.zbi"
    args+=(-z "${kernelzbi}")
    fx-zbi -o "${kernelzbi}" \
      "${ZBI_IMAGE}" \
      --entry "data/ssh/authorized_keys=${authkeys_path}" \
      --type=entropy:64 /dev/urandom
  fi
fi

if [[ -n "${KERNEL_IMAGE}" ]]; then
  args+=(-t "${KERNEL_IMAGE}")
fi

if [[ -n "${image_source}" ]]; then
  img_raw="${imgdir}/raw.blk"
  # Stage the disk image and expand to IMAGE_SIZE if needed.
  if (( "$is_fvm" )); then
    fvm_tool="$(fx-command-run host-tool --print fvm)"
    fx-fvm-extend-image "${fvm_tool}" "${FUCHSIA_BUILD_DIR}/${image_source}" "${img_raw}" "${IMAGE_SIZE}"
  else
    cp "${FUCHSIA_BUILD_DIR}/${image_source}" "${img_raw}"
    if [[ -n "${IMAGE_SIZE}" ]]; then
      fx-extend "${img_raw}" "${IMAGE_SIZE}"
    fi
  fi
  args+=(-D "${img_raw}" --diskfmt=raw)
fi

if [[ -z "${PKG_TARGET}" ]]; then
  "${FUCHSIA_DIR}/zircon/scripts/run-zircon" "${args[@]}" "${run_zircon_args[@]}" "$@"
else
  # Create symlinks to all of the various components in a temp directory, so
  # that our tar file is just a archive of individual files with no paths.
  SYMLINK_PATH="$(mktemp -d)"
  CLEANUP_LIST+=("${SYMLINK_PATH}")
  for i in "${kernelzbi}" "${img_raw}" "${KERNEL_IMAGE}"; do
    if [[ ! $i ]]; then
      continue
    fi
    name="${i##*/}"
    ln -s "${i}" "${SYMLINK_PATH}/${name}"
  done

  # Now go ahead and create the tarball, working from within the symlink
  # directory (again, to avoid pathnames in the tarball)
  echo >&2 "Packaging into ${PKG_TARGET}"
  cd "${SYMLINK_PATH}" > /dev/null
  tar cvzf "${PKG_TARGET}" --dereference ./*
  echo >&2 "done"
fi
