#!/bin/bash
# Copyright 2018 The Chromium OS 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 opens various servo consoles using cu, from outside the chroot,
# automatically getting the correct console from dut-control. This
# also tees the output to a secondary logfile.
#
# The recommended way to use this is to setup an alias, e.g. add this in
# your .bashrc (outside the chroot):
# alias dut-console="~/chromiumos/src/platform/dev/contrib/dut-console"
# And then simply run:
# dut-console -c ec
#
# The script also allows to connect to different servod port, e.g.
# dut-console -c cpu -p 9998

CONTRIB_DIR="$(dirname "$(readlink -f "$0")")"
# Script is stored in $CROS_SDK/src/platform/dev/contrib
CROS_SDK="${CONTRIB_DIR}/../../../.."
PYTHONPATH="${CROS_SDK}/chroot/usr/lib64/python2.7/site-packages"

kdmx_pid=

# Loads script libraries.
. "${CONTRIB_DIR}/common.sh" || exit 1

FLAGS_HELP='dut-control [flags]

Opens CPU/EC servo console using "cu", outputs to both terminal, and an output
file named "log-${type}[-${port}]" in the current directory.

The recommended way to use this is to setup an alias, e.g. add this in your
.bashrc (outside the chroot):
# alias dut-console="~/chromiumos/src/platform/dev/contrib/dut-console"
And then simply run:
# dut-console -c ec
'

DEFINE_string console "cpu" \
  "Opens a console, one of cpu, ec, cr50, fpmcu, servo_micro, servo_v4" c
DEFINE_integer port "" "Servod port" p
DEFINE_boolean kdmx "${FLAGS_FALSE}" \
  "Start kdmx proxy for kgdb (only makes sense for cpu console)" k

# Parse command line.
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"

if [[ "$#" -ne 0 ]]; then
  echo "Extraneous arguments on command line: $@"
  flags_help
  exit 2
fi

# Only now can we die on error.  shflags functions leak non-zero error codes,
# so will die prematurely if 'set -e' is specified before now.
set -e

cleanup() {
  trap - INT TERM ERR EXIT

  if [[ -n "${kdmx_pid}" ]]; then
    kill "${kdmx_pid}" 2>/dev/null
  fi
}

get_pty() {
  local pty_name="$1"
  local port="$2"
  local args=()

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

  PYTHONPATH="${PYTHONPATH}" \
    python -m "servo.dut_control" "${pty_name}" "${args[@]}" | cut -d : -f 2
}

find_cu() {
  if ! hash cu; then
    echo "Please install cu first:" >&2
    echo "sudo apt-get install cu" >&2
    exit 1
  fi
}

main() {
  local kdmx
  local pty
  local pty_name
  local outlog

  find_cu

  trap cleanup INT TERM ERR EXIT

  pty_name="${FLAGS_console}_uart_pty"
  pty="$(get_pty "${pty_name}" "${FLAGS_port}")"

  if [[ ! -e "${pty}" ]]; then
    echo "Cannot find pty ${pty_name}." >&2
    exit 1
  fi

  outlog="log-${FLAGS_console}"
  if [[ -n "${FLAGS_port}" ]]; then
    outlog="${outlog}-${FLAGS_port}"
  fi

  if [[ "${FLAGS_kdmx}" -eq "${FLAGS_TRUE}" ]]; then
    if ! hash kdmx; then
      echo "Please build and put kdmx in your PATH first." >&2
      echo "See https://www.chromium.org/chromium-os/how-tos-and-troubleshooting/kernel-faq" >&2
      exit 1
    fi

    # Note that we hardcode kdmx pty file location in the /tmp directory of the
    # chroot. This should be ok as there is normally only one user, and only
    # a single instance of dut-console/kdmx can run per console/servod instance.
    local spath_in="/tmp/kdmx_${FLAGS_console}"
    if [[ -n "${FLAGS_port}" ]]; then
      spath_in="${spath_in}_${FLAGS_port}"
    fi
    local spath="${CROS_SDK}/chroot${spath_in}"
    local spath_pty="${spath}_trm"
    local spath_log="${spath}_log"

    # Make sure we do not use a stale pty file
    rm -f "${spath_pty}"

    echo "Muxing ${pty_name}:${pty} with kdmx..."
    kdmx -n -p "${pty}" -s "${spath}" > "${spath_log}" 2>&1 &
    kdmx_pid="$!"
    # Give kdmx enough time to start and create pty file
    sleep 0.5

    pty="$(cat "${spath_pty}" 2>/dev/null || true)"
    if [[ -z "${pty}" ]]; then
      echo "kdmx failed to start:" >&2
      cat "${spath_log}" >&2
      exit 1
    fi
    echo "You can now use kdbg inside the chroot with a command like:"
    echo '${CROSS_ARCH}-gdb \
        /build/${BOARD}/usr/lib/debug/boot/vmlinux \
        -ex "target remote $(cat '"${spath_in}"'_gdb)"'
  fi

  echo "Opening ${pty_name}:${pty}..."
  echo "Log in ${outlog}, type <enter>~. to exit."

  stdbuf -oL cu --nostop -l "${pty}" | tee "${outlog}"
}

main
