|
|
|
|
Serveur réparti de données Web d'utilisateursIntroduction
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 serveurLe 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 protocoleLe 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 1997ceci 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 PIERRELes 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.gifLe 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.frOn 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 |
Pour tout commentaire, webmaster@e-nef.com Dernière MaJ 14/01/2018 |