source: tol/tolbaseBLT/lib/rmtps_client/rmtps_client.tol

devel
Last change on this file was 56ade3b, checked in by Jorge Pérez <josp.jorge@…>, 10 years ago

fixes #1932, se ha creado la rama trunk/tolbaseBLT copia de trunk/tolbase

git-svn-id: ​https://www.tol-project.org/svn/tolp/trunk@7330 be4846ae-f051-483a-831f-b64e7d08527f

  • Property mode set to 100644
File size: 8.5 KB
RevLine 
[56ade3b]1/* -*- mode: c++ -*- */
2/**
3 * rmtps_client.tol --
4 *
5 */
6
7/**
8 *  RemotePing -- Verifica si un servidor RMTPS esta escuchando
9 *
10 *  Argumentos:
11 *
12 *    Host: host que aloja al servidor RMTPS
13 *   
14 *    Port: puerto donde el servidor RMPTS esta escuchando
15 *
16 *  Resultado:
17 * 
18 */
19Real RemotePing(Text Host, Real Port)
20{
21
22  Set result = Tcl_Eval("::rmtps_client::server_ping "+Host+" "+
23                        FormatReal(Port, "%.0lf"));
24  Real If(result["status"], Eval(result["result"]),{
25      WriteLn("RemotePing: "+result["result"],"E");
26      Real 0
27    })
28};
29PutDescription("Verifica si un servidor RMTPS_SERVER esta ejecutandose en un "
30               "ordenador remoto y esta escuchando peticiones."
31               "Retorna 1 si el servidor esta ejecutandose o 0 en caso "
32               "contrario",
33               RemotePing);
34
35/**
36 *  RemoteExec -- Ejecuta un comando en remoto
37 *
38 *  Argumentos:
39 *
40 *    Host: host que aloja al servidor RMTPS
41 *   
42 *    Port: puerto donde el servidor RMPTS esta escuchando
43 *
44 *    CmdLine:
45 *
46 *  Resultado:
47 * 
48 */
49Real RemoteExec(Text Host, Real Port, Text CmdLine)
50{
51
52  Set result = Tcl_Eval("::rmtps_client::ps_run "+Host+" "+
53                        FormatReal(Port, "%.0lf")+
54                        " {"+CmdLine+"}");
55  Real If(result["status"], Eval(result["result"]),{
56      WriteLn("RemoteExec: "+result["result"],"E");
57      Real 0
58    })
59};
60PutDescription("Ejecuta en un ordenador remoto un comando dado en CmdLine. "
61               "CmdLine tambien contiene los argumentos separados por "
62               "espacios. "
63               "Retorna el PID del proceso ejecutado o 0 si algun error "
64               "ocurrio durante el intento de ejecucion del comando. "
65               "Necesita que un servidor RmtPS_Server este escuchando en el "
66               "puerto Port del ordenador Host",
67               RemoteExec);
68
69/**
70 *  RemoteTOL -- Invoca un proceso TOL remoto
71 *
72 *  Argumentos:
73 *
74 *    Host: host que aloja al servidor RMTPS
75 *   
76 *    Port: puerto donde el servidor RMPTS esta escuchando
77 *
78 *    Args:
79 *
80 *  Resultado:
81 *
82 *    PID del proceso TOL lanzado o 0 si algun error ha ocurrido
83 * 
84 */
85Real RemoteTOL(Text Host, Real Port, Set Args )
86{
87
88  Text cmd = "::rmtps_client::ps_runtol";
89  Text port = FormatReal(Port, "%.0lf");
90  Text project = Args[ 1 ];
91  Set tolargs = Args[ 2 ];
92  Set cmdln_args = If( project=="", Copy( Empty ),
93                       [[ "-project", project ]] );
94  Set EvalSet( tolargs, Real( Set item ) {
95      Text type = Name( item[ 1 ] );
96      Case( type=="expr", {
97          Set Append( cmdln_args, [[ "-expr", item[ 1 ] ]] );
98          Real 0
99        },
100        type=="file", {
101          Real idx_rel = FindIndexByName( item, "relative" );
102          Set Append( cmdln_args,
103                      If( idx_rel, {
104                          Set [[ "-relative", item[ idx_rel ],
105                                 "-file", item[ 1 ] ]]
106                        }, {
107                          Set [[ "-file", item[ 1 ] ]]
108                        } ) );
109          Real 0
110        } ,
111        1, {
112          Warning( "RemoteTOL: tipo de elemento desconocido '"
113                   + type + "' debe "
114                   "ser 'expr' o 'file'" );
115          Real 0
116        } );
117        Real 0
118    } );
119  Set tcl_args = [[ cmd, host, port ]] << [[ cmdln_args ]];
120  //Set View( tcl_args, "Std" );
121  Set result = Tcl_EvalEx( tcl_args );
122  Real If(result["status"], Eval(result["result"]),{
123      WriteLn("RemoteTOL: "+result["result"],"E");
124      Real 0
125    })
126};
127PutDescription("Ejecuta en proceso TOL remoto. Args es un conjunto con los "
128               "argumentos a pasar a TOL en la linea de comandos.\n"
129               "Los elementos de Args son interpretados por el servidor de "
130               "procesos TOL y se traducen en argumentos de linea de comandos "
131               "al proceso TOL que se invoca. Los argumentos son:\n"
132               "\tText project = nombre del proyecto que se cargara\n"
133               "\tSet tolargs = conjunto de elementos a evaluar.\n"
134               "El conjunto tolargs contiene expresiones TOL o archivos a "
135               "evaluar en la linea de comandos. Cada uno de los "
136               "elementos es un conjunto con los siguientes elementos con "
137               "nombre:\n"
138               "\tText tolargs[1] : contiene la expresion o el nombre del "
139               "\tarchivo a evaluar. El nombre de tolargs[1] debe ser expr o "
140               "\tfile. Si el nombre es expr el valor se considera una "
141               "\texpresion TOL. Si el nombre es file el valor se considera "
142               "\tel nombre de un archivo a evaluar."
143               "\tText relative = nombre de proyecto respecto al cual se "
144               "\tcargara el archivo TOL. Este campo es opcional y solo se "
145               "\tconsidera cuando el tolargs[1] es un archivo. Por omision "
146               "\tel archivo se toma trelativo al argumento project.\n\n"
147               "Retorna el PID del proceso TOL ejecutado o 0 si algun error "
148               "ocurrio durante el intento de ejecucion. "
149               "Necesita que un servidor RmtPS_Server este escuchando en el "
150               "puerto Port del ordenador Host",
151               RemoteTOL);
152
153/**
154 *  RemoteAlive -- Verifica, en remoto, si un proceso continua vivo
155 *
156 *  Argumentos:
157 *
158 *    Host: host que aloja al servidor RMTPS
159 *   
160 *    Port: puerto donde el servidor RMPTS esta escuchando
161 *
162 *    PID: pid del proceso a verificar
163 *
164 *  Resultado:
165 * 
166 */
167Real RemoteAlive(Text Host, Real Port, Real PID)
168{
169  Set result = Tcl_Eval("::rmtps_client::ps_is_active "+Host+" "+
170                        FormatReal(Port, "%.0lf")+
171                        " " + FormatReal(PID, "%.0lf"));
172  Real If(result["status"], {
173      Real alive = Eval(result["result"]);
174      If(Eq(alive,-1), {
175          WriteLn("hubo un error en ::rmtps_server::on_ps_alive, "
176                  "rmtps_client no lo esta reportando por ahora. "
177                  "Mientras tanto puede chequear el log del servidor", "W");
178          Real 0
179        }, alive)
180    }, {
181      WriteLn("RemoteAlive: "+result["result"],"E");
182      Real 0
183    })
184};
185PutDescription("Verifica si un proceso dado por su PID continua vivo en un "
186               "ordenador remoto. "
187               "Retorna 1 si el proceso esta en la lista de procesos activos, "
188               "0 si el proceso no esta activo o -1 si hubo un error durante "
189               "la operacion remota, por ejemplo: PID invalido. "
190               "Necesita que un servidor RmtPS_Server este escuchando en el "
191               "puerto Port del ordenador Host",
192               RemoteAlive);
193
194/**
195 *  RemoteKill -- Termina la ejecucion de un proceso activo
196 *
197 *  Argumentos:
198 *
199 *    Host: host que aloja al servidor RMTPS
200 *   
201 *    Port: puerto donde el servidor RMPTS esta escuchando
202 *
203 *    PID: pid del proceso a finalizar
204 *
205 *  Resultado:
206 * 
207 */
208Real RemoteKill(Text Host, Real Port, Real PID)
209{
210  Set result = Tcl_Eval("::rmtps_client::ps_kill "+Host+" "+
211                        FormatReal(Port, "%.0lf")+
212                         " " + FormatReal(PID, "%.0lf"));
213  Real If(result["status"], {
214      Real killed = Eval(result["result"]);
215      If(Eq(killed,-1), {
216          WriteLn("hubo un error en ::rmtps_server::on_ps_kill, "
217                  "rmtps_client no lo esta reportando por ahora. "
218                  "Mientras tanto puede chequear el log del servidor","W");
219          Real 0
220        }, killed)
221    }, {
222      WriteLn("RemoteKill: "+result["result"],"E");
223      Real 0
224    })
225};
226PutDescription("Termina la ejecucion de un proceso, dado por su PID, en un "
227               "ordenador remoto. "
228               "Retorna 1 si el proceso se pudo finalizar o 0 si ocurrio un "
229               "error, por ejemplo: PID invalido, o no hay permisos "
230               "suficientes. "
231               "Necesita que un servidor RmtPS_Server este escuchando en el "
232               "puerto Port del ordenador Host",
233               RemoteKill);
234
235/**
236 *  RemoteProcessInitTcl -- Carga el codigo tcl del cliente de RmtPS_Client
237 *
238 *  Carga rmtps_client.tcl. Si durante la carga retorna con error se
239 *  retorna 0 y un mensaje de error se muestra en la salida
240 *  estandar. Si la carga fue satisfactoria se retorna 1.
241 * 
242 *  Argumentos:
243 *
244 *    path - camino del archivo rmtps_client.tcl
245 *
246 *  Resultado:
247 *
248 *   
249 */
250Real RemoteProcessInitTcl(Text path)
251{
252  Set result = Tcl_Eval("source {"+path+"}");
253  //Set View(result, "Std");
254  Real If(result["status"], 1, {
255      WriteLn("RemoteProcessInit: "+result["result"],"E");
256      Real 0
257    })
258};
259
260/*Real RemoteProcessInitTcl(GetAbsolutePath("rmtps_client.tcl"));*/
Note: See TracBrowser for help on using the repository browser.