Perl TP 1 Postes connectés au réseau Exercice 1 Saisies des adresses IP Le bloc d'instruction donné ci-dessous permet à l'utilisateur de saisir une adresse IP sous la forme d'une chaîne de caractères (la valeur saisie par l'utilisateur n'est pas vérifiée). my $ip ; print "Saisir une adresse IP : " ; $ip = <STDIN> ; chomp $ip ; Rechercher le script Perl (fichier saisies.pl) dont le rôle est de permettre à l'utilisateur de saisir plusieurs adresses IP (vous pouvez vous aider de l'algorithme donné ci-dessous). Le script prend fin quand l'utilisateur saisit une ligne vide. Algo Saisies ip : Chaîne Répéter Afficher("Saisir une adresse IP : ") Saisir(ip) Si ip <> "" Alors Afficher("Adresse saisie : ",ip) Afficher(" FIN ") Jusqu'à ip = "" Exercice 2 Mémorisation des adresses IP On se propose de stocker dans un tableau (variable @IPs) toutes les adresses IP saisies par l'utilisateur. Naturellement, cette variable devra être initialisée avec une liste vide. Rechercher le script Perl (fichier memorisation.pl) dont le rôle est de mémoriser (dans la variable @IPs) toutes les adresses IP saisies par l'utilisateur. Quand l'utilisateur met fin à la saisie (saisie d'une chaîne vide), toutes les adresses IP mémorisées sont affichées (une adresse IP par ligne). Exercice 3 Chaîne constituée de chiffres Rechercher le code Perl de la fonction estentier() (fichier test_estentier.pl) dont le rôle est de retourner la valeur 1 (VRAI) si la chaîne passée en paramètre n'est constituée que de chiffres, et la valeur 0 (FAUX) dans le cas contraire (vous pouvez vous aider de l'algorithme donné ci-dessous). Fonction estentier(src:chaîne):booléen c : Caractère ok : Booléen Si LONGUEUR(src) = 0 Alors retourner FAUX ok < VRAI TantQue i <= LONGUEUR(src) ET ok Faire c < SSCHAINE(src,i,1) Si c >= "0" ET c <= "9" Alors ok < FAUX TantQue retourner ok page 1
Rechercher le script Perl (fichier test_estentier.pl) dont le rôle est de tester la fonction estentier(). sub estentier { my ($src) = @_ ; # Main print &estentier("") ; print &estentier("125") ; print &estentier("a207b") ; Exercice 4 Vérification de la saisie Rechercher le code Perl de la fonction verifierip() (fichier test_verifierip.pl) dont le rôle est de retourner la valeur 1 (VRAI) si la chaîne passée en paramètre représente une valeur IP (quatre valeurs entières comprises entre 0 et 255, séparées par le caractère "point"), et la valeur 0 (FAUX) dans le cas contraire (vous pouvez vous aider de l'algorithme donné ci-dessous). Fonction vérifierip(adresse:chaîne):booléen ok : Booléen octet : Chaîne octets[4] : Chaîne octets < Découper(".",adresse) Si Cardinal(octets) = 4 Alors ok < VRAI TantQue i <= 4 ET ok Faire octet < octets[i] Si estentier(octet) ET octet >= 0 ET octet <= 255 Alors ok < FAUX TantQue retourner ok retourner FAUX Rechercher le script Perl (fichier test_verifierip.pl) dont le rôle est de tester la fonction verifierip(). sub estentier { sub verifierip { my $ip ; do { print "Saisir adresse IP : " ; $ip = <STDIN> ; chomp $ip ; if(&verifierip($ip) == 1){ print "Adresse IP correcte." ; else { print "Adresse IP incorrecte." ; while($ip ne "") ; page 2
Exercice 5 Non prise en compte des adresses IP incorrectes On se propose de stocker dans un tableau (variable @IPs) toutes les adresses IP saisies par l'utilisateur. Rechercher le script Perl (fichier memorisation_2.pl) dont le rôle est de mémoriser (dans la variable @IPs) toutes les adresses IP correctes saisies par l'utilisateur (dans le cas de la saisie d'une adresse incorrecte, celle-ci n'est pas mémorisée et un message est affiché). Quand l'utilisateur met fin à la saisie (saisie d'une chaîne vide), toutes les adresses IP mémorisées sont affichées (une adresse IP par ligne). Exercice 6 Adresse IP du poste local Recopier le fichier memorisation_2.pl dans le fichier memorisation_3.pl, puis modifier le code du programme principal de façon à ne pas prendre en compte l'adresse saisie par l'utilisateur si celle-ci correspond à celle du poste local. Pour connaître l'adresse IP du poste local dans un script Perl, il faut tout d'abord rechercher son nom (fonction hostname() du module Sys::Hostname). L'adresse est déduite à partir du nom à l'aide de la fonction gethostbyname() appelée dans un contexte scalaire. L'adresse IP est retournée sous la forme d'une chaîne de quatre caractères (chaîne dite "packtée"). Chaque caractère de la chaîne correspond à un octet de l'adresse. La foncion inet_ntoa() du module Socket permet de convertir une chaîne de quatre caractères en une adresse IP (notation décimale pointée). use Socket ; use Sys::Hostname ; my $nom = hostname() ; my $adr = gethostbyname($nom) ; my $mon_ip = inet_ntoa($adr) ; Exercice 7 Suppression des doublons Recopier le fichier memorisation_3.pl dans le fichier memorisation_4.pl. Rechercher le code de la fonction dejarecensee() dont le rôle est de retourner 1 (VRAI) si l'adresse passée en paramètre est déjà recensée dans le tableau lui aussi passé en paramètre, et 0 (FAUX) dans le cas contraire. Fonction déjàrencensée(adresse:chaîne,liste[]:chaîne):booléen trouvée : Booléen trouvée < FAUX TantQue i <= Cardinal(liste) ET NON trouvée Faire Si liste[i] = adresse Alors trouvée < VRAI TantQue retourner trouvée Enfin, modifier le code du programme principal de façon à ne pas mémoriser une adresse déjà recensée. Exercice 8 Validité des adresses IP Recopier le fichier memorisation_4.pl dans le fichier memorisation_5.pl, puis modifier le code de la fonction verifierip() en remplaçant l'appel à la fonction estentier() par une recherche de correspondance (expression régulière). Exercice 9 Stockage des adresses IP Recopier le fichier memorisation_5.pl dans le fichier memorisation_6.pl, puis modifier le code du programme principal en remplaçant l'affichage final des adresses IP saisies par l'écriture de toutes ces adresses dans le fichier texte adresses_ip.txt (une adresse IP par ligne). page 3
Exercice 10 Consultation du fichier des adresses IP Rechercher le script Perl (fichier lecture_adresses.pl) dont le rôle est d'afficher la liste des adresses IP (une adresse IP par ligne à l'écran) stockées dans le fichier texte adresses_ip.txt. Exercice 11 Gestion des adresses IP Recopier le fichier memorisation_6.pl dans le fichier gestion_ip.pl. Modifier ce nouveau fichier de façon à initialiser, au lancement de l'exécution du script, le tableau des adresses (variable @IPs) avec le contenu du fichier texte adresses_ip.txt. Exercice 12 Postes connectés Rechercher le script Perl (fichier ping_postes.pl) dont le rôle est d'indiquer, pour chaque adresse IP mémorisée dans le fichier texte adresses_ip.txt, si le poste associé est connecté ou pas au réseau. Il vous faudra exploiter les fonctionnalités proposées par le module Net::Ping (Le module Net::Ping est un module orienté objet. L'opérateur > correspond à l'opérateur "point" en Python que l'on utilise lors de l'appel de méthodes). Il est possible de consulter la documentation d'une fonction ou d'un module Perl dans un terminal (sous Debian, le paquet perl doc doit être installé) : perldoc f nom_fonction perldoc nom_module Exercice 13 Heure courante Rechercher le script Perl (fichier heure_courante.pl) dont le rôle est d'afficher l'heure courantes sous la forme "JJ/MM/AAAA hh:mm:ss". Trois fonctions vous seront nécessaires : time() qui retourne la valeur epoch, localtime() qui retourne l'heure et la date calculées à partir d'un nombre de secondes passé en paramètre, sprintf() qui permet de formater une chaîne de caractères (opérateur de format % en Python). Il est conseillé de bien lire les indications de la documentation concernant les valeurs retournées par la fonction localtime(). J'attire votre attention sur numéro du mois et sur l'année. Il sera peut être nécessaire d'adapter ces deux valeurs. Exercice 14 Etat des connexions Rechercher le script Perl (fichiers connexions.pl) dont le rôle est de tenir à jour une table recensant toutes les adresses IP à surveiller (adresses IP présentes dans le fichier texte adresses_ip.txt et recopiées dans la variable @IPs au démarrage du script). Cette table (variable %connexions de type tableau nominatif) permet pour chaque adresse IP, de connaître l'état de connexion au réseau du poste associé ainsi que la date/heure à laquelle ce poste s'est connecté au réseau. Cette table est rafraîchie et affichée toutes les 10 secondes (utilisation de la fonction sleep()). Ci-dessous, est présenté un exemple d'état des variables @IPs et %connexions à un instant donné. @IPs %connexions 0 "192.168.104.7" "192.168.104.10" "05/03/2011 15:28:33" 1 "192.168.104.10" "192.168.2.1" "05/03/2011 17:18:25" 2 "192.168.207.5" 3 "192.168.2.1" Les adresses IP qui n'apparaissent pas dans la liste des clefs de la variable %connexions correspondent à des postes qui ne sont pas connectés au réseau. page 4
Squelette du script connexions.pl #!/usr/bin/perl use Net::Ping ; @IPs = () ; %connexions = () ; sub initialiserlisteip { @IPs = () ; open(lst_ip,"<adresses_ip.txt") ; sub testerconnexions { my $ping = Net::Ping >new() ; foreach my $adresse ( @IPs ) { sub visualiserconnexions { # Programme principal &initialiserlisteip() ; while(1){ &testerconnexions() ; &visualiserconnexions() ; sleep(10) ; La fonction testerconnexions() doit tenir à jour le tableau nominatif %connexions. Si un poste répond à la commande ping et si son adresse IP n'est pas déjà présente dans la liste des clefs de la variable %connexions, un nouvel élément est créé. Dans le cas où un poste ne répond pas alors que son adresse IP est présente dans la liste des clefs de la variable %connexions, l'élément associé est supprimé du tableau nominatif. Exercice 15 Fichier Journal Recopier le fichier connexions.pl dans le fichier journal_connexions.pl. Modifier ce nouveau script de façon à tenir à jour un fichier journal nommé connexions.log dont le rôle est de recenser toutes les connexions (C) et déconnexions (D) au réseau. Exemple de fichier journal généré : 192.168.10.3 C 05/03/2011 07:10:55 192.168.104.7 C 05/03/2011 08:01:11 192.168.104.100 C 05/03/2011 08:15:27 192.168.104.7 D 05/03/2011 08:35:18 Dans ce fichier, on peut voir que le poste qui a pour adresse IP 192.168.104.7 s'est connecté au réseau le 05/03/2011 à 08h01m11s et qu'il s'est déconnecté du réseau le même jour à 08h35m18s. page 5