Salut,
Sinon, j'ai réessayer de faire la même chose pour un autre cas, mais tellement je suis nul en perl,
Si je peux me permettre. Il ne faut pas voir les choses ainsi.
Je dirais plutôt que tu es débutant en Perl, mais ça ce n'est pas un problème. On a tous débuter un jour.
que je n'ai pas su comment le faire :
si le champ TargetName existe dans le résultat --> affichage du message: "OK | TargetName = ERP.FR"
sinon --> affichage du message "NOK | TargetName is Down"
En revanche il faut construire correctement l'algorithme suite à une analyse judicieuse de ta situation.
Si le fichier a la structure que tu viens de la présenter, alors ton raisonnement est un peux faux.
Si on a une ligne qui contient le champ TargetName (pour être plus précis je dirais des lignes qui commencent avec TargetName) alors le message peut être affiche sinon, on ne peux pas afficher Down pour un Target qui n'existe pas. Tu vois ce que je veux dire?
Je vais te donner deux exemples pour me faire comprendre.
1er cas - je vais utiliser ton fichier
lami20j@debian:~$ cat target.txt
Java Runtime: Sun Microsystems Inc. 1.6.0_0 /usr/lib/jvm/java-6-openjdk/jre
Heap sizes: current=5056k free=4589k max=520256k
JVM args:
HOME: /usr/local/
BASE: /usr/local/
TargetName = ERP.FR
lami20j@debian:~$
lami20j@debian:~$ cat targetname.pl
#!/usr/bin/perl
use strict;use warnings;
my $fic="/home/lami20j/target.txt";
open F,"target.txt" or die "E/S : $fic $!\n";
while(my $ligne=<F>){
next unless $ligne=~/^TargetName/; # on saute les lignes qui
# ne commencent pas
# avec TargetName
$ligne=~/=\s+(.*)/;
print "OK | TargetName = $1\n";
}
__END__
Le résultat
lami20j@debian:~$ perl targetname.pl
OK | TargetName = ERP.FR
Mais ce n'est pas vraiment ça que tu veux.
Tu veux avoir un message qui te dis si le TargetName est Down.
En ce cas voici deux scénarios :
- soit TargetName est vide et en ce cas on fait un test sur ce qui est après le signe égal
- soit il y a quelque part un champ qui nous donne l'état du Target
Dans les deux cas il n'y aura pas moyen de récupérer quelque chose qui n'existe pas, je parle de nom de target. Le champs TargetName doit exister quelque soit l'état (down ou pas)
Si tu n'as pas besoin de nom, un message TargetName is Down, sans préciser le nom de target, n'est pas concluant vu que tu ne pourras pas savoir pour quel target tu auras le message.
Pour simuler ton exercice voici un exemple
(j'ai mis une structure de fichier adapté qui nous permettra de savoir l'étant du target)
Le fichier modifié
lami20j@debian:~$ cat target.txt
Java Runtime: Sun Microsystems Inc. 1.6.0_0 /usr/lib/jvm/java-6-openjdk/jre
Heap sizes: current=5056k free=4589k max=520256k
JVM args:
HOME: /usr/local/
BASE: /usr/local/
TargetName = ERP.FR;1
Java Runtime: Sun Microsystems Inc. 1.6.0_0 /usr/lib/jvm/java-6-openjdk/jre
Heap sizes: current=5056k free=4589k max=520256k
JVM args:
HOME: /usr/local/
BASE: /usr/local/
TargetName = ERP.UK;0
Script + exécution
lami20j@debian:~$ cat targetname2.pl
#!/usr/bin/perl
#use strict;use warnings;
my $fic="/home/lami20j/target.txt";
my($type,$target);
open F,"target.txt" or die "E/S : $fic $!\n";
while(<F>){
next unless /^TargetName/; # les lignes qui ne commencent pas
# avec TargetName ne nous interessent pas
/^Target.*=\s+(.*);(\d)/;
$2==1 ?print "OK | TargetName = $1\n":print "NOK | $1 is DOWN\n";
}
__END__
lami20j@debian:~$ perl targetname2.pl
OK | TargetName = ERP.FR
NOK | ERP.UK is DOWN
Ce qu'on retiens dans cette histoire, c'est que pour trouver une solution adéquate, il fait savoir 3 choses
- les données en entrée
- le traitement qu'on veut appliquer aux données en entrée
- un exemple concret de ce qu'on doit obtenir
En ce moment on peut commencer chercher une solution.
J'espère que je ne t'ai pas trop embrouillé.
Merci pour votre réponse,
j'ai essayé de mettre en place votre solution, mais l'expression While(<DATA>) n'est pas reconnue, je recois toujours une erreur au niveau de cette ligne :
JMXURL=service:jmx:rmi:///jndi/rmi://10.33.208.39:1099/jmxrmi
Queue=*
JAR=/usr/run.jar
FILE=/usr/titexe2009
CMD_TMPL="java -jar $JAR query -QQueue=$Queue --jmxurl $JMXURL"
WORKING=`$CMD_TMPL 2>&1`
echo "$WORKING" > $FILE
use strict;
use warnings;
cat $FILE
while(<DATA>){
if (/Destination\s*=\s*(.*)/ .. /^$/){
my $dest=$1;
if (/Size\s*=\s*(\d+)/){
given ($1){
when($1==0){say "Status = OK / Destination = $dest && Size = 0" ;}
when($1<10){say "Status = Critical / Destination = $dest && Size = $1";}
default {say "Status = Warning / Destination = $dest && Size = $1";}
}
}
}
}
Merci d'avance,
Cordialement,
titexe