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