#!/bin/bash
#
# test_eth_load
#
# Schickt Netzkarten-Auslastungen ans ULS
##################################################################################
#
unset TMP_PATH SETULSHOSTNAME SECTION TESTSTEP SAVESTATEPATH NFS QA QS FLAGS CONFIGDIR
while getopts h:s:t:d:C:T:v? op
 do
  case "$op" in
   v) FLAGS=v;;
   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` [-C <path>] [-d <path>] [-h <ulshostname>] [-s <section>] [-t <teststep>] [-T <savestatepath>] [-v]"
      exit 1;;
  esac
done
shift $(( $OPTIND -1))
#
. `dirname $0`/uls_header
#
export LANG=C
#
if [[ ! -f ${SAVESTATEPATH:-/dev/shm}/uls.netdev.last ]]
 then
  [[ -n "$SAVESTATEPATH" && ! -d "$SAVESTATEPATH" ]] && mkdir -p "$SAVESTATEPATH"
  date '+SECS %s.%N' >${SAVESTATEPATH:-/dev/shm}/uls.netdev.last
  cat /proc/net/dev >>${SAVESTATEPATH:-/dev/shm}/uls.netdev.last
  exit 0
fi
#
( cat ${SAVESTATEPATH:-/dev/shm}/uls.netdev.last
  date '+SECS %s.%N' >${SAVESTATEPATH:-/dev/shm}/uls.netdev.last
  cat /proc/net/dev >>${SAVESTATEPATH:-/dev/shm}/uls.netdev.last
  cat ${SAVESTATEPATH:-/dev/shm}/uls.netdev.last
) | sed 's/:/ /g' | awk -v H="${SETULSHOSTNAME:-$ULSHOSTNAME}" -v SECTION="${SECTION:-System}" -v TESTSTEP="${TESTSTEP:-Net}" -v DT="$DT" '
function flformat(f)
{ if( f < 0.0000001 )
    d = 0
  else
  { d = 4 - log(f)/2.3
    if( d < 0 )
     d = 0
  }
  return sprintf("%0.*f", d, f)
}

BEGIN { c = 0; z = 0
        print "D;" DT ";" H ";" SECTION ";"
      }

$1 == "SECS" { c++;
               s[c] = $2;
             }
NF == 17 { if( $1 != "lo" && $1 != "sit0" && $2 + $3 + $10 + $11 > 0 ) 
           { rb[c":"$1] = $2;
             rp[c":"$1] = $3;
             re[c":"$1] = $4;
             rd[c":"$1] = $5;
             rfi[c":"$1] = $6;
             rfr[c":"$1] = $7;
             rc[c":"$1] = $8;
             rm[c":"$1] = $9;
             tb[c":"$1] = $10;
             tp[c":"$1] = $11;
             te[c":"$1] = $12;
             td[c":"$1] = $13;
             tfi[c":"$1] = $14;
             co[c":"$1] = $15;
             tca[c":"$1] = $16;
             tc[c":"$1] = $17;
             dev[$1]++;
           }
         }

END { ti = s[2] - s[1];
      if( ti > 0 )
      { for( i in dev )
        { if( m[i] != "" )
            d = m[i];
          else
            d = i;
          if( rp["2:"i] >= rp["1:"i] )
          { print "V;;;;" TESTSTEP ":" i ";rxpck;" flformat((rp["2:"i] - rp["1:"i])/ti) ";1/s"
            if( tp["2:"i] >= tp["1:"i] )
              print "V;;;;;txpck;" flformat((tp["2:"i] - tp["1:"i])/ti) ";1/s"
            if( rb["2:"i] >= rb["1:"i] )
            { print "V;;;;;rxkbyt;" flformat((rb["2:"i] - rb["1:"i])/1000/ti) ";kB/s"
              print "V;;;;;rxmbyt;" flformat((rb["2:"i] - rb["1:"i])/1000000) ";MB"
            }
            if( tb["2:"i] >= tb["1:"i] )
            { print "V;;;;;txkbyt;" flformat((tb["2:"i] - tb["1:"i])/1000/ti) ";kB/s"
              print "V;;;;;txmbyt;" flformat((tb["2:"i] - tb["1:"i])/1000000) ";MB"
            }
            if( FLAGS ~ "v" )
            { if( rc["2:"i] >= rc["1:"i] )
                print "V;;;;;rxcmp;" flformat((rc["2:"i] - rc["1:"i])/ti) ";1/s"
              if( tc["2:"i] >= tc["1:"i] )
                print "V;;;;;txcmp;" flformat((tc["2:"i] - tc["1:"i])/ti) ";1/s"
              if( rm["2:"i] >= rm["1:"i] )
                print "V;;;;;rxmcst;" flformat((rm["2:"i] - rm["1:"i])/ti) ";1/s"
              if( re["2:"i] >= re["1:"i] )
                print "V;;;;;rxerr;" flformat((re["2:"i] - re["1:"i])/ti) ";1/s"
              if( te["2:"i] >= te["1:"i] )
                print "V;;;;;txerr;" flformat((te["2:"i] - te["1:"i])/ti) ";1/s"
              if( co["2:"i] >= co["1:"i] )
                print "V;;;;;coll;" flformat((co["2:"i] - co["1:"i])/ti) ";1/s"
              if( rd["2:"i] >= rd["1:"i] )
                print "V;;;;;rxdrop;" flformat((rd["2:"i] - rd["1:"i])/ti) ";1/s"
              if( td["2:"i] >= td["1:"i] )
                print "V;;;;;txdrop;" flformat((td["2:"i] - td["1:"i])/ti) ";1/s"
              if( tca["2:"i] >= tca["1:"i] )
                print "V;;;;;txcarr;" flformat((tca["2:"i] - tca["1:"i])/ti) ";1/s"
              if( rfr["2:"i] >= rfr["1:"i] )
                print "V;;;;;rxfram;" flformat((rfr["2:"i] - rfr["1:"i])/ti) ";1/s"
              if( rfi["2:"i] >= rfi["1:"i] )
                print "V;;;;;rxfifo;" flformat((rfi["2:"i] - rfi["1:"i])/ti) ";1/s"
              if( tfi["2:"i] >= tfi["1:"i] )
                print "V;;;;;txfifo;" flformat((tfi["2:"i] - tfi["1:"i])/ti) ";1/s"
            }
          }
        }
      }
    }' | send_test_tab $TMP_PATH
