Forum Programmation.shell besoin d'un gros coup de pouce, orientation projet

Posté par  .
Étiquettes : aucune
0
24
mai
2007
Bonjour à tous,

Voici un script qui dans un premier temps lit des adresses mac dans un fichier, puis fait deux requêtes, l'une donne le numéro de port, avec une adresse en décimal, l'autre donne l'addresse en hexadécimal.
Je voudrai l'adresse mac en hexa et le numéro de port qui va avec; dans un premier temps la réalisation du script aprés quelques testes amener toujours le même nombres de ligne dans les deux requêtes et la ligne un de la première requête était en corrélation avec la ligne un de la deuxième reqûete .
Une fois le programme réalisé et presque mis en production un soucis est survenus (chose apparemment courante), parfois il n'y pas le même nombres de lignes j'ai donc le droit à une erreur et certainement que tout est faussé.

Donc l'idée est de comparer soit comparer le debut de chaque ligne des deux fichiers est ne l'afficher que si ce sont bien les mêmes. Ou mais alors là je ne vois pas du tout et ne sais pas du tout si c'est réalisable convertir dans chaque ligne l'adresse décimal en héxa, ce qui ne fairai qu'utiliser qu'une requête est éviterai les erreurs lors de l'éxecution.

Place aux éléments concret :
les deux fichiers aprés requêtes une requête :
extrait fichier1 héxa et déci

SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.169.136.214 "00 00 48 A9 88 D6 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.171.21.223 "00 00 48 AB 15 DF "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.171.21.243 "00 00 48 AB 15 F3 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.87.1 "00 00 48 AD 57 01 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.87.67 "00 00 48 AD 57 43 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.87.74 "00 00 48 AD 57 4A "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.87.83 "00 00 48 AD 57 53 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.88.7 "00 00 48 AD 58 07 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.88.54 "00 00 48 AD 58 36 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.88.181 "00 00 48 AD 58 B5 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.88.253 "00 00 48 AD 58 FD "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.89.126 "00 00 48 AD 59 7E "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.90.3 "00 00 48 AD 5A 03 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.180.49.16 "00 00 48 B4 31 10 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.180.50.12 "00 00 48 B4 32 0C "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.180.50.41 "00 00 48 B4 32 29 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.180.50.47 "00 00 48 B4 32 2F "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.183.133.169 "00 00 48 B7 85 A9 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.183.136.10 "00 00 48 B7 88 0A "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.116.128.32.28 "00 00 74 80 20 1C "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.1.3.16.165.239 "00 01 03 10 A5 EF "



extrait fichier2 port ad déci :


SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.169.136.214 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.171.21.223 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.171.21.243 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.87.1 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.87.67 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.87.74 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.87.83 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.88.7 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.88.54 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.88.181 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.88.253 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.89.126 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.90.3 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.180.49.16 25





Le programme qui devient une usine à gaz :

#On en deduit le nombre de switch

nb_switchs=$i

#On efface les (ex) logs
if [ -f result.txt ]; then
rm result.txt
fi
rm repd.txt
rm reph.txt
rm repdcf1.txt
rm rephcf1.txt
touch repd.txt
touch reph.txt
touch result.txt

#
#

for switch in `seq 1 $nb_switchs`
do
#On recupere l'ip du switch
ip_switch=${ip[$switch]}

echo "switch $ip_switch"

#On recupere les reponses des 2 questions (changer les oids suivant votre equipements!!)
snmpwalk -c public -v 2c $ip_switch .1.3.6.1.2.1.17.4.3.1.2.0 >> repd.txt
snmpwalk -c public -v 2c $ip_switch .1.3.6.1.2.1.17.4.3.1.1 >> reph.txt
sleep 1



cut -d' ' -f1 repd.txt >> repdf1.txt
cut -d' ' -f1 reph.txt >> rephf1.txt


#On remplace l'espace entre le num de port et ce qui precede par deux espaces.
sed 's/ / /g' -i repd.txt


#cmp [ repdf1.txt -ne rephf1.txt ]; then
#echo "il y a probleme reexecution du script dans quelque instant"
#./port_mac4.sh
#else


#On lit le fichier repd.txt
#Traitement des donnees recuperation ports puis adresses mac

i=1
while read ligne
do
port[$i]=${ligne: -3}
i=`expr $i + 1`

done < repd.txt

#On lit le fichier reph.txt

i=1
while read ligne
do
mac[$i]=${ligne: -19}
mac_tmp=${mac[$i]}
mac[$i]=${mac_tmp:0:17}
i=`expr $i + 1`
done < reph.txt
nb_entrees=`expr $i - 1`


#On parcours le tableau des ports afin d'eviter le spanning tree
for i in `seq 1 $nb_entrees`
do
port_affiche[$i]=1
for j in `seq 1 $nb_entrees`
do
if [ $j -ne $i ]; then
tmp_port1=${port[$j]}
echo "port1:$tmp_port1"
tmp_port2=${port[$i]}

echo "port2:$tmp_port2"
if [ $tmp_port1 -eq $tmp_port2 ]; then
port_affiche[$i]=0
fi
fi
done
done




#On affiche les ports etant unique les reponses seront dans result.txt
for i in `seq 1 $nb_entrees`
do
affiche=${port_affiche[$i]}
if [ $affiche -eq 1 ]; then
NPort=`expr ${port[$i]} % 32`
BS=`expr ${port[$i]} / 32`
TBS=`expr $BS + 1`
echo "BS : $TBS Port : $NPort IP Port en serie : ${port[$i]} switch : $ip_switch MAC : ${mac[$i]}" >> result.
txt
fi
done
#fi
done



Les deux cut -d' ' -f1 repd.txt; vont me permettre de récupérer les deux premières parties qui m'intérresse, juste aprés je pensais faire une boucle qui puisse vérifier si sur chaqu'une des lignes les caractères corespondent et en faire dépendre l'affichage finale, ne pas utiliser les informations si elles différent ....
enfin je suis totalement perdu si quelqu'un peut éclaircir le problème ce serait vraiment génial.

