#!/bin/bash

# Copyright 2019 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 script contains debug functions called by factory_install.sh

DEBUG_FUNCTIONS=(call_dev_debug_vboot call_mosys_eventlog sys_fw_log call_dmesg
                 call_get_storage_info checksums call_lspci cat_write_gpt
                 dd_storage)

# Checks if the given debug action is valid and supported.
is_valid_debug_action() {
  [ "$1" -eq "$1" 2>/dev/null ] &&
  [ "$1" -ge 0 -a "$1" -lt "${#DEBUG_FUNCTIONS[@]}" ]
}

debug_menu() {
  echo "## Available information in Debug console:"
  echo "##   a) Print all debug information"
  echo "##   0) dev_debug_vboot"
  echo "##   1) firmware event log"
  echo "##   2) /sys/firmware/log"
  echo "##   3) kernel log"
  echo "##   4) Storage Information"
  echo "##   5) checksums"
  echo "##   6) lspci"
  echo "##   7) /usr/sbin/write_gpt.sh"
  echo "##   8) dd storage device"
  echo "##   s) Save all debug information to USB"
  echo "##   q) Quit debug console"
}

debug_functions_all() {
  for debug_function in "${DEBUG_FUNCTIONS[@]}"; do
    "${debug_function}"
  done
}

call_dev_debug_vboot() {
  echo
  echo "## dev_debug_vboot:"
  dev_debug_vboot || true

  echo
  echo "## debug_vboot_noisy.log:"
  cat /var/log/debug_vboot_noisy.log || true
}

call_mosys_eventlog() {
  echo
  echo "## firmware event log:"
  mosys eventlog list || true
}

sys_fw_log() {
  echo
  echo "## /sys/firmware/log:"
  cat /sys/firmware/log || true
}

call_dmesg() {
  echo
  echo "## kernel log:"
  dmesg || true
}

call_get_storage_info() {
  echo
  echo "## Storage information:"
  get_storage_info || true
}

checksums() {
  echo
  echo "## checksums:"
  local parts=$(sed -n 's/.* \([^ ]*[^0-9][24]$\)/\1/p' /proc/partitions)
  for part in ${parts}; do
    md5sum "/dev/${part}" || true
  done
}

call_lspci() {
  echo
  echo "## lspci:"
  lspci -t || true
}

cat_write_gpt() {
  echo
  echo "## /usr/sbin/write_gpt.sh:"
  cat /usr/sbin/write_gpt.sh || true
}

dd_storage() {
  storage_devices=$(lsblk | grep disk | awk '{print $1}')
  echo
  echo "## dd storage device:"
  for device in ${storage_devices}; do
    for part in p2 p4 2 4; do
      local name="${device}${part}"
      if [ -e "/dev/${name}" ]; then
        echo
        echo "### dd ${name}:"
        dd if="/dev/${name}" bs=512 count=1 status=none | od -xc -Ax || true
      fi
    done
  done
}

debug_save_logs() {
  echo "-- USB info --"
  lsblk -p -S

  echo
  echo "-- select USB device to save log file --"
  usbs=$(lsblk -p -S | grep usb | awk '{print $1}')
  for usb in ${usbs}; do
    lsblk -p "${usb}" -l | grep part
  done

  read -p "Enter usb device partition(eg. /dev/sdb1) > " usb_part

  local mount_point="/media"
  mount "${usb_part}" "${mount_point}" || true
  if ! lsblk | grep -q "${mount_point}"; then
    echo "Fail to mount ${usb_part} to ${mount_point}"
    return
  fi
  debug_functions_all > "${mount_point}/debug.log" 2>&1
  umount "${mount_point}" || true

  echo "-- debug.log saved to ${usb_part}. --"
}

main() {
  while true; do
    clear
    debug_menu
    read -p 'debug_action> ' action
    action="$(echo "${action}" | tr 'A-Z' 'a-z')"

    case "${action}" in
      "a")
        debug_functions_all 2>&1 | secure_less.sh
        ;;
      "s")
        debug_save_logs
        ;;
      "q")
        break
        ;;
      *)
        if is_valid_debug_action "${action}"; then
          "${DEBUG_FUNCTIONS[action]}" 2>&1 | secure_less.sh
        else
          echo "Invalid debug action."
        fi
        ;;
    esac

    read -N 1 -p "Press any key to continue to debug console> "
  done
}
main "$@"