IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation et administration système Perl Discussion :

envoyer cmd sur switch cisco et traiter resultat


Sujet :

Programmation et administration système Perl

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Points : 12
    Points
    12
    Par défaut envoyer cmd sur switch cisco et traiter resultat
    Bonjour,

    je cherche à faire un script qui se connecte à un switch, envoie une commande, récupère le résultat et le traite afin d'en ressortir certaines infos.
    Je suis sous windows, avec perl v5.16

    Pour l'instant, mon script utilise le module Net::Telnet::Cisco, se connecte au switch, et lance la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    show interfaces | include Ethernet.*line protocol is
    Ce qui me retourne un résultat du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    FastEthernet0/1 is down, line protocol is down (notconnect)
    FastEthernet0/2 is down, line protocol is down (notconnect)
    FastEthernet0/3 is up, line protocol is up (connected)
    FastEthernet0/4 is down, line protocol is down (notconnect)
    FastEthernet0/5 is up, line protocol is up (connected)
    FastEthernet0/6 is down, line protocol is down (notconnect)
    FastEthernet0/7 is up, line protocol is up (connected)
    FastEthernet0/8 is down, line protocol is down (notconnect)
    FastEthernet0/9 is down, line protocol is down (notconnect)
    FastEthernet0/10 is down, line protocol is down (notconnect)
    FastEthernet0/11 is up, line protocol is up (connected)
    Maintenant, ce que je souhaiterai faire, c'est lire ce résultat ligne par ligne, et remonter une alerte (un simple printf avec le nom de l'interface) si quelque part il y a un état err-disabled ou une interface qui est connected mais down. Ce genre de chose.

    J'ai un peu parcouru ce topic qui semble faire exactement ce que je souhaite. Ca m'a bien aidé pour la connexion mais la méthode pour lire et traiter le résultat m'échappe complétement.

    J'espère ne pas vous avoir perdu en route, je reste à disposition pour plus d'information.

    Merci d'avance =)

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    tu récupères ce résultat dans quoi? Dans une variable?

    Si oui, tu peux splitter la variable sur début de ligne pour obtenir un tableau de lignes, puis examiner chaque ligne une à une pour voir si elle contient ce que tu recherches. Quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my @lignes = split /^/, $resultat;
    while (defined ($_ = shift @lignes)) {
         print "ERR: $_ \n" if /err-disabled/;
    }

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Et pourquoi ne pas utiliser SNMP, c'est prévu pour (d'autant plus que je suis presque sur qu'il y a un module SNMP dans perl) ?

    Se connecter à un équipement pour récupérer périodiquement le statut des interfaces me parait un peut brutal
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    @Lolo78 : Merci, je vais éssayer ta méthode. Je débute en Perl donc ca va me prendre un certain temps avoir d'avoir le résultat attendu je pense ^^

    @ram-0000 : En faite j'avais aussi pensé à utiliser SNMP et un logiciel comme Nagios pour la supervision des switchs mais à la fin des tests je dois obtenir un petit compte rendu clair de l'état du réseau que même quelqu'un qui n'est pas informaticien doit comprendre. Donc je voulais commencer par faire un script perl pour récupérer les infos et les "mettre en page" à ma convenance.
    Mon responsable craint que Nagios soit un peu comme Ciscoworks LMS, c'est à dire trop "uzine à gaz" dans lequel on ne voit pas forcément l'éssentiel.

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Bonjour,

    tu récupères ce résultat dans quoi? Dans une variable?

    Si oui, tu peux splitter la variable sur début de ligne pour obtenir un tableau de lignes, puis examiner chaque ligne une à une pour voir si elle contient ce que tu recherches. Quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my @lignes = split /^/, $resultat;
    while (defined ($_ = shift @lignes)) {
         print "ERR: $_ \n" if /err-disabled/;
    }
    Le handle de fichier plaqué sur une variable au lieu d'un vrai fichier et aussi une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    open my $RESULTAT, "<", \$resultat;
    while (<$RESULTAT>) {
       # ...
    }
    Le handle se comporte comme si on lisait dans un vrai fichier, et $/ est le séparateur de ligne. Ca marque aussi en écriture. ;)
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Bon j'ai un peu de mal à obtenir ce que je souhaite. En faite je ne comprend pas vraiment vos morceaux de code.


    Pour être plus précis, mon script envoi cette commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @output = $session->cmd('show interfaces | include Ethernet.*line protocol is');
    La commande :

    m'affiche ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    FastEthernet0/1 is down, line protocol is down (notconnect)
    FastEthernet0/2 is down, line protocol is down (notconnect)
    FastEthernet0/3 is up, line protocol is up (connected)
    FastEthernet0/4 is down, line protocol is down (notconnect)
    FastEthernet0/5 is up, line protocol is up (connected)
    FastEthernet0/6 is down, line protocol is down (notconnect)
    FastEthernet0/7 is up, line protocol is up (connected)
    FastEthernet0/8 is down, line protocol is down (notconnect)
    FastEthernet0/9 is down, line protocol is down (notconnect)
    FastEthernet0/10 is down, line protocol is down (notconnect)
    FastEthernet0/11 is up, line protocol is up (connected)
    Ensuite il faudrait que je récupère (par exemple) "FastEthernet0/9" si quelque part sur la ligne qui traite de cette information, se trouve le mot err-disabled.

    Je pense que vous aviez compris mais c'est moi qui ne comprend pas vos codes xD.

    j'ai testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my @lignes = split(/^/, @output); 
    while (defined ($_ = shift @lignes)) {
         print "ERR: $_ \n" if /connected/;
    }
    avec comme vous le voyez une recherche sur /connected/ pour être sur de ressortir au moins un résultat, mais rien ne s'affiche lorsque j'éxécute ce code.

    La première étape je pense, est de découper mon @output en ligne, de rechercher avec une expression régulière le mot err-disabled, puis de retourner dans une variable le nom de l'interface.

    En faite, j'aimerai savoir comment passé une expression régulière sur mon @output. je crois que c'est plus prudent de commencer petit quand on ne connait pas trop.

    Merci pour votre patience en tout cas ^^

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 158
    Points : 88
    Points
    88
    Par défaut
    bonjour cureuil57 . Je suis entrain d'écrire un script qui devra faire la même chose que le tien, mais il me retourne le resultat 1 aulieu de me retourner la liste des voisins .

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    !/usr/bin/perl
    use Net::Telnet;
    $telnet = new Net::Telnet ( Timeout=>10,Errmode=>'die');
    $telnet->open('10.10.10.10');
    $telnet->waitfor('/Username: $/i');
    $telnet->print('user');
    $telnet->waitfor('/password: $/i');
    $telnet->print('MDP');
    #$telnet->waitfor('/router1#/i');
    $telnet->waitfor('/#$/i');
    $telnet->print('show cdp neighbors');
    $output = $telnet->waitfor('/#$/i');
    print $output;
    Peut tu m'aider à résoudre cela stp ?

    NB: J'ai posté la même question sur un nouveau sujet si tu prefére me répondre laba

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par cureuil57 Voir le message
    Ensuite il faudrait que je récupère (par exemple) "FastEthernet0/9" si quelque part sur la ligne qui traite de cette information, se trouve le mot err-disabled.
    Je pense que si tu remplaces ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my @lignes = split(/^/, @output); 
    while (defined ($_ = shift @lignes)) {
         print "ERR: $_ \n" if /connected/;
    }
    par cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach (@output) {
         print "ERR: $_ \n" if /err-disabled/;
    }
    C'est à dire que tu affiches chaque ligne qui contient "err-disabled".
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  9. #9
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Le split était utile si tu récupérais le résultat dans une variable scalaire, pour transformer celle-ci en tableau. Là tu récupères directement dans le tableau @output, le split n'est plus utile; il suffit de vérifier chaque élément du tableau comme Philou te l'as montré avec la construction utilisant le foreach.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Merci à vous !! cela fonctionne presque parfaitement.

    Mon code ressemble à ça maintenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    my @result;
    my $nb_err=0;
    foreach (@output) {
        if (/connected/){ #ici je met connected pour avoir un résultat par ce que je n'ai pas de err-disabled
    		@result[$nb_err] = $_;
    		$nb_err++;
    	}
    }
    if ($nb_err!=0){
    	print "Liste des interfaces err-disabled :\n";
    	print @result;
    }
    else {
    	print "aucune interface err_disabled détectée"
    }
    et donne comme résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Scalar value @result[$nb_err] better written as $result[$nb_err] at HOME\Bureau\super.pl line 47.
    Liste des interfaces err-disabled :
    FastEthernet0/3 is up, line protocol is up (connected)
    FastEthernet0/5 is up, line protocol is up (connected)
    FastEthernet0/6 is up, line protocol is up (connected)
    FastEthernet0/7 is up, line protocol is up (connected)
    FastEthernet0/11 is up, line protocol is up (connected)
    FastEthernet0/48 is up, line protocol is up (connected)
    GigabitEthernet0/1 is up, line protocol is up (connected)
    Cela s’exécute mais j'ai un warning pas très beau. Une idée pour le faire partir ? ensuite, histoire d'être un peu difficile mais ça me sera très utile pour la suite, j'aimerai récupérer seulement "/FastEthernet.\/../" plutôt que la ligne entière "FastEthernet.\/.. is up, line protocol is up (connected)".

    Encore merci à vous =) vous m'avez déjà bien aidé

  11. #11
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Pour encore mieux écrire cette partie de code, voici comment faire :
    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my $nb_err=0;
    foreach (@output) {
        if (/connected/){ #ici je met connected pour avoir un résultat par ce que je n'ai pas de err-disabled
    		@result[$nb_err] = $_;
    		$nb_err++;
    	}
    }
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach (@output) {
        if (/connected/){ #ici je met connected pour avoir un résultat par ce que je n'ai pas de err-disabled
    		push @result, $_;
    	}
    }
    L'utilisation de @tableau[$indice] est syntaxiquement correcte, mais sémantiquement incorrecte, car le sigil @ fait référence à une valeur tableau, alors que tableau[$indice] est un scalaire, c'est tableau qui est un tableau.
    En toute rigueur, il faut donc écrire $tableau[$indice].
    Par contre, si l'on veut récupérer une liste de deux éléments quelconque du tableau (par exemple, le premier et le dernier), il faut bien utilise le sigil @, car dans ce cas, les valeurs retournées sont multiples : @tableau[0,-1].
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  12. #12
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Pour ne récupérer que le premier élément d'une ligne (chaque élément étant séparer par un espace), voici deux méthodes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $ligne = "FastEthernet0/3 is up, line protocol is up (connected)";
    my $element;
    ($element) = split /\s+/, $ligne;
    ($element) = $ligne =~ /(.*?)\s+/;
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  13. #13
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Effectivement, le warning ne s'affiche plus à l'exécution, merci pour l'info =)

    Et voila le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    my @result;
    my $nb_err=0;
    my $interface;
    foreach (@output) {
        if (/connected/){
    		($interface) = split /\s+/;
    		push @result, "$interface\n";
    		$nb_err++;
    	}
    }
    if ($nb_err!=0){
    	print "Liste des interfaces err-disabled :\n";
    	print @result;
    }
    else {
    	print "aucune interface err_disabled détectée"
    }
    pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Liste des interfaces err-disabled :
    FastEthernet0/3
    FastEthernet0/5
    FastEthernet0/6
    FastEthernet0/7
    FastEthernet0/11
    GigabitEthernet0/1
    Merci beaucoup !! =) problème résolu =)

  14. #14
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    As-tu essayé l'une des méthodes du message #12 ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  15. #15
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Oui,j'ai édité mon précédent post je n'avais pas vu qu'il y avait eu une réponse après.

    Merci beaucoup =)

  16. #16
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Tu peux aussi supprimer totalement l'usage de la variable $nb_err (déclaration et incrémentation), et remplacer le test
    par
    Évaluer un tableau dans un contexte de scalaire (ici, comme un booléen) retourne la taille du tableau, qui pris comme un booléen, retourne VRAI s'il n'est pas vide.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  17. #17
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Tu peux aussi supprimer totalement l'usage de la variable $nb_err (déclaration et incrémentation), et remplacer le test
    par
    Évaluer un tableau dans un contexte de scalaire (ici, comme un booléen) retourne la taille du tableau, qui pris comme un booléen, retourne VRAI s'il n'est pas vide.
    Effectivement. C'est modifié .

  18. #18
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Un jour j'arriverai peut-être à maitriser les expressions régulières en Perl mais pour le moment j'ai un peu de mal.
    Du coup quelqu'un saurait comment afficher seulement les lignes ou il y a au moins 1 input error ou 1 CRC (peu importe le nombre de overrun et ignored, histoire que ce soit plus drôle) ?

    donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
         0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
         0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
         1 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
         0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
         0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
         0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
         0 input errors, 1 CRC, 0 frame, 0 overrun, 0 ignored
         0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
         0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored

  19. #19
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Peut-être comme ceci, avec une expression régulière un peu spécifique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print foreach grep /(^|\s)[1-9]\d* input error.*?\s+[1-9]\d* CRC/, @int_err
    Pour être plus générique, je ferai une analyse de chaque ligne afin de stoker les informations dans un tableau de hash, et je filtrerai ensuite ce tableau.
    Un peu comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    my @err;
    foreach my $int_err (@int_err) {
      push @err, {};
      foreach my $err (split /\s*,\s*/, $int_err) {
        my ($nb_err, $err_type) = $err =~ /(\d+)\s+(.*)/;
        $err[-1]->{$err_type} = $nb_err;
      }
    }
     
    foreach my $err (grep $_->{"input errors"} || $_->{"CRC"}, @err) {
      print join ", ", map "$err->{$_} $_", keys %$err;
      print "\n";
    }
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  20. #20
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Oula j'ai un peu du mal à suivre ta deuxième méthode. Je vais déjà essayer de faire fonctionner la première pour avoir un résultat acceptable et par la suite j’essaierai d'améliorer en me basant sur ta méthode générique.

    Donc pour remettre dans le contexte plus précisement :

    j'ai un tableau d'interface tel que @all_interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FastEthernet0/1
    FastEthernet0/2
    FastEthernet0/3
    FastEthernet0/4
    FastEthernet0/5
    sur chaque interface je passe la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my @int_CRC;
    foreach (@all_interfaces){
    	@int_CRC = $session->cmd("sh int $_ \| inc CRC");
            #print $_;
    	#print @int_CRC;
    }
    print $_ et print @int_CRC donnent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FastEthernet0/1 0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
    FastEthernet0/2 0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
    FastEthernet0/3 0 input errors, 1 CRC, 0 frame, 0 overrun, 0 ignored
    FastEthernet0/4 0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
    FastEthernet0/5 0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
    C'est bourrin par ce que ça envoie masse commandes au switch au lieu d'une seule (show interfaces | include CRC) mais c'est le seul moyen que j'ai trouvé pour avoir le nom de l'interface + le récap des erreurs.

    Du coup je pensais faire quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my @int_CRC;
    foreach (@all_interfaces){
    	@int_CRC = $session->cmd("sh int $_ \| inc CRC");
    	if (grep /[1-9]\d* input error.*?\s+[1-9]\d* CRC/, @int_CRC){
    		print "$_\n"
    	}
    }
    Pour afficher seulement le nom de l'interface ou on détecte au moins une input error ou un CRC.

    Mais ça ne fonctionne pas et je ne comprend pas pourquoi. Le script ne me renvoie aucune interface, même quand je teste avec [0-9] input ou CRC.
    J'ai essayé de bidouillé l'expression régulière avec le peu que je connais mais je n'obtiens rien =/

    :aie:

    EDIT

    Finalement,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my @int_CRC;
    foreach (@all_interfaces){
    	@int_CRC = $session->cmd("sh int $_ \| inc CRC");
    	if (grep /[1-9]+ input error.*[1-9]+ CRC/, @int_CRC){
    		print "$_\n"
    	}
    }
    semble fonctionner comme je le souhaite.
    Je rappel que je dois grep s'il y a une input erreur ou plus (pareil pour le CRC).
    Si vous voyez un problème dans mon expression régulière ou si vous pensez qu'elle ne traite pas correctement le problème je suis ouvert à toute critique je suis pas très bon en regex.

    Merci =)

Discussions similaires

  1. Problème connexion en ssh sur Switch CISCO
    Par Maykin dans le forum Modules
    Réponses: 2
    Dernier message: 18/04/2011, 12h00
  2. Telnet sur des switchs Cisco
    Par developpeur99 dans le forum Langage
    Réponses: 1
    Dernier message: 14/10/2010, 21h35
  3. Perte du lien réseau sur le port d'une switch Cisco
    Par annedeblois dans le forum Hardware
    Réponses: 5
    Dernier message: 30/07/2010, 18h11
  4. Spanning Tree sur switch cisco catalyst 3525 : pvst et IEEE
    Par klkklk dans le forum Développement
    Réponses: 0
    Dernier message: 06/10/2008, 14h13
  5. Réponses: 3
    Dernier message: 05/03/2007, 15h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo