#!/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