OVH Cloud OVH Cloud

analyse tres complexe de fichier perl

5 réponses
Avatar
lepetitpere
Salut Au forum

Bon voila ma preoccupation..

je dois analyser avec Perl un fichier log comportant comme vous allez
le constater un certain nombre de donn=E9es...

je dois "Grouper " ces donn=E9es en fonction des routeurs logiques
(logical-routers), mais le probleme est que ce fichier etant gener=E9
automatiquement
par le serveur, il doit etre trait=E9 tel quel par le programme, et seul
le premier "bloc comportant un routeur logique est declar=E9 par
logical-routers"...


Exemple:

.=2E.
.=2E.
.=2E.
logical-routers {
m10_0_as1 {
interfaces {
ge-0/1/0 {
unit 50 {
vlan-id 50;
family inet {
address 218.1.xx.xxx/xx {
vrrp-group 50 {
virtual-address 218.x.95.xxx;
priority 200;
preempt;
accept-data;
}
}
}
}
unit 51 {
vlan-id 51;
family inet {
address 172.xx.xx.82/xx {
vrrp-group 51 {
virtual-address 172.16.xx.xx1;
priority 200;
preempt;
accept-data;
}
}
}
}



je dois ressortir le nom du routeur (ici m10_0_as1), ensuite son
interface ( ge-0/1/0), ensuite les unit appartenant
a cet interfaces (de 50,51,....61.....=E0 185 par exemple j=B4ai pas tout
mis pr ne pas faire bcp de place),
sous son unit j doit ressortir son Vlan-Id,address, ensuite passer au
suivant,

et des qu=B4une nouvelle interface de ce meme logical-routers est
trouv=E9, refaire la meme operation pour cet interface


a la suite de celui du haut:

ge-1/1/0 {
unit 11 {
vlan-id 11;
family inet {
address 1xx.xx.xxx.6/xx;
}
}
}
}


ge-1/1/0 est la nouvelle interface mais n=B4est pas explicitement
annonc=E9 coe la haut par le mot interfaces



Par la suite il y aura encore un nouvel logical-routers:


m10_0_vr1 {
interfaces {
ge-1/0/0 {
unit 201 {
vlan-id 201;
family inet {
filter {
output fil-1/0/0.201;
}
address 1x2.xx.88.2/aa {
vrrp-group 201 {
virtual-address 1xx.1x.xx.1;
priority 200;
preempt;
}
}
}
}
unit 240 {
vlan-id 240;
family inet {
address xx8.1.x7.xx/xx {
vrrp-group 240 {
virtual-address 218.x.7x.xx;
preempt;
accept-data;
}
}
}
}

ici m10_0_vr1 est le nom du nouveau logical-routers, et en dessous son
interface et les donn=E9es de cet interface coe la haut


Qu=B4il faut traiter comme celui du haut, tout cela c=B4est dans le meme
fichier, entre eux il y a encore un tas d=B4autres infos mais
seules celles ci nous interressent et il faut les recuperer et les
afficher...

je ne sais pas comment proceder, j=B4ai essayer des methodes sans
resultat, je m=B4en remets aux experts du forum pour me faire avancer...

Merci

5 réponses

Avatar
Denis Dordoigne
Bonjour,

je ne sais pas comment proceder, j´ai essayer des methodes sans
resultat, je m´en remets aux experts du forum pour me faire avancer...


Ce n'est pas que je veux pas t'aider, mais si tu as déjà essayé des
méthodes qui n'ont pas fonctionné il faudrait un peu les détailler pour
qu'on ne cherche pas également dans une mauvaise direction...

Tu as vérifié sur search.cpan.org qu'il n'y avait pas déjà un module qui
parsait ce type de fichier ? Lorsque j'y cherche n'importe quel marque de
routeur j'ai des dizaines de réponses...

--
Denis

Avatar
lepetitjoe
En fait j´essaie de construire une truc avec les Piles (Push et Pop )
mais je suis loin d´arriver a un resultat escompté. On m´´a
conseillé de regarder ds cette direction la.
Je ne comprends pas bien la fin de votre message la ou vous dites avoir
des dizaines de reponses....



Denis Dordoigne wrote:
Bonjour,

je ne sais pas comment proceder, j´ai essayer des methodes sans
resultat, je m´en remets aux experts du forum pour me faire avancer...


Ce n'est pas que je veux pas t'aider, mais si tu as déjà essayé des
méthodes qui n'ont pas fonctionné il faudrait un peu les détailler pour
qu'on ne cherche pas également dans une mauvaise direction...

Tu as vérifié sur search.cpan.org qu'il n'y avait pas déjà un mod ule qui
parsait ce type de fichier ? Lorsque j'y cherche n'importe quel marque de
routeur j'ai des dizaines de réponses...

--
Denis



Avatar
Klaus
lepetitpere wrote:
je dois analyser avec Perl un fichier log comportant comme vous allez
le constater un certain nombre de données...

Exemple:

logical-routers {
m10_0_as1 {
interfaces {
ge-0/1/0 {
unit 50 {
vlan-id 50;
family inet {
address 218.1.xx.xxx/xx {
vrrp-group 50 {
virtual-address 218.x.95.xxx;
priority 200;
preempt;
accept-data;
}
}
}
}
unit 51 {
vlan-id 51;
family inet {
address 172.xx.xx.82/xx {
vrrp-group 51 {
virtual-address 172.16.xx.xx1;
priority 200;
preempt;
accept-data;
}
}
}
}


[snip]

je dois ressortir le nom du routeur (ici m10_0_as1), ensuite son
interface ( ge-0/1/0), ensuite les unit appartenant
a cet interfaces (de 50,51,....61.....à 185 par exemple j´ai pas tout
mis pr ne pas faire bcp de place),
sous son unit j doit ressortir son Vlan-Id,address, ensuite passer au
suivant,
et des qu´une nouvelle interface de ce meme logical-routers est
trouvé, refaire la meme operation pour cet interface


La structure des données (avec des paranthèses "{" et "}" ) me semble
plutôt hierarchique, donc mon premier réflexe est de les transformer
d'abord en XML. Il y a une centaine des modules XML dans CPAN.
Personnellement, je préfère le module "XML::Writer" pour créer des
structures XML:
voir http://search.cpan.org/~josephw/XML-Writer-0.600/Writer.pm

========================= ========================
use strict;
use warnings;

use XML::Writer;
my $xml_var;

my $xml_write = new XML::Writer(OUTPUT => $xml_var,
DATA_MODE => 1, DATA_INDENT => 2);

$xml_write->xmlDecl('iso-8859-1');
$xml_write->startTag('racine');
while (<DATA>) { chomp; s/^s+//; s/s+$//;
if (/^(.*?)s*{$/) {
$xml_write->startTag('bal', id=>$1);
}
elsif (/^}$/) {
$xml_write->endTag('bal');
}
else {
$xml_write->dataElement('ligne', $_);
}
}
$xml_write->endTag('racine');
$xml_write->end();
========================= ========================

Le résultat en format XML se trouve maintenant dans la variable
"$xml_var" avec les paranthèses ouvertes "{" qui sont transformé en
balise XML ouverte <bal id="..."> et les paranthèses fermées "}" qui
sont transormé en balise XML fermée </bal>:

exemple:
<?xml version="1.0" encoding="iso-8859-1"?>
<racine>
<bal id="logical-routers">
<bal id="m10_0_as1">
<bal id="interfaces">
<bal id="ge-0/1/0">
<bal id="unit 50">
<ligne>vlan-id 50;</ligne>
<bal id="family inet">
<bal id="address 218.1.xx.xxx/xx">
<bal id="vrrp-group 50">
<ligne>virtual-address 218.x.95.xxx;</ligne>
<ligne>priority 200;</ligne>
<ligne>preempt;</ligne>
<ligne>accept-data;</ligne>
</bal>
</bal>
</bal>
</bal>


ensuite j'utilise le module "XML::Simple" pour transformer la structure
XML ("$xml_var") dans une structure de Perl ("$xml_mem")
voir http://search.cpan.org/~grantm/XML-Simple-2.14/lib/XML/Simple.pm

========================= ========================
use XML::Simple;
my $xml_mem = XMLin($xml_var,
ForceArray => 1, KeyAttr => ['bal']);
========================= ========================

finalement je navigue dans la structure Perl pour ressortir:
- le nom du routeur (m10_0_as1),
- ensuite son interface (ge-0/1/0),
- ensuite les unit (50, 51, ..., 185) avec vlan-id et address

========================= ========================
for my $r_ptr ( @{ $xml_mem->{'bal'}->[0]->{'bal'} } ) {
my $router = $r_ptr->{'id'};
print "router......: $routern";

for my $i_ptr ( @{ $r_ptr->{'bal'}->[0]->{'bal'} } ) {
my $interface = $i_ptr->{'id'};
print " interface.: $interfacen";

for my $u_ptr ( @{ $i_ptr->{'bal'} } ) {
my $unit = $u_ptr->{'id'};
$unit =~ s/^unit (.*?);?$/$1/;
my $vlan = $u_ptr->{'ligne'}->[0];
$vlan =~ s/^vlan-id (.*?);?$/$1/;
my $addr;

LOOP1:
for my $a_ptr (@{ $u_ptr->{'bal'} }) {
for my $b_ptr (@{ $a_ptr->{'bal'} }) {
my $t = $b_ptr->{'id'};
if (defined $t
and $t =~ /^address (.*?);?$/) {
$addr = $1; last LOOP1;
}
}
my $t = $a_ptr->{'ligne'}->[0];
if (defined $t
and $t =~ /^address (.*?);?$/) {
$addr = $1; last LOOP1;
}
}
printf " unit....: %-3s ", $unit;
printf "(vlan-id = %3s", $vlan;
printf ", address = %s)n", $addr;
}
}
}
========================= ========================

voici le résultat:

++++++++++++++++++++++++++++++++++++++++++++++++
router......: m10_0_as1
interface.: ge-0/1/0
unit....: 50 (vlan-id = 50, address = 218.1.xx.xxx/xx)
unit....: 51 (vlan-id = 51, address = 172.xx.xx.82/xx)
interface.: ge-1/1/0
unit....: 11 (vlan-id = 11, address = 1xx.xx.xxx.6/xx)
router......: m10_0_vr1
interface.: ge-1/0/0
unit....: 201 (vlan-id = 201, address = 1x2.xx.88.2/aa)
unit....: 240 (vlan-id = 240, address = xx8.1.x7.xx/xx)
++++++++++++++++++++++++++++++++++++++++++++++++

Finalement, voici les données originales dans la section __DATA__ du
programme Perl:

========================= ========================
__DATA__
logical-routers {
m10_0_as1 {
interfaces {
ge-0/1/0 {
unit 50 {
vlan-id 50;
family inet {
address 218.1.xx.xxx/xx {
vrrp-group 50 {
virtual-address 218.x.95.xxx;
priority 200;
preempt;
accept-data;
}
}
}
}
unit 51 {
vlan-id 51;
family inet {
address 172.xx.xx.82/xx {
vrrp-group 51 {
virtual-address 172.16.xx.xx1;
priority 200;
preempt;
accept-data;
}
}
}
}
}
ge-1/1/0 {
unit 11 {
vlan-id 11;
family inet {
address 1xx.xx.xxx.6/xx;
}
}
}
}
}
m10_0_vr1 {
interfaces {
ge-1/0/0 {
unit 201 {
vlan-id 201;
family inet {
filter {
output fil-1/0/0.201;
}
address 1x2.xx.88.2/aa {
vrrp-group 201 {
virtual-address 1xx.1x.xx.1;
priority 200;
preempt;
}
}
}
}
unit 240 {
vlan-id 240;
family inet {
address xx8.1.x7.xx/xx {
vrrp-group 240 {
virtual-address 218.x.7x.xx;
preempt;
accept-data;
}
}
}
}
}
}
}
}
========================= ========================

Avatar
lepetitjoe
Merci Klaus
La je me rends compte que je dois me mettre aux XML (je connais un peu
mais pas suffisament...)
Je travaille sur Linux suse , si vous pouvais me donner des tips pr
configurer l´environnement necessaire afin de travailler dessus ca
m´avancerait bcp.

Autre question:je comprends pas bien le cheminement, par ou commencer?
qui lit quoi? qui appele qui dans quel ordre?
Comme j´ai signalé dans mon descriptif il existe d´autres données
dans le fichiers mais qui ne sont pas à utiliser (donc j´ai pas
inseré cela dans ce code ci dessus) je ne sais pas si ca ne genera pas
l´analyse???

Merci encore deja j´ai une piste
Avatar
Klaus
wrote:
Merci Klaus
La je me rends compte que je dois me mettre aux XML (je connais un peu
mais pas suffisament...)


bonne décision !

J'ai trouvé des sites avec des infos sur XML en général:
----------------------------------------------------------------
http://www.w3.org/XML/
http://www.w3.org/XML/1999/XML-in-10-points.fr.html
http://www.topxml.com/
http://xmlfr.org/index/object.title/xml/

Je travaille sur Linux suse , si vous pouvais me donner des tips pr
configurer l´environnement necessaire afin de travailler dessus ca
m´avancerait bcp.


Je suis désolé, je ne sais pas comment configurer l'environnement de
Linux Suse, je travaille sur Windows XP avec Activestate Perl:

C:>perl -v
This is perl, v5.8.8 built for MSWin32-x86-multi-thread

Autre question:je comprends pas bien le cheminement, par ou commencer?
qui lit quoi? qui appele qui dans quel ordre?


Voici les étapes de ma solution:

Etape 1:
lire le fichier <DATA>, ligne par ligne et traduire le "{" en "<bal
id=...>" et le "}" en "</bal>", le résultat se trouve dans un fichier
"virtuel" en mémoire: le scalar "$xml_var".

Etape 2:
transformer le fichier "virtuel" ("$xml_var") en structure de Perl
("$xml_mem")

Etape 3:
Naviguer la structure Perl pour ressortir le nom du routeur, ensuite
son interface, et finalement les les units avec vlan-id et address.
(j'ai appris la stratégie de naviguer une structure de Perl dans
http://perl.enstimac.fr/DocFr/perllol.html )

En fait, dans ma réponse précédente, j'ai donné un programme perl
complet (mais éclaté en plusieurs morceaux, il faut donc
copier/coller les morceaux (y compris la section __DATA__) dans un seul
fichier, ça devrait fonctionner tout seul. (sous condition que les
modules "XML::Writer" et "XML::Simple" sont bien intallés).

Comme j´ai signalé dans mon descriptif il existe d´autres données
dans le fichiers mais qui ne sont pas à utiliser (donc j´ai pas
inseré cela dans ce code ci dessus) je ne sais pas si ca ne genera pas
l´analyse???


Avec ma demarche en utilisant XML::Simple, il est probable que
l'analyse sera géné par d'autres données, mais je voudrais signaler
que XML::Simple n'est qu'une première stratégie/module parmi des
centaines des stratégies/modules XML.

Parmi les centaines des modules XML sur CPAN, j'utilise 5:
----------------------------------------------------------------
http://search.cpan.org/~josephw/XML-Writer-0.600/Writer.pm
http://search.cpan.org/~grantm/XML-Simple-2.14/lib/XML/Simple.pm
http://search.cpan.org/~msergeant/XML-Parser-2.34/Parser.pm
http://search.cpan.org/~podmaster/XML-TokeParser-0.05/TokeParser.pm
http://search.cpan.org/~mirod/XML-Twig-3.26/Twig.pm

Il est probable qu'il existe autres stratégies/modules XML qui sont
beaucoup mieux adapté au problème (peut-être XML::Twig ? -- ou
XML::TokeParser ?)

Merci encore deja j´ai une piste


De rien. Je suis toujours content d'assister.