#!/bin/bash
# Copyright 2019 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
### generate a report of error conditions

## usage: fx triage [--config <config-file>]
##                  [--select <select-string>]
##                  [--data <path-to-snapshot>]
## Without 'select':
## Processes "fx snapshot" output looking for problems specified in config
## files. If no snapshot output is specified (no '--data') it runs a new
## "fx snapshot" and uses its "inspect.json" file.
## With 'select':
## Generates selectors from the snapshot, filtered by select-string.
## --config, --tag, --exclude-tag options are ignored.
##
##    --config <config-file-or-dir>      Path to config file or dir
##    --data <snapshot-or-dir>          Path to snapshot.zip or uncompressed dir
##    --tag <tag>                        Adds an action tag to include
##    --exclude-tag <tag>                Adds an action tag to exclude
##    --select <string>                  Generates selectors filtered by <string>
##    --test                             (deprecated) Run self-tests (only)
##
## 0 or more --config paths may be given. Path is relative to CWD, or absolute.
##   If path is a directory, path/*.triage will be loaded.
##   If 0 paths are given, config defaults to
##   /src/diagnostics/config/triage/*.triage.
##
## 0 or more --tag values may be given. If tags are provided, only actions with
##   matching tags will be included.
##
## 0 or more --exclude-tag values may be given. If exclude tags are provided,
##   actions with matching tags will be excluded. This value is ignored if
##   any --tag values are included.
##
## If no --tag values or --exclude-tag values are included then all of the
##   actions will be included.
##
## 0 or 1 --data paths may be given.
##   Path must point to a snapshot.zip or a directory containing an unpacked snapshot.zip.
##   For this path, 'fx triage' will analyze all supported filetypes.
##   Currently, the only supported filetype is inspect.json.
##   Future versions will add support for different files.
##   If no --data is given,`ffx target snapshot` will be invoked and analyzed.
##
## 0 or more --select strings may be given. --select changes the
## operation of the program: it generates all selectors for all
## data in the snapshot and then filters them (via grep) through
## all the --select strings.

set -e
trap 'echo "Triage found a problem!"' ERR

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

# Defaults.
config_paths=( )
testit=""
data_paths=( )
tags=( )
exclude_tags=( )
flags=""
select_filters=( )
output_format="text"

# Flag parsing.
while [[ "$1" =~ ^- ]]; do
  case "$1" in
  -h|--help)
    fx-command-help
    exit 0
    ;;
  --config)
    shift
    config_paths+=( "$1" )
    ;;
  --data)
    shift
    data_paths+=( "$1" )
    ;;
  --select)
    shift
    select_filters+=( "$1" )
    ;;
  --tag)
    shift
    tags+=( "$1" )
    ;;
  --exclude-tag)
    shift
    exclude_tags+=( "$1" )
    ;;
  --output-format)
    shift
    output_format="$1"
    ;;
  --test)
    testit="yes"
    ;;
  *)
    echo Bad option "$1"
    echo
    fx-command-help
    exit 1
  esac
  shift
done

triage_exe="${HOST_OUT_DIR}/../host-tools/triage"
diag_tool_exe="${HOST_OUT_DIR}/../host-tools/diag_tool"

if [[ -n "$testit" ]]; then
  echo "[ERROR] fx triage --test is deprecated!"
  echo "please use 'fx test triage_lib_test' instead"
  exit
fi

if [ -z "${data_paths}" ]; then
  temp_dir=$(mktemp -d)
  trap 'rm -rf "${temp_dir}"' EXIT
  fx-command-run host-tool ffx target snapshot -d "${temp_dir}" > /dev/null
  unzip "${temp_dir}/snapshot.zip" -d "${temp_dir}" > /dev/null
  data_paths+="${temp_dir}"
fi

unzipped_data_dirs=( )

for data_path in "${data_paths[@]}"
  do
  if [[ -d "${data_path}" ]] ; then
    # This should be an unzipped snapshot.zip; pass it to the Triage
    # executable.
    # Triage will complain if snapshot.zip files aren't in the directory.
    unzipped_data_dirs+=( $data_path )
  else
    # This should be a .zip file. unzip will complain if not. Unzip it and
    # pass its contents to the Triage executable.
    temp_dir=$(mktemp -d)
    trap 'rm -rf "${temp_dir}"' EXIT
    unzip "${data_path}" -d "${temp_dir}" > /dev/null
    unzipped_data_dirs+=( $temp_dir )
  fi
done

if [ -z "${select_filters}" ]; then

  if (( !"${#config_paths[@]}" )); then
    config_paths=( "${FUCHSIA_DIR}/src/diagnostics/config/triage/"
                   "${FUCHSIA_DIR}/src/diagnostics/config/triage/detect/" )
  fi

  config_files=( )
  for config_path in "${config_paths[@]}"; do
    if [[ -d "${config_path}" ]] ; then
      config_files+=( "${config_path}"/*.triage )
    else
      config_files+=( "${config_path}" )
    fi
  done

  for config_file in "${config_files[@]}"
  do
    flags="${flags} --config ${config_file}"
  done

  for tag in "${tags[@]}"
  do
    flags="${flags} --tag ${tag}"
  done

  for data_path in "${unzipped_data_dirs[@]}"
  do
    flags="${flags} --data ${data_path}"
  done

  for tag in "${exclude_tags[@]}"
  do
    flags="${flags} --exclude-tag ${tag}"
  done

  flags="${flags} --output-format ${output_format}"

  if [[ ! -f "$triage_exe" ]]; then
    echo "Building Triage..."
    fx-command-run build triage
  fi

  $triage_exe ${flags}

else
  temp_dir=$(mktemp -d)
  trap 'rm -rf "${temp_dir}"' EXIT

  for data_path in "${unzipped_data_dirs[@]}"
  do
    $diag_tool_exe --snapshot "$data_path/inspect.json" generate "$temp_dir/diag_out"
    cat "$temp_dir/diag_out" >> "$temp_dir/diag_all"
    echo >> "$temp_dir/diag_all" # diag_tool output has no final newline
  done

  for filter in "${select_filters[@]}"
  do
    # Note this repeatedly filters diag_all by writing to a temp file and
    # moving it back into place.
    cat "$temp_dir/diag_all" | grep "$filter" > "$temp_dir/diag_filtered"
    mv "$temp_dir/diag_filtered" "$temp_dir/diag_all"
  done

  cat "$temp_dir/diag_all" | sort | uniq | sed s/^/INSPECT:/
fi
