commit fd89a2e6b703014beb8bfe4cc629a9422520d6bf Author: Jérôme Bousquié Date: Fri Dec 14 09:01:09 2018 +0100 initial diff --git a/bandwidth.conf b/bandwidth.conf new file mode 100644 index 0000000..9fc0d3b --- /dev/null +++ b/bandwidth.conf @@ -0,0 +1,6 @@ +ip=192.168.0.100 +community=comcacti +version=2c +ifnames=(Gi1/0/22 Gi1/0/25 Gi1/0/27 Gi1/0/1 Gi1/0/2) +# refaire en JSON +# parser avec jq : https://stedolan.github.io/jq/ \ No newline at end of file diff --git a/bandwidth.sh b/bandwidth.sh new file mode 100755 index 0000000..8289eab --- /dev/null +++ b/bandwidth.sh @@ -0,0 +1,88 @@ +#!/bin/bash +# Récupération des volumes de données passées par les interfaces + +# Tableau associatif principal pour stocker uniquement les interfaces à monitorer de l'équipement : +# interfaces[nom] = index incrémental applicatif +# ex : interfaces["Gi1/0/1"] = 0 +# Cet index sert à identifier l'interface choisie dans les tableaux suivants. +# +# Un tableau indexé classique par attribut monitoré est ensuite créé : +# index dans les OID de l'interface : ifOidIndexes[index] = ifOidIndex +# description de l'interface : ifDescriptions[index] = ifDescr +# vitesse de l'interface : ifSpeeds[index] = ifSpeed +# compteur d'octets in : ifBytesIN[index] = ifBytesIN +# compteur d'octets out : ifBytesOUT[index] = ifBytesOUT + +# path de snmpwalk sur le système +snmpwalkPath=/usr/bin/snmpwalk + +# OID de base des noms d'interface +oidIfnames=iso.3.6.1.2.1.31.1.1.1.1 +# OID de base des descriptions d'interface +oidIfDescriptions=1.3.6.1.2.1.2.2.1.2 +# OID de base des vitesses d'interface +oidIfSpeeds=1.3.6.1.2.1.2.2.1.5 +# OID de base des compteurs octets IN +oidIfBytesIN=1.3.6.1.2.1.2.2.1.10 +# OID de base des compteurs octets OUT +oidIfBytesOUT=1.3.6.1.2.1.2.2.1.16 + + +# Test arguments entrés +if [[ $# -eq 0 ]]; then + echo 'Erreur de paramètre : le fichier de configuration de bandwith doit être passé' + echo 'Usage : bandwith.sh fichier_bandwith.conf' + exit 1 +fi; +# Source de la configuration et tests fichiers +if [ ! -e $1 ]; then + echo 'Erreur : fichier '$1' non trouvé.' + exit 1 +fi; +source $1; + + +# Index des interfaces de l'équipement : tableau associatif, exemple : interfaces["Gi1/0/6"] = 3 +declare -A interfaces +for i in ${!ifnames[@]}; do + interfaces[${ifnames[$i]}]=$i +done + +# Recherche des noms d'interface de l'équipement. +# Paramètres de snmpwalk +walkParams=' -v '$version' -c '$community' -Oq '$ip' ' +# Récupération des interfaces de l'équipement avec leur nom +walkIfname=$($snmpwalkPath $walkParams $oidIfnames) + +# Recherche dans tous ces noms d'interfaces, ceux demandés par le monitoring. +# Quand un nom est trouvé, on stocke son OID (index dans les OID) dans le tableau ifOidIndexes +# https://www.tldp.org/LDP/abs/html/string-manipulation.html +n=1 # compteur +oidIdx= # valeur courante oid d'interface +substringToRemove=$oidIfnames. # chaîne à retirer du résultat oidDeBase+'.' +for w in $walkIfname; do + # $walkInfame contient une suite de paires OID, nom. On ne retiendra donc que l'OID correspondant au nom, soit l'élément précédent + # on ne traite donc qu'un élément sur deux. + modulo=$(($n%2)) + if [ $modulo == 0 ] + then + # le résultat courant du walk fait-il partie des clés du tableau des interfaces à monitorer ? + # si oui, on le stocke son indexOID dans le tableau ifOidIndexes + for i in ${!interfaces[@]}; do + nom=\"$i\" + if [ $nom = $w ]; then + index=${interfaces[$i]} + ifOidIdx=${oidIdx#$substringToRemove} # retrait de la chaine OID de base+'.' pour ne conserver que l'indexOID final + + echo $ifOidIdx + # stocker cet oidIndex dans le tableau au bon index $index + fi + done + else + oidIdx=$w + fi + + n=$((n+1)) +done + +