#!/usr/local/bin/bash
#
# Get an itrace and save it into /ifs/itraces
#
# Can save and restore the itrace categories context, if a new set of itrace
# categories is specified.


usage()
{
    cat <<EOF
Usage: isi_get_itrace [-c categories] -C categories [-p preset] [-r cmd] [name]
    -c category1,category2,...	Capture using these categories
    -C category1,category2,...	Capture using /only/ these categories
    -p preset 			Capture using a preset set of categories
    -r cmd 			Run trace while executing cmd
    -l                          Low frequency event logging: disables
                                thread switch event logging.

    Presets:
    stats	Network/performance/IB statistics
    normal	Filesystem and thread trace, with some stats
    mutex	Mutex contention trace
    network	Verbose network tracing
    all		Ridiculous level of tracing
EOF
}

save_categories()
{
    SAVE_CATS=`sysctl -n kern.itrace.categories`
}

restore_categories()
{
    sysctl "kern.itrace.categories=$SAVE_CATS"
}

set_categories()
{
    for a in ${1//,/ }; do
      sysctl "kern.itrace.category.$a=1"
    done
}

clear_categories()
{
    sysctl "kern.itrace.categories=0"
}

set_preset()
{
    CATS=""
    case "$1" in
	stats) CATS="perfstat,netstat,ibstat,threadswitch"
	;;
	normal) CATS="mutex,syscall,vop,profile,doalert,netdevstat,efs,signal,interrupt,netstat,ibstat,perfstat,clockstack,threadswitch"
	;;
	mutex) CATS="mutex,threadswitch"
	;;
	network) CATS="netstat,sockstat,threadswitch"
	;;
	all) CATS="mutex,syscall,vop,profile,doalert,sockstat,netdevstat,net,netverb,efs,interrupt,signal,nfs,disk,ib,func,perfstat,netstat,ibstat,rpc,clockstack,lock,lockverb,threadswitch"
	;;
    esac

    set_categories "$CATS"
}

# Begin

save_categories

COMMAND="sleep 24"
LOWFREQ=0

while getopts 'hc:C:p:r:l' OPTION
do
  case $OPTION in
      h) usage; exit 1
      ;;
      c) set_categories "$OPTARG"
      ;;
      C) clear_categories
      set_categories "$OPTARG"
      ;;
      p) clear_categories
      set_preset "$OPTARG"
      ;;
      r) COMMAND=$OPTARG
      ;;
      l) LOWFREQ=1
      ;;
  esac
done
shift $((OPTIND - 1))

# Turn on the low frequency itrace by disabling threadswitch logging
if [ $LOWFREQ -eq 1 ] ; then
    sysctl "kern.itrace.category.threadswitch=0"
fi

TRACENAME=$1
if [ "$TRACENAME" = "" ] ; then 
    TRACENAME=unnamed
fi

USING_CATS=`sysctl kern.itrace.category | grep -v ": 0"`
echo -n "Using categories: "
for a in ${USING_CATS//1/}; do
    a=${a//kern.itrace.category./}
    echo -n "${a//:/} "
done
echo

echo -n "Starting trace..."

sysctl kern.itrace.running=1 > /dev/null

echo -n "Executing: $COMMAND"
$COMMAND
sysctl kern.itrace.running=0 > /dev/null
/usr/bin/isi_save_itrace $TRACENAME

restore_categories

exit
