Page suivante Page précédente Table des matières Serveur et interface d'administration PingOO 2: RFC du protocole PingOOp  

2. RFC du protocole PingOOp

2.1 Pourquoi pas Corba ?

Corba semblait le meilleur choix pour les applications à développer en utilisant les RPC et aussi l'interopérabilité entre le client et le serveur. Malheureusement, après maintes recherches lors des premières semaines du stage nous nous sommes confrontés à plusieurs problèmes lorsqu'est venu le temps de commencer le développement.

Côté Perl

Après de nombreuses recherches pour utiliser CORBA dans l'application serveur, nous avons trouvé Mico

MICO est l'acronyme de MICO Is CORBA
. Mico est une implémentation de Corba disponible librement et totalement conforme au standard CORBA 2.2. Cette implémentation a été écrite en C++. De plus, un module Perl, disponible sur les CPAN, fournit une interface aux appels C++.

Toutefois, il a été impossible de compiler le module Perl CORBA-MICO car il utilisait des fonctions inexistantes ou renommées. Il faut signaler que la version de ce module est toujours inférieure à un, ce qui signifie qu'il s'agit d'une version de développement.

Côté Java

D'autres problèmes, moins génants cette fois-ci, se sont aussi posés du coté java. Le premier est l'absence du compilateur idl2java pour le JDK 1.2 de LINUX. Cette absence aurait put être contournée par l'utilisation de idl2java qui est récupérable chez Sun pour les plates-formes Windows et Solaris.

D'autres sociétés proposaient des implémentations de CORBA (ou encore ORB

ORB : Object Request Broker, des fournisseurs d'objets distribués
mais celles-ci fonctionnaient uniquement avec la version 1.0 de Java ou n'étaient pas libres de droits.

Enfin, parmis les quelques ORB fonctionnels et gratuits , il y avait celui de Xerox : l'ORB ILU

ILU : Inter-Language Unification System ou système d'unification entre langages
. Mais les langages supportés (C++, ANSI C, Python, Java et Common Lisp) ne comprenaient pas Perl. On peut cependant noter qu'il aurait été possible faire fonctionner ILU avec un ORB d'une autre société en utilisant la norme IIOP si une implémentation de CORBA pour Perl avait existé.

2.2 XML-RPC

Qu'est-ce que XML-RPC?

Ce sont des spécifications et un ensemble d'implémentations qui permettent aux logiciels de tourner sur un ensemble disparate de systèmes pour appeler des fonctions au travers d'internet.

C'est un système d'appel de fonctions à distance (ou Remote Procedure Call (RPC)) qui utilise le protocole HTTP comme moyen de transport et XML comme format d'encodage.

Il est conçu pour être aussi simple que possible tout en permettant d'utiliser des structures de données complexes lors de la transmission, réception et utilisation.

Voici l'URL traitant de XML-RPC : http://www.xmlrpc.com/.

Pour le moment, les langages supportés sont nombreux (Perl, Java, Python, PHP...) mais il ne s'agit là encore que des versions de développement.

Il pourrait etre intéressant d'utiliser XML-RPC par la suite pour formatter les requêtes et les réponses.

2.3 Protocole de bas niveau

Format du message

Un message se compose dans l'ordre suivant :

Un message peut être soit signé, soit crypté. Il s'agit du mode de transmission. packet lu correspond au message crypté et/ou signé.

Signature des messages

Un message à envoyer peut être :

Le mode est déterminé par le contenu de la première ligne.
Dans le cas de la réception, les opérations sur le packet seront à effectuer à l'envers. Par exemple pour un message crypté, il sera décrypté puis sa signature sera vérifiée.

Mode crypté

Dans ce mode la première ligne du message est toujours : BEGIN-CRYPTED

Mode non-crypté

Dans ce mode la première ligne du message est toujours : BEGIN

2.4 Protocole de haut niveau

Il s'agit là des informations contenue dans le packet qui est signé et/ou crypté.

Format du message

Message d'envoi

Le message d'envoi se compose :

La première ligne se compose :

Exemple :


    pingoop://host:port/Session_Id/Request_Id/Module/Function
    

