#!/usr/bin/bash

PLUGIN=$(basename $0)

SLABLOG=$(mktemp)
PS_LWD=$(mktemp -d)

# Check to see if journalctl exists.
if command -v journalctl 2> /dev/null; then
    JOURNALCTL=true
    LOGFILE=/var/tmp/journalctl
else
    JOURNALCTL=false
    LOGFILE=/var/log/messages
fi

function WatchFile ()
{
    FILE=$1

    TMPFILE=$(mktemp -p /var/tmp -t Watch.XXXXX)
    while true; do
        if [ $JOURNALCTL = true ]; then
            journalctl -b > $FILE
        fi
        diff=$(diff -q $FILE $TMPFILE)
        rc=$?
        if [ $rc == 1 ]; then
            cat $FILE > $TMPFILE
        else
            rm $TMPFILE
            return $rc
        fi
        sleep 2
    done
}

function SysRq ()
{
    ACTION=$1
    logger -p local2.info -t "List of $ACTION Tasks" Start
    sleep 1
    echo $ACTION > /proc/sysrq-trigger
    # Wait until logfile has changed.
    WatchFile $LOGFILE
    if [[ $? -ne 0 ]]; then
        logger -p local2.warning -t "List of $ACTION Tasks" Check on $LOGFILE failed
    fi

    logger -p local2.info -t "List of $ACTION Tasks" Stop

}

# Verbose tree view of running processes:

ps -elfH > $PS_LWD/ps-lwd.log
rstrnt-report-log -l $PS_LWD/ps-lwd.log
rm -rf $PS_LWD

# Get some system information from the system

PROCLIST='m t w'

for p in $PROCLIST ; do
    # Dump a list of blocked tasks and their information
    SysRq $p
    sleep 2
done

# Send slab info to a file for logging
timestamp=$(/bin/date '+%F %T')
echo "Dumping slabinfo - Start - $timestamp" >> $SLABLOG
cat /proc/slabinfo >> $SLABLOG
timestamp=$(/bin/date '+%F %T')
echo "Dumping slabinfo - Stop - $timestamp" >> $SLABLOG
logger -p local2.info -t "SlabCacheInfo" -f $SLABLOG

if [ $JOURNALCTL = true ]; then
    journalctl -b > $LOGFILE
fi

# Submit dmesg log if any output
rstrnt-report-log -l $LOGFILE

# Upload any logs the user may want
if [ -e $TESTPATH/logs2get ]; then
    for l in `cat $TESTPATH/logs2get`; do
        rstrnt-report-log -l $l
    done
fi

rm -f $SLABLOG
