|  | #!/bin/bash | 
|  | # Copyright 2020 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 | 
|  | ### Obtain and parse a snapshot from a connected target. | 
|  |  | 
|  | ## Connects to a running target and obtains a snapshot that contains useful | 
|  | ## information for debugging a target. | 
|  | ## | 
|  | ## Information supplied includes: | 
|  | ## - Build information and annotations. | 
|  | ## - Kernel and System logs. | 
|  | ## - Inspect Data. | 
|  | ## | 
|  | ## If no directory is supplied, a unique one will be generated. | 
|  | ## | 
|  | ## Usage: fx snapshot [(--output-directory|-o)] <DIRECTORY>] -- <TARGET ARGS> | 
|  | ## | 
|  | ##    --output-directory    (Optional) Directory where the files will be stored. | 
|  | ##                          Must be an existing directory. | 
|  |  | 
|  | # Load environment helpers. | 
|  | source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/../lib/vars.sh || exit $? | 
|  | fx-config-read | 
|  |  | 
|  | # Flag Parsing. | 
|  | output_dir= | 
|  | is_output_dir_provided=false | 
|  |  | 
|  | while [[ $# -gt 0 ]]; do | 
|  | case "$1" in | 
|  | --help|-h) | 
|  | fx-command-help | 
|  | exit 0 | 
|  | ;; | 
|  | --output-directory|-o) | 
|  | shift | 
|  | output_dir="$1" | 
|  | is_output_dir_provided=true | 
|  | ;; | 
|  | --) | 
|  | shift | 
|  | break   # Remaining flags are passed on to the target. | 
|  | ;; | 
|  | *) | 
|  | fx-error "Invalid flag $1" | 
|  | exit 1 | 
|  | esac | 
|  | shift | 
|  | done | 
|  |  | 
|  | # Check the validity of the output file. | 
|  | if [[ "${is_output_dir_provided}" == "true" ]]; then | 
|  | if [[ -z "${output_dir}" ]]; then | 
|  | fx-error "No output directory provided." | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | if [[ ! -d "${output_dir}" ]]; then | 
|  | fx-error "Path provided is not a directory." | 
|  | exit 1 | 
|  | fi | 
|  | fi | 
|  |  | 
|  | # If no output directory is supplied, generate a unique one according to time. | 
|  | if [[ -z "${output_dir}" ]]; then | 
|  | # Generate an output directory. | 
|  | # Format is /tmp/snapshots/<YearMonthDay_HourMinuteSecond> | 
|  | uuid=`date +"%Y%m%d_%H%M%S"` | 
|  | output_dir="/tmp/snapshots/${uuid}" | 
|  | mkdir -p "${output_dir}" | 
|  | if [[ "$?" -ne 0 ]]; then | 
|  | rm -rf "${output_dir}"  # Just in case. | 
|  | fx-error "Failed to create output directory ${output_dir}." | 
|  | fx-error "Check errors or provide your own with --output-directory. See --help for more details." | 
|  | exit 1 | 
|  | fi | 
|  | fi | 
|  |  | 
|  | fx-info "Consider running \`ffx target snapshot\` instead. fx snapshot will eventually be deprecated." | 
|  |  | 
|  | # At this point, we know that we have a valid output directory. | 
|  |  | 
|  | error_bringing_snapshot= | 
|  | tempfile="/tmp/__snapshot_temp" | 
|  | output_file="${output_dir}/snapshot.zip" | 
|  | # Obtain the snapshot and store it in a temporary location. | 
|  | fx-command-run shell snapshot "${@}" > "${output_file}" | 
|  | if [ "$?" -ne 0 ]; then | 
|  | fx-error "Could not obtain snapshot from target." | 
|  | error_bringing_snapshot=true | 
|  | else | 
|  | echo "Exported ${output_file}" | 
|  | fi | 
|  |  | 
|  | if [[ ! -z "${error_bringing_snapshot}" ]]; then | 
|  | # Do error cleanup. | 
|  | rm -f "${output_file}" | 
|  | if [[ "${is_output_dir_provided}" == "false" ]]; then | 
|  | rm -rf "${output_dir}" | 
|  | fi | 
|  | exit 1 | 
|  | fi |