Remplir la base de données à partir des données de vnStat

Analyse de la sortie de vnStat

Vous l’avez compris, il va falloir à partir des données texte fournis par vnstat, générer une commande sql capable de remplir une table.

Toutes les commandes de base du shell vont être passées en revue !

La 1ère étape va être de juste produire un fichier de valeur. Puis ce fichier permettra de générer les requêtes SQL nécessaires

Si vous avez eu la curiosité de lancer vnstat pour chaque des 3 statistiques (mois : -m, par jour : -d et par heure : -h) , vous avez du voir que la plus compliquée est celle concernant la statistique par heures. Donc je vais traiter celle-ci en détail, es autres sont du même style mais en beaucoup plus simple

Tout d’abord on va regarder en détail la sortie de vnstat -h, mais avant on va envoyer ces données dans un fichier à l’aide de l’opérateur de redirection >

Comme vous le voyez, le fichier stath.txt de sortie contient :

  • une ligne d’entête avec le nom de l’interface (enp2s0) et l’heure de la création du fichier (20:45)
  • une courbe
  • les données (vous remarquez les doubles crochets ][ ? j’ai remarqué qu’ils sont absents si on lance la même commande sur une Debian
  • Attention : des lignes d’heures concernent effectivement ce jour mais certaines concernent la veille (toutes celles > à 20h car il est 20h45 sur cet exemple)

Ni l’entête ni la courbe ne nous intéressent, donc il faut ignorer cette partie. Comment faire ? le début de la partie intéressante ne commencera peut-être pas par 21, ni par h.

Donc je me suis dit qu’il fallait partir du bas de la courbe (la ligne de ———-) puis se décaler de 3 lignes vers le bas, pour arriver à l’entête du tableau.

Donc la 1ère ligne à lire est celle qui commence par “h rx (Mib) …………” et c’est la ligne qui contient les tirets “——” + 3

  • trouver le numéro de la ligne qui contient les tirets grâce à l’opérateur grep.

J’utilise l’anti-slash (\) car sinon, grep prend le tiret (-) pour le début d’un opérateur.

J’utilise l’option -n pour que grep m’affiche le numéro de la ligne

J’utilise l’option -m1 pour que grep s’arrête à la première ligne contenant “-+”

Vous constatez que grep me renvoie le numéro de la ligne (12), suivi de deux-points (:) puis la ligne qui correspond à la recherche mais je ne m’intéresse qu’au numéro de ligne.

Donc on va utiliser cut, qui va couper selon un délimitateur (les deux points) et ne prendre que la 1ère partie (1er champ ou field) et mettre tout cela dans la variable ligdeb ce qui donne :

vous remarquez que maintenant on a ligdeb qui vaut 12. Reste à lui ajouter 3.

pour cela, on va utiliser l’opérateur mathématique “bc”. S’il n’est pas installé, installez-le , il existe pour toutes les distributions et est tout petit.

Voilà, ligdeb vaut la bonne valeur : 15

        Donc on va traiter le fichier ligne à ligne, et on commencera réellement à s”intéresser au contenu de la ligne à partir de la ligne 15.

Vous remarquez qu’en dessous de cette ligne numéro 15, se trouvent 8 lignes. Ces 8 lignes forment 3 tableaux de 8 lignes (3 x 8) = 24 : ce sont les valeurs des 24 dernières heures et que ces 8 lignes ont une structure identique.

On a donc :

  • 1 ligne d’entête à analyser
  • 8 lignes de données à analyser

Vous me direz “pourquoi analyser la ligne d’entête ?” : à cause des unités : dans l’exemple, vnstat a mis MiB mais si le volume de données avait été très petit, il aurait mis KiB et GiB si le volume est très gros. En plus, on est obliger de supposer que les colonnes peuvent avoir des unités différentes !!

Analyse de l’entête

On a 3 blocs de 3 données : l’heure (h), l’unité de réception (RX MiB) l’unité d’émission (TX MiB)

On part donc de la ligne

 

J’ai déjà dit que sous debian, on n’a pas les doubles crochets, donc je vais m’en débarrasser grâce à la commande sed dans tout le fichier en une seule fois, les anti-slash (\) servent à empêcher sed d’interpréter les caractères [ et ]. //g signifie qu’on remplace ][ par ce qu’il y a entre // (donc par rien) et qu’on le fait globalement (g)

Voici donc notre nouvelle ligne d’entête à traiter :

On a finalement un ensemble de 15 valeurs séparées par des espaces et ce qui nous intéressent sont  les numéros (en commençant par 1)

  • 3 : l’unité RX du 1er groupe d’heures (RXG1)
  • 5 : l’unité TX du 1er groupe d’heures (TXG1)
  • 8 : l’unité RX du 2ième groupe d’heures (RXG2)
  • 10 : l’unité TX du 2ième groupe d’heures (TXG2)
  • 13 : l’unité RX du 3ième groupe d’heures (RXG3)
  • 5 : l’unité TX du 2ième groupe d’heures (TXG3)

Voilà le travail de la commande awk, parfaite pour récupérer des valeurs séparées par des espaces, ce qui donne, pour RXG1 :

Vous avez compris que echo affiche lig, puis qu’il passe la valeur à awk (grâce au pipe (|) , lequel affiche la 3ième valeur (print $3). En répétant ceci sur les 6 colonnes, on a l’unité utilisée pour chacune d’entre elle.

Analyse d’une ligne de données.

Les lignes de détails sont les 8 lignes qui débutent à lig+1(donc 16) .

Elles correspondent à  3 tableaux mais horizontalement les uns à côté des autres.

Pour chaque tableau, on a 3 valeurs :

  • L’heure (visiblement contenant le zéro non significatif), ces horaires ne concernent soit la date actuelle soit celle de la veille !
  • La quantité de données reçues (RX)
  • La quantité de données émises (TX)

En procédant de même (avec awk) , on a va récupérer toutes ces valeurs (exemple avec le 1er groupe, à répéter pour le groupe 2 et 3)

Mais ces valeurs sont dans les unités de la ligne d’entête et moi, je voudrai tout avoir en MiB.

Donc : Si c’est en MiB : je ne fais rien, si c’est en GiB, je multiplie par 1024 et si c’est en KiB, je divise par 1024.

Mais bc, fait de préférence des divisions euclidiennes (en ne fournissant qu’un résultat entier), donc on va le forcer à fournir un résultat décimal , par exemple avec 2 chiffres derrière la virgule grâce à “scale”

Ce qui va donner (en supposant que val est ma valeur à convertir, valunit, son unité

if [ “$valunit” == “(GiB)” ]; then val=$( echo “scale=2; $val * 1024 ” | bc ) elif [ “$valunit” == “(KiB)” ]; then val=$( echo “scale=2; $val / 1024 ” | bc ) fi

Il nous faut aussi déterminer la véritable date de chaque ligne: on a 24h de données mais il n’est que 20h45, donc les heures 21,22 et 23 concernent la veille.

Donc la règle est simple : si l’heure est <= à l’heure actuelle alors la date est la date actuelle, sinon c’est la veille. Comme en SQL, il vaut mieux exprimer les dates au format iso (SSAA-MM-JJ), on va d’abord stocker en variable, la date du jour, celle de la veille à ce format ainsi que l’heure actuelle :

ymd=$(date +"%Y-%m-%d")
ymdhier=$(date -d "$dataset_date - 1 days" +%Y-%m-%d)
monheure=$(date +"%H")

Et pour chaque ligne, si l’heure sur la ligne est hh et que la date de la ligne est dt on fera :

#Aujourd'hui ou hier ? bc donne le résultat d'un test sous la forme : 1 si vrai, 0 sinon
#j'utilise bc pour être sur que les données hh et monheure seront comparées numériquement et pas sous la forme de chaînes de caractères
if [ $(echo "$hh <= $monheure" | bc) -ge 1 ]; then
   dt=$ymd
else
   dt=$ymdhier 
fi

Une fois qu’on a toutes nos valeurs, on les met dans une ligne en les séparant par exemple par des point-virgules ou autre chose qui remplira un nouveau fichier.

iface désigne de nom de l’interface réseau (ex : enp2s0 ou eth0) : la table pouvant contenir des données de plusieurs cartes.

echo ""$iface"";"$dt"";""$hh"";""$rx"";""$tx" >> fichiertxt.txt

Ne reste plus qu’à mettre tout cela dans une boucle de type :

i=1
while IFS= read lig
do
..............traite la ligne lig selon les cas pour écrire 
..............3 lignes dans un nouveau fichier "fichiertxt.txt" pour chaque ligne lue
i=$(( i + 1 ))
done < stath.txt

Création des ordres SQL de remplissage de la table TBHOUR

Voilà qui est beaucoup plus simple : il suffit de lire notre fichier précédemment créé ligne à ligne et de générer les ordres SQL.

Mais : il ne faut pas générer de doublons hors les données qu’on reçoit à 20h45 par exemple, si elle sont figée concernant les heures 0 à 19, elles ne le sont pas pour la ligne de l’heure 20h.

En effet, si le traitement repasse à 20h55 ou à 21h10, les valeurs de la lignes 20h auront surement augmentée.

Donc un simple chargement brut de fichier (LOADDATA) ne convient pas, il faut uitliser un ordre INSERT… ON DUPLICATE UPDATE…..(ajout d”une ligne et si la ligne est déjà présente, mise à jour de la valeur). Vous me direz, comment ça peut marcher puisque la clé primaire de la table est un ID unique totalement artificiel ??  Et bien grâce à l’index unique qu’on a créé.

On va donc lire fichiertxt.txt ligne à ligne et contruire l’ordre sql et l’exécuter

while IFS=; read iface dt hh rx tx 
do
   sql="INSERT INTO MYIFSTAT.TBHOUR (IFACE, DAY, HOUR, RX, TX) VALUES('$iface','$dt',$hh,$rx,$tx) ON DUPLICATE KEY UPDATE RX=$rx, TX=$tx, DMAJ=CURRENT_TIMESTAMP;"
   mysql --login-path=local <<< "$sql"
done < $fichiertxt.txt

DMAJ me permet de voir quand l’ordre SQL est passé avec succès la dernière fois (pratique pour debuguer).

J’aurai pu mettre des quotes partout avec mysql mais j’ai l’habitude de ne pas les utiliser pour des champs de type nombres … une vieille habitude qui me permet de créer des ordres SQL qui fonctionnent que ce soit avec MySQL, SQLServer, Firebird, PostGre, DB2, Oracle.

MYIFSTAT est le nom que j’ai donné à ma base de données, vous pouvez en utiliser un autre.

J’utilise –login-path qui n’est compatible qu’avec MySQL, pour MariaDB, vous devrez préciser le nom de l’utilisateur et le mot de passe avec -u et -p

Et la suite ?

Après avoir fait la même chose pour les statistiques quotidiennes et mensuelles, ne reste plus qu’à mettre tout ça dans un seul et unique script shell. Idéalement pouvant traiter plusieurs interfaces (toutes celles de la table TBIFACE dont ACTIF vaut ‘Y’) et de le lancer régulièrement grâce à la crontab.

Voici comment cela se présente maintenant  : le script principale ne nomme myifstat.sh et est lancé toutes les 10 minutes (ça tourne très rapidement mais on pourrai mettre toutes les 15, 20 ou 30 minutes)

crontab -e
# VIA VNSTAT (remplissage base MySQL)
*/10 * * * * sh /var/www/html/netmysql/bash/myifstat.sh > /var/www/html/netmysql                                                                                                                                                             /bash/myifstat.log 2>&1

Ce script est le script maître, il lancer tout le traitement pour chaque interface paramétrées dans TBIFACE et qui sont actives , il utilise des fonctions décrites dans le fichier function.sh

Pour les télécharger : myiface.sh  function.sh

#!/bin/sh
#----------------------------------------------------------------------------#
#Pour chaque interface active dans la base de données
# demande les stats et met à jour la base de données
#----------------------------------------------------------------------------#
source /var/www/html/netmysql/bash/function.sh
deb=$(date +"%d/%m/%Y %H:%M:%S")
echo "Démarrage ""$deb"
GetMySqlType

#RECUPE STATS GLOBALES
rm -f /tmp/listeiface.txt
sql="SELECT IFACE FROM MYIFSTAT.TBIFACE WHERE ACTIF='Y' INTO OUTFILE '/tmp/listeiface.txt'"
if [ "$mysqltype" == "mysql" ]; then
	mysql --login-path=local -e "$sql"
else
	mysql --user="$mysqluser" --password="$mysqlpass" -e "$sql"
fi
while IFS="|" read myiface
do
	if [ "$myiface" != "" ]; then
		ret=0
		echo "-----------------------"
		echo "iface=""$myiface"
		echo "-----------------------"
		IfaceCheckDeclare $myiface
		if [ $ret -eq 0 ]; then
			echo "GetStatMonthTxt ""$myiface"
			GetStatMonthTxt $myiface
		fi
		if [ $ret -eq 0 ]; then
			echo "GetStatDayTxt ""$myiface"
			GetStatDayTxt $myiface
		fi
		if [ $ret -eq 0 ]; then
			echo "GetStatHourTxt ""$myiface"
			GetStatHourTxt $myiface
		fi
	fi
done < /tmp/listeiface.txt
fin=$(date +"%d/%m/%Y %H:%M:%S")
echo "Fin ""$fin"
exit 0

Ce script principal utilise des fonctions dont le source est dans function.sh certaines solutions utiliser diffèrent car évidement, en se relisant, un a une vue différente.

#!/bin/sh
#----------------------------------------------------------------------------#
#fonctions utilisées :
# - GetStatMonthTxt : fournis pour une interface, les stats mensuelle au format txt
# - GetStatDayTxt : fournis pour une interface, les stats quotidiennes au format txt
# - GetStatHourTxt : fournis pour une interface, les stats sur 24h au format txt
# Synaxe : param1 : Iface
#----------------------------------------------------------------------------#

function GetMySqlType()
{
mysqluser="myifstat"
mysqlpass="Myifstat@51"
i=`mysql -V | grep -i mariadb`
if [ "$i" != "" ]; then
   mysqltype="mariadb"
else
   mysqltype="mysql"
fi
}

function IfaceCheckDeclare()
{
ret=0
local Iface="$1"
if [ $ret -eq 0 -a "$Iface" == "" ]; then
   echo "Interface ""$Iface"" manquante, usage : IfaceCheckDeclare Ifacename"
   ret=1
fi
if [ $ret -eq 0 ]; then
   ifconfigpath=`whereis ifconfig | cut -d: -f2 | awk '{print $1}' `
   if [ "$ifconfigpath" == "" ]; then
      echo "ifconfig not found"
      ret=1
   fi 
fi

if [ $ret -eq 0 ]; then
   i=`$ifconfigpath | cut -d: -f1 | cut -d' ' -f1 | grep "$Iface"`
   if [ $ret -eq 0 -a "$i" == "" ]; then
      echo "Interface ""$Iface"" inconnue dans ifconfig"
      ret=1
   fi 
fi

i=`whereis vnstat | cut -d: -f2`
if [ $ret -eq 0 -a "$i" == "" ]; then
   echo "vnstat non installé"
   ret=1
fi 
i=`ps -u vnstat | grep vnstatd`
if [ $ret -eq 0 -a "$i" == "" ]; then
   echo "vnstatd is not running please install this service"
   ret=1
fi 
if [ $ret -eq 0 -a ! -f "/var/lib/vnstat/""$Iface" ]; then 
   echo "$IFace not declared in vnstat user vnstat -u -i ""$IFace"" first"
   ret=1
fi
}


function ConvertToMiB()
{
local val="$1"
local valunit="$2"
newval="$val"
ret=0
if [ $ret -eq 0 -a "$valunit" != "KiB" -a "$valunit" != "MiB" -a "$valunit" != "GiB" ]; then
   newval=0
   ret=1
fi
if [ $ret -eq 0 -a "$val" == "" ]; then
   newval=0
   ret=1
fi
if [ $ret -eq 0 -a "$valunit" == "GiB" ]; then
   newval=$( echo "scale=2; $newval * 1024 * 1024" | bc | awk '{printf "%.2f\n", $0}' )
elif [ $ret -eq 0 -a "$valunit" == "MiB" ]; then
   newval=$( echo "scale=2; $newval * 1024 " | bc | awk '{printf "%.2f\n", $0}')
elif [ $ret -eq 0 -a "$valunit" == "KiB" ]; then
   newval="$newval"
fi
if [ $ret -eq 0 ]; then
   newval=$( echo "scale=2; $newval / 1024 " | bc | awk '{printf "%.2f\n", $0}' )
fi
}

function GetStatDayTxt
{
local Iface="$1"
local OutFile="$2"
local ret=0
local my=$(date +"%m/%Y")
local tempfile="/tmp/statd""$Iface"".txt"
local tempfile2="/tmp/statdpipe""$Iface"".txt"
rm -f "$tempfile"
rm -f "$tempfile2"
touch "$tempfile2"

vnstat -d -i "$Iface" | grep $my > "$tempfile"
ret=$?
if [ $ret -eq 0 ]; then
   while IFS="|" read s1 s2 s3 s4
   do 
      s1=`echo "$s1" | xargs`
      s2=`echo "$s2" | xargs`
      #echo $s2
      dt=`echo "$s1" |cut -d' ' -f1`
      rxval=`echo "$s1" |cut -d' ' -f2`
      rxval=`sed 's/\,/\./' <<< "$rxval" `
      rxunit=`echo "$s1" |cut -d' ' -f3`

      txval=`echo "$s2" |cut -d' ' -f1`
      txval=`sed 's/\,/\./' <<< "$txval" `
      txunit=`echo "$s2" |cut -d' ' -f2`

      dd=`echo "$dt" |cut -d'/' -f1`
      mm=`echo "$dt" |cut -d'/' -f2`
      yy=`echo "$dt" |cut -d'/' -f3`
      dt="$yy""-""$mm""-""$dd"

      #echo "$s"
      #echo "dt=""$dt"
      #echo "dd=""$dd"
      #echo "mm=""$mm"
      #echo "yy=""$yy"
      #echo "txval=""$txval"
      #echo "rxval=""$rxval"

      ConvertToMiB "$rxval" "$rxunit"
      rxval="$newval"
      rxunit="MiB"
      ConvertToMiB "$txval" "$txunit"
      txval="$newval"
      txunit="MiB"
      echo "$Iface""|""$dt""|""$rxval""|""$rxunit""|""$txval""|""$txunit" >> "$tempfile2"
   done < "$tempfile"
fi
if [ $ret -eq 0 -a "$OutFile" != "" ]; then
   cp "$tempfile2" "$OutFile"
   ret=$?
fi
###############################################################
# REMPLIR TABLE HOUR"
GetMySqlType
if [ $ret -eq 0 ]; then
   i=0
   while IFS="|" read s1 s2 s3 s4 s5 s6
   do
      sql="INSERT INTO MYIFSTAT.TBDAY (IFACE, DAY, RX, TX) VALUES('$s1','$s2',$s3,$s5) ON DUPLICATE KEY UPDATE RX=$s3, TX=$s5, DMAJ=CURRENT_TIMESTAMP; "
      if [ "$mysqltype" == "mysql" ]; then
         mysql --login-path=local <<< "$sql"
      else
         mysql --user="$mysqluser" --password="$mysqlpass" -e "$sql"
      fi
      r=$?
      if [ $r -ne 0 ]; then
         echo "ERR"
         echo "$sql"
      fi
      i=$( echo "$i + 1 " | bc )
   done < "$tempfile2"
   echo "$Iface"" : ""$i"" lignes mises à jour dans MYIFSTAT.TBDAY"
fi
rm -f "$tempfile2" 
###############################################################
}


function GetStatHourTxt()
{
local Iface="$1"
local OutFile="$2"
local ret=0
local ymd=$(date +"%Y-%m-%d")
local ymdhier=$(date -d "$dataset_date - 1 days" +%Y-%m-%d)
local monheure=$(date +"%H")
local tempfile="/tmp/stath""$Iface"".txt"
rm -f "$tempfile"
local tempfile2="/tmp/stathpipe""$Iface"".txt"
rm -f "$tempfile2"
touch "$tempfile2"

vnstat -h -i "$Iface" > "$tempfile"
if [ $ret -eq 0 ]; then
   sed -i -e 's/\]\[//g' "$tempfile"
   ligdeb=`cat "$tempfile" | grep -n "rx (" | cut -d: -f1`
   ligfin=$( echo "$ligdeb + 9 " | bc )
   ilig=1
   while read s
   do
      if [ $ilig -ge $ligdeb -a $ilig -le $ligfin ]; then
         if [ $ilig -eq $ligdeb ]; then
            rxunit=`echo "$s" |cut -d'(' -f2 |cut -d')' -f1`
            #echo $rxunit
            txunit=`echo "$s" |cut -d'(' -f3 |cut -d')' -f1`
         else
            h0=`echo "$s" |cut -d' ' -f1`
            rx0=`echo "$s" | awk '{print $2}' `
            tx0=`echo "$s" | awk '{print $3}' `
            h8=`echo "$s" | awk '{print $4}' `
            rx8=`echo "$s" | awk '{print $5}' `
            tx8=`echo "$s" | awk '{print $6}' `
            h16=`echo "$s" | awk '{print $7}' `
            rx16=`echo "$s" | awk '{print $8}' `
            tx16=`echo "$s" | awk '{print $9}' `

            #Aujourd'hui ou hier ?
            if [ $(echo "$h0 <= $monheure" | bc) -ge 1 ]; then
               d0=$ymd
            else
               d0=$ymdhier 
            fi
            if [ $(echo "$h8 <= $monheure" | bc) -ge 1 ]; then
               d8=$ymd
            else
               d8=$ymdhier
            fi
            if [ $(echo "$h16 <= $monheure" | bc) -ge 1 ]; then
               d16=$ymd
            else
               d16=$ymdhier
            fi

            #Valeur des TX en MiB 
            ConvertToMiB "$tx0" "$txunit"
            if [ $ret -ne 0 ]; then
               echo "Pb converting (tx0) ""$tx0"" in ""$txunit"
            fi
            tx0="$newval"
            ConvertToMiB "$tx8" "$txunit"
            if [ $ret -ne 0 ]; then
               echo "Pb converting (tx8) ""$tx8"" in ""$txunit"
            fi
            tx8="$newval"
            ConvertToMiB "$tx16" "$txunit"
            if [ $ret -ne 0 ]; then
               echo "Pb converting (tx16) ""$tx16"" in ""$txunit"
            fi
            tx16="$newval"
            #Valeur des RX en MiB 
            ConvertToMiB "$rx0" "$rxunit"
            if [ $ret -ne 0 ]; then
               echo "Pb converting (rx0) ""$rx0"" in ""$rxunit"
            fi
            rx0="$newval"
            ConvertToMiB "$rx8" "$rxunit"
            if [ $ret -ne 0 ]; then
               echo "Pb converting (rx8) ""$rx8"" in ""$rxunit"
            fi
            rx8="$newval"
            ConvertToMiB "$rx16" "$rxunit"
            if [ $ret -ne 0 ]; then
               echo "Pb converting (rx16) ""$rx16"" in ""$rxunit"
            fi
            rx16="$newval"

            eval ymd$h0=$d0
            eval hh$h0=$h0
            eval hrx$h0=$rx0
            eval htx$h0=$tx0

            eval ymd$h8=$d8
            eval hh$h8=$h8
            eval hrx$h8=$rx8
            eval htx$h8=$tx8

            eval ymd$h16=$d16
            eval hh$h16=$h16
            eval hrx$h16=$rx16
            eval htx$h16=$tx16 
         fi
       fi
       ilig=$( echo "$ilig + 1 " | bc )
    done < "$tempfile"

    echo "$Iface""|""$ymd00""|""$hh00""|""$hrx00""|""MiB""|""$htx00""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd01""|""$hh01""|""$hrx01""|""MiB""|""$htx01""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd02""|""$hh02""|""$hrx02""|""MiB""|""$htx02""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd03""|""$hh03""|""$hrx03""|""MiB""|""$htx03""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd04""|""$hh04""|""$hrx04""|""MiB""|""$htx04""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd05""|""$hh05""|""$hrx05""|""MiB""|""$htx05""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd06""|""$hh06""|""$hrx06""|""MiB""|""$htx06""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd07""|""$hh07""|""$hrx07""|""MiB""|""$htx07""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd08""|""$hh08""|""$hrx08""|""MiB""|""$htx08""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd09""|""$hh09""|""$hrx09""|""MiB""|""$htx09""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd10""|""$hh10""|""$hrx10""|""MiB""|""$htx10""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd11""|""$hh11""|""$hrx11""|""MiB""|""$htx11""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd12""|""$hh12""|""$hrx12""|""MiB""|""$htx12""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd13""|""$hh13""|""$hrx13""|""MiB""|""$htx13""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd14""|""$hh14""|""$hrx14""|""MiB""|""$htx14""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd15""|""$hh15""|""$hrx15""|""MiB""|""$htx15""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd16""|""$hh16""|""$hrx16""|""MiB""|""$htx16""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd17""|""$hh17""|""$hrx17""|""MiB""|""$htx17""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd18""|""$hh18""|""$hrx18""|""MiB""|""$htx18""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd19""|""$hh19""|""$hrx19""|""MiB""|""$htx19""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd20""|""$hh20""|""$hrx20""|""MiB""|""$htx20""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd21""|""$hh21""|""$hrx21""|""MiB""|""$htx21""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd22""|""$hh22""|""$hrx22""|""MiB""|""$htx22""|""MiB" >> "$tempfile2"
    echo "$Iface""|""$ymd23""|""$hh23""|""$hrx23""|""MiB""|""$htx23""|""MiB" >> "$tempfile2"
fi
if [ $ret -eq 0 -a "$OutFile" != "" ]; then
   cp "$tempfile2" "$OutFile"
   ret=$?
fi
###############################################################
# REMPLIR TABLE HOUR"
GetMySqlType
if [ $ret -eq 0 ]; then
   i=0
   while IFS="|" read s1 s2 s3 s4 s5 s6 s7
   do
      sql="INSERT INTO MYIFSTAT.TBHOUR (IFACE, DAY, HOUR, RX, TX) VALUES('$s1','$s2',$s3,$s4,$s6) ON DUPLICATE KEY UPDATE RX=$s4, TX=$s6, DMAJ=CURRENT_TIMESTAMP;"
      if [ "$mysqltype" == "mysql" ]; then
         mysql --login-path=local <<< "$sql"
      else
         mysql --user="$mysqluser" --password="$mysqlpass" -e "$sql"
      fi
      r=$?
      if [ $r -ne 0 ]; then
         echo "ERR"
         echo "$sql"
      fi

      i=$( echo "$i + 1 " | bc )
   done < "$tempfile2"
   echo "$Iface"" : ""$i"" lignes mises à jour dans MYIFSTAT.TBHOUR"
fi
rm -f "$tempfile2" 
###############################################################
}


function GetStatMonthTxt()
{
local Iface="$1"
local OutFile="$2"
local ret=0
local ymd=$(date +"%Y-%m-%d")
local ymdhier=$(date -d "$dataset_date - 1 days" +%Y-%m-%d)
local monheure=$(date +"%H")
local tempfile="/tmp/statm""$Iface"".txt"
rm -f "$tempfile"
local tempfile2="/tmp/statmpipe""$Iface"".txt"
rm -f "$tempfile2"
touch "$tempfile2"

vnstat -m -i "$Iface" > "$tempfile"
if [ $ret -eq 0 ]; then
ligdeb=`cat "$tempfile" | grep -n '\-+-' -m 1 | cut -d: -f1`
ligdeb=$( echo "$ligdeb + 1" | bc )
ligfin=`cat "$tempfile" | grep -n "estimated" | cut -d: -f1`
ligfin=$( echo "$ligfin - 2 " | bc )
ilig=1
while read s
do
if [ $ilig -ge $ligdeb -a $ilig -le $ligfin ]; then
col1=`echo "$s" |cut -d'|' -f1`
col2=`echo "$s" |cut -d'|' -f2`
mm=`echo "$col1" | awk '{print $1}' ` 
mm=`sed 's/\.//' <<< "$mm" `
mm=$(echo "$mm" | tr '[:upper:]' '[:lower:]')
yy=`echo "$col1" | awk '{print $2}' | cut -d\' -f2 `
yy="20""$yy"
rxval=`echo "$col1" | awk '{print $3}' `
rxval=`sed 's/\,/\./' <<< "$rxval" `
rxunit=`echo "$col1" | awk '{print $4}' `
txval=`echo "$col2" | awk '{print $1}' `
txval=`sed 's/\,/\./' <<< "$txval" ` 
txunit=`echo "$col2" | awk '{print $2}' `

#Jour du mois
if [ "$mm" == "jan" -o "$mm" == "janv" ]; then
mm="01"
elif [ "$mm" == "feb" -o "$mm" == "fevr" ]; then
mm="02"
elif [ "$mm" == "mar" -o "$mm" == "mars" ]; then
mm="03"
elif [ "$mm" == "apr" -o "$mm" == "avr" ]; then
mm="04"
elif [ "$mm" == "may" -o "$mm" == "mai" ]; then
mm="05"
elif [ "$mm" == "jun" -o "$mm" == "juin" ]; then
mm="06"
elif [ "$mm" == "jul" -o "$mm" == "juil" ]; then
mm="07"
elif [ "$mm" == "aug" -o "$mm" == "aout" ]; then
mm="08"
elif [ "$mm" == "sep" -o "$mm" == "sept" ]; then
mm="09"
elif [ "$mm" == "oct" ]; then
mm="10"
elif [ "$mm" == "nov" ]; then
mm="11"
elif [ "$mm" == "dec" ]; then
mm="12"
fi
#echo "s=""$s"
#echo "mm=""$mm"
#echo "yy=""$yy"

#echo "txval=""$txval"
#echo "rxval=""$rxval"


#Valeur des TX en MiB 
ConvertToMiB "$txval" "$txunit"
if [ $ret -ne 0 ]; then
echo "Pb converting ""$txval"" in ""$txunit"
fi
txval="$newval"
#Valeur des RX en MiB 
ConvertToMiB "$rxval" "$rxunit"
if [ $ret -ne 0 ]; then
echo "Pb converting ""$rxval"" in ""$rxunit"
fi
rxval="$newval"

echo "txval=""$txval"
echo "rxval=""$rxval"

ssaammdd="$yy""-""$mm""-01"
dd=$(date -d "$ssaammdd -1 days + 1 months" +"%Y-%m-%d")
echo "$Iface""|""$dd""|""$rxval""|""MiB""|""$txval""|""MiB" >> "$tempfile2"

fi
ilig=$( echo "$ilig + 1 " | bc )
done < "$tempfile"
fi
if [ $ret -eq 0 -a "$OutFile" != "" ]; then
cp "$tempfile2" "$OutFile"
ret=$?
fi
###############################################################
# REMPLIR TABLE MONTH
GetMySqlType
if [ $ret -eq 0 ]; then
i=0
while IFS="|" read s1 s2 s3 s4 s5 s6
do
sql="INSERT INTO MYIFSTAT.TBMONTH (IFACE, LASTDAY, RX, TX) VALUES('$s1','$s2',$s3,$s5) ON DUPLICATE KEY UPDATE RX=$s3, TX=$s5, DMAJ=CURRENT_TIMESTAMP; "
if [ "$mysqltype" == "mysql" ]; then
mysql --login-path=local <<< "$sql"
else
mysql --user="$mysqluser" --password="$mysqlpass" -e "$sql"
fi
r=$?
if [ $r -ne 0 ]; then
echo "ERR"
echo "$sql"
fi

i=$( echo "$i + 1 " | bc )
done < "$tempfile2"
echo "$Iface"" : ""$i"" lignes mises à jour dans MYIFSTAT.TBMONTH"
fi
rm -f "$tempfile2" 
###############################################################
}

#ret=0
#IfaceCheckDeclare "enp3s0"
#echo "$ret"
#ConvertToMiB "2.1" "MiB"
#echo "$ret"" ""$newval"
#GetStatMonthTxt enp3s0 
#GetStatMonthTxt enp2s0


Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.