#!/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/"
                   "${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

  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
