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

Langage Perl Discussion :

Problème lecture fichier en redirection avec foreach


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut Problème lecture fichier en redirection avec foreach
    Bonjour,

    je vais vous expliquer brièvement ce que je cherche a faire:
    j'ai un dump des noeuds contenu dans une application, a chaque lancement du script, je voudrais qu'il vérifie si les noeuds qui étaient présent dans l'ancien dump le sont toujours ou si ils ont été supprimés. Mon problème vient du fait que mon fichier est en redirection (>>), ce qui pose grandement problème a ma boucle foreach apparemment.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    open (DUMP,">>/tmp/dump");
    foreach $node (<DUMP>) {
    print "$node";
    }
    Ce code ne m'affiche rien, or si je remplace par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open (DUMP,"/tmp/dump");
    La aucun problème j'ai bien le contenu du tableau qui est affiché. Mon problème est que ce fichier DUMP est rempli a chaque itération du script avec une nouvelle entrée.

    Je vous met l'intégralité de mon script au cas ou vous me trouviez une solution détournée
    PS: en rouge les lignes dont il est question plus haut.

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    #!/bin/perl
    
    ## Script argument waited:
    ## 1st argument: IP of NNM Server
    ## 2nd argument: Site name (ex C2x or C4)
    
    
    $NNM_IP=$ARGV[0];
    $site=$ARGV[1];
    
    open (LOG,">>/tmp/NNMImport.log");
    print LOG "$date";
    
    open (DUMP,">>/tmp/dump");
    
    # get NNM nodes
    @file=`opcdeploy -cmd "D:\\HP\\NNM\\nonOV\\perl\\a\\bin\\perl D:\\HP\\NNM\\bin\\nnmtopodump.ovpl -type node" -node $NNM_IP`;
    #get OM nodes
    @file2=`opcnode -list_nodes | grep Name | awk '{print\$3}'`;
    
    
    #define table for existing OM node
    foreach $node (@file2) {
    	$node_exist[$node]->{_exist}=1;
    }
    
    
    # parse NNM node results and insert nodes 
    foreach $line (@file){
    
    	if ($line =~ /<name>(.*)</) {
    	$node_name=$1;
    	print DUMP "$node_name\n";
    	}
    
    	if ($line =~ /<shortname>(.*)</) {
    	$node_label=$1;
    	}
    
    	if ($line =~ /<deviceCategory>(.*)</) {
    	$node_type=$1;
    		if ($node_type eq "Other"){
    			if (($systobjectID eq ".1.3.6.1.4.1.236.30.2.2")||($systobjectID eq "PELCO")){
    			$layout_group="$site Camera";
    			$node_group="$site Camera";
    			} 
    			else {
    			$layout_group="$site Other";
    			$node_group="$site Other";
    			}
    		}
    			
    		if ($node_type eq "Switch"){
    		$layout_group="$site Switch";
    		$node_group="$site Switch";
    		}
    
    		if ($node_type eq "Server"){
    		$layout_group="$site Server";
    		$node_group="$site Server";
    		}
    
    		if (($node_type eq "Computer")||($node_type eq "Workstation")){
    		$layout_group="$site Workstation";
    		$node_group="$site Workstation";
    		}
    
    		if ($node_type eq "Printer"){
    		$layout_group="$site Printer";
    		$node_group="$site Printer";
    		}
    	}
    
    	if ($line =~ /<systemObjectId>(.*)</) {
    	$systobjectID=$1;
    	}
    
    	
    	if ($line =~ /<\/node>/) {
    	# a new node iteration has been covered place it in OM node node bank
    	&insert_or_move_node();			
    	}
    }
    
    # now control if nodes have been suppresed from NNM and delete them from OM
    #to be implemented
    
    # Add node function
    sub add_node {
    print "\tadd node $node_name\n";
    	`opcnode -add_node node_name=$node_name node_label=$node_label net_type=NETWORK_IP mach_type=MACH_BBC_OTHER_IP group_name='$node_group' layout_group='$layout_group'`;
    	}
    
    	
    # Move node function
    sub move_node {
    	print "\tmove node $node_name\n";
    	`opcnode -move_nodes node_list='$node_name' layout_group='$layout_group'`;
    	`opcnode -deassign_nodes node_name='$node_name' group_name='$site Other' net_type=NETWORK_IP `;
    	`opcnode -assign_nodes node_name='$node_name' group_name='$node_group' net_type=NETWORK_IP `;
    }
    
    
    # Delete nodes
    sub delete_node {
    	foreach $node (<DUMP>) {
    print "$node";
    		$node_to_supress = print (grep {/'$node'/} @file);
    		if ($node_to_supress eq "") {
    			`opcnode -del_node node_name=$node net_type=NETWORK_IP`;
    		}
    	}
    }
    
    
    # insert or move node function
    #if node already exist move it in appropriate node group
    #else add it in OM nodebank
    sub insert_or_move_node {
    	print "insert or move node : $node_name\n";
    		if ($node_exist[$node]->{_exist}) {
    			&move_node ();
    		}
    		else {
    			&add_node ();
    		}
    	&delete_node ();
    }
    J'espère avoir bien expliqué mon problème, je vous remercie par avance de toute l'aide que vous pourrez m'apporter

  2. #2
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 184
    Points : 322
    Points
    322
    Par défaut
    Tu ouvres ton fichiers en écriture seule avec ajout (">>"). Tu ne peux donc pas le lire.

    Essaie en l'ouvrant en lecture/écriture avec ajout ("+<").

  3. #3
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    Hummm ok, en effet ca fonctionne bien en effet
    Bon après j'ai vraiment fait ma nouille, parce que j'ai trouvé une autre solution peu de temps avant en faisant un close puis open en lecture juste avant l'appel de ma fonction delete.

    Malheureusement, le comportement n'est pas exactement celui attendu, mais la le problème vient plutôt du fait du grep j'en ai peur.
    Pour une raison que j'ignore, il me rajoute systématiquement un 1 ou un 0 devant mon hostname, ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $node_to_supress = print (grep {/'$node'/} @file);
    print "$node_to_supress";
    me renvoie le résultat:
    110.X.X.X au lieu de 10.X.X.X.

    J'ai l'impression qu'il m'ajoute le code retour de la fonction au passage...

  4. #4
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 184
    Points : 322
    Points
    322
    Par défaut
    Pourquoi print ?

  5. #5
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    Hello,

    oui non pas de raison, c'est un reliquat de plusieurs tests que j'ai fait auparavant. toujours est il que ce code me renvoie la valeur 0 pour la variable $node_to_supress et que je n'arrive pas bien a comprendre pourquoi, car parfois elle prend la valeur 1, j'arrive pas bien a voir la logique dans tout ca, mais bon je vais continuer a investiguer

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Peux tu nous remettre ton dernier code complet à ce jour.
    Sinon en regardant rapidement ton premier post, voici déjà des corrections impératives.
    1. Met toujours en début de script ceci
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      use strict;
      use warnings;
    2. Pense à bien déclarer tes variables
    3. Essaye d'indenter correctement ton code
    4. Voici un peu de lecture.

  7. #7
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 184
    Points : 322
    Points
    322
    Par défaut
    Je pencherai pour le fait que grep retourne une liste.
    Puisque $node_to_suppress est un scalaire, il prend la taille du tableau retourné par grep (utilisation d'une liste dans un contexte scalaire).

  8. #8
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    Merci Djibril pour ces conseils avisés

    Donc j'ai suivi tes indications, j'ai réindenté mon code, déclaré mes variables, et voici la dernière version de mon script:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    #!/bin/perl
     
    ## Script argument waited:
    ## 1st argument: IP of NNM Server
    ## 2nd argument: Site name (ex C2x or C4)
     
    use strict;
    use warnings;
     
    # variables
    my $node_to_supress;
    my $node;
    my $node_name;
    my $node_label;
    my $node_type;
    my $systobjectID;
    my $node_group;
     
    # script argument
    $NNM_IP=$ARGV[0];
    $site=$ARGV[1];
     
    # logfile
    open (LOG,">>/tmp/NNMImport.log");
    print LOG "$date";
     
    # dump file of NNM nodes
    open (DUMP,">>/tmp/dump");
     
    # get NNM nodes
    @file=`opcdeploy -cmd "D:\\HP\\NNM\\nonOV\\perl\\a\\bin\\perl D:\\HP\\NNM\\bin\\nnmtopodump.ovpl -type node" -node $NNM_IP`;
    #get OM nodes
    @file2=`opcnode -list_nodes | grep Name | awk '{print\$3}'`;
     
     
    #define table for existing OM node
    foreach $node (@file2) {
    	$node_exist[$node]->{_exist}=1;
    }
     
     
    # parse NNM node results and insert nodes 
    foreach $line (@file){
     
    	if ($line =~ /<name>(.*)</) {
    		$node_name=$1;
    		print DUMP "$node_name\n";
    	}
     
    	if ($line =~ /<shortname>(.*)</) {
    		$node_label=$1;
    	}
     
    	if ($line =~ /<deviceCategory>(.*)</) {
    		$node_type=$1;
    			if ($node_type eq "Other"){
    				if (($systobjectID eq ".1.3.6.1.4.1.236.30.2.2")||($systobjectID eq "PELCO")){
    					$layout_group="$site Camera";
    					$node_group="$site Camera";
    				} 
    				else {
    					$layout_group="$site Other";
    					$node_group="$site Other";
    				}
    			}
     
    			if ($node_type eq "Switch"){
    				$layout_group="$site Switch";
    				$node_group="$site Switch";
    			}
     
    			if ($node_type eq "Server"){
    				$layout_group="$site Server";
    				$node_group="$site Server";
    			}
     
    			if (($node_type eq "Computer")||($node_type eq "Workstation")){
    				$layout_group="$site Workstation";
    				$node_group="$site Workstation";
    			}
     
    			if ($node_type eq "Printer"){
    				$layout_group="$site Printer";
    				$node_group="$site Printer";
    			}
    	}
     
    	if ($line =~ /<systemObjectId>(.*)</) {
    		$systobjectID=$1;
    	}
     
    # a new node iteration has been covered place it in OM node node bank	
    	if ($line =~ /<\/node>/) {
    		&insert_or_move_node();			
    	}
    }
     
    # now control if nodes have been suppresed from NNM and delete them from OM
    #to be implemented
     
    # Add node function
    sub add_node {
    	print "\tadd node $node_name\n";
    	`opcnode -add_node node_name=$node_name node_label=$node_label net_type=NETWORK_IP mach_type=MACH_BBC_OTHER_IP group_name='$node_group' layout_group='$layout_group'`;
    }
     
     
    # Move node function
    sub move_node {
    	print "\tmove node $node_name\n";
    	`opcnode -move_nodes node_list='$node_name' layout_group='$layout_group'`;
    	`opcnode -deassign_nodes node_name='$node_name' group_name='$site Other' net_type=NETWORK_IP `;
    	`opcnode -assign_nodes node_name='$node_name' group_name='$node_group' net_type=NETWORK_IP `;
    }
     
     
    # Delete nodes
    sub delete_node {
    	foreach $node (<DUMP>) {
    		$node_to_supress = (grep {/'$node'/} @file);
    			if ($node_to_supress eq "") {
    				`opcnode -del_node node_name=$node net_type=NETWORK_IP`;
    			}
    	}
    }
     
     
    # insert or move node function
    #if node already exist move it in appropriate node group
    #else add it in OM nodebank
    sub insert_or_move_node {
    	print "insert or move node : $node_name\n";
    		if ($node_exist[$node]->{_exist}) {
    			&move_node ();
    		}
    		else {
    			&add_node ();
    		}
    	close DUMP;
    	open (DUMP,"/tmp/dump");
    	&delete_node ();
    }
    Accessoirement je vous met un exemple une petite partie du fichier de dump (le contenu du @file):

    Code xml : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <?xml version="1.0" encoding="windows-1252"?>
    <topo>
        <node>
            <id>38654708295</id>
            <uuid>bb6fe8f8-2027-4ec8-9e1d-a925b0c7b835</uuid>
            <shortname>10.x.x.x</shortname>
            <name>10.x.x.x</name>
            <description>Cisco IOS Software, C3750 Software (C3750-IPSERVICESK9-M), Version 12.2(53)SE2, RELEASE SOFTWARE (fc3)Technical Support: http://www.cisco.com/techsupportCopyright (c) 1986-2010 by Cisco Systems, Inc.Compiled Wed 21-Apr-10 04:49 by prod_rel_team</description>
            <status>NORMAL</status>
            <managementMode>MANAGED</managementMode>
            <contact/>
            <location/>
            <nodesnmpsysname>SW-1-CORE-R2.IVVQ.TSS</nodesnmpsysname>
            <nodesnmpaddress>10.x.x.x</nodesnmpaddress>
            <systemObjectId>.1.3.6.1.4.1.9.1.516</systemObjectId>
            <notes/>
            <nodecreatetime>2010-11-16T09:25:08.888Z</nodecreatetime>
            <nodemodifiedtime>2010-12-21T14:09:50.233Z</nodemodifiedtime>
            <nodelaststatuschange>2010-11-16T16:08:20.381Z</nodelaststatuschange>
            <protocolversion/>
            <snmpAgent/>
            <node_group/>
            <deviceDescription>A stack of any catalyst37xx stack-able ethernet switches with unified identity (as a single unified switch), control and management.</deviceDescription>
            <deviceCategory>Switch</deviceCategory>
            <deviceFamily>Cisco Catalyst 3750 Series Switches</deviceFamily>
            <deviceVendor>Cisco</deviceVendor>
            <capabilities>
                <capability>com.hp.nnm.capability.card.cisco.stack</capability>
                <capability>com.hp.ov.nnm.capability.metric.cisco.env.fan</capability>
                <capability>com.hp.nnm.capability.metric.cpm2</capability>
                <capability>com.hp.nnm.capability.metric.ocb</capability>
                <capability>com.hp.nnm.capability.node.ipforwarding</capability>
                <capability>com.hp.nnm.capability.node.lanswitching</capability>
                <capability>com.hp.nnm.capability.metric.cenv</capability>
                <capability>com.hp.nnm.capability.metric.cmp</capability>
                <capability>com.hp.ov.nnm.capability.metric.cisco.env.power</capability>
            </capabilities>
            <extendedAttributes>
                <attribute>
                    <name>ODB_ID</name>
                    <value>8b5d9ee8c4a47a0126756a34851ea05f</value>
                </attribute>
            </extendedAttributes>
        </node>

    Pour rappel, mon problème vient de la fonction delete_node, tous les jours est effectué un dump des noeuds contenu dans NNM (résultat envoyé dans @file)
    et doivent être intégré, déplacé ou supprimé dans OML, dont les noeuds sont eux stockés dans @file2. Mon script n'est donc pas encore opérationnel, puisque je devrais également garder une trace du fichier DUMP, pour la prochaine exécution du script et comparé si des noeuds ont été supprimés de NNM entre 2 dump (Je ne peux pas faire le delta entre le @file et @file2, car il n'y a pas que des noeuds de NNM intégrés dans OML). Je ne sais pas si c'est super claire, mais bon au pis j'apporterais des précisions si vous avez des questions précises

    D'avance merci pour votre aide a tous.

  9. #9
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par Dimitry.e Voir le message
    Je pencherai pour le fait que grep retourne une liste.
    Puisque $node_to_suppress est un scalaire, il prend la taille du tableau retourné par grep (utilisation d'une liste dans un contexte scalaire).
    J'ai envisagé cette possibilité, j'ai donc testé en remplacant le $node_to_supress par un tableau @node_to_supress, mais cela n'améliore pas le comportement de mon script.

  10. #10
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    PS: je suis pas psyco rigide sur l'algo, si vous avez une solution qui m'affranchisse du grep je n'ai rien contre, c'est juste que je suis plus habitué a dev en shell où le grep est une fonction magique

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bon, alors, rien qu'à voir ton fichier dump, je te conseil de tout reprendre .
    Du moment où le but est de lire un fichier XML, il faut utiliser un parseur XML, et pour ce faire, je te conseil le module XML::Twig. D'ailleurs, voici un article sur perl et xml.

    Explique ce que tu souhaites récupérer dans le XML et on pourra t'aider rapidement.

  12. #12
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    Hummm ok je vais regarder le module voir comment il fonctionne exactement.

    Ce que je cherche a faire:

    je dois vérifier si les hostnames contenus dans DUMP sont présent dans @file (balise <name>10.x.x.x</name>) ou pas, si il est présent alors le système ne fait rien, si l'entrée n'est pas présente alors il lance la commande "opcnode -del_node"

  13. #13
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Si ce n'est pas confidentiel, on peut avoir le dump en entier, ou un exemple de dump pas tronqué, car tel quel, ton XML n'est pas valide.

    Sinon, tu souhaites récupérer toutes les IP des balises name c'est ça. Et @file ressemble à quoi ?

  14. #14
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Euh, en regardant un peu de plus près je sais, je suis pointilleux, je m'aperçois que ton fichier XML ressemble à du SNMP. Il existe également pas mal de modules sur le CPAN sur ce sujet, notamment Net::SNMP. Il pourrait surement faire ton bonheur.

  15. #15
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    Oui autant pour moi j'ai pas remis la balise finale, je te donne une partie du dump (trop long pour être mis en entier) (attention le terme je m'en rend compte est mal choisi car il porte confusion avec le fichier du même nom, en fait la il s'agit du @file):

    Code xml : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    <?xml version="1.0" encoding="windows-1252"?>
    <topo>
        <node>
            <id>38654708295</id>
            <uuid>bb6fe8f8-2027-4ec8-9e1d-a925b0c7b835</uuid>
            <shortname>10.0.32.126</shortname>
            <name>10.0.32.126</name>
            <description>Cisco IOS Software, C3750 Software (C3750-IPSERVICESK9-M), Version 12.2(53)SE2, RELEASE SOFTWARE (fc3)Technical Support: http://www.cisco.com/techsupportCopyright (c) 1986-2010 by Cisco Systems, Inc.Compiled Wed 21-Apr-10 04:49 by prod_rel_team</description>
            <status>NORMAL</status>
            <managementMode>MANAGED</managementMode>
            <contact/>
            <location/>
            <nodesnmpsysname>SW-1-CORE-R2.IVVQ.TSS</nodesnmpsysname>
            <nodesnmpaddress>10.0.32.126</nodesnmpaddress>
            <systemObjectId>.1.3.6.1.4.1.9.1.516</systemObjectId>
            <notes/>
            <nodecreatetime>2010-11-16T09:25:08.888Z</nodecreatetime>
            <nodemodifiedtime>2010-12-21T14:09:50.233Z</nodemodifiedtime>
            <nodelaststatuschange>2010-11-16T16:08:20.381Z</nodelaststatuschange>
            <protocolversion/>
            <snmpAgent/>
            <node_group/>
            <deviceDescription>A stack of any catalyst37xx stack-able ethernet switches with unified identity (as a single unified switch), control and management.</deviceDescription>
            <deviceCategory>Switch</deviceCategory>
            <deviceFamily>Cisco Catalyst 3750 Series Switches</deviceFamily>
            <deviceVendor>Cisco</deviceVendor>
            <capabilities>
                <capability>com.hp.nnm.capability.card.cisco.stack</capability>
                <capability>com.hp.ov.nnm.capability.metric.cisco.env.fan</capability>
                <capability>com.hp.nnm.capability.metric.cpm2</capability>
                <capability>com.hp.nnm.capability.metric.ocb</capability>
                <capability>com.hp.nnm.capability.node.ipforwarding</capability>
                <capability>com.hp.nnm.capability.node.lanswitching</capability>
                <capability>com.hp.nnm.capability.metric.cenv</capability>
                <capability>com.hp.nnm.capability.metric.cmp</capability>
                <capability>com.hp.ov.nnm.capability.metric.cisco.env.power</capability>
            </capabilities>
            <extendedAttributes>
                <attribute>
                    <name>ODB_ID</name>
                    <value>8b5d9ee8c4a47a0126756a34851ea05f</value>
                </attribute>
            </extendedAttributes>
        </node>
        <node>
            <id>38654714232</id>
            <uuid>ce421d04-85a8-417e-8bce-25c294f5c3d4</uuid>
            <shortname>mex-03-c4-sm-2.ivvq.tss</shortname>
            <name>mex-03-c4-sm-2.ivvq.tss</name>
            <description>Hardware: Intel64 Family 6 Model 26 Stepping 5 AT/AT COMPATIBLE - Software: Windows Version 6.0 (Build 6002 Multiprocessor Free)</description>
            <status>NORMAL</status>
            <managementMode>MANAGED</managementMode>
            <contact/>
            <location/>
            <nodesnmpsysname>MEX-03-C4-SM-2</nodesnmpsysname>
            <nodesnmpaddress>10.0.36.15</nodesnmpaddress>
            <systemObjectId>.1.3.6.1.4.1.311.1.1.3.1.2</systemObjectId>
            <notes/>
            <nodecreatetime>2010-11-16T09:28:27.800Z</nodecreatetime>
            <nodemodifiedtime>2010-12-22T12:09:22.598Z</nodemodifiedtime>
            <nodelaststatuschange>2010-11-24T12:39:17.198Z</nodelaststatuschange>
            <protocolversion/>
            <snmpAgent/>
            <node_group/>
            <deviceDescription>Microsoft Windows NT Server</deviceDescription>
            <deviceCategory>Server</deviceCategory>
            <deviceFamily>Microsoft Windows NT Servers</deviceFamily>
            <deviceVendor>Microsoft</deviceVendor>
            <capabilities>
                <capability>com.hp.nnm.capability.metric.hr</capability>
                <capability>com.hp.nnm.capability.node.VM</capability>
            </capabilities>
            <extendedAttributes>
                <attribute>
                    <name>ODB_ID</name>
                    <value>6e38112c1a6452b37c50c37169dde5a0</value>
                </attribute>
            </extendedAttributes>
        </node>
    </topo>


    Mon fichier DUMP lui est beaucoup plus simple, il est rempli avec le contenu de des balises <name>machin</name>, avec une entrée par ligne:
    machin
    machin2
    machin3
    ....

  16. #16
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bon, je vais essayer de te faire un petit programme qui te permettra d'avancer, mais avant j'ai besoin d'avoir quelques infos, corrige moi si je me trompe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @file=`opcdeploy -cmd "D:\\HP\\NNM\\nonOV\\perl\\a\\bin\\perl D:\\HP\\NNM\\bin\\nnmtopodump.ovpl -type node" -node $NNM_IP`;
    @file contient le fichier XML que tu as mis ci-dessus ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #get OM nodes
    @file2=`opcnode -list_nodes | grep Name | awk '{print\$3}'`;
    @file2 correspond à ce que tu appelles Dump, avec une liste de hostname ?

    Tu souhaites récupérer tous les hostnames de la balise topo/node/name dans @hostname_file par exemple ?

    Ensuite tu souhaites faire une comparaison des hostname entre @hostname_file et @file2 ?

    A l'issu de cette comparaison, les hostnames présents dans @file2 et absent de @hostname_file subissent un traitement notamment "opcnode -del_node" ?

    Ai je bien compris ?

  17. #17
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par djibril Voir le message
    Bon, je vais essayer de te faire un petit programme qui te permettra d'avancer, mais avant j'ai besoin d'avoir quelques infos, corrige moi si je me trompe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @file=`opcdeploy -cmd "D:\\HP\\NNM\\nonOV\\perl\\a\\bin\\perl D:\\HP\\NNM\\bin\\nnmtopodump.ovpl -type node" -node $NNM_IP`;
    @file contient le fichier XML que tu as mis ci-dessus ?
    Exactement, ce sont tous les noeuds contenus dans NNM


    Citation Envoyé par djibril Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #get OM nodes
    @file2=`opcnode -list_nodes | grep Name | awk '{print\$3}'`;
    @file2 correspond à ce que tu appelles Dump, avec une liste de hostname ?
    Ce sont tous les noeuds contenus dans OML (appli ou je souhaite intégrer mes noeuds), mais pour la fonction delete on n'en a pas besoin, puisque comme je le disais, on ne peut se baser sur ce fichier car dans OML, il y a des noeuds provenant d'autres applications, et donc non contenus dans NNM. Si on l'utilisais, on aurait un résultat caduque qui me supprimerait de OML tous les noeuds provenant des autres applications que NNM


    Citation Envoyé par djibril Voir le message
    Tu souhaites récupérer tous les hostnames de la balise topo/node/name dans @hostname_file par exemple ?
    A chaque fois que je balaie le @file, j'ajoute les hostnames des équipements dans un fichier plat, ou un tableau peut m'importe.


    Citation Envoyé par djibril Voir le message
    Ensuite tu souhaites faire une comparaison des hostname entre @hostname_file et @file2 ?
    Non, le @file2 me sert juste a déterminer si un noeud est déjà présent dans OML ou pas, si non je l'ajoute, si oui je ne fait rien (la fonction move est juste la pour mieux organiser noeuds dans OML)
    Mon but, lorsque le script va s'exécuter une première fois, tous les hostnames des noeuds de NNM seront écrit dans @hostname_file, le lendemain, lorsque le script s'exécutera de nouveau, je dois m'assurer que des noeuds n'ont pas été supprimés de NNM (donc dans le nouveau @file), si ils ne sont plus présent, alors cela voudra dire que le noeud a été supprimé de NNM, et qu'il faut donc que je le supprime de OML, d'ou l'appel de la fonction delete. La comparaison doit donc avoir lieu dans ce sens: est ce que les hostnames contenus dans @hostname_file sont ils présent dans @file.


    Citation Envoyé par djibril Voir le message
    A l'issu de cette comparaison, les hostnames présents dans @file2 et absent de @hostname_file subissent un traitement notamment "opcnode -del_node" ?
    Non comme précisé plus haut, si je procède de la sorte, il me supprimera les noeuds provenant des autres applications puisqu'ils ne seront pas référencés dans NNM. C'est l'inverse, tous les noeuds contenus dans @hostname_file et qui ne sont plus présent dans @file (et pas @file2) doivent être supprimés.


    Citation Envoyé par djibril Voir le message
    Ai je bien compris ?
    A peu près , mais j'avoue c'est pas simple et pas ordinaire comme type de script.

  18. #18
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    J'avais fini le programme, mais là tu m'as embrouillé . Comment récupères tu ton fichier Dump contenant la petite liste de hostname ?

  19. #19
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    Lol désolé

    le fichier dump est rempli avec la commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    foreach $line (@file){
    
    	if ($line =~ /<name>(.*)</) {
    		$node_name=$1;
    		print DUMP "$node_name\n";
    	}

  20. #20
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    L'idéal quand tu as ce genre de programme, c'est de te faire un algo basique avec des mots simples.

    Pour ton cas, j'essaye de résumer.

    Tu as des noeuds contenus dans ton NNM et des noeuds en provenance de OLM. Le but final de ton programme est d'effectuer une vérification journalière des noeuds NNM.
    Tous les jours, NNM génère des noeuds (via XML) que tu récupères. Tu extraits du fichier XML les hostnames. Ensuite effectue une comparaison avec les hostnames NNM de la veille. Donc pour l'instant on ne parle toujours pas de OML.

    Exemple : Mon programme s'appele test.pl et il a été lancé pour la première hier (jeudi).

    Voici ce qu'il a fait jeudi :
    - Il a cherché un fichier nnm.temp contenant les hostnames NNM de mercredi sans succès, donc il a considéré qu'il n'y avait pas de comparaisons à faire. Il a donc récupéré les hostnames nnm de jeudi via la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @file=`opcdeploy -cmd "D:\\HP\\NNM\\nonOV\\perl\\a\\bin\\perl D:\\HP\\NNM\\bin\\nnmtopodump.ovpl -type node" -node $NNM_IP`;
    Il les a stocké dans un fichier nnm.temp et c'est tout

    Vendredi (aujourd'hui)
    Il recherche le fichier nnm.temp, le trouve et mémorise les hostnames. Puis il récupères les hostnames nnm avec la commande opcdeploy .
    Il décide de comparer les deux listes.
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @nnm_jeudi = qw / machine1 machine2 machine3/;
    @nnm_vendredi = qw / machine1 machine2/;
    il s'aperçoit que machine3 a disparu, donc il décide de supprimer d'OML en utilisant la fonction del_node. Puis il réécrit le fichier nnm.temp en y mettant uniquement machine1 et machine2. Ce fichier sera lu demain etc etc

    Ai je bien compris ? Car sans réponse difficile d'avancer dans mon programme ? Si oui, à quoi te servait donc ton @file2 vu qu'il n'intervient à aucun moment ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème lecture fichier avec fscanf
    Par hypto dans le forum C
    Réponses: 7
    Dernier message: 18/11/2013, 16h57
  2. problème lecture fichier avec structures de données
    Par hannibal007 dans le forum Débuter
    Réponses: 3
    Dernier message: 09/04/2013, 19h51
  3. Problème lecture fichier DBF avec mémos
    Par Fishes83 dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 20/02/2013, 14h49
  4. Réponses: 2
    Dernier message: 23/06/2009, 08h42
  5. Problème lecture fichier avec >>
    Par C1rcus dans le forum C++
    Réponses: 2
    Dernier message: 18/11/2007, 18h19

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