#!/bin/bash
# Skrypt netperf analizujący plik z danymi uzyskanymi z polecenia netstat,
# wyszukujący ważne dane i trendy.

log="/home/admin/netstat.log"     # Zmień odpowiednio do swojego systemu.
stats="/tmp/netperf.stats.$$"
awktmp="/tmp/netperf.awk.$$"

trap "`which rm` -f $awktmp $stats" 0

if [ ! -r $log ] ; then
  echo "Błąd: nie można odczytać pliku $log." >&2
  exit 1
fi

# Najpierw wyświetlamy podstawowe dane z ostatniego wpisu w pliku.

eval $(tail -1 $log)    # Wszystkie wartości są zapisywane w zmiennych.

rep="$(scriptbc -p 3 $re/$snt\*100)"
repn="$(scriptbc -p 4 $re/$snt\*10000 | cut -d. -f1)"
repn="$(( $repn / 100 ))"
retop="$(scriptbc -p 3 $reto/$snt\*100)"; 
retopn="$(scriptbc -p 4 $reto/$snt\*10000 | cut -d. -f1)"
retopn="$(( $retopn / 100 ))"
dupp="$(scriptbc -p 3 $dup/$rec\*100)"; 
duppn="$(scriptbc -p 4 $dup/$rec\*10000 | cut -d. -f1)"
duppn="$(( $duppn / 100 ))"
oop="$(scriptbc -p 3 $oo/$rec\*100)"; 
oopn="$(scriptbc -p 4 $oo/$rec\*10000 | cut -d. -f1)"
oopn="$(( $oopn / 100 ))"

echo "Aktualne wyniki polecenia netstat:"

echo -n "  wysłanych pakietów: $snt, liczba retransmisji: $re ($rep%), "
echo "przekroczone czasy retransmisji: $reto ($retop%)"
echo -n "  odebranych pakietów: $rec, duplikaty: $dup ($dupp%), "
echo "zmieniona kolejność pakietów: $oo ($oop%)"
echo "  liczba żądań nawiązania połączenia: $creq, z czego zaakceptowanych: $cacc"
echo ""

# Sprawdzenie, czy pojawiły się ważne problemy.

if [ $repn -ge 5 ] ; then
  echo "*** Uwaga: odsetek retransmisji >= 5% oznacza problem"
  echo "(przeciążony router?)"
fi
if [ $retopn  -ge 5 ] ; then
  echo "*** Uwaga: odsetek przekroczonych czasów retransmisji >= 5% oznacza problem"
  echo "(przeciążony router?)"
fi
if [ $duppn -ge 5 ] ; then
  echo "*** Uwaga: odsetek odebranych duplikatów >= 5% oznacza problem"
  echo "(prawdopodobny problem z urządzeniem nadawczym)"
fi
if [ $oopn -ge 5 ] ; then
  echo -n "*** Uwaga: odsetek pakietów odebranych w zmienionej kolejności >= 5% "
  echo "oznacza problem"
fi

# Teraz przeanalizujmy trendy historyczne.

echo "Analiza trendów...."

while read logline ; do
  eval "$logline"
  rep2="$(scriptbc -p 4 $re / $snt \* 10000 | cut -d. -f1)"
  retop2="$(scriptbc -p 4 $reto / $snt \* 10000 | cut -d. -f1)"
  dupp2="$(scriptbc -p 4 $dup / $rec \* 10000 | cut -d. -f1)"
  oop2="$(scriptbc -p 4 $oo / $rec \* 10000 | cut -d. -f1)"
  echo "$rep2 $retop2 $dupp2 $oop2" >> $stats
done < $log

echo ""

# Wyliczenie statystyk i porównanie ich z bieżącymi wartościami.

cat << "EOF" > $awktmp
    { rep += $1; retop += $2; dupp += $3; oop += $4 }
END { rep /= 100; retop /= 100; dupp /= 100; oop /= 100;
      print "reps="int(rep/NR) ";retops=" int(retop/NR) \
         ";dupps=" int(dupp/NR) ";oops="int(oop/NR) }
EOF

eval $(awk -f $awktmp < $stats)

if [ $repn -gt $reps ] ; then
  echo "*** Uwaga: wyższy niż średni odsetek retransmisji."
  echo "    (Wartość średnia: $reps%, bieżąca: $repn%.)"
fi
if [ $retopn -gt $retops ] ; then
  echo "*** Uwaga: wyższy niż średni odsetek przekroczonych czasów retransmisji."
  echo "    (Wartość średnia: $retops%, bieżąca: $retopn%.)"
fi
if [ $duppn -gt $dupps ] ; then
    echo "*** Uwaga: wyższy niż średni odsetek duplikatów."
  echo "    (Wartość średnia: $dupps%, bieżąca: $duppn%.)"
fi
if [ $oopn -gt $oops ] ; then
  echo -n "*** Uwaga: wyższy niż średni odsetek pakietów odebranych "
  echo "w zmienionej kolejności."
  echo "    (Wartość średnia: $oops%, bieżąca: $oopn%.)"
fi
echo \(Wartości obliczone na podstawie $(wc -l < $stats) wyników polecenia netstat.\)
exit 0
