Tabla de Contenidos

Módulo rpc

Este módulo permite que en Uma se sirva una interfaz RPC usando un protocolo propio muy sencillo, no usa HTTP. De esta forma es fácilmente posible que clientes muy simples realicen llamadas a Uma mandando una lista de parámetros y obteniendo como resultado otra lista.

Comunicándose con Uma (protocolo cliente)

El primer paso a realizar por parte del cliente será loguearse, para esto deberá establecer una conexión TCP al puerto 9876 de la máquina ejecutando Uma.

Antes que nada se realizará obligatoriamente el proceso de autenticación.

Una vez concluido se seguirá normalmente con el protocolo, lo cual implica que el cliente mandará un mensaje (respetando el formato establecido) e inmediatamente el servidor le responderá con otro mensaje (usando el mismo formato), repitiéndose hasta que uno de los dos pares (cliente o servidor) decida cortar la conexión.

Salvo en el proceso de autenticación, los mensajes del servidor serán única y exclusivamente las respuestas a los mensajes del cliente.

Autentificación

Al conectarse, el cliente recibirá inmediatamente un texto de la siguiente forma:

AUTH token

donde token es una cadena alfanumérica, o visto más genéricamente es lo que se llama un mensaje.

En respuesta a este texto, el cliente deberá calcular el SHA-1 del token concatenado por un «-» y el password de RPC de Uma. El resultado en hexadecimal del hash deberá ser mandado con la siguiente línea:

AUTH resultado

donde obviamente resultado es el resultado del hash.

Si la contraseña es incorrecta el servidor cortará inmediatamente la conexión.

Si la contraseña es correcta NO se avisará al cliente.

Formato de mensajes

Los mensajes son una lista de elementos separada por espacios en blanco (únicamente el caracter 32 de ASCII).

Cada elemento deberá respetar la siguiente sintaxis en EBNF:

elemento ::=
  { ? todos los caracteres ? - ( '\' | lf | cr | '"' | ' ' )
  | '"',
    { ? todos los caracteres ? - ( '\' | lf | cr | '"' )
    | '\', ( '\' | 'n' | 'r' | '"' )
    },
    '"'
  };
cr ::= ? retorno de carro ?; (* caracter CR del ASCII *)
lf ::= ? salto de línea ?; (* caracter LF del ASCII *)
mensaje ::= { elemento | ' ' }, cr, lf;

Sí, la descripción en EBNF de la sintaxis no tiene errores, y sí, se permiten elementos seguidos y cosas del estilo de «Hola"mu"nd""o».

Creando un handler del lado del servidor

El módulo RPC manda al sistema de eventos todas las peticiones que reciba por parte de los clientes por medio de ::event::generate. Una forma simple de agregar un nuevo procedimiento RPC en Uma es usando entonces ::event::add, a continuación un ejemplo:

 
::event::add -module pepito -on rpc.PINGO -command ::modules::pepito::on_rpc_PINGO
::event::add -module pepito -on rpc.CONTAR -command ::modules::pepito::on_rpc_CONTAR
 
namespace eval ::modules::pepito {
 
...
 
  proc on_rpc_PINGO {channel args} {
    puts "PONGO: Hola"
    return PONGO
  }
  proc on_rpc_CONTAR {channel args} {
    return [list OK hay [llength $args] opciones] ;# además del nombre del procedimiento
  }
 
...