#!/bin/bash
#
# Copyright 2021 The ChromiumOS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# This is a generic ChromeOS package/image test setup script. It is meant to
# be used for either the object file or package bisection tools. This script
# does one of the following depending on what ${BISECT_MODE} is set to:
#
# 1) ${BISECT_MODE} is PACKAGE_MODE:
#   build_image is called and generates a new ChromeOS image using whatever
#   packages are currently in the build tree. This image is then pushed to the
#   remote machine using flash over ethernet (or usb flash if ethernet flash
#   fails).
#
# 2) ${BISECT_MODE} is OBJECT_MODE:
#   emerge is called for ${BISECT_PACKAGE} and generates a build for said
#   package. This package is then deployed to the remote machine and the machine
#   is rebooted. If deploying fails then a new ChromeOS image is built from
#   scratch and pushed to the machine like in PACKAGE_MODE.
#
# This script is intended to be used by binary_search_state.py, as
# part of the binary search triage on ChromeOS objects and packages. It should
# return '0' if the setup succeeds; and '1' if the setup fails (the image
# could not build or be flashed).
#

export PYTHONUNBUFFERED=1

source common/common.sh

usb_flash()
{
  echo
  echo "Insert a usb stick into the current machine"
  echo "Note: The cros flash will take time and doesn't give much output."
  echo "      Be patient. If your usb access light is flashing it's working."
  sleep 1
  read -p "Press enter to continue" notused

  cros flash --board=${BISECT_BOARD} --clobber-stateful usb:// ~/trunk/src/build/images/${BISECT_BOARD}/latest/chromiumos_test_image.bin

  echo
  echo "Flash to usb complete!"
  echo "Plug the usb into your chromebook and install the image."
  echo "Refer to the ChromiumOS Developer's Handbook for more details."
  echo "http://www.chromium.org/chromium-os/developer-guide#TOC-Boot-from-your-USB-disk"
  while true; do
    sleep 1
    read -p "Was the installation of the image successful? " choice
    case $choice in
        [Yy]*) return 0;;
        [Nn]*) return 1;;
        *) echo "Please answer y or n.";;
    esac
  done
}

ethernet_flash()
{
  echo
  echo "Please ensure your Chromebook is up and running Chrome so"
  echo "cros flash may run."
  echo "If your Chromebook has a broken image you can try:"
  echo "1. Rebooting your Chromebook 6 times to install the last working image"
  echo "2. Alternatively, running the following command on the Chromebook"
  echo "   will also rollback to the last working image:"
  echo "   'update_engine_client --rollback --nopowerwash --reboot'"
  echo "3. Flashing a new image through USB"
  echo
  sleep 1
  read -p $'Press enter to continue and retry the ethernet flash' notused
  cros flash --board=${BISECT_BOARD} --clobber-stateful ${BISECT_REMOTE} ~/trunk/src/build/images/${BISECT_BOARD}/latest/chromiumos_test_image.bin
}

reboot()
{
  ret_val=0
  pushd ~/trunk/src/scripts > /dev/null
  set -- --remote=${BISECT_REMOTE}
  . ./common.sh || ret_val=1
  . ./remote_access.sh || ret_val=1
  TMP=$(mktemp -d)
  FLAGS "$@" || ret_val=1
  remote_access_init || ret_val=1
  remote_reboot || ret_val=1
  popd > /dev/null

  return $ret_val
}

echo
echo "INSTALLATION BEGIN"
echo

