#!/bin/bash

KILL=/usr/bin/killall
OPCONTROL=/usr/bin/opcontrol
OPHELP=/usr/bin/ophelp
VALGRIND=/home/developer/sdk_tools/valgrind/usr/bin/valgrind
GETMACHINEINFO="/bin/uname -m"
CHMOD=/bin/chmod
GETPID=/bin/pidof
SENDSIGQUIT="kill -3"

is_app_executable()
{
	if [[ $1 =~ ^((/opt/apps)|(/opt/usr/apps))/[a-zA-Z0-9]{10}/bin/[a-zA-Z0-9_\\-]{1,}(\.exe)?$ ]] ; then 
		return 1
	else
		return 0
	fi
}

is_emulator()
{
	MACHINE=`$GETMACHINEINFO`
	if [[ $MACHINE =~ .*emulat.* ]] ; then
		return 1
	else
		return 0
	fi
}

op_init()
{
	$OPCONTROL --init
}

op_startdaemon()
{
	$OPCONTROL --start-daemon
}

op_start()
{
	$OPCONTROL --start && echo start_ok
}

op_dump()
{
	$OPCONTROL --dump
}

op_stop()
{
	$OPCONTROL --stop
}

op_shutdown()
{
	$OPCONTROL --shutdown
}

op_reset()
{
	$OPCONTROL --reset
}

op_deinit()
{
	$OPCONTROL --deinit
}

op_list()
{
	$OPCONTROL --list-events 2> /dev/null
}

op_status()
{
	$OPCONTROL --status 2> /dev/null | grep ^Event
}

op_save()
{
	$OPCONTROL --save=$SAVENAME
}

op_help()
{
	$OPHELP -e $EVENTQUERY
}

op_setup()
{
#	validate $SETUPOPTION
	while [[ "$#" -ne 0 ]]
		do
			arg=`printf %s $1 | awk -F= '{printf $1}'`
			val=`printf %s $1 | awk -F= '{printf $2}'`
			shift

			if [[ -z "$val" ]] ; then
				echo "Invalid setup option!"
				exit 1
			fi

			case "$arg" in
				separate)
					SEPARATE=$val
					;;
				vmlinux)
					VMLINUX=$val
					;;
				image)
					IMAGEPATH=$val
					;;
				callgraph)
					CALLGRAPH=$val
					;;
				event)
					EVENT=$val
					;;
				*)
					echo "Unknown setup option!"
					exit 1
					;;
			esac
		done
	
	if [[ -n "$SEPARATE" ]] ; then
		SETUPARGS="$SETUPARGS --separate=$SEPARATE"
	fi

	if [[ -n "$VMLINUX" ]] ; then
		if [[ "$VMLINUX" == "no" ]] ; then
			SETUPARGS="$SETUPARGS --no-vmlinux"
		else
			SETUPARGS="$SETUPARGS --vmlinux=$VMLINUX"
		fi
	fi

	if [[ -n "$IMAGEPATH" ]] ; then
		SETUPARGS="$SETUPARGS --image=$IMAGEPATH"
	fi

	if [[ -n "$CALLGRAPH" ]] ; then
		SETUPARGS="$SETUPARGS --callgraph=$CALLGRAPH"
	fi

	if [[ -n "$EVENT" ]] ; then
		SETUPARGS="$SETUPARGS --event=$EVENT"
	fi

	$OPCONTROL --setup $SETUPARGS	
}

disable_watchdog()
{
	echo 0 > /proc/sys/kernel/nmi_watchdog
}

ls_app()
{
	is_app_executable $APPPATH
	if [[ "$?" -ne 1 ]] ; then
		echo "Invalid application executable path!"
		exit 1
	fi
	ls $APPPATH; echo cmd_ret:$?;
}

kill_app()
{
	is_app_executable $APPPATH
	if [[ "$?" -ne 1 ]] ; then
		echo "Invalid application executable path!"
		exit 1
	fi
	$KILL $APPPATH
}

valgrind_run()
{
#	validate $VALGRINDOPTION
	VALGRINDAPPPATH=`printf %s "$*" | awk '{printf $NF}'`
	is_app_executable $VALGRINDAPPPATH
	if [[ "$?" -ne 1 ]] ; then
		echo "Invalid application executable path!"
		exit 1
	fi
	$VALGRIND $@
}

valgrind_chmod_result()
{
	RESULTDIRECTORY=/tmp/valgrind_result
	$CHMOD 777 $RESULTDIRECTORY/*
}

valgrind_terminate_app()
{
	PID=`$GETPID $VALGRIND`
	$SENDSIGQUIT $PID
}

echo $@
#echo $@ >> /home/developer/oprofile_history

if [[ `id -u` != "0" ]] ; then
	echo "You must be root to run this script!"
#	echo "You are not root!" >> /home/developer/oprofile_history
	exit 1
fi

if [[ -n $1 ]]; then
	case "$1" in
		init)
			op_init
			;;
		startdaemon)
			op_startdaemon
			;;
		start)
			op_start
			;;
		dump)
			op_dump
			;;
		stop)
			op_stop
			;;
		shutdown)
			op_shutdown
			;;
		reset)
			op_reset
			;;
		deinit)
			op_deinit
			;;
		list)
			op_list
			;;
		status)
			op_status
			;;
		save)
			if [[ -n $2 ]]; then
				SAVENAME=$2
			else
				echo "Save name is not given!"
				exit 1
			fi
			op_save
			;;
		ophelp)
			if [[ -n $2 ]]; then
				EVENTQUERY=$2
			else
				echo "Event query is not given!"
				exit 1
			fi
			op_help
			;;
		setup)
			if [[ $# -ge 2 ]]; then
				shift
				SETUPOPTION=$@
			else
				echo "Setup option is not given!"
				exit 1
			fi
			op_setup $@
			;;
		watchdogoff)
			disable_watchdog
			;;
		lsapp)
			if [[ -n $2 ]]; then
				APPPATH=$2
			else
				echo "Application executable path is not given!"
				exit 1
			fi
			ls_app
			;;
		killapp)
			if [[ -n $2 ]]; then
				APPPATH=$2
			else
				echo "Application executable path is not given!"
				exit 1
			fi
			kill_app
			;;
		valgrind)
			is_emulator
			if [[ "$?" -ne 1 ]] ; then
				echo "Valgrind option is available only on the emulator!"
				exit 1
			fi
			if [[ $# -ge 2 ]]; then
				shift
				VALGRINDOPTION=$@
			else
				echo "Valgrind option is not given!"
				exit 1
			fi
			valgrind_run $@
			;;
		valgrind_chmod)
			is_emulator
			if [[ "$?" -ne 1 ]] ; then
				echo "Valgrind option is available only on the emulator!"
				exit 1
			fi
			valgrind_chmod_result
			;;
		valgrind_terminate)
			is_emulator
			if [[ "$?" -ne 1 ]] ; then
				echo "Valgrind option is available only on the emulator!"
				exit 1
			fi
			valgrind_terminate_app
			;;
		*)
			echo "Unknown option!" >&2
			exit 1
			;;
	esac
fi


