#!/bin/bash
#
# Copyright (c) 2019-2020 by Cisco Systems, Inc.
# All rights reserved.
#

#
# run from admin shell
# It will generate a file to xr /harddisk:/gather_data.tgz
# Copy the xr "copy harddisk:/gather_data.tgz tftp:"
# Once copied out, can untar/zip, enjoy!
#

TOP_DIR=/misc/scratch

cmds_admin_common=(
    "/opt/cisco/calvados/bin/shownvdb dump 0           > shownvdb_test"
    "/opt/cisco/calvados/bin/shownvdb dump 1           > shownvdb_mgmt"
    "/opt/cisco/calvados/bin/shownvdb dump 2           > shownvdb_pcie"
    "/opt/cisco/calvados/bin/shownvdb dump 3           > shownvdb_apm"
    "/opt/cisco/calvados/bin/shownvdb dump 4           > shownvdb_lda"
    "/opt/cisco/calvados/bin/shownvdb dump 5           > shownvdb_nplib"
    "/opt/cisco/calvados/bin/shownvdb dump 6           > shownvdb_flash"
    "/opt/cisco/calvados/bin/epm_trace_boot            > show_epm_trace"
    "/opt/cisco/calvados/bin/ctracedec -AswdgtklN canbus_driver     > show_canbus_driver_trace"
    "/opt/cisco/calvados/bin/ctracedec -AswdgtklN aikido_upgrade    > show_aikido_upgrade_trace"
)

cmds_admin_rp=(
    # ./admin-cli-proxy
    # /opt/cisco/calvados/bin/calvados_login_shell
    # show sdr
    # switch stats
    # show reboot-history
    "ls -l /misc/disk1/tftpboot/ > mis_disk1_tftpboot"
    # lc outputs
)

cmds_admin_lc=(
    # ./admin-cli-proxy^
    # /opt/cisco/calvados/bin/calvados_login_shell
    # show sdr
    # switch stats
    # show reboot-history
    # ls -l /misc/disk1/tftpboot/
    # lc outputs
)


cmds_all=(
    "echo cmds_all            > cmds_all"
    "tar -cz -f pcie.tgz -C /misc/scratch pcie"
    "tar -cz -f pcie.1.tgz -C /misc/scratch pcie.1"
    "tar -cz -f pcie.2.tgz -C /misc/scratch pcie.2"
    "tar -cz -f pcie.3.tgz -C /misc/scratch pcie.3"
    "tar -cz -f pcie.4.tgz -C /misc/scratch pcie.4"
    "tar -cz -f pcie.5.tgz -C /misc/scratch pcie.5"
    "tar -cz -f pcie.6.tgz -C /misc/scratch pcie.6"
    "tar -cz -f pcie.7.tgz -C /misc/scratch pcie.7"
    "tar -cz -f var_logs.tgz -C /var log --exclude ctrace --exclude local --exclude instdb --exclude={old*}"
    "cp /proc/cmdline .                     ;# /proc/cmdline"
    "cp /etc/init.d/spirit_pd.sh ."
    "cp /etc/init.d/pd-functions ."
    "cp /etc/init.d/fabric.sh ."
    "lspci   > lspci"
    "lspci -v > lcpci_v"
    "lspci -vt > lcpci_vt"
    "echo ps axo pid,cmd,start > ps_axo"
    "ps axo pid,cmd,start >> ps_axo"
    "cat /etc/show_version.txt   > show_version.txt"
    "cat /etc/build-info.txt     > build-info.txt"
    "dmesg                       > dmesg"
    "dmesg -T                    > dmesgt"
    "cat /proc/meminfo           > proc_meminfo"
    )
    
cmds_host=(
    "cat /etc/show_version.txt   > show_version2.txt"
    "dmidecode -t memory         > dmidecode_memory"
)

cmds_xr_common=(
    "echo cmds_xr_common       > cmds_xr_common"
    "/pkg/bin/shownvdb dump 1  > shownvdb_mgmt"
    "/pkg/bin/shownvdb dump 2  > shownvdb_pcie"
    "/pkg/bin/shownvdb dump 3  > shownvdb_apm"
    "/pkg/bin/shownvdb dump 4  > shownvdb_lda"
    "/pkg/bin/shownvdb dump 5  > shownvdb_nplib"
    "/pkg/bin/fpga info        > fpga_info"
    "/pkg/bin/fpga show_tech   > fpga_show_tech"
    "/pkg/bin/show_watchdog -p > show_watchdog"
    "/pkg/bin/ng_show_version  > ng_show_version"
    "cat /etc/show_version.txt > show_version.txt"
    "/pkg/sbin/showemt         > showemt"
    "/pkg/sbin/showipu         > showipu"
    "/pkg/sbin/showipu -d      > showipu_d"
    "/pkg/sbin/showipu -c      > showipu_c"
    "/pkg/sbin/sysmgr_show -o -b > show_process_boot"
    "/pkg/bin/show_fia_ltrace -I .* > show_fabric_fia_trace"
    "/pkg/bin/easy_debug_ltrace -Z apm_ltrace -W 1 > show_apm_ltrace"
    "/pkg/bin/show_diagnostic_trace -A > show_diagnostic"
    "/pkg/bin/ethernet_trace_show    > show_trace_gether"
    "/pkg/bin/sysmgr_show_ltrace     > show_trace_sysmgr"
    # sysmgr_show -o -h | grep "Node id" (Great for the "-n" commands)
    # sysmgr_show -o -h | grep "Node name" (Great for the "-n" commands)
    # TBD -- asic_error
    # TBD -- show reboot-history
    # "admin-cli-proxy-xr_run_cmd show reboot-history card location 0/
    )

cmds_xr_rp=(
    "echo cmds_xr_rp       > cmds_xr_rp"
    #    show configuration history
    #    cfgmgr_show_history -s -f -n 0x5dc -t all -b
    # EEPROM data
    # show ipv4 int br
    # show int br
    "/pkg/bin/show_platform_sysdb       > show_platform_sysdb"
    "/pkg/bin/show_rmf_sysdb            > show_rmf_sysdb"
    "/pkg/bin/show_fpd_loc_ng fpd       > fpd"
    "/pkg/bin/show_inventory -e         > show_inventory"
    "/pkg/sbin/show_logging             > show_logging"
    "/pkg/bin/apm_show -a               > show_apm_psa_status"
    "/pkg/bin/apm_show -m               > show_apm_psm_status"
    "/pkg/bin/fsi_show -f -l            > show_fabric_fia_link-status"
    "/pkg/bin/show_interface -a -o 0x2  > show interface_brief"
    "/pkg/sbin/nvgen -c -l 1 -t 1 -o 1  > config"
    "/pkg/bin/corehelper_context -c 0x1 -n all   > show_context"
    "/pkg/bin/smartliccmd show license smart all > smartliccmd"
    "/pkg/bin/nslot all                 > nslot_all"
    "/pkg/bin/show_diag -t              > show_diag_detail"
    "/pkg/bin/prm_np_show summary       > show_np_summary"
    # "/pkg/sbin/admin-cli-proxy-xr_run_cmd show alarms > admin_show_alarms"
    "/pkg/bin/im_show status             > show_im_status"
    )

cmds_xr_lc=(
    "echo cmds_xr_lc       > cmds_xr_lc"
    "/pkg/bin/show_fia_ltrace -I .* > show_fabric_fia_trace"
    "/pkg/bin/fsi_show -f -l        > show_fabric_fia_link-status"
    "/pkg/bin/prm_np_show summary              > show_np_summary"
    "/pkg/bin/vic_show_ltrace                  > show_vic_ltrace"
    "/pkg/bin/lda_show_ltrace                  > show_lda_ltrace"
    "/pkg/bin/serdes_show_trace                > show_serdes_ltrace"
    "/pkg/bin/fpgalib_show_ltrace              > show_fpgalib_ltrace"
    "/pkg/bin/show_npu_server_ltrace           > show_npu_ltrace"
    "/pkg/bin/show_prm_server_ltrace           > show_prm_ltrace"
    "/pkg/bin/trm_show_ltrace -J               > show_trm_ltrace"
    "/pkg/bin/lightspeed_uidb_show_ltrace -J   > show_uidb_ltrace"
    "/pkg/bin/show_vkg_pm_ltrace -C            > show_pm_creation_ltrace"
    "/pkg/bin/lda_test client sm ifsub all     > lda_test_client_sm_ifsub"
    "/pkg/bin/lda_test client shmem info       > lda_test_client_shmem"
    "/pkg/bin/show_blkhwk_ltrace -s 2 fia      > show_fabric_blkhwk_err"
    "/pkg/bin/show_avago16nm_ltrace -s 2 fab_xbar > show_fabric_avago_err"
    # "/pkg/bin/lda_test client pll  show_tech 0 > lda_test_client_pll"
    "tar -cz -f npu.tgz /misc/scratch/npu_* "
    "tar -cz -f np.tgz -C /misc/scratch np "
    "tar -cz -f ls.tgz /misc/scratch/ls_* "
    "tar -cz -f asic_errors.tgz /misc/scratch/asic-err-logs-backup/* "
    "timeout 120 /pkg/bin/pcli vic_ls show tech                   > vic_ls_show_tech"
    # showmem rmem 4 `showipu | grep Physical | awk '{print $5}'` 0x470000 > /tmp/FPGA
    )

function run_cmd_list {
    arr=("$@")
    for cmd in "${arr[@]}"
    do
        echo "*** run_cmd_list --==>>" $cmd
        echo "echo \"run CMD --==>> " $cmd \">> cmd_list
        echo $cmd >> cmd_list
    done
}


function xr_cmds_rp {

    run_cmd_list "${cmds_xr_rp[@]}"
}

function xr_cmds_lc {

    run_cmd_list "${cmds_xr_lc[@]}"
}

function xr_cmds {
    MY_FUNCTION=$1

    run_cmd_list "${cmds_xr_common[@]}"
    $MY_FUNCTION
}

function admin_cmds_rp {

    run_cmd_list "${cmds_admin_rp[@]}"
}

function admin_cmds_lc {

    run_cmd_list "${cmds_admin_lc[@]}"
}


function admin_cmds {
    MY_FUNCTION=$1

    run_cmd_list "${cmds_admin_common[@]}"

    chvrf 0 scp $TOP_DIR/gather my_host:$TOP_DIR
    chvrf 0 ssh my_host $TOP_DIR/gather my_host
    chvrf 0 scp my_host:$TOP_DIR/my_host.tgz .
    chvrf 0 ssh my_host rm -f $TOP_DIR/my_host.tgz
    $MY_FUNCTION
}

function host_cmds {
    MY_FUNCTION=$1

    run_cmd_list "${cmds_host[@]}"
    $MY_FUNCTION
}

function common_foo {
# common_foo $TOP_DIR lc1_xr xr_cmds xr_cmds_lc
# common_foo $TOP_DIR lc1_admin admin_cmds admin_cmds_rp
    BASE_DIR=$1
    DIR_NAME=$2
    MY_FUNCTION=$3
    MY_FUNCTION2=$4
    cd $BASE_DIR

    rm -rf $DIR_NAME
    mkdir $DIR_NAME
    cd $DIR_NAME

    run_cmd_list "${cmds_all[@]}"
    $MY_FUNCTION $MY_FUNCTION2

    chmod a+x cmd_list
    `./cmd_list > cmd_list_output 2>&1`
    cd ..
    tar -cz -f $DIR_NAME.tgz $DIR_NAME
    ls -lrt
    rm -rf $DIR_NAME
}

if [ -z ${1+x} ]; then
    cp $0 ${TOP_DIR}
    #
    # Which cards are we working on?
    #
    cd $TOP_DIR
    GATHER_DIR=gather.`date "+%y%m%d%H%M"`
    mkdir $GATHER_DIR
    cd $GATHER_DIR

    cp ../gather .

    rm -f SHOW_PLATFORM
    chvrf 0 /opt/cisco/calvados/bin/show_cmd "show platform" > SHOW_PLATFORM

    CARDS=`cat SHOW_PLATFORM | grep "OPERATIONAL   OPERATIONAL" | tr "/" " " | awk '{print tolower($2) ","}'`
    carray=(`echo $CARDS | tr "," "\n"`)

    # print "\ncarray: " + carray
    for card in "${carray[@]}"
    do
        if [[ $card = *"r"* ]]; then
            MY_CARD_ADMIN="${card}_admin"
            MY_CARD_XR="${card}_xr"
        else
            MY_CARD_ADMIN="lc${card}_admin"
            MY_CARD_XR="lc${card}_xr"
        fi
        #
        # Gather from ADMIN
        #
        chvrf 0 scp $TOP_DIR/gather $MY_CARD_ADMIN://misc/scratch/gather &> /dev/null
        chvrf 0 ssh $MY_CARD_ADMIN  $TOP_DIR/gather $MY_CARD_ADMIN       &> $MY_CARD_ADMIN &

        #
        # Gather from XR
        #
        chvrf 0 scp $TOP_DIR/gather $MY_CARD_XR:/misc/scratch/gather &> /dev/null
        chvrf 0 ssh $MY_CARD_XR     $TOP_DIR/gather $MY_CARD_XR      &> $MY_CARD_XR &

    done

    echo "**********************************************************"
    echo "**************** Gathing data from all LCs ***************"
    echo "************************** wait **************************"
    echo "**********************************************************"
    wait
    echo "************************** wait done *********************"

    for card in "${carray[@]}"
    do
        if [[ $card = *"r"* ]]; then
            MY_CARD_ADMIN="${card}_admin"
            MY_CARD_XR="${card}_xr"
        else
            MY_CARD_ADMIN="lc${card}_admin"
            MY_CARD_XR="lc${card}_xr"
        fi

        #
        # Gather from ADMIN
        #

        echo scp $MY_CARD_ADMIN
        chvrf 0 scp $MY_CARD_ADMIN:$TOP_DIR/${MY_CARD_ADMIN}.tgz .       &> /dev/null
        chvrf 0 ssh $MY_CARD_ADMIN  rm -f $TOP_DIR/${MY_CARD_ADMIN}.tgz  &> /dev/null

        #
        # Gather from XR
        #

        echo scp $MY_CARD_XR
        chvrf 0 scp $MY_CARD_XR:$TOP_DIR/${MY_CARD_XR}.tgz .      &> /dev/null
        chvrf 0 ssh $MY_CARD_XR  rm -f $TOP_DIR/${MY_CARD_XR}.tgz &> /dev/null
    done
    echo "**********************************************************"

    cd ..
    rm -f gather_data.tgz
    tar  -cz -f gather_data.tgz $GATHER_DIR
    MY_RSP="$(cut -d'_' -f2 <<<"$HOSTNAME" | awk '{print tolower($HOSTNAME)}')"

    MY_RSP_NAME=${MY_RSP}_xr

    echo scp gather_data.tgz $MY_RSP_NAME:/misc/disk1
    chvrf 0 scp gather_data.tgz $MY_RSP_NAME:/misc/disk1
    echo
else
    if [[ $1 = *"xr"* ]]; then
        if [[ $1 = *"rsp"*  ||  $1 = *"rp"* ]]; then
            common_foo $TOP_DIR $1 xr_cmds xr_cmds_rp
        else
            common_foo $TOP_DIR $1 xr_cmds xr_cmds_lc
        fi
    else
        if [[ $1 = *"admin"* ]]; then
            if [[ $1 = *"rsp"*  ||  $1 = *"rp"* ]]; then
                common_foo $TOP_DIR $1 admin_cmds admin_cmds_rp
            else
                common_foo $TOP_DIR $1 admin_cmds admin_cmds_lc
            fi
        else
            common_foo $TOP_DIR $1 host_cmds
        fi
    fi
fi

