CC21 - 2004/5 - TP Noté
Sujet 'ER' : Expressions regulieres et "LOGS"
La question 1 prepare a la question 2. On peut y utiliser des entrees
simplifiees. Les sous-questions 1a, 1b, 1c, 1d sont independantes.
La question 2 traite de donnees reelles, en reutilisant les resultats du 1
- 2a : depend seulement des 1b et 1c
- 2b : depend des sous-questions 1: a, b, c, d
Indications communes :
- on rappelle que, pour identifier clairement ce qui est reconnu par une regle,
on peut utiliser une instruction telle que printf("<<%s>>",yytext);
- les macro-definitions sont pratiques : voir Memento flex, titre IV-1,
et aussi le man flex
- ne pas essayer de suite des expressions regulieres complexes, plutot
proceder graduellement, par petits essais successifs
- attention aux caracteres a sens special : voir Memento flex, partie II,
et le man flex
1 - RECONNAISSANCE D'ELEMENTS SIMPLES
Pour les tests, on peut utiliser des exemples simples, tels que le suivant
(ne pas hesiter a extraire des sous-exemples pour simplifier le cas echeant)
--------------------------- lex1.1.dat ----------------------------
hackers_limited.int-evry.fr 157.158.110.132 .100 hello
www.maileva.com:80 999 bye. [03/Jun/2004:22:31:11 +0200]
-start- "127.128.00.1" www.free.fr [03/Jun/2004:22:31:11]
"GET /images/puce.gif HTTP/1.1"
1a) CHAMP ADRESSE IP : 4 champs numeriques separes par des '.'
Donnez une specification lex1a.flex. On ne demande pas de specifier
la longueur ni la valeur de chaque champ numerique
1b) CHAINES ENTRE DOUBLE QUOTES
Elles sont de la forme : "xxxxxxxxxxxxx"
On ne s'interesse pas ici a l'analyse de leur contenu.
Donnez une specification lex1b.flex
1c) PARTIES "DATE"
Un exemple de forme admise est : [03/Jun/2004:22:31:11 +0200]
(les crochets font partie de la "date" ; le champ +0200 est relatif
au temps GMT)
Donnez une specification lex1c.flex. Le format ci-dessus, les types
de champ, ainsi que leurs longueurs (2 digits pour le jour, etc...)
doivent etre respectes (mais on ne demande pas de verifier la validite
"semantique" des valeurs des champs ; p.ex. 35 serait un nO de jour valide).
1d) - PARTIE "AUTHORITY" :
- c'est une chaine (qui n'est pas entre double quotes) de 1 ou plusieurs "symboles":
. un "symbole" etant forme de caracteres alphabetiques ou de '-' ou de '_'
. deux symboles consecutifs sont separes par un '.'
- elle est eventuellement suivie d'un numero de port, qui est un entier
decimal, separe de la partie chaine de symboles par un ':'
- le tout figurant obligatoirement en debut de ligne d'un fichier de log
Donnez une specification lex1d.flex pour reconnaitre une partie "authority"
2 - TRAITEMENT DE DONNEES REELLES
- DONNEES
EXEMPLE : extrait d'un des fichiers de "logs" suivant le fonctionnement
d'un syteme securise (multiprocesseurs) d'envoi de fax par le web.
------------------- logExtrait1.dat --------------------------
www.maileva.com:80 81.88.96.7 - - [03/Jun/2004:22:31:11 +0200] "GET / HTTP/1.1" 200 16593 "-" "MSIE 6.0"
www.maileva.com:80 81.88.96.7 - - [03/Jun/2004:22:31:11 +0200] "GET /loadCss.js HTTP/1.1" 200 1826 "http://www.maileva.com:80/" "MSIE 6.0"
www.maileva.com:80 81.88.96.7 - - [03/Jun/2004:22:31:11 +0200] "GET /images/menu.gif HTTP/1.1" 200 8030 "http://www.maileva.com:80/" "MSIE 6.0"
www.maileva.com:80 81.88.96.7 - - [03/Jun/2004:22:31:11 +0200] "GET /authentifie.js HTTP/1.1" 200 3690 "http://www.maileva.com:80/" "MSIE 6.0"
www.maileva.com:80 81.88.96.7 - - [03/Jun/2004:22:31:11 +0200] "GET /images/spacer.gif HTTP/1.1" 200 43 "http://www.maileva.com:80/" "MSIE 6.0"
www.maileva.com:80 81.88.96.7 - - [03/Jun/2004:22:31:11 +0200] "GET /images/pt_ss_menu_offre.gif HTTP/1.1" 200 3966 "http://www.maileva.com:80/" "MSIE 6.0"
www.maileva.com:80 81.88.96.7 - - [03/Jun/2004:22:31:11 +0200] "GET /images/puce.gif HTTP/1.1" 200 120 "http://www.maileva.com:80/" "MSIE 6.0"
www.maileva.com:80 81.88.96.7 - - [03/Jun/2004:22:31:11 +0200] "GET /images/pt_ss_menu_concept.gif HTTP/1.1" 200 4067 "http://www.maileva.com:80/" "MSIE 6.0"
www.maileva.com:80 81.88.96.7 - - [03/Jun/2004:22:31:11 +0200] "GET /images/pt_ss_menu_societe.gif HTTP/1.1" 200 3648 "http://www.maileva.com:80/" "MSIE 6.0"
www.maileva.com:80 81.88.96.7 - - [03/Jun/2004:22:31:11 +0200] "GET /images/slogan_home.gif HTTP/1.1" 200 5782 "http://www.maileva.com:80/" "MSIE 6.0"
www.maileva.com:80 81.88.96.7 - - [03/Jun/2004:22:31:11 +0200] "GET /images/logo_techno_bleu.gif HTTP/1.1" 200 1363 "http://www.maileva.com:80/" "MSIE 6.0"
www.maileva.com:80 81.88.96.7 - - [03/Jun/2004:22:31:11 +0200] "GET /images/mlg_consult2.jpg HTTP/1.1" 200 4741 "http://www.maileva.com:80/" "MSIE 6.0"
www.maileva.com:80 81.88.96.7 - - [03/Jun/2004:22:31:11 +0200] "GET /images/lrebleue.gif HTTP/1.1" 200 4826 "http://www.maileva.com:80/" "MSIE 6.0"
www.maileva.com:80 81.88.96.7 - - [03/Jun/2004:22:31:11 +0200] "GET /images/img_baseline/espace_client_1.gif HTTP/1.1" 200 177 "http://www.maileva.com:80/" "MSIE 6.0"
DESCRIPTION. Chaque ligne du fichier comporte, dans cet ordre, les champs
suivant, separes par un espace :
- une partie "authority" (identifiant le serveur)
- une adresse IP (identifiant le client distant)
- deux '-'
- une partie date
- une requete (= une chaine entre double quotes)
- 2 nombres entiers
- une partie "programme demande" (chaine entre double quotes)
- une partie navigateur client (chaine entre double quotes)
Indications communes
- utiliser des macro-definitions (choisir de preference des noms assez courts)
- proceder tres graduellement
2a - Extraction de donnees : parties "date" et "requete"
Pour eviter la creation explicite de fichier, on pourra utilisera au lancement
de l'analyseur des redirections distinctes pour les flots stdout et stderr
(Rappel UX11 : on peut faire par exemple : ./a.out 1> f1 2> f2)
Donner la specification lex2a.flex pour :
- extraire les parties "date", et les stocker dans un fichier nomme "dates.txt"
- extraire les parties "requete", les stocker dans un fichier "requetes.txt"
- chaque extrait est a stocke dans le fichier adequat a raison de un par ligne,
precede du numero de la ligne correspondante dans le fichier d'entree
2b - Verification de format des articles
Le fonctionnement des extractions suppose que le fichier d'entree est correct.
Le degre de verification est a choisir par compromis efficience / complexite.
Ici on verifiera que chaque ligne comporte tous les champs precedents, dont
l'essentiel a ete analyse en 1, separes l'un de l'autre par un espace.
Donner une specification lex2b.flex pour realiser une verification prealable
d'un fichier de "log". Indications:
- il suffit d'imprimer "---- OK ! ----" apres une ligne reconnue correcte
- il peut etre plus clair de proceder graduellement : on pourra commencer par
verifier que tous les elements traites en 1 sont bien reconnus isolement,
puis verifier qu'ils sont tous presents
Si l'on veut comparer a la situation reelle, un exemple de fichier de
log complet est fourni
(les deux dernieres chaines entre double quotes peuvent etre tres reduites,
mais vous pouvez utiliser votre analyseur pour tester leur presence).