# ---------------------------------------------------------------------
# gsp_show_ltrace - ksh shell script wrapper to display the gsp ltrace
#                   shmem buffers.
#
# Jan 2009, Huan Le
#
# Copyright (c) 2009 by cisco Systems, Inc.
# All rights reserved.
#--------------------------------------------------------------------

prog=${0##*/}

usage() {
   print $prog - a wrapper to display GSP ltrace shmem buffer
   print "Usage: $prog -t <ltrace> [-i <node-id>][-G <gid>][-h|H|?]"
   print "       -t: double-quote space-separate list of gsp ltrace."
   print "           <ltrace> entry: b|c|cl|e|ea|em|m|nf|lf|ls|tf|ts"
   print "          b:     bootstrap"
   print "          c:     create_leave_slow"
   print "          cl:    client - libgroup"
   print "          e:     ens"
   print "          ea:    gea - gsp/server error api"
   print "          em:    error_minor"
   print "          m:     mem"
   print "          nf:    nb_fast"
   print "          ls:    limp_slow,        lf:   limp_fast"
   print "          ts:    time_out_slow,    tf:   time_out_fast"
   print "       -i <node-id>: node where gsp buffers are retrieved"
   print "       -G <gid>: <gid> is space-separated list of group id." 
   print "                 Used with '-t cl' ltrace only."
   print "Example: $prog -t \"c e ea\""
   print "         $prog -t \"c cl\" -G 2001 -i 65"
   print "         $prog -t cl -G \"2001 2002 2003\" -i 65"
}

exec_path="/pkg/bin"

gsp_trace=""
gid=""
args=""
cmd_list=""

while getopts :t:i:G:hH-? option
do case $option in 
   t)
      gsp_trace="$OPTARG";;
   G)
      gid="$OPTARG";;
   i)
      nodeid="-i $OPTARG"
      args="$args $nodeid";;
   :)
      print -u2 "ERROR: option -$OPTARG required value"
      usage
      exit 2;;
   h|H)
      usage
      exit 0;;
   ?)
      print -u2 "ERROR: unknown option $OPTARG"
      usage
      exit 2;;
esac
done

if [ "$gsp_trace" == "" ] ; then
    print "ERROR: missing required -t arg"
    usage
    exit 2
fi

# To support comma-separated list 
# gsp_trace="${gsp_trace//,/ }"

for ltrace in $gsp_trace; do
   case $ltrace in 
      all)
         cmd_list="$cmd_list gsp_bootstrap_show_ltrace gsp_create_leave_slow_show_ltrace show_ltrace_gsp gea_show_ltrace gsp_error_minor_show_ltrace gsp_ens_show_ltrace gsp_timeout_slow_show_ltrace gsp_timeout_fast_show_ltrace gsp_limp_slow_show_ltrace gsp_limp_fast_show_ltrace gsp_nb_fast_show_ltrace gsp_sync_slow_show_ltrace gsp_sync_fast_show_ltrace gsp_mem_show_ltrace";;
      b|bootstrap)
         cmd_list="$cmd_list gsp_bootstrap_show_ltrace";;

      c|create|create_leave|create_leave_slow) 
         cmd_list="$cmd_list gsp_create_leave_slow_show_ltrace";;

      cl|client)
         cmd_list="$cmd_list show_ltrace_gsp";;

      ea|error_api)
         cmd_list="$cmd_list gea_show_ltrace";;

      em|error_minor)
         cmd_list="$cmd_list gsp_error_minor_show_ltrace";;

      e|ens)
         cmd_list="$cmd_list gsp_ens_show_ltrace";;

      ts|time_out_slow)
         cmd_list="$cmd_list gsp_timeout_slow_show_ltrace";;

      tf|time_out_fast)
         cmd_list="$cmd_list gsp_timeout_fast_show_ltrace";;

      ls|limp_slow)
         cmd_list="$cmd_list gsp_limp_slow_show_ltrace";;

      lf|limp_slow)
         cmd_list="$cmd_list gsp_limp_fast_show_ltrace";;

      nf|nb_fast)
         cmd_list="$cmd_list gsp_nb_fast_show_ltrace";;

      ss|sync_slow)
         cmd_list="$cmd_list gsp_sync_slow_show_ltrace";;

      sf|sync_fast)
         cmd_list="$cmd_list gsp_sync_fast_show_ltrace";;

      m|mem)
         cmd_list="$cmd_list gsp_mem_show_ltrace";;

      *)
         print -u2 "$prog: invalid ltrace value '$ltrace'"
         exit 3;;
   esac
done

for cmd in $cmd_list ; do
   exec_cmd="$exec_path/$cmd"

   if [[ -x $exec_cmd ]] ; then 
      cmd_args=$args

      if [ "$cmd" == "show_ltrace_gsp" ] ; then
         # To support comma-separated list 
         # gid="${gid//,/' '}"

         for group in $gid; do
            group_args="$cmd_args -G $group"
            echo "$prog: execute $exec_cmd $group_args"
            $exec_cmd $group_args
         done

      else
         echo "$prog: execute $exec_cmd $cmd_args"
         $exec_cmd $cmd_args
      fi
   else 
      echo "$prog: $exec_cmd not found"
   fi
done