Merci ...
  • # .

    Posté par  . Évalué à 2.

    Le plus simple reste de convertir ton hexa en décimal.
    Un ti script pour t'aider :)

    #!/bin/bash
    echo $((0x$1)).$((0x$2)).$((0x$3)).$((0x$4)).$((0x$5)).$((0x$6))


    et ensuite, ca te donne ca quand tu l'appelles :

    ./hex2dec 00 00 48 A9 88 D6
    0.0.72.169.136.214


    Reste plus qu'a simplifier drastiquement ton code et ne lire que le fichier 2 pour obtenir ce que tu souhaites :)
    • [^] # Re: .

      Posté par  . Évalué à 1.

      Mhh, bien

      Mais je crois qu'il faudrait plutôt l'inverse ;) un convertisseur décimal >> hexa
      Je ne souhaite pas du tout conserver l'adresse en décimal, d'ailleur une adresse mac en décimal c'est pas trés parlant, les requêtes snmp sont parfois trés étranges.
      • [^] # Re: .

        Posté par  . Évalué à 2.

        Vi ca me parait logique maintenant que tu le dis ;) Mais étant un peu fénéant, j'ai pas lu le script, juste ton message en diagonale, honte à moi ;)

        Dans ce cas la, faut voir du coté de printf :

        printf "%.2X\n" 192
        C0


        Ce qui donnerait (version qui me vient à l'esprit, y a surement plus joli)

        printf "%.2X %.2X %.2X %.2X %.2X %.2X\n" $(echo '0.0.72.169.136.214' | sed -e "s/\./ /g")
        00 00 48 A9 88 D6
        • [^] # Re: .

          Posté par  . Évalué à 1.

          Pas de problème ;)
          Merci bien je regarderai pour la version deux vue que ca m'embête de tout refaire je cherche quand même dans un premier temps à comparer ligne à ligne et à poursuivre le suite que s'il elles correspondent bien.

          En tout cas merci je ne connaissai pas du tout cette utilisation de printf ainsi que le passage hexa >> decimal ;)
  • # Utiliser les outils existants

    Posté par  . Évalué à 2.

    Salut,

    Tu peux aussi essayer d'éviter l'usine à gaz en utilisant ce qui existe déjà.
    Bon, on va supposer que le fichier MAC contient les adresses MAC et que le fichier PORT contient les ports. Tu devrais alors pouvoir avoir à peu près ce que tu veux en trois lignes :

    cut -d. -f9-12 MAC | sort >MAC.sort
    cut -d. -f9-12 PORT | sort >PORT.sort
    join MAC.sort PORT.sort

    Ça devrait te cracher, avec les exemples que tu donnes, quelque chose du genre :

    72.169.136.214 "00 00 48 A9 88 D6 " 25
    72.171.21.223 "00 00 48 AB 15 DF " 25
    72.171.21.243 "00 00 48 AB 15 F3 " 25
    72.173.87.1 "00 00 48 AD 57 01 " 25
    72.173.87.67 "00 00 48 AD 57 43 " 25
    72.173.87.74 "00 00 48 AD 57 4A " 25
    72.173.87.83 "00 00 48 AD 57 53 " 25
    72.173.88.181 "00 00 48 AD 58 B5 " 25
    72.173.88.253 "00 00 48 AD 58 FD " 25
    72.173.88.54 "00 00 48 AD 58 36 " 25
    72.173.88.7 "00 00 48 AD 58 07 " 25
    72.173.89.126 "00 00 48 AD 59 7E " 25
    72.173.90.3 "00 00 48 AD 5A 03 " 25
    72.180.49.16 "00 00 48 B4 31 10 " 25

    avec, donc, l'adresse en décimal, l'adresse en hexa et le port.

    A+
    JJD
    • [^] # Re: Utiliser les outils existants

      Posté par  . Évalué à 2.

      Tiens pendant qu'on est dans ce qui existe déjà concernant les commandes shells standard, quelqu'un aurait la main sur une tite doc répertoriant les différents outils ?
      Un truc du genre :
      selectioner un champs dans une ligne -> cut
      selectioner une ligner suivant un pattern -> grep
      ...

      Un truc généraliste, sans toutes les possibilités des commandes, mais qui permette de savoir ce qu'il est possible de faire sans avoir à rechercher sur tout internet avec une faible probabilité de trouver la bonne commande ?
      Car mon gros problème quand je fais un script, c'est que je réinvente souvent la roue, ne connaissant pas l'outil XXX (exemple, je faisait des sed au lieu de cut...)
      • [^] # Re: Utiliser les outils existants

        Posté par  . Évalué à 2.

        Il existe cette page qui rescence differentes commandes bash utiles:
        http://zero202.free.fr/cs2-elem/html/index.html

        D'ailleurs le site en lui meme est une petite mine d'information sur linux mais pas que.
        • [^] # Re: Utiliser les outils existants

          Posté par  . Évalué à 1.

          Ca a l'air d'être un trés bon site.

          Hum je m'en sort pas en voulant travailler avec des élements simple : je ne veus pas réecrire le script avec les élements ci dessus, quoi je le fairais certainement pour la version finale mais là j'aimerai continuer sur ma lancer le problème c'est que juste pour extraire et comparer si le début de chaine (fichier1) correspond bien au début de chaine fichiers 2 je fais un truc plus que lourd est qui ne fonctionne pas :


          #!/bin/sh


          i=1
          while read ligne; do

          i=`expr $i + 1`
          debutd[$i]=$ligne

          done < fich.txt

          nb_lignd=$i
          echo "$i"



          j=1
          while read ligne; do

          j=`expr $j + 1`
          debuth[$j]=$ligne

          done < ficd.txt

          nb_lignh=$j
          echo "$j"


          for lign in `seq 1 $nb_lignd`
          do
          default_affiche[$i]=1
          gg=${debutd[$lign]}

          echo "$gg"


          for lig in `seq 1 $nb_lignh`
          do

          verifh=${debuth[$lig]}
          echo "$verifh"
          if [ ${debuth[$lig]} -ne ${debutd[$lign]} ]; then
          default_affiche[$lign]=0
          else
          if [ ${debuth[$lig]} -eq ${debutd[$lign]} ]; then
          tmp_addeci=${addeci[$lign]}
          tmp_addecih=${addeci[$lig]}

          fi
          fi
          done

          for lign in `seq 1 $nb_lignd`
          do
          affiche1=${default_affiche[$i]}
          if [ $affiche -eq 1 ]; then
          echo"${tmp_addeci[$lign]}"
          fi

          done

          done


          Et même si cela fonctionné je l'imagine mal dans mon usine à gaz en début car là ce serai une usine miné.


          Donc je pense qu'une fois extrait (chaque début de ligne) dans les deux différents fichiers : je fais quelquechose du type

          cmp repdf1.txt rephf1.txt > fichierx.txt

          je pense que cela va comparer les deux fichiers et mettre la différence dans le fichierx puis j'aimerai reprendre le contenu de fichierx (chaque ligne) et les supprimer de repdf1 et rephf1, le problème c'est que je ne vois pas comment faire. ...

          :-/
          • [^] # Re: Utiliser les outils existants

            Posté par  . Évalué à 1.

            aie cmp me donne juste la ligne qui différe et quand il y en a plusieurs il en indique toujours qu'une.
            Bon piste qui est peut etre à laisser tombé.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.