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