#!/bin/bash

#########################################
# Name: brun
#
# Summary: run script in background, log stdout, stderr
#
# Description:
#
# Author: k. headley
#
# Copyright MBARI 2013
#
#########################################

#########################################
# Script configuration defaults
# casual users should not need to change
# anything below this section
#########################################
X_ARG="defaultXValue"
DFL_LOG_PATH="."
LOG_PATH=${DFL_LOG_PATH}
LOG_FILE=""
FILE_PATH="."
TEST=""
RLOG=xrun.log
RLOG_PATH="."

#################################
# Script variable initialization
#################################
VERBOSE="FALSE"

#################################
# Function Definitions
#################################
#################################
# name: sigTrap
# description: signal trap callback
# will interrupt 
# args: none
#################################
sigTrap(){
    exit 0;
}

#################################
# name: printUsage
# description: print use message
# args: none
#################################
printUsage(){
    echo
    echo "  usage: `basename $0` [-TVhl <log>] <program> [args...]"
    echo "    l  <log> : log file path"
    echo "    T        : test (echo, don't execute)"
    echo "    V        : verbose output"
    echo "    h        : print this help message"
    echo ""
}

########################################
# name: vout
# description: print verbose message to stderr
# args:
#     msg: message
########################################
vout(){
    if [ "$VERBOSE" == "TRUE" ]
    then
	echo "$1" >&2
    fi
}

########################################
# name: exitError
# description: print use message to stderr
# args:
#     msg:        error message
#     returnCode: exit status to return
########################################
exitError(){
    echo >&2
    echo "$1" >&2
    echo >&2
    exit $2
}

##########################
# Script main entry point
##########################


# Argument processing
if [ "$#" -lt 1 ];then
    printUsage
    exit 0
fi

while getopts f:l:hTV Option
do
    case $Option in
	l ) LOG_PATH="$OPTARG"
	;;
	T ) TEST="echo"
	;;
	V ) VERBOSE="TRUE"
	;;
	h) printUsage
	  exit 0
	;;
	*) #exit 0 # getopts outputs error message
	;;
    esac
done

# call sigTrap on INT,TERM or EXIT
# trap sigTrap INT TERM EXIT

# reset trapped signals
# trap - INT TERM EXIT

# shift out all the options
# [OPTIND is the index of the first
# non-opt argument]
let "count = $OPTIND-1"
while [ "${count}" -gt 0 ]
do
	shift;
	let "count -= 1";
done

# should still be a program 
# name remaining. If not,
# it's an error
if [ "$#" -lt 1 ]
then
    printUsage
    exit 1
fi

# set the program file name
FILE_PATH=${1}

# shift out the program file name 
# [only the options remain]
shift
ARGS=${1+"$@"}

if [ "${LOG_PATH}" == "${DFL_LOG_PATH}" ]
then
	LOG_FILE="`basename ${FILE_PATH}`-out.log"
else
	LOG_FILE="`basename ${LOG_PATH}`"
	LOG_PATH="`dirname ${LOG_PATH}`"
fi

FILE_PID="-1"
if [ "$TEST" == "echo" ]
then
${TEST} "${FILE_PATH} ${ARGS}" '2>&1 &'
else
${FILE_PATH} ${ARGS} >> ${LOG_PATH}/${LOG_FILE} 2>&1 &
FILE_PID=$!
fi

vout "FILE_PATH : ${FILE_PATH}"
vout "ARGS [$#] : ${ARGS}"
vout "LOG_PATH  : ${LOG_PATH}"
vout "FILE_PID  : ${FILE_PID}"

vout "`date +%Y.%m.%d-%H:%M:%S` - TARGET=${FILE_PATH} PID=${FILE_PID} LOG=${LOG_PATH}/${LOG_FILE}"

echo "`date +%Y.%m.%d-%H:%M:%S` - TARGET=${FILE_PATH} PID=${FILE_PID} LOG=${LOG_PATH}/${LOG_FILE}" >> $LOG_PATH/$RLOG
