< < E-NEF > >

Création de sites | Moniteurs | Chercher | Voyager | Cartes

()
perl pages
 
Dites nous ce que vous
avez pensé de cette page

 Excellent
 Vaut le coup de le lire
 Sans intérêt

 Pas assez technique
 Juste comme il faut
 Trop technique

Serveur réparti de données Web d'utilisateurs

Introduction

Les entreprises sur l'Internet ont de plus en plus tendance à vouloir mettre en commun leur sous réseaux et leurs informations, d'autant plus si sont disséminées sur plusieurs sites géographiquement éloignées.

L'ESIEA est une école d'Ingénieurs qui dispose de deux sites, un à Laval et un a Paris, et même avec deux noms de domaines différents.

Suite à une discussion avec Jean-Phillippe Rozé, l'idée a été lancée de mettre en commun la liste des pages web des intranets des deux sites.

Les deux sous-réseaux sont reliés grâce au tunneling (noyau Linux) à travers l'Internet, mais celà est aussi possible à travers l'Internet, normalement..

Le serveur

Les comptes de la machine contenant le scripte serveur sont scannés, à la recherche d'un répertoire public_html des utilisateurs contenant les pages personnelles

Chacune des machines doit posséder un serveur HTTP avec l'option UserDir public_html ainsi que Perl 5.002 au minimum pour les fonctions réseau.

Le modèle fonctionne sur le mode du Client/Serveur: le scripte CGI de Paris par exemple contacte un serveur à Laval, pour obtenir les données des utilisateurs.

La version en cours de développement contacte un serveur local, qui à son tour contacte le serveur distant, et suivant la date de dernière consultation, prend une valeur dans un cache, ou récupère les données. Et cela sur plusieurs serveurs.

Fonctionnement du serveur

Le serveur a été conçu en Perl car portable sous tout type d'architecture. Les transactions se font sous TCP/IP en mode connecté.

La boucle principale attend les connections, et forke le serveur des réception:

for ( $waitedpid = 0;
     ($paddr = accept(Client,Server)) || $waitedpid;
      $waitedpid = 0, close Client)
           {
               next if $waitedpid;
               my($port,$iaddr) = sockaddr_in($paddr);
               my $name = gethostbyaddr($iaddr,AF_INET);
               spawn sub {
                        &gere_connection(*Client);
               };
           }

La fonction spawn reçoit la fonction anonyme vers laquelle le fork va s'effectuer. Le code du spawn provient de la documentation en ligne de Perl.

La fonction gere_connection envoie la bannière du serveur, puis lit dans $buffer le contenu de la commande envoyée. Puis on fait un test pour trouver la commande demandée.

L'appel d'une commande récupère dans un tableau de hachage les valeurs récupérées, et les envoie une par une avec un foreach.

Description du protocole

Le serveur fonctionne à base d'un protocole en mode texte:

telnet MoXWorld.esiea.fr 12345
[0.07][MoXWorld.esiea.fr] MoXWorld Agent Server v2.4.5b (C)Emmanuel PIERRE 1997
ceci est la bannière d'accueil du serveur, reflètant la charge de la machine hôte, puis son nom et enfin la version et le copyright.

Il est aussi prévu une identification du serveur avec le port écouté:

IDENT
IDENT= MoXWorld.esiea.fr:12345

On peut finir la connection par:

BYE
Connection closed by foreign host.

Il est prévu de récupérer les pages personnelles de la machine:

GET pages

darche  http://MoXWorld.esiea.fr:2001/~darche/index.html     Marc-Aurèle DARCHE

epierre	http://MoXWorld.esiea.fr:2001/~epierre/index.html    Emmanuel PIERRE

Les différents champs séparés par des tabulations, sont le login, l'adresse HTTP, et les informations du champ de login. La connection prend fin après le dernier envoi.

Algorithmiquement, il est d'abord recherché dans le répertoire de l'utilisateur un fichier .webredirect contenant l'URL complète si on veut rediriger sa page web sur une autre adresse. Sinon on recherche un fichier index.html dans le répertoire page.

La demande GET cv renvoie les C.V. sous le même format.

GET cv

epierre http://MoXWorld.esiea.fr:2001/~epierre/cv/index.html    Emmanuel PIERRE

Ici on recherche un fichier .webcvredirect contenant l'URL complète si on veut rediriger sa page web contenant le cv sur une autre adresse. Sinon on recherche un fichier index.html dans le répertoire cv.

Sous le même format, on peut récupérer les activités

GET activ