Les paramètres à envoyer peuvent être une valeur simple (ou chaîne), un tableau de valeur simples, un fichier ou bien une table de hachage ne pouvant contenir que des valeur simples ou d'autres tables de hachages du même type.

Message de réponse

Le message de réponse se compose de plusieurs champso requis suivis d'une liste de paramètres de retours. Si un des champs requies est absent le message est invalide.

Les paramètres

Ce sont les mêmes types et spécifications qu'il s'agisse de l'envoi ou de la réception. Les paramètres peuvent être une valeur simple (chaîne de caractères), un tableau de valeurs simples, un fichier ou bien une table de hachage contenant des valeurs simples ou des tables de hachages du même type.

Une ligne commançant par le champ :

A droite de ces mots clés, entre accolades, se trouve le nom du paramètre. Celui-ci est respecte l'expression régulière [a-zA-Z0-9_]+. Le nom d'un paramètre est unique. Pour les tables de hachage, à un hashkey{nom} correspondra un hashvalue{nom} et vice-versa.

Client : envoi de la requête


    pingoop://host:port/Session_Id/Request_Id/Module/Function 
    simple{key1}:encoded_value
    array{key2}:encoded_value1,encoded_value2 .... ,encoded_valueN 
    hashkey{key3}:key11.key12.key13.key1n,key21.key22...
    hashvalue{key3}:encoded_value1,encoded_value2
    end_param 
      

Serveur : envoi de la réponse


    request_id:request_id 
    accepted:[yes|no] 
    comment:explain why request is refused 
    simple{message_key1}:encoded_value
    array{message_key2}:encoded_value1,encoded_value2 .... ,encoded_valueN 
    hashkey{message_key3}:key11.key12.key13.key1n,key21.key22...
    hashvalue{message_key3}:encoded_value1,encoded_value2...,encoded_valueM 
    file{message_key5}:encoded_name,encoded_contain
    end_param
      

Connexion au serveur

Echange des clés publiques entre le client et le serveur.

Cette permière procédure de connexion permet au client et au serveur d'échanger leur clé publiques ainsi que de passer d'autres paramètres importants comme le nom de login ou le mot de passe.

Voici la liste des étapes lors de la connexion au serveur :

Déconnexion du client

Cet appel sert à deconnecter complètement le client du serveur. Cet appel devrait couper toutes les connexions qui existent entre les deux parties.

L'appel se fait sur la fonction Kernel/Disconnect. Après que cet appel ai eût lieu, il n'est plus possible d'écrire sur n'importe quelle socket reliant le client au serveur. Toutes les connexion doivent avoir été fermées.

Reconnexion au serveur

Le reconnexion a lieu lorsqu'il faut ouvrir un nouveau canal de communication entre le client et le serveur pour une application particulière. Ce procédé évite d'avoir à recommencer intégralement l'identification de l'utilisateur.

Déconnexion d'une application

Contrairement à l'appel de déconnexion précédent celui-ci ne ferme que le canal spécifique sur lequel l'appel est lancé.

Il s'agit d'un appel à la fonction Kernel/DisconnectChild qui prend en paramètre module le nom de l'application à fermer.

Codage en Base64

Les données transmises sont en partie encodées en base 64. En effet, chaque paramètre étant transcrit sur une seule ligne, les différents éléments la constituant devaient être facilement reconnaissables.

Exemple :


  request_id:OQ==
  accepted:eWVz
  comment:
  array{applications}:VUdN,U2h1dGRvd24=,TWFpbFNN,QmFja3Vw,TWFpbnRlbmFuY2U=
  end_param
  

Types de données transférées

Le protocole défini à ce jour permet de transmettre et recevoir :

Les valeurs simples


   simple{key}:b64value
    

où :

Les tableaux


   array{key}:b64value1,b64value2,...,b64valueN
     

où :

Les fichiers


   file{key}:b64value1,b64value2
   ou
   file{key}:b64value1
     

où :

Les hachages


   hashkey{key}:b64path1,b64path2,...,b64pathN
   hashvalue{key}:b64value1,b64value2,...,b64valueN
     

où :

Si la valeur associée à un chemin est vide, cette valeur est une chaîne vide et non une table de hachage vide.