#!/bin/bash
#
# test_system_load
#
# Schickt cpu-Auslastungen ans ULS
##################################################################################
#
unset TMP_PATH SETULSHOSTNAME SECTION TESTSTEP SAVESTATEPATH SMPFLAG CONFIGDIR
while getopts h:s:t:d:C:T:m op
 do
  case "$op" in
   C) [[ -n "$OPTARG" ]] && CONFIGDIR="$OPTARG";;
   d) [[ -n "$OPTARG" ]] && TMP_PATH="-d $OPTARG";;
   h) [[ -n "$OPTARG" ]] && SETULSHOSTNAME="$OPTARG";;
   s) [[ -n "$OPTARG" ]] && SECTION="$OPTARG";;
   t) [[ -n "$OPTARG" ]] && TESTSTEP="$OPTARG";;
   T) [[ -n "$OPTARG" ]] && SAVESTATEPATH="$OPTARG";;
   m) SMPFLAG=1;;
   *) echo "usage: `basename $0` [-d <path>] [-h <ulshostname>] [-s <section>] [-t <teststep>] [-T <savestatepath>] [-m]"
      exit 1;;
  esac
done
shift $(( $OPTIND -1))
#
. `dirname $0`/uls_header
#
if [[ ! -f ${SAVESTATEPATH:-/dev/shm}/uls.stat.last ]]
 then
  [[ -n "$SAVESTATEPATH" && ! -d "$SAVESTATEPATH" ]] && mkdir -p "$SAVESTATEPATH"
  cat /proc/stat >${SAVESTATEPATH:-/dev/shm}/uls.stat.last
  sed 's/^/I /' /proc/interrupts >>${SAVESTATEPATH:-/dev/shm}/uls.stat.last
  exit 0
fi
#
( cat ${SAVESTATEPATH:-/dev/shm}/uls.stat.last
  cat /proc/stat >${SAVESTATEPATH:-/dev/shm}/uls.stat.last
  sed 's/^/I /' /proc/interrupts >>${SAVESTATEPATH:-/dev/shm}/uls.stat.last
  cat ${SAVESTATEPATH:-/dev/shm}/uls.stat.last
) | awk -v H="${SETULSHOSTNAME:-$ULSHOSTNAME}" -v SECTION="${SECTION:-System}" -v TESTSTEP="${TESTSTEP:-System Load}" -v DT="$DT" -v M="${SMPFLAG:-0}" '
function di(a, b)
{ if( a >= b )
    return a - b
  else
    return 4294967296 - b + a
}
BEGIN { print "D;" DT ";" H ";" SECTION ";"
        c = 0; z = 0}
/^cpu /     { c++
             u[c] = $2; n[c] = $3; s[c] = $4; id[c] = $5; io[c] = $6
             hirq[c] = $7 ; sirq[c] = $8; steal[c] = $9; guest[c] = $10
           }

/^cpu[0-9]/ { gsub("cpu", "", $1)
             cpus[$1]++
             if( $1 > z )
               z = $1
             ui[c":"$1] = $2; ni[c":"$1] = $3; si[c":"$1] = $4; idi[c":"$1] = $5
             ioi[c":"$1] = $6; hirqi[c":"$1] = $7 ; sirqi[c":"$1] = $8
             steali[c":"$1] = $9; guesti[c":"$1] = $10 }

/^I *[0-9]/ { for( i = 0; i <= z; i++ )
         intri[c":"i] += $(i+3);
     }
END { if( u[2] < u[1] )
        exit
      for( i = 0; cpus[i] == 2; i++ )
      { ti = idi["2:"i]-idi["1:"i]+ui["2:"i]-ui["1:"i]+ni["2:"i]-ni["1:"i]+si["2:"i]-si["1:"i]+ioi["2:"i]-ioi["1:"i]+hirqi["2:"i]-hirqi["1:"i]+sirqi["2:"i]-sirqi["1:"i]+steali["2:"i]-steali["1:"i]

        if( ti > 0 )
          ti = 100.0/ti
        else
          ti = 0

        intr += di(intri["2:"i], intri["1:"i])*ti

        if( M )
        { if( cpus[1] == 2 )
          { printf("V;;;;%s:%d;%%idle;%.2f;%%;\n", TESTSTEP, i, (idi["2:"i] - idi["1:"i])*ti)
            printf("V;;;;;%%usr;%.2f;%%;\n", (ui["2:"i] - ui["1:"i])*ti)
            printf("V;;;;;%%sys;%.2f;%%;\n", (si["2:"i] - si["1:"i])*ti)
            printf("V;;;;;%%nice;%.2f;%%;\n", (ni["2:"i] - ni["1:"i])*ti)
            printf("V;;;;;%%iowait;%.2f;%%;\n", (ioi["2:"i] - ioi["1:"i])*ti)
            printf("V;;;;;%%irq;%.2f;%%;\n", (hirqi["2:"i] - hirqi["1:"i])*ti)
            printf("V;;;;;%%soft;%.2f;%%;\n", (sirqi["2:"i] - sirqi["1:"i])*ti)
            printf("V;;;;;intr/s;%.2f;1/s;\n", di(intri["2:"i], intri["1:"i])*ti)
            if( steal[2] > 0 )
              printf("V;;;;;%%st;%.2f;%%;\n", (steali["2:"i] - steali["1:"i])*ti)
            if( guest[2] > 0 )
              printf("V;;;;;%%guest;%.2f;%%;\n", (guesti["2:"i] - guesti["1:"i])*ti)
          }
        }
      }

      t = u[2]-u[1]+n[2]-n[1]+s[2]-s[1]+id[2]-id[1]+io[2]-io[1]+hirq[2]-hirq[1]+sirq[2]-sirq[1]+steal[2]-steal[1]
      if( t > 0 )
        t = 100.0/t
      else
        t = 0

      printf("V;;;;%s;%%idle;%.2f;%%;\n", TESTSTEP, (id[2] - id[1])*t)
      printf("V;;;;;%%usr;%.2f;%%;\n", (u[2] - u[1])*t)
      printf("V;;;;;%%sys;%.2f;%%;\n", (s[2] - s[1])*t)
      printf("V;;;;;%%nice;%.2f;%%;\n", (n[2] - n[1])*t)
      printf("V;;;;;%%iowait;%.2f;%%;\n", (io[2] - io[1])*t)
      printf("V;;;;;%%irq;%.2f;%%;\n", (hirq[2] - hirq[1])*t)
      printf("V;;;;;%%soft;%.2f;%%;\n", (sirq[2] - sirq[1])*t)
      printf("V;;;;;intr/s;%.2f;1/s;\n", intr)
      if( steal[2] > 0 )
        printf("V;;;;;%%st;%.2f;%%;\n", (steal[2] - steal[1])*t)
      if( guest[2] > 0 )
        printf("V;;;;;%%guest;%.2f;%%;\n", (guest[2] - guesti[1])*t)
    }' | send_test_tab $TMP_PATH