Serveur Web de l'ESIEA  http://www.esiea.fr/srv      http://www.esiea.fr/activ/minilogo.gif

Le troisième champs contient une image. Même demande pour GET proj, l'ensemble des projets des élèves.

Le fichier de redirection s'appelle .webactivredirect contenant l'URL complète. Sinon on recherche un fichier index.html dans le répertoire activ.

Puis on recherche dans activ le fichier minilogo.gif contenant le logo de l'activité.

Pour GET proj, le fichier .webprojlist peut contenir plusieurs projets, chacun sur une ligne, les champs Nom chemin-URL et URL-logo séparés par une tabulation. Sinon on peut utiliser un fichier .webprojname contenant le nom, sinon le fichier index.html dans proj, avec aussi un fichier minilogo.gif.

Il est même prévu de récupérer les dates anniversaires des élèves:

GET dob

03 18 1975      Emmanuel PIERRE http://www.esiea.fr/public_html/Emmanuel.PIERRE epierre@mail.esiea.fr
06 20 1974      Mauc-Aurèle DARCHE     http://www.esiea.fr/public_html/Marc-Aurele.DARCHE  darche@mail.esiea.fr

On obtient la date format jj mm aaaa, le nom, la page web et l'email.

On cherche dans le répertoire perso un fichier appelé DOB contenant la date de naissance au format jj mm aaaa séparés par des espaces.

Les clients

Les clients se connectent aux serveurs, et ajoutent les informations locales, trient, formattent et envoient le résultat au serveur.

La procédure est simple, on vérifie si l'hôte est joignable, puis on se connecte, on envoie la commande et on récupère le résultat.

La commande Connect_server prend en arguments le nom du serveur, le port à contacter, et la commande à emmettre.

sub Connect_server {

        my $server = $_[0];
        my $port   = $_[1];
        my $cmd    = $_[2];
	
	# Le serveur est-il présent ?
        return "Server Down" if not (pingecho($server,10));

	# Procédures de connection
        $sockaddr = 'S n a4 x8';

        chop($hostname = `hostname`);

        ($name, $aliases, $proto) = getprotobyname('tcp');

        ($name, $aliases, $port) = getservbyname($port, 'tcp')

        unless $port =~ /^\d+$/;

        ($name, $aliases, $type, $len, $thisaddr) = gethostbyname($hostname);

        ($name, $aliases, $type, $len, $thataddr) = gethostbyname($serveur);

        $this = pack($sockaddr, &AF_INET, 0, $thisaddr);
        $that = pack($sockaddr, &AF_INET, $port, $thataddr);

        if (!(socket(S, &PF_INET, &SOCK_STREAM, $proto))) {
                warn "socket: $!\n";
                return "socket: $!\n";
        }

        if (!(bind(S, $this))) {
                warn "bind: $!\n";
                return "bind: $!\n";
        }

        if (!(connect(S, $that))) {
                warn "connect: $!\n";
                return "connect: $!\n";
        }

	# Pas de buffering
        select(S); $| = 1; select(STDOUT);

        while (1) {
                sysread(S, $buffer, 512);
                chomp($buffer);
                $buffer=$cmd."\r\n";
                syswrite(S, $buffer, length($buffer));
                while ($buffer ne "") {
                        sysread(S, $buffer, 512);
                        $res1.= $buffer;
                }
                last;
        }
Ensuite, on transforme les données de façon plus utilisable:
@tab=split(m/\n/m,$res1);
        while (@tab) {
                $ad=pop(@tab);

                next if ($ad eq "\n");

                ($id,$str1)=($ad =~ /\s*(.+)\t(.+)/);
                
		next if ($id eq "");

                $hash{$id}=$ad;

        }
}

Conclusion

Un serveur portable est très utile pour relier "finement" un réseau interne d'informations.

Au niveau du client, toutes les présentations sont possibles sans contraintes, au niveau de l'utilisateur, il suffit de créer les répertoires correspondants à leurs besoins.

Là où se pose problème, est que tous les comptes des utilisateurs du systèmes sont systématiquement scannées à chaque demande. Cela charge le système.

La version en développement prévoit un cache des informations, avec éventuellement des commandes forçant la relecture du cache, et tenant compte de la charge processeur.

Les sources sont disponibles dans WebInside.tgz

counter
&copy; Copyright 1998-1999 Emmanuel PIERRE. Libre reproduction sous Licence LLDDv1.
Pour tout commentaire, webmaster@e-nef.com
Dernière MaJ

Valid XHTML 1.0!

No Patents/