#!/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
### listen for logs from the on-device log_listener

## usage: fx log [-h | --help] [--raw] [-r | --remote-symbols] LOG_LISTENER_FLAGS
##
##    --raw                   do not attempt to symbolize the log
##
##    --remote-symbols|-r     attemp to resolve symbols using predefined remote
##                            symbol servers for symbols that cannot be resolved
##                            locally. See `fx help symbolize` for more
##                            information on remote symbol servers.
##
##    --help|-h               show this help and attempt to also show the
##                            on-device log_listener help
##
##    LOG_LISTENER_FLAGS      bypass flags for the on-device log_listener
##
## Creates an SSH connection with a device and starts listening for logs.
## It will listen to the device specified with `fx -d DEVICE log` or
## `fx set-device`, otherwise it will try to find a connected device.

set -o pipefail

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

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 is_remote=0

while [[ $# -ne 0 ]]; do
  case "$1" in
  -h|--help)
    fx-command-help
    echo
    echo "*** Help for on-device log_listener:"
    fx-command-exec shell log_listener -h
    exit 0
    ;;
  --raw)
    is_raw=1
    ;;
  --remote-symbols|-r)
    is_remote=1
    ;;
  *)
    break
  esac
  shift
done

if (( is_raw )) && (( is_remote )); then
  fx-error "Invalid syntax: --raw and -r cannot be used together"
  fx-command-help
  exit 1
fi

if (( is_raw )); then
  listen "$@"
else
  declare symbolizer=( "fx-command-run" "symbolize" )
  if (( is_remote )); then
    symbolizer+=("-r")
  fi
  listen "$@" | "${symbolizer[@]}"
fi
