#!/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,`fx 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=( )

# 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" )
    ;;
  --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 snapshot --output-directory "${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/" )
  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

  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
