R
PC-Tcl es una herramienta que permite la ejecución remota de comandos en intérpretes situados en máquinas conectadas por redes que soporten el protocolo TCP/IP. Está realizado exclusivamente en Tcl y funciona en versiones iguales o superiores a la 7.5.Está basada en Tcl-RPC realizada por Michael Shorter. Su parecido con el original es ahora prácticamente inexistente. Sobre ella se ha recortado y ampliado la especificación para adecuarlo a las necesidades del proyecto GEDOP.
Llamadas a Procedimientos Remotos (RPC)
Como su propio nombre indica, una llamada a procedimiento remoto (RPC) es una llamada a un procedimiento que existe y se ejecutará en una máquina remota.
Los RPC ocultan la comunicación entre procesos, de forma que parezca una llamada a un procedimiento absolutamente normal, es decir, permite a un programa comunicarse con sus partes remotas utilizando el mismo mecanismo (llamada a procedimiento) que utiliza para comunicarse con las locales. Un mecanismo RPC ideal permitiría la invocación de procedimientos sin conocer si son remotos o locales, pero en la práctica, los RPC no son tan transparentes.
Instalación
Los pasos para instalarlo son los siguientes:
Para utilizar este paquete, se debe de incluir en el auto_path el directorio donde se encuentra la extensión y cargarla mediante el comando:
Creación de un servidor primario
Se suministra un script para la generación de un servidor principal en el fichero ser.tcl. Se debe modificar la primera línea adecuándola a la situación del intérprete en el sistema.
Se debe pasar al script como argumento el puerto al que atenderá el servidor. Se lanza de la siguiente forma:
En UNIX:
En Windows 95
Donde 10001 es el número del puerto (Es un número cualquiera).
Cargar la extensión
La extensión se engloba en un package que hay que proporcionar al intérprete. Una vez incorporado a la variable auto_path la localización de la extensión, se incorpora con el comando package require Tcl_RPC, que devolverá la versión de RPC-Tcl que se esté utilizando.
Comandos
Envío de comandos de forma remota
Se implementa en dos pasos:
Envío del texto del comando
El envío del texto del comando se efectúa mediante el comando RPC al comando RPC, al que se le pasa siempre como primer argumento el comando a ejecutar, y después los parámetros de configuración en forma de parejas argumento-valor.
La sustitución de variables y comandos se debe gestionar con mucho cuidado para obtener el resultado deseado. Si el texto del comando se engloba entre comillas, la sustitución de las variables y la ejecución de comandos entre corchetes se efectúa en el cliente. Si se sitúa entre llaves, se realiza en el servidor. Si se desea combinar ambas posibilidades, se englobará todo el comando entre comillas y se protegerán con backslash los caracteres que se desea no sean leídos por el intérprete en el cliente.
Si el comando a ejecutar se sitúa entre comillas, se efectuará la sustitución de los valores de las variables y la ejecución de los comandos entre corchetes en el cliente, y si se sitúa entre llaves, se hará en el sevidor.
Si las opciones no son asignadas, se toman los valores por defecto. Los valores por defecto se pueden modificar mediante el comando RPC_configure.
Tabla A-1. Opciones del comando RPC.
|
-type with_result all_ack only_result
only_ack_send none |
Tipo de gestión del resultado. Se confirma la recepción del comando y se recupera el resultado Se confirma la recepción del comando y la ejecución en el servidor Se recupera el resultado sin confirmar la recepción del texto del comando Se recupera sólo la confirmación de ejecución Se confirma únicamente la recepción del texto del comando. No confirmación de llegada ni resultado |
|
-port |
.Puerto del servidor al que se envía el comando |
|
-host |
.Máquina en la que se sitúa el servidor. |
El objetivo de la opción type es doble. Por una parte se elige el nivel de seguridad que se desea, por otra, se permite evitar interactuar con la cola de eventos.
Si se espera recibir el resultado de la ejecución, se devuelve un identificador de petición que será utilizado para identificarla. El identificador será una cadena de texto (versión 2.0), o un valor numérico (version 1.9).
Se pueden enviar tantos comandos como se desee sin recoger el resultado de los anteriores. Pueden ser de tipos diferentes, y sus resultados pueden recogerse en cualquier orden.
Recepción del resultado
Para recibir el resultado se pueden emplear dos comandos. De forma habitual se empleará el comando
Este comando utiliza eventos. Si no se desea que se utilice la cola de eventos, se deberá utilizar
Se le pasa de forma obligatoria como primer argumento de entrada el identificador del comando RPC enviado al servidor. El segundo, en caso de existir, es el número de milisegundos que se esperan antes de devolver el control. Caso de no obtener el resultado, se devuelve el carácter 0x16. La ejecución se detiene hasta que se obtiene el resultado o finaliza la cuenta de los milisegundos. Por ejemplo:
Esto devolvería el identificador del comando remoto, por ejemplo 7
Para recuperar el resultado:
Esto tendría que devolver 123, si no se recibiese en 10 segundos generaría un error.
Se le pasa como argumento un identificador. Comprueba que ha recibido el resultado. Si es así lo devuelve; si no, devuelve el valor nulo (por defecto, el caracter ASCII 16).
No se utilizan eventos, es el usuario el que debe gestionar la espera hasta la recepción del resultado.
Valores por defecto de la configuración
Para asignar los valores por defecto de la configuración se utiliza el comando RPC_configure. Se le pasan las parejas de argumento_valor mostradas para el comando RPC. Si no se le pasan argumentos, devuelve una lista con los actuales valores por defecto.
Creación de servidores dedicados
Es posible crear desde el cliente un nuevo servidor, a partir del servidor primario, que le atienda de forma exclusiva. Para ello se ejecuta, mediante un RPC, el comando make_server. El resultado del comando es el puerto que escucha el servidor dedicado. Por tanto siempre se ejecutará con el tipo with_result. Un ejemplo es el siguiente:
Transmisión de ficheros
La transmisión de ficheros se configura de la misma forma que el comando RPC. Los comandos son:
Trae al cliente el fichero remoto
Copia en el servidor el fichero local
Ambos comandos generan un error si la transmisión del fichero no es completa, y refrescan durante su ejecución la cola de eventos.
Cierre de servidores
Un servidor se cierra mediante el comando RPC_server_shutdown. Se configura con los valores de server y port de forma idéntca al comando RPC.
Traza
Se puede generar una traza de las operaciones efectuadas asignando cualquier valor a la variable global RPC_DEBUG. Para desactivar esta traza, bastará con borrar dicha variable.
Ejemplo de uso
Para este ejemplo se va asuponer que se desea ejecutar desde un Pc con Windows 95, procedimientos existentes en una máquina UNIX.
Para ello se comenzará creando un servidor primario en la máquina UNIX:
El haber puesto una "&" al final de la segunda línea hace que este proceso se quede en background, recuperarndo de inmediato el control de la consola el usuario, que de otra forma quedaría bloqueada por el proceso.
En la parte correspondiente a Windows 95:
Se decide a qué host y a qué puerto se conectará:
Se crea un servidor dedicado:
Se espera cierto tiempo hasta que se ha creado el servidor, para ello se hace un bucle:
A partir de aquí ya pueden empezar a ejecutarse los procedimientos remotos: