#!/bin/bash

TS=$( date '+%Y-%m-%d-%H-%M-%S' )
OUT_FILE=/tmp/bcm_sosreport.$( hostname ).${TS}.tar.gz
OUT_DIR=bcm_sosreport.$( hostname ).${TS}
LOG_FILE=/tmp/${OUT_DIR}/sosreport.log
mkdir -p /tmp/$OUT_DIR/tmp

ALL=false

function usage {
cat <<EOF
Usage: bcm_sosreport [opts]
  -h Display option help text.
  -a Enable all collection plugins. This can cause interruption to running processes.
EOF
exit 2
}

while getopts "ah" o; do
  case "${o}" in
    a)
      ALL=true
      ;;
    h)
      usage
      ;;
  esac
done

if [ ! -d /sys/kernel/debug/bnxt_re ]; then
    echo !!!WARNING!!! The bnxt_re driver is not loaded, or no devices detected. RoCE information will not be captured. Please 'modprobe bnxt_re' and re-run !!!WARNING!!!

    if [ ! -d /sys/bus/pci/drivers/bnxt_en ]; then
        echo !!!WARNING!!! The bnxt_en driver is not loaded. Network card information will not be captured. Please 'modprobe bnxt_en' and re-run !!!WARNING!!!
    fi
    sleep 5
fi

if [ -f /opt/bcm_sosreport/dump_cores ]; then
    timeout 60 nohup /opt/bcm_sosreport/dump_cores 2>&1 | tee -a $LOG_FILE 
    mv /tmp/bcm_sosreport_coredumps /tmp/$OUT_DIR/tmp/
fi

if [ -f /opt/bcm_sosreport/snapdumps ]; then
    timeout 60 nohup /opt/bcm_sosreport/snapdumps 2>&1 | tee -a $LOG_FILE
    mv /tmp/bcm_sosreport_snapdumps /tmp/$OUT_DIR/tmp/
fi

if [ -f /opt/bcm_sosreport/crashdumps ]; then
    timeout 60 nohup /opt/bcm_sosreport/crashdumps 2>&1 | tee -a $LOG_FILE
    mv /tmp/bcm_sosreport_crashdumps /tmp/$OUT_DIR/tmp/
fi

if [ -f /opt/bcm_sosreport/vmcore ]; then
    timeout 60 nohup /opt/bcm_sosreport/vmcore 2>&1 | tee -a $LOG_FILE
    mv /tmp/bcm_sosreport_vmcore /tmp/$OUT_DIR/tmp/
fi

if [ -f /opt/bcm_sosreport/g4x_otc ]; then
    timeout 60 nohup /opt/bcm_sosreport/g4x_otc 2>&1 | tee -a $LOG_FILE
    mv /tmp/bcm_sosreport_g4x_otc /tmp/$OUT_DIR/tmp/
fi

if [ "$ALL" = true ]; then
    if [ -f /opt/bcm_sosreport/dscdumps ]; then
        timeout 60 nohup /opt/bcm_sosreport/dscdumps 2>&1 | tee -a $LOG_FILE
        mv /tmp/bcm_sosreport_dscdumps /tmp/$OUT_DIR/tmp/
    fi
fi

timeout 600 nohup sos report -v --batch --plugin-timeout 120 --threads=1 2>&1 | tee -a $LOG_FILE | grep --line-buffered -vP '^Your sosreport|\t/tmp/sosreport|\t/var/tmp/sosreport| Size| Owner| sha256|Please send this file to your support representative.'
REPORT_FILE=$( grep -A1 'Your sosreport has been generated and saved in' $LOG_FILE | tail -n 1 | sed 's/\t//' )

cd /tmp/$OUT_DIR

if [ ! -z "$REPORT_FILE" ] && [ -f "$REPORT_FILE" ]; then
    tar xf $REPORT_FILE --strip-components=1
    rm $REPORT_FILE
fi

if [ -f "${REPORT_FILE}.sha256" ]; then
    rm "${REPORT_FILE}.sha256"
fi

cd /tmp
tar czfv $OUT_FILE $OUT_DIR > /tmp/$OUT_DIR.list
rm -rf /tmp/$OUT_DIR
rm -rf /tmp/bcm_sosreport_coredumps /tmp/bcm_sosreport_snapdumps /tmp/bcm_sosreport_g4x_otc /tmp/tmp/bcm_sosreport_dscdumps

echo "Your Broadcom sosreport has been saved in: $OUT_FILE"
echo "Please send this file to Broadcom support."

echo

echo Interesting Broadcom files in your report:
cat /tmp/$OUT_DIR.list | sed "s/${OUT_DIR}\///" | grep -E 'tmp/bcm_sosreport_coredumps|tmp/bcm_sosreport_crashdumps|tmp/bcm_sosreport_snapdumps|tmp/bcm_sosreport_g4x_otc|tmp/bcm_sosreport_vmcore|tmp/bcm_sosreport_dscdumps|sos_commands/sos_extras/bcm_sosreport_|sys\/class\/infiniband\/bnxt_re|sys\/kernel\/debug\/bnxt_re' | grep -v '/$'


cat /tmp/$OUT_DIR.list | grep tmp/bcm_sosreport_coredumps/ | grep -q .core$
if [ $? -ne 0 ]; then
    echo WARNING: No network interface core dumps were collected.
fi

rm /tmp/$OUT_DIR.list
