#!/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.

#### CATEGORY=Run, inspect and debug
### Display logs from a target device.

## usage: fx log FFX_LOG_FLAGS
##
##    FFX_LOG_FLAGS           flags to pass to ffx log, see `fx ffx log --help`.
##
## LEGACY MODE: listen for logs from the on-device log_listener
##
## usage: fx log --legacy [-h | --help] [--raw] LOG_LISTENER_FLAGS
##
##    --legacy                runs in legacy mode, i.e. listen for logs from
##                            the on-device log_listener
##
##    --raw                   do not attempt to symbolize the log
##
##    --help|-h               show this help and attempt to also show the
##                            on-device log_listener help
##
##    LOG_LISTENER_FLAGS      flags (e.g., severity) to pass to the on-device
##                            log_listener; supported flags are listed at
##                            https://fuchsia.dev/fuchsia-src/reference/diagnostics/consumers/log_listener.
##
## Creates an SSH connection with a device and starts listening for logs.
## It will listen to the device specified with `fx -t DEVICE log` or
## `fx set-device`, otherwise it will try to find a connected device.
##
## If the command hangs without printing anything, first check to make sure `fx shell`
## works on its own.
##
## For more information on flags supported by the on-device log_listener, see
## https://fuchsia.dev/fuchsia-src/reference/diagnostics/consumers/log_listener.

set -o pipefail

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?

if [[ "$1" == '--legacy' ]]; then
  shift

  fx-warn 'DEPRECATION WARNING'
  fx-warn 'You are using `fx log` in legacy mode, this mode will be removed soon.'
  fx-warn 'If you have any concerns, please report to https://fxbug.dev/131196.\n'

  function listen {
    while true; do
      fx-command-run wait || return
      fx-command-run shell log_listener "$@"
      local error_code=$?
      if [[ "${error_code}" -eq 0 ]]; then
        # this is necessary, so that "--dump_logs yes" works as expected.
        break
      fi
      echo "$(date '+%Y-%m-%d %H:%M:%S %Z'): Connection lost (status ${error_code}), reconnecting..."
    done
  }

  declare is_raw=0
  declare symbolizer=( "fx-command-run" "ffx" "debug" "symbolize" )

  while [[ $# -ne 0 ]]; do
    case "$1" in
    -h|--help)
      fx-command-help
      echo
      echo "[Attempting to shell into a connected device to provide help for the on-device log_listener]"
      fx-command-exec shell log_listener -h
      exit 0
      ;;
    --raw)
      is_raw=1
      ;;
    --remote-symbols|-r)
      fx-error "--remote-symbols|-r is deprecated. Remote symbolization will be tried automatically."
      exit 1
      ;;
    --no-prettify)
      symbolizer+=("--no-prettify")
      ;;
    *)
      break
    esac
    shift
  done

  if (( is_raw )); then
    listen "$@"
  else
    listen "$@" | "${symbolizer[@]}"
  fi
else
  fx-command-run ffx log "$@"
fi
