Bonjour,

Je suis en train de tenter quelque chose avec mes élèves.
Nous sommes dans une classe où règne Microsoft et donc où nous ne savons pas travailler.
Impossible d'éditer /etc/hosts (Windows\system32\drivers\etc) par manque de droits suffisants, et pour l'apprentissage du Web dynamique on est un peu mal.
Et pour la liste DNS pour chaque poste c'est pareil on ne peut pas la modifier.

J'ai donc mon portable avec Apache, bind9/named, etc... permettant d'heberger les sites de mes élèves.
J'ai créé un script bash qui permet (un peu comme Wamp) en une ligne de commande de créer autant d'hôtes virtuels avec les dossiers "squelettes" pour les sites en modifiant le contenu des fichiers "vhost.template".

Maintenant, dans un premier temps, j'aimerais créer un script perl, il me semble que c'est le meilleur langage pour ce genre de traitement de données qui me permettrait de "mettre de l'ordre" dans le fichier /ec/hosts.
Vu que la liste DNS n'est pas encore modifiée au niveau de la classe, l'administrateur ne m'a pas encore répondu à ce sujet, je dois passer par le /etc/hosts de mon système pour "résoudre les noms de domaines".

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
 
use strict;
use warnings;
 
use experimental 'smartmatch';
 
my @ipaddresses = ('');
 
my $targetfile="/etc/hosts";
 
my $ipentry="";
my @domains = ('');
 
open(my $descripteur,'<:encoding(UTF-8)', $targetfile) or die "$targetfile not found :{";
 
while(my $ligne = <$descripteur>)  # tant que nous ne sommes pas arrivés à la fin du fichier
{
	chomp $ligne;				# on enlève le caractère '\n' de fin de ligne
 
	if($ligne =~ /^([0-9]{1,3}\.){3}[0-9]{1,3}/)
	{
		($ipentry,@domains)=split('\s{1,}|\t',$ligne); # on "splitte" à un ou plusieurs espaces ou à une tabulation
 
		if(!($ipentry ~~ @ipaddresses))
		{
			print "IP trouvée --> $ipentry \n";
 
			push(@ipaddresses,$ipentry);
		}
	}
}
J'aimerais créer un "hash" ou "map" avec une clef (adresse IP) et un ou plusieurs domaines.
Est-ce possible en perl ou dois-je passer par MySQL ?

Instinctivement je ferais ceci mais je n'arrive pas à parcourir le tableau de domaines par la suite...

A la lecture du fichier j'obtients le tableau @domains via le split.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
my %hashEntries=('');
 
if(!$ipentry ~~ $hashEntries{$ipentry}) $hashEntries{$ipentry}=[ @domains ]; # si je mets @domains sans les crochets j'ai le nombre d'éléments au lieu de la référence du tableau HASH[...].
else
{
 # c'est ici que je n'arrive pas à "pusher" les domaines à ceux qui existent déjà
 my @existingDomains=$hashEntries{$ipentry};
 
}
Pourriez-vous m'éclairer sur ce sujet ?
[EDIT]
Oui, le fichier /etc/hosts à la lecture de ses lignes, risque de contenir plusieurs fois une certaine adresse IP, par exemple 127.0.0.6 pourrait apparaître trois ou quatre fois avec des domaines différents (en nombre aussi)...
127.0.0.6 www.test1.ecole.be
...
...
...
127.0.0.6 www.test2.ecole.be test3 test4
...
...
127.0.0.6 www.test5.ecole.be
Le but du jeu serait de "refondre" un /etc/hosts avec une seule ligne pour 127.0.0.6 avec tous les domaines trouvés à la lecture de celui-ci.

1. je parcoure /etc/hosts
2. je lis chaque ligne et détecte si il s'agit d'une IPv4
3. je lie une adresse IP avec une liste de domaines (au lieu de map dans le titre j'aurais dû mettre lists)
4. si je retrouve la même ip j'ajoute les domaines à ceux de la liste correspondant à la clef représentée par l'adresse IP
5. je renomme le fichier /etc/hosts
6. je relis le fichier renommé et dès que je trouve une ipv4 je ne recopie pas la ligne dans /etc/hosts
7. une fois la fin du fichier renommé atteinte j'écris les lignes contenant l'adresse IP et les domaines liés dans /etc/hosts