#!/bin/bash

# Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2021 All Rights Reserved
#
# Licensed under CLOUD LINUX LICENSE AGREEMENT
# http://cloudlinux.com/docs/LICENSE.TXT

KDUMP_DIR=$(grep -E '^path +.*' /etc/kdump.conf | awk '{print $2}')

if [ -z "$KDUMP_DIR" ]; then
	KDUMP_DIR="/var/crash"
fi

dump_dirs=(${KDUMP_DIR}/*)
N_DUMP=2

for (( idx=${#dump_dirs[@]}-1 ; idx>=0 ; idx-- )) ; do
	if [ -f "${dump_dirs[idx]}/vmcore" ]; then
		(( $(( N_DUMP-- )) > 0 )) && continue
		rm -f  "${dump_dirs[idx]}/vmcore"
	fi
done

MINDATE=$(date +%F-%X -d "-1 days")

DIR_PANIC=$(ls -ltr $KDUMP_DIR | tail -1 | awk '{print $9}')
LAST_PANIC=$(echo ${DIR_PANIC} | cut -d'-' -f 2,3,4,5)

TCP_PORT=515
TMP_FILE="/tmp/sentry.panic.tmp"

KEY_WORDS_DMESG=("BUG:" "Oops:" "Kernel panic")

function check_if_hungtask
{
	echo "$1" | grep "task .* blocked"
}

function check_if_stalls
{
	echo "$1" | grep "detected stalls"
}

function check_if_lockup
{
	echo "$1" | grep -i -E "(soft|hard) ?lockup"
}

if [[ "${LAST_PANIC}" > "${MINDATE}" ]]
then
	echo "Sending Panic (${LAST_PANIC} ${MINDATE})"

	PANIC_PATH=$KDUMP_DIR/$DIR_PANIC
	VMLINUX_PATH=/lib/debug/lib/modules/$(uname -r)/vmlinux

	for elem in "${KEY_WORDS_DMESG[@]}"
	do
		grep -A200 -e "$elem" $PANIC_PATH/vmcore-dmesg.txt > $TMP_FILE
		[ "$?" == "0" ] && break
	done

	if rpm -q kernel-debuginfo-$(uname -r) &> /dev/null; then
		CRASH_LOG=$(cat $TMP_FILE)
		if check_if_hungtask $CRASH_LOG || check_if_stalls $CRASH_LOG || check_if_lockup $CRASH_LOG
		then
			crash -s $VMLINUX_PATH $PANIC_PATH/vmcore &>> $TMP_FILE << EOF
			foreach bt 
EOF
		else
			crash -s $VMLINUX_PATH $PANIC_PATH/vmcore &>> $TMP_FILE << EOF
			bt
EOF
		fi
	fi

	nc sentrykernel.cloudlinux.com $TCP_PORT <$TMP_FILE

	rm -f $TMP_FILE
else
	echo "No appropriate panic (${LAST_PANIC} ${MINDATE})"
fi