if [[ "${BISECT_MODE}" == "OBJECT_MODE" ]]; then
  echo "EMERGING ${BISECT_PACKAGE}"
  set -x
  sudo rm -rf /build/${BISECT_BOARD}/var/cache/portage/*
  sudo rm -rf /build/${BISECT_BOARD}/tmp/portage/${BISECT_PACKAGE}*
  set +x
  if [[ ${BISECT_PACKAGE} == *chromeos-chrome ]]; then
    if [[ ${BISECT_USE_FLAGS} == *chrome_internal* && \
      ${BISECT_USE_FLAGS} != *-chrome_internal* ]]; then
      # for the pre-upload check of the length of lines
      chrome_build_dir="/var/cache/chromeos-chrome/chrome-src-internal/src/"
      chrome_build_dir+="out_${BISECT_BOARD}"
    else
      # for the pre-upload check of the length of lines
      chrome_build_dir="/var/cache/chromeos-chrome/chrome-src/src/"
      chrome_build_dir+="out_${BISECT_BOARD}"
    fi
    set -x
    sudo rm -rf ${chrome_build_dir}
    set +x
  fi
  set -x
  CLEAN_DELAY=0 emerge-${BISECT_BOARD} -C ${BISECT_PACKAGE}
  USE="${BISECT_USE_FLAGS}" emerge-${BISECT_BOARD} ${BISECT_PACKAGE}
  set +x
  emerge_status=$?

  if [[ ${emerge_status} -ne 0 ]] ; then
    echo "emerging ${BISECT_PACKAGE} returned a non-zero status: $emerge_status"
    exit 1
  fi

  echo
  echo "DEPLOYING TO ${BISECT_REMOTE}"

  if [[ ${BISECT_PACKAGE} == *chromeos-kernel-* ]]; then
    cmd="/mnt/host/source/src/scripts/update_kernel.sh --board=${BISECT_BOARD} --remote=${BISECT_REMOTE}"
    if [[ ${BISECT_REMOTE} == *:* ]]; then
      IP=$(echo $1 | cut -d ":" -f1)
      PORT=$(echo $1 | cut -d ":" -f2)
      cmd="/mnt/host/source/src/scripts/update_kernel.sh --board=${BISECT_BOARD} --remote=${IP} --ssh_port=${PORT}"
    fi
    if [[ ${BISECT_REBOOT_OPTION} == false ]]; then
      cmd+=" --noreboot"
    fi
    set -x
    # exec the command to make sure it always exit after
    exec $cmd
    set +x
  fi

  if [[ ${BISECT_PACKAGE} == *chromeos-chrome ]]; then
    # deploy_chrome needs to run inside chrome source tree
    pushd ~/chrome_root
    set -x
    deploy_chrome --force --build-dir=${chrome_build_dir}/Release \
      --device=${BISECT_REMOTE}
    set +x
    popd
  else
    set -x
    cros deploy ${BISECT_REMOTE} ${BISECT_PACKAGE} --log-level=info
    set +x
  fi
  deploy_status=$?

  if [[ ${BISECT_REBOOT_OPTION} == false ]]; then
    exit 0
  fi

  if [[ ${deploy_status} -eq 0 ]] ; then
    echo "Deploy successful. Rebooting device..."
    reboot
    if [[ $? -ne 0 ]] ; then
      echo
      echo "Could not automatically reboot device!"
      read -p "Please manually reboot device and press enter to continue" notused
    fi
    exit 0
  fi

  echo "Deploy failed! Trying build_image/cros flash instead..."
  echo
fi

echo "BUILDING IMAGE"
pushd ~/trunk/src/scripts
USE="${BISECT_USE_FLAGS}" ./build_image test --board=${BISECT_BOARD} \
  --noenable_rootfs_verification --noeclean
build_status=$?
popd

if [[ ${build_status} -eq 0 ]] ; then
    echo
    echo "FLASHING"
    echo "Pushing built image onto device."
    echo "cros flash --board=${BISECT_BOARD} --clobber-stateful ${BISECT_REMOTE} ~/trunk/src/build/images/${BISECT_BOARD}/latest/chromiumos_test_image.bin"
    cros flash --board=${BISECT_BOARD} --clobber-stateful ${BISECT_REMOTE} ~/trunk/src/build/images/${BISECT_BOARD}/latest/chromiumos_test_image.bin
    cros_flash_status=$?
    while [[ ${cros_flash_status} -ne 0 ]] ; do
        while true; do
          echo
          echo "cros flash has failed! From here you can:"
          echo "1. Flash through USB"
          echo "2. Retry flashing over ethernet"
          echo "3. Abort this installation and skip this image"
          echo "4. Abort this installation and mark test as failed"
          sleep 1
          read -p "Which method would you like to do? " choice
          case $choice in
              1) usb_flash && break;;
              2) ethernet_flash && break;;
              3) exit 125;;
              4) exit 1;;
              *) echo "Please answer 1, 2, 3, or 4.";;
          esac
        done

        cros_flash_status=$?
    done
else
    echo "build_image returned a non-zero status: ${build_status}"
    exit 1
fi

exit 0
