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