| #!/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 |