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