#!/bin/sh

arg=$1
shift

if [ -f "config.status" ] ; then
    prefix=$(cat config.status | grep @prefix@ | awk -F, '{print $3}')
fi
if [ -f "config.status" -a -z "$prefix" ] ; then
    prefix=$(cat config.status | grep '"prefix"' | awk -F\" '{print $4}')
fi

if [ -z "$prefix" -a -d "/usr/local/freeswitch" ] ; then
    prefix="/usr/local/freeswitch"
fi
if [ -z "$prefix" -a -d "/opt/freeswitch" ] ; then
    prefix="/opt/freeswitch"
fi

if [ -z "$prefix" ] ; then
    prefix=$FS_PREFIX
fi

if [ -z "$prefix" -a -f "./bin/freeswitch" ] ; then
    prefix=`pwd`
fi

if [ -z "$prefix" ] ; then
    echo "Unable to locate freeswitch prefix directory."
    exit 255
fi

if [ "$arg" = "gcore" ] ; then
	user=$1
	shift
	fspid=`cat $prefix/run/freeswitch.pid`
	echo "pulling gcore $fspid"
	gcore -o core $fspid
else
    user=$arg
fi


core=`ls -1t core* | head -1 2> /dev/null`

if [ -z "$core" ] ; then
	core=`ls -1 core 2> /dev/null`
fi

if [ -z "$core" ] ; then
	core=`ls -1 freeswitch.core 2> /dev/null`
fi

if [ -z "$core" ] ; then
	echo "You must be in the current directory with a core file from FreeSWITCH!"
	exit 255
fi

if [ -x `which gdb` ] ; then
  echo "Found gdb"
else
  echo "Unable to locate gdb, is it installed?"
  exit 255
fi

echo "core is $core"

line="--------------------------------------------------------------------------------"

mypwd=`pwd`
tmpdir=/tmp/fscore_pb.tmp
post_file=$mypwd/fscore_pb.post


if [ -z $user ] ; then
	user=$SUDO_USER
fi

if [ -z $user ] ; then
	user=$USER
fi

if [ -z $user ] ; then
	user="anon"
fi

post_cmd=""
command -v wget >/dev/null 2>&1
if [ $? -eq 0 ]; then
    post_cmd="wget --output-file=/dev/null --output-document=/tmp/fscore_pb.tmp/pb_out --http-user=pastebin --http-password=freeswitch https://pastebin.freeswitch.org --post-file=$post_file"
    echo -n "paste=Send&remember=0&poster=$user&format=none&expiry=f&code2=" > $post_file
fi

if [ -z "$post_cmd" ]; then
    command -v curl >/dev/null 2>&1
    if [ $? -eq 0 ]; then 
	post_cmd="curl -o /tmp/fscore_pb.tmp/pb_out --user pastebin:freeswitch http://pastebin.freeswitch.org -d paste=Send -d remember=0 -d poster=$user -d format=none -d expiry=f --data-urlencode code2@$post_file"
    fi
fi

if [ -z "$post_cmd" ]; then
  echo "Unable to locate wget or curl."
  exit 255
fi

echo "Gathering Data Please Wait........."

UNAME=`uname`;

#Linux
if [ "${UNAME}" = "Linux" ]; then
    echo "LSB RELEASE:" >> $post_file
    echo $line >> $post_file
    if [ -f /etc/redhat-release ]; then
	cat /etc/redhat-release  >> $post_file
    else
	lsb_release -a >> $post_file
    fi

    echo "CPU INFO:" >> $post_file
    echo $line >> $post_file
    cat /proc/cpuinfo >> $post_file
#Mac
elif [ "${UNAME}" = "Darwin" ]; then
    system_profiler SPSoftwareDataType SPHardwareDataType >> $post_file
fi;

echo "GIT INFO:" >> $post_file
echo $line >> $post_file
echo -n "Revision: " >> $post_file
if [ -d ".git" ] ; then
    git log -1 | cat  >> $post_file
    printf "\n\n\n" >> $post_file
    git status >> $post_file
else
    echo "Not run from an git managed directory." >> $post_file
fi

echo "GDB BACKTRACE:" >> $post_file
echo $line >> $post_file

cat > fscore_pb.$$.gdb <<EOF
echo \n\n
set pagination off
echo Thread Info\n
echo $line\n
info threads
echo Stack Trace\n
echo $line
bt
echo \n\n\n\n Stack Trace (full)\n
echo $line\n
bt full
echo \n\n\n\n Stack Trace (all threads)\n
echo $line\n
thread apply all bt
echo \n\n\n\n Stack Trace (all threads) (full)\n
echo $line\n
thread apply all bt full
quit
EOF

gdb $prefix/bin/freeswitch `echo $core | tail -n1` -x fscore_pb.$$.gdb 1 >> $post_file 2>/dev/null

rm fscore_pb.$$.gdb
rm -fr $tmpdir 
mkdir -p $tmpdir
cd $tmpdir

echo $post_cmd
$post_cmd

mv $post_file $tmpdir

echo "Finished."
if [ -e /tmp/fscore_pb.tmp/pb_out ]; then
    pb=`cat /tmp/fscore_pb.tmp/pb_out | grep parent_pid | awk -F \" '{print $6}'`
    echo "Please report http://pastebin.freeswitch.org/$pb to the developers."
else
    echo "Please check recent posts on http://pastebin.freeswitch.org/ and find your issue to report to the developers."
fi