xref: /openbmc/openpower-debug-collector/dump/tools/opdump/opdreport (revision 1bee03b8426b0f69ec3bae2fd6a4714f2b4a0678)
135714cd2SDhruvaraj Subhashchandran#!/bin/bash
235714cd2SDhruvaraj Subhashchandran# shellcheck disable=SC2034  # Variable is used elsewhere
335714cd2SDhruvaraj Subhashchandran
435714cd2SDhruvaraj Subhashchandranhelp=$(cat << EOF
535714cd2SDhruvaraj Subhashchandran        opdreport creates an archive consisting of the following:
635714cd2SDhruvaraj Subhashchandran                * host dump files and header applied on top of it
735714cd2SDhruvaraj Subhashchandran        The type parameter controls the content of the data. The generated
835714cd2SDhruvaraj Subhashchandran        archive is stored in the user specified location.
935714cd2SDhruvaraj Subhashchandran
1035714cd2SDhruvaraj Subhashchandranusage: opdreport [OPTION]
1135714cd2SDhruvaraj Subhashchandran
1235714cd2SDhruvaraj SubhashchandranOptions:
1335714cd2SDhruvaraj Subhashchandran        -n, --name <name>     Name to be used for the archive.
1435714cd2SDhruvaraj Subhashchandran                              Default name format
1535714cd2SDhruvaraj Subhashchandran                              SYSDUMP.<serial number>.<dump_id>.<time>
1635714cd2SDhruvaraj Subhashchandran                              Optional parameter.
1735714cd2SDhruvaraj Subhashchandran        -d, --dir <directory> Archive directory to copy the compressed report.
1835714cd2SDhruvaraj Subhashchandran                              Default output directory is current working
1935714cd2SDhruvaraj Subhashchandran                              directory. Optional parameter.
2035714cd2SDhruvaraj Subhashchandran        -i, --dumpid <id>     Dump identifier to associate with the archive.
2135714cd2SDhruvaraj Subhashchandran                              Identifiers include numeric characters.
2235714cd2SDhruvaraj Subhashchandran                              Default dump identifier is 0
2335714cd2SDhruvaraj Subhashchandran        -s, --size <size>     Maximum allowed size (in KB) of the archive.
2435714cd2SDhruvaraj Subhashchandran                              Report will be truncated if size exceeds
2535714cd2SDhruvaraj Subhashchandran                              this limit. Default size is unlimited.
2635714cd2SDhruvaraj Subhashchandran        -f, --failingunit     The id of the failed unit
2735714cd2SDhruvaraj Subhashchandran        -e, --eid             Error log associated with the failure
2835714cd2SDhruvaraj Subhashchandran        -t, --type            Type of the dump to be collected
2935714cd2SDhruvaraj Subhashchandran                              1  -  Hardware dump
3035714cd2SDhruvaraj Subhashchandran                              3  -  Performance dump
3135714cd2SDhruvaraj Subhashchandran                              5  -  Hostboot dump
3235714cd2SDhruvaraj Subhashchandran                              10 -  SBE Dump
3335714cd2SDhruvaraj Subhashchandran        -h, --help            Display this help and exit.
3435714cd2SDhruvaraj SubhashchandranEOF
3535714cd2SDhruvaraj Subhashchandran)
3635714cd2SDhruvaraj Subhashchandran
3735714cd2SDhruvaraj Subhashchandran# Constants
3835714cd2SDhruvaraj Subhashchandranreadonly OP_DUMP="opdump"
3935714cd2SDhruvaraj Subhashchandranreadonly DREPORT_SOURCE="/usr/share/dreport.d"
4035714cd2SDhruvaraj Subhashchandranreadonly TRUE=1
4135714cd2SDhruvaraj Subhashchandranreadonly FALSE=0
4235714cd2SDhruvaraj Subhashchandranreadonly TIME_STAMP="date -u"
4335714cd2SDhruvaraj Subhashchandranreadonly UNLIMITED="unlimited"
4435714cd2SDhruvaraj Subhashchandranreadonly DREPORT_INCLUDE="$DREPORT_SOURCE/include.d"
4535714cd2SDhruvaraj Subhashchandranreadonly INVENTORY_MANAGER='xyz.openbmc_project.Inventory.Manager'
4635714cd2SDhruvaraj Subhashchandranreadonly INVENTORY_PATH='/xyz/openbmc_project/inventory/system'
4735714cd2SDhruvaraj Subhashchandranreadonly INVENTORY_ASSET_INT='xyz.openbmc_project.Inventory.Decorator.Asset'
4835714cd2SDhruvaraj Subhashchandranreadonly INVENTORY_BMC_BOARD='/xyz/openbmc_project/inventory/system/chassis/motherboard'
4935714cd2SDhruvaraj Subhashchandranreadonly HEADER_EXTENSION="$DREPORT_INCLUDE/gendumpheader"
5035714cd2SDhruvaraj Subhashchandranreadonly FILE_SCRIPT="$DREPORT_SOURCE/include.d/gendumpinfo"
5135714cd2SDhruvaraj Subhashchandran
5235714cd2SDhruvaraj Subhashchandran# Error Codes
5335714cd2SDhruvaraj Subhashchandranreadonly SUCCESS=0
5435714cd2SDhruvaraj Subhashchandranreadonly INTERNAL_FAILURE=1
5535714cd2SDhruvaraj Subhashchandranreadonly RESOURCE_UNAVAILABLE=2
5635714cd2SDhruvaraj Subhashchandran
5735714cd2SDhruvaraj Subhashchandran# Variables
5835714cd2SDhruvaraj Subhashchandrandeclare -x dump_type="$OP_DUMP"
5935714cd2SDhruvaraj Subhashchandrandeclare -x dump_sbe_type=100
6035714cd2SDhruvaraj Subhashchandrandeclare -x size_dump=""
6135714cd2SDhruvaraj Subhashchandrandeclare -x elog_id="00000000"
6235714cd2SDhruvaraj Subhashchandrandeclare -x EPOCHTIME
6335714cd2SDhruvaraj SubhashchandranEPOCHTIME=$(date +"%s")
6435714cd2SDhruvaraj Subhashchandrandeclare -x name=""
6535714cd2SDhruvaraj Subhashchandrandeclare -x dump_dir="/tmp"
6635714cd2SDhruvaraj Subhashchandrandeclare -x dump_id="00000000"
6735714cd2SDhruvaraj Subhashchandrandeclare -x dump_size="unlimited"
6835714cd2SDhruvaraj Subhashchandrandeclare -x content_path=""
6935714cd2SDhruvaraj Subhashchandrandeclare -x name_dir=""
7035714cd2SDhruvaraj Subhashchandrandeclare -x serialNo="0000000"
7135714cd2SDhruvaraj Subhashchandrandeclare -x dDay
7235714cd2SDhruvaraj SubhashchandrandDay=$(date -d @"$EPOCHTIME" +'%Y%m%d%H%M%S')
7335714cd2SDhruvaraj Subhashchandrandeclare -x dump_content_type=""
7435714cd2SDhruvaraj Subhashchandrandeclare -x FILE=""
7535714cd2SDhruvaraj Subhashchandran
76*1bee03b8SSwarnendu-R-C#Source opdreport common functions
77*1bee03b8SSwarnendu-R-C. $DREPORT_INCLUDE/opfunctions
78*1bee03b8SSwarnendu-R-C
7935714cd2SDhruvaraj Subhashchandran# @brief Get serial number property from inventory
8035714cd2SDhruvaraj Subhashchandranfunction fetch_serial_number() {
8135714cd2SDhruvaraj Subhashchandran    serialNo=$(busctl get-property "$INVENTORY_MANAGER" "$INVENTORY_PATH" \
8235714cd2SDhruvaraj Subhashchandran            "$INVENTORY_ASSET_INT" SerialNumber | cut -d " " -f 2 | \
8335714cd2SDhruvaraj Subhashchandran        sed 's/^"\(.*\)"$/\1/')
8435714cd2SDhruvaraj Subhashchandran
8535714cd2SDhruvaraj Subhashchandran    if [ -z "$serialNo" ]; then
8635714cd2SDhruvaraj Subhashchandran        serialNo="0000000"
8735714cd2SDhruvaraj Subhashchandran    fi
8835714cd2SDhruvaraj Subhashchandran}
8935714cd2SDhruvaraj Subhashchandran
9035714cd2SDhruvaraj Subhashchandran# @brief Check the validity of user inputs and initialize global variables
9135714cd2SDhruvaraj Subhashchandranfunction initialize() {
9235714cd2SDhruvaraj Subhashchandran    # shellcheck disable=SC2154 # name comes from elsewhere
9335714cd2SDhruvaraj Subhashchandran    if [ -z "$name" ]; then
9435714cd2SDhruvaraj Subhashchandran        name="SYSDUMP"
9535714cd2SDhruvaraj Subhashchandran    fi
9635714cd2SDhruvaraj Subhashchandran    fetch_serial_number
9735714cd2SDhruvaraj Subhashchandran    # shellcheck disable=SC2154 # dump_id comes from elsewhere
9835714cd2SDhruvaraj Subhashchandran    name="${name}.${serialNo}.${dump_id}.${dDay}"
9935714cd2SDhruvaraj Subhashchandran
10035714cd2SDhruvaraj Subhashchandran    if [ -z "$dump_sbe_type" ]; then
10135714cd2SDhruvaraj Subhashchandran        echo "Error: Dump type is not provided."
10235714cd2SDhruvaraj Subhashchandran        return "$RESOURCE_UNAVAILABLE"
10335714cd2SDhruvaraj Subhashchandran    fi
10435714cd2SDhruvaraj Subhashchandran
10535714cd2SDhruvaraj Subhashchandran    if [ -z "$dump_dir" ]; then
10635714cd2SDhruvaraj Subhashchandran        dump_dir=$PWD
10735714cd2SDhruvaraj Subhashchandran    fi
10835714cd2SDhruvaraj Subhashchandran
10935714cd2SDhruvaraj Subhashchandran    if [[ "$dump_size" =~ ^[0-9]+$ ]]; then
11035714cd2SDhruvaraj Subhashchandran        dump_size=$((dump_size * 1024))
11135714cd2SDhruvaraj Subhashchandran    else
11235714cd2SDhruvaraj Subhashchandran        dump_size=$UNLIMITED
11335714cd2SDhruvaraj Subhashchandran    fi
11435714cd2SDhruvaraj Subhashchandran
115*1bee03b8SSwarnendu-R-C    get_originator_details "system"
116*1bee03b8SSwarnendu-R-C
11735714cd2SDhruvaraj Subhashchandran    return "$SUCCESS"
11835714cd2SDhruvaraj Subhashchandran}
11935714cd2SDhruvaraj Subhashchandran
12035714cd2SDhruvaraj Subhashchandran# @brief Collect the dump
12135714cd2SDhruvaraj Subhashchandranfunction collect() {
12235714cd2SDhruvaraj Subhashchandran    content_path="/tmp/dump_${dump_id}_${EPOCHTIME}"
12335714cd2SDhruvaraj Subhashchandran    dump_outpath="$content_path/plat_dump"
12435714cd2SDhruvaraj Subhashchandran    if ! mkdir -p "$dump_outpath"; then
12535714cd2SDhruvaraj Subhashchandran        echo "Could not create the destination directory $dump_outpath"
12635714cd2SDhruvaraj Subhashchandran        return "$INTERNAL_FAILURE"
12735714cd2SDhruvaraj Subhashchandran    fi
12835714cd2SDhruvaraj Subhashchandran
12935714cd2SDhruvaraj Subhashchandran    dump-collect --type "$dump_sbe_type" --id "0x$dump_id" \
13035714cd2SDhruvaraj Subhashchandran        --failingunit "$failing_unit" --path "$dump_outpath"
13135714cd2SDhruvaraj Subhashchandran}
13235714cd2SDhruvaraj Subhashchandran
13335714cd2SDhruvaraj Subhashchandran# @brief Package the dump and transfer to dump location
13435714cd2SDhruvaraj Subhashchandranfunction package() {
13535714cd2SDhruvaraj Subhashchandran    FILE="/tmp/dumpheader_${dump_id}_${EPOCHTIME}"
13635714cd2SDhruvaraj Subhashchandran    if ! mkdir -p "$dump_dir"; then
13735714cd2SDhruvaraj Subhashchandran        echo "Could not create the destination directory $dump_dir"
13835714cd2SDhruvaraj Subhashchandran        dump_dir="/tmp"
13935714cd2SDhruvaraj Subhashchandran    fi
14035714cd2SDhruvaraj Subhashchandran
14135714cd2SDhruvaraj Subhashchandran    cd "$content_path" || exit "$INTERNAL_FAILURE"
14235714cd2SDhruvaraj Subhashchandran
143c14bf2c9SSwethaParasa    dump_content_type=${dump_id:0:2}
14435714cd2SDhruvaraj Subhashchandran    "$FILE_SCRIPT"
14535714cd2SDhruvaraj Subhashchandran    elog_id=$eid
14635714cd2SDhruvaraj Subhashchandran
14735714cd2SDhruvaraj Subhashchandran    if ! tar -cvzf "$name" plat_dump/*Sbe* info.yaml; then
14835714cd2SDhruvaraj Subhashchandran        echo "$($TIME_STAMP)" "Could not create the compressed tar file"
14935714cd2SDhruvaraj Subhashchandran        return "$INTERNAL_FAILURE"
15035714cd2SDhruvaraj Subhashchandran    fi
15135714cd2SDhruvaraj Subhashchandran
15235714cd2SDhruvaraj Subhashchandran    size_dump=$(stat -c %s "$name")
15335714cd2SDhruvaraj Subhashchandran
15435714cd2SDhruvaraj Subhashchandran    if [ "$dump_size" != "$UNLIMITED" ] && \
15535714cd2SDhruvaraj Subhashchandran        [ "$size_dump" -gt "$dump_size" ]; then
15635714cd2SDhruvaraj Subhashchandran        rm "$name"
15735714cd2SDhruvaraj Subhashchandran        return "$RESOURCE_UNAVAILABLE"
15835714cd2SDhruvaraj Subhashchandran    fi
15935714cd2SDhruvaraj Subhashchandran
16035714cd2SDhruvaraj Subhashchandran    echo "Adding Dump Header: $HEADER_EXTENSION"
16135714cd2SDhruvaraj Subhashchandran    "$HEADER_EXTENSION"
16235714cd2SDhruvaraj Subhashchandran
16335714cd2SDhruvaraj Subhashchandran    if ! tee -a "$FILE" < "$name" > /dev/null; then
16435714cd2SDhruvaraj Subhashchandran        echo "$($TIME_STAMP)" "Could not create the compressed file"
16535714cd2SDhruvaraj Subhashchandran        rm -rf "$name" "$FILE"
16635714cd2SDhruvaraj Subhashchandran        return "$INTERNAL_FAILURE"
16735714cd2SDhruvaraj Subhashchandran    fi
16835714cd2SDhruvaraj Subhashchandran
16935714cd2SDhruvaraj Subhashchandran    if ! mv "$FILE" "$name"; then
17035714cd2SDhruvaraj Subhashchandran        echo "$($TIME_STAMP)" "Could not create the compressed file"
17135714cd2SDhruvaraj Subhashchandran        rm -rf "$name" "$FILE"
17235714cd2SDhruvaraj Subhashchandran        return "$INTERNAL_FAILURE"
17335714cd2SDhruvaraj Subhashchandran    fi
17435714cd2SDhruvaraj Subhashchandran
17535714cd2SDhruvaraj Subhashchandran    mv "$name" "$dump_dir"
17635714cd2SDhruvaraj Subhashchandran
17735714cd2SDhruvaraj Subhashchandran    rm -rf "$content_path"
17835714cd2SDhruvaraj Subhashchandran    rm -rf "$FILE" "$name"
17935714cd2SDhruvaraj Subhashchandran
18035714cd2SDhruvaraj Subhashchandran    return "$SUCCESS"
18135714cd2SDhruvaraj Subhashchandran}
18235714cd2SDhruvaraj Subhashchandran
18335714cd2SDhruvaraj Subhashchandran# @brief Initiate BMC dump
18435714cd2SDhruvaraj Subhashchandranfunction initiate_bmc_dump() {
18535714cd2SDhruvaraj Subhashchandran    bmcDumpPath=$(busctl call xyz.openbmc_project.Dump.Manager \
18635714cd2SDhruvaraj Subhashchandran            /xyz/openbmc_project/dump/bmc \
18735714cd2SDhruvaraj Subhashchandran        xyz.openbmc_project.Dump.Create CreateDump a\{sv\} 0)
18835714cd2SDhruvaraj Subhashchandran    result=$?
18935714cd2SDhruvaraj Subhashchandran    if [[ $result -ne $SUCCESS ]]; then
19035714cd2SDhruvaraj Subhashchandran        echo "Error in creating BMC dump associated with system dump"
19135714cd2SDhruvaraj Subhashchandran    else
19235714cd2SDhruvaraj Subhashchandran        echo "BMC dump initiated $bmcDumpPath"
19335714cd2SDhruvaraj Subhashchandran    fi
19435714cd2SDhruvaraj Subhashchandran}
19535714cd2SDhruvaraj Subhashchandran
19635714cd2SDhruvaraj Subhashchandran# @brief Main function
19735714cd2SDhruvaraj Subhashchandranfunction main() {
19835714cd2SDhruvaraj Subhashchandran    initialize
19935714cd2SDhruvaraj Subhashchandran    result=$?
20035714cd2SDhruvaraj Subhashchandran    if [[ $result -ne $SUCCESS ]]; then
20135714cd2SDhruvaraj Subhashchandran        echo "$($TIME_STAMP)" "Error: Failed to initialize, Exiting"
20235714cd2SDhruvaraj Subhashchandran        return "$INTERNAL_FAILURE"
20335714cd2SDhruvaraj Subhashchandran    fi
20435714cd2SDhruvaraj Subhashchandran
20535714cd2SDhruvaraj Subhashchandran    collect
20635714cd2SDhruvaraj Subhashchandran    result=$?
20735714cd2SDhruvaraj Subhashchandran    if [[ $result -ne $SUCCESS ]]; then
20835714cd2SDhruvaraj Subhashchandran        echo "$($TIME_STAMP)" "Error: Failed to collect dump, Exiting"
20935714cd2SDhruvaraj Subhashchandran        return "$INTERNAL_FAILURE"
21035714cd2SDhruvaraj Subhashchandran    fi
21135714cd2SDhruvaraj Subhashchandran
21235714cd2SDhruvaraj Subhashchandran    package
21335714cd2SDhruvaraj Subhashchandran    result=$?
21435714cd2SDhruvaraj Subhashchandran    if [[ $result -ne $SUCCESS ]]; then
21535714cd2SDhruvaraj Subhashchandran        echo "$($TIME_STAMP)" "Error: Failed to package, Exiting"
21635714cd2SDhruvaraj Subhashchandran        return "$INTERNAL_FAILURE"
21735714cd2SDhruvaraj Subhashchandran    else
21835714cd2SDhruvaraj Subhashchandran        echo "$($TIME_STAMP)" "Successfully completed"
21935714cd2SDhruvaraj Subhashchandran    fi
22035714cd2SDhruvaraj Subhashchandran
22135714cd2SDhruvaraj Subhashchandran    initiate_bmc_dump
22235714cd2SDhruvaraj Subhashchandran    return "$SUCCESS"
22335714cd2SDhruvaraj Subhashchandran}
22435714cd2SDhruvaraj Subhashchandran
22535714cd2SDhruvaraj Subhashchandranif ! TEMP=$(getopt -o n:d:i:s:t:e:f:h \
22635714cd2SDhruvaraj Subhashchandran        --long name:,dir:,dumpid:,size:,type:,eid:,failingunit:,help \
22735714cd2SDhruvaraj Subhashchandran        -- "$@"); then
22835714cd2SDhruvaraj Subhashchandran    echo "Error: Invalid options"
22935714cd2SDhruvaraj Subhashchandran    exit 1
23035714cd2SDhruvaraj Subhashchandranfi
23135714cd2SDhruvaraj Subhashchandran
23235714cd2SDhruvaraj Subhashchandraneval set -- "$TEMP"
23335714cd2SDhruvaraj Subhashchandran
23435714cd2SDhruvaraj Subhashchandranwhile [[ $# -gt 1 ]]; do
23535714cd2SDhruvaraj Subhashchandran    key="$1"
23635714cd2SDhruvaraj Subhashchandran    case $key in
23735714cd2SDhruvaraj Subhashchandran        -n|--name)
23835714cd2SDhruvaraj Subhashchandran            name=$2
23935714cd2SDhruvaraj Subhashchandran            shift 2 ;;
24035714cd2SDhruvaraj Subhashchandran        -d|--dir)
24135714cd2SDhruvaraj Subhashchandran            dump_dir=$2
24235714cd2SDhruvaraj Subhashchandran            shift 2 ;;
24335714cd2SDhruvaraj Subhashchandran        -i|--dumpid)
24435714cd2SDhruvaraj Subhashchandran            dump_id=$2
24535714cd2SDhruvaraj Subhashchandran            shift 2 ;;
24635714cd2SDhruvaraj Subhashchandran        -s|--size)
24735714cd2SDhruvaraj Subhashchandran            dump_size=$2
24835714cd2SDhruvaraj Subhashchandran            shift 2 ;;
24935714cd2SDhruvaraj Subhashchandran        -f|--failingunit)
25035714cd2SDhruvaraj Subhashchandran            failing_unit=$2
25135714cd2SDhruvaraj Subhashchandran            shift 2 ;;
25235714cd2SDhruvaraj Subhashchandran        -e|--eid)
25335714cd2SDhruvaraj Subhashchandran            eid=$2
25435714cd2SDhruvaraj Subhashchandran            shift 2 ;;
25535714cd2SDhruvaraj Subhashchandran        -t|--type)
25635714cd2SDhruvaraj Subhashchandran            dump_sbe_type=$2
25735714cd2SDhruvaraj Subhashchandran            shift 2 ;;
25835714cd2SDhruvaraj Subhashchandran        -h|--help)
25935714cd2SDhruvaraj Subhashchandran            echo "$help"
26035714cd2SDhruvaraj Subhashchandran            exit ;;
26135714cd2SDhruvaraj Subhashchandran        *) # unknown option
26235714cd2SDhruvaraj Subhashchandran            echo "Unknown argument: $1"
26335714cd2SDhruvaraj Subhashchandran            echo "$help"
26435714cd2SDhruvaraj Subhashchandran            exit 1 ;;
26535714cd2SDhruvaraj Subhashchandran    esac
26635714cd2SDhruvaraj Subhashchandrandone
26735714cd2SDhruvaraj Subhashchandran
26835714cd2SDhruvaraj Subhashchandranmain
26935714cd2SDhruvaraj Subhashchandranexit $?
270