#!/bin/bash

# Wrapper to setup a live session on localhost and read it in text mode live

SESSION_NAME="lttngtop-live-simple-$RANDOM"

destroy()
{
	lttng destroy $SESSION_NAME >/dev/null
	rm -rf $HOME/lttng-traces/$HOSTNAME/${SESSION_NAME}*
	exit 0
}

if test "$1" = "-h" -o "$1" = "--help"; then
	echo "usage : $0 [OPTIONS] [program [program-options]]"
	echo "OPTIONS :"
	echo "  -f             Follow threads associated with selected PIDs"
	echo "  -p             Comma-separated list of PIDs to display (in addition to the eventual executed program)"
	echo "  -n             Comma-separated list of procnames to display (in addition to the eventual executed program)"
	echo "  -a             In textdump mode, display all events but write in bold the processes we are interested in (-f and -p)"
	echo "  -k             kprobes to insert (same format as lttng enable-event, can be repeated)"
	echo "  -o <filename>  In textdump, output the log in <filename>"
	exit 0
fi

pgrep -u root lttng-sessiond >/dev/null
if test $? != 0; then
	echo "Starting lttng-sessiond as root (trying sudo, start manually if \
it fails)"
	sudo lttng-sessiond -d
	if test $? != 0; then
		exit 1
	fi
fi

pgrep lttng-relayd >/dev/null
if test $? != 0; then
	echo "Starting lttng-relayd as your current user, start manually if \
it fails"
	lttng-relayd -d
	if test $? != 0; then
		exit 1
	fi
fi

SUDO=""
groups|grep tracing >/dev/null
if test $? != 0; then
	echo "You are not a member of the tracing group, so you need root \
access, the script will try with sudo"
	SUDO="sudo"
fi

# check if lttng command if in the path
# check if the user can execute the command (with sudo if not in tracing group)
# check if lttng-modules is installed
$SUDO lttng list -k | grep sched_switch >/dev/null
if test $? != 0; then
	echo "Something went wrong executing \"$SUDO lttng list -k | grep sched_switch\", \
try to fix the problem manually and then start the script again"
fi

# if our random session name was already in use, add more randomness...
$SUDO lttng list | grep $SESSION_NAME
if test $? = 0; then
	SESSION_NAME="$SESSION_NAME-$RANDOM"
fi
$SUDO lttng list | grep $SESSION_NAME
if test $? = 0; then
	echo "Cannot create a random session name, something must be wrong"
	exit 2
fi

lttng create $SESSION_NAME --live 1000000 -U net://localhost >/dev/null
[[ $? != 0 ]] && exit 2

trap "destroy" SIGINT SIGTERM

lttng enable-event -s $SESSION_NAME -u -a >/dev/null
lttng add-context -s $SESSION_NAME -u -t vpid -t procname -t vtid >/dev/null

lttng enable-event -s $SESSION_NAME -k lttng_statedump_start,lttng_statedump_end,lttng_statedump_process_state,lttng_statedump_file_descriptor,lttng_statedump_vm_map,lttng_statedump_network_interface,lttng_statedump_interrupt,sched_process_free,sched_switch,sched_process_fork >/dev/null
[[ $? != 0 ]] && exit 2
lttng enable-event -s $SESSION_NAME -k --syscall -a >/dev/null
[[ $? != 0 ]] && exit 2
lttng add-context -s $SESSION_NAME -k -t pid -t procname -t tid -t ppid >/dev/null
[[ $? != 0 ]] && exit 2
# if you want to add Perf counters, do something like that :
#lttng add-context -s $SESSION_NAME -k -t perf:cache-misses -t perf:major-faults -t perf:branch-load-misses >/dev/null

LTTNGTOPARGS=""
PROG=""

while [ "$1" != "" ]; do
	if test "$1" = "-p"; then
		shift
		LTTNGTOPARGS="$LTTNGTOPARGS -p $1"
		shift
	elif test "$1" = "-k"; then
		shift
		lttng enable-event -k -s $SESSION_NAME "probe-$1" --probe $1 >/dev/null
		shift
	elif test "$1" = "-o"; then
		shift
		LTTNGTOPARGS="$LTTNGTOPARGS -o $1"
		shift
	elif test "$1" = "-n"; then
		shift
		LTTNGTOPARGS="$LTTNGTOPARGS -n $1"
		shift
	elif test "${1:0:1}" = "-"; then
		LTTNGTOPARGS="$LTTNGTOPARGS $1"
		shift
	else
		PROG=$@
		break
	fi
done

if test ! -z "$PROG"; then
	PROG="-- $PROG"
fi

lttng start $SESSION_NAME >/dev/null
[[ $? != 0 ]] && exit 2

s=$(lttngtop -r net://localhost | grep $SESSION_NAME)
if test $? != 0; then
	echo "Problem executing lttngtop -r net://localhost | grep $SESSION_NAME"
	exit 1
fi
lttngtop -t -r $(echo $s|cut -d' ' -f1) $LTTNGTOPARGS $PROG

destroy
