source: admin/Sources/Clients/ogAdmClient/sources/ogAdmClient.c @ 72e876e

918-git-images-111dconfigfileconfigure-oglivegit-imageslgromero-new-oglivemainmaint-cronmount-efivarfsmultivmmultivm-ogboot-installerogClonningEngineogboot-installer-jenkinsoglive-ipv6test-python-scriptsticket-301ticket-50ticket-50-oldticket-577ticket-585ticket-611ticket-612ticket-693ticket-700ubu24tplunification2use-local-agent-oglivevarios-instalacionwebconsole3
Last change on this file since 72e876e was 72e876e, checked in by alonso <alonso@…>, 11 years ago

git-svn-id: https://opengnsys.es/svn/branches/version1.0@4167 a21b9725-9963-47de-94b9-378ad31fedc9

  • Property mode set to 100644
File size: 76.6 KB
Line 
1// ********************************************************************************************************
2// Cliernte: ogAdmClient
3// Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla
4// Fecha Creación: Marzo-2010
5// Fecha Última modificación: Abril-2010
6// Nombre del fichero: ogAdmClient.c
7// Descripción :Este fichero implementa el cliente general del sistema
8// ********************************************************************************************************
9#include "ogAdmClient.h"
10#include "ogAdmLib.c"
11//________________________________________________________________________________________________________
12//      Función: tomaConfiguracion
13//
14//      Descripción:
15//              Lee el fichero de configuración del servicio
16//      Parámetros:
17//              filecfg : Ruta completa al fichero de configuración
18//      Devuelve:
19//              TRUE: Si el proceso es correcto
20//              FALSE: En caso de ocurrir algún error
21//________________________________________________________________________________________________________
22BOOLEAN tomaConfiguracion(char* filecfg)
23{
24        char modulo[] = "tomaConfiguracion()";
25
26        if (filecfg == NULL || strlen(filecfg) == 0) {
27                errorLog(modulo, 1, FALSE); // Fichero de configuración del cliente vacío
28                return (FALSE);
29        }
30        FILE *fcfg;
31        int lSize;
32        char * buffer, *lineas[MAXPRM], *dualparametro[2];
33        int i, numlin, resul;
34
35        fcfg = fopen(filecfg, "rt");
36        if (fcfg == NULL) {
37                errorLog(modulo, 2, FALSE); // No existe fichero de configuración del cliente
38                return (FALSE);
39        }
40
41        fseek(fcfg, 0, SEEK_END);
42        lSize = ftell(fcfg); // Obtiene tamaño del fichero.
43        rewind(fcfg);
44        buffer = (char*) reservaMemoria(lSize+1); // Toma memoria para el buffer de lectura.
45        if (buffer == NULL) { // No hay memoria suficiente para el buffer
46                errorLog(modulo, 3, FALSE);
47                return (FALSE);
48        }
49        lSize=fread(buffer, 1, lSize, fcfg); // Lee contenido del fichero
50        buffer[lSize]=CHARNULL;
51        fclose(fcfg);
52
53        /* Inicializar variables globales */
54        servidoradm[0]=CHARNULL;
55        puerto[0] = CHARNULL;
56        pathinterface[0]=CHARNULL;
57        urlmenu[0]=CHARNULL;
58        urlmsg[0]=CHARNULL;
59
60        numlin = splitCadena(lineas, buffer, '\n');
61        for (i = 0; i < numlin; i++) {
62                splitCadena(dualparametro, lineas[i], '=');
63
64                resul = strcmp(StrToUpper(dualparametro[0]), "SERVIDORADM");
65                if (resul == 0)
66                        strcpy(servidoradm, dualparametro[1]);
67
68                resul = strcmp(StrToUpper(dualparametro[0]), "PUERTO");
69                if (resul == 0)
70                        strcpy(puerto, dualparametro[1]);
71
72                resul = strcmp(StrToUpper(dualparametro[0]), "PATHINTERFACE");
73                if (resul == 0)
74                        strcpy(pathinterface, dualparametro[1]);
75
76                resul = strcmp(StrToUpper(dualparametro[0]), "URLMENU");
77                if (resul == 0)
78                        strcpy(urlmenu, dualparametro[1]);
79
80                resul = strcmp(StrToUpper(dualparametro[0]), "URLMSG");
81                if (resul == 0)
82                        strcpy(urlmsg, dualparametro[1]);
83        }
84
85        if (servidoradm[0] == CHARNULL) {
86                liberaMemoria(buffer);
87                errorLog(modulo,4, FALSE); // Falta parámetro SERVIDORADM
88                return (FALSE);
89        }
90
91        if (puerto[0] == CHARNULL) {
92                liberaMemoria(buffer);
93                errorLog(modulo,5, FALSE); // Falta parámetro PUERTO
94                return (FALSE);
95        }
96        if (pathinterface[0] == CHARNULL) {
97                liberaMemoria(buffer);
98                errorLog(modulo,56, FALSE); // Falta parámetro PATHINTERFACE
99                return (FALSE);
100        }
101
102        if (urlmenu[0] == CHARNULL) {
103                liberaMemoria(buffer);
104                errorLog(modulo,89, FALSE); // Falta parámetro URLMENU
105                return (FALSE);
106        }
107        if (urlmsg[0] == CHARNULL) {
108                liberaMemoria(buffer);
109                errorLog(modulo,90, FALSE); // Falta parámetro URLMSG
110                return (FALSE);
111        }
112        liberaMemoria(buffer);
113        return (TRUE);
114}
115//______________________________________________________________________________________________________
116// Función: FinterfaceAdmin
117//
118//       Descripción:
119//              Esta función es la puerta de comunicación entre el módulo de administración y el motor de clonación.
120//              La Aplicación de administración utiliza una interface para ejecutar funciones del motor de clonación;
121//              esta interface llamará a la API del motor con lo que cambiando el comportamiento de esta interface
122//              podremos hacer llamadas a otras API de clonación y de esta manera probar distintos motores.
123//
124//      Parámetros:
125//              - script: Nombre del módulo,función o script de la interface
126//              - parametros: Parámetros que se le pasarán a la interface
127//              - salida: Recoge la salida que genera la llamada a la interface
128
129//      Devuelve:
130//              Código de error de la ejecución al módulo , función o script de la interface
131//
132//      Especificaciones:
133//              El parámetro salida recoge la salida desde un fichero que se genera en la ejecución del script siempre que
134//              sea distinto de NULL, esto es, si al llamar a la función este parámetro es NULL no se recogerá dicha salida.
135//              Este fichero tiene una ubicación fija: /tmp/_retinterface
136//______________________________________________________________________________________________________
137
138int FinterfaceAdmin( char *script,char* parametros,char* salida)
139{
140    FILE *f;
141        int lSize,nargs,i,resul;
142    char msglog[LONSTD],*argumentos[MAXARGS];
143        char modulo[] = "FinterfaceAdmin()";
144
145
146        if (ndebug>= DEBUG_MEDIO) {
147                sprintf(msglog, "%s:%s", tbMensajes[8], script);
148                infoDebug(msglog);
149        }
150
151        /* Crea matriz de los argumentos */
152        nargs=splitCadena(argumentos,parametros,32);
153        for(i=nargs;i<MAXARGS;i++){
154                argumentos[i]=NULL;
155        }
156
157        /* Muestra matriz de los argumentos */
158        for(i=0;i<nargs;i++){
159                if (ndebug>= DEBUG_ALTO) {
160                        sprintf(msglog, "%s: #%d-%s", tbMensajes[9],i+1,argumentos[i]);
161                        infoDebug(msglog);
162                }
163        }
164        /* Elimina fichero de retorno */
165        if(salida!=(char*)NULL){
166                f = fopen("/tmp/_retinterface_","w" );
167                if (f==NULL){  // Error de eliminación
168                        scriptLog(modulo,10);
169                        resul=8;
170                        scriptLog(modulo,resul);
171                        return(resul);
172                }
173                fclose(f);
174        }
175        /* Compone linea de comando */
176        if(parametros){
177                strcat(script," ");
178                strcat(script,parametros);
179        }
180        /* LLamada función interface */
181        resul=system(script);
182        if(resul){
183                scriptLog(modulo,10);
184                scriptLog(modulo,resul);
185                return(resul);
186        }
187        /* Lee fichero de retorno */
188        if(salida!=(char*)NULL){
189                f = fopen("/tmp/_retinterface_","rb" );
190                if (f==NULL){ // Error de apertura
191                        scriptLog(modulo,10);
192                        resul=9;
193                        scriptLog(modulo,resul);
194                        return(resul);
195                }
196                else{
197                        fseek (f ,0,SEEK_END);  // Obtiene tamaño del fichero.
198                        lSize = ftell (f);
199                        rewind (f);
200                        if(lSize>LONGITUD_SCRIPTSALIDA){
201                                scriptLog(modulo,10);
202                                resul=11;
203                                scriptLog(modulo,resul);
204                                return(resul);
205                        }
206                        fread (salida,1,lSize,f);       // Lee contenido del fichero
207                        rTrim(salida);
208                        fclose(f);
209                }
210        }
211        /* Muestra información de retorno */
212        if(salida!=(char*)NULL){
213                if(ndebug>2){
214                        sprintf(msglog,"Información devuelta %s",salida);
215                        infoDebug(msglog);
216                }
217        }
218        return(resul);
219}
220//______________________________________________________________________________________________________
221// Función: interfaceAdmin
222//
223//       Descripción:
224//              Esta función es la puerta de comunicación entre el módulo de administración y el motor de clonación.
225//              La Aplicación de administración utiliza una interface para ejecutar funciones del motor de clonación;
226//              esta interface llamará a la API del motor con lo que cambiando el comportamiento de esta interface
227//              podremos hacer llamadas a otras API de clonación y de esta manera probar distintos motores.
228//
229//      Parámetros:
230//              - script: Nombre del módulo,función o script de la interface
231//              - parametros: Parámetros que se le pasarán a la interface
232//              - salida: Recoge la salida que genera la llamada a la interface
233
234//      Devuelve:
235//              Código de error de la ejecución al módulo , función o script de la interface
236//
237//      Especificaciones:
238//              El parámetro salida recoge la salida desde el procedimiento hijo que se genera en la ejecución de éste
239//              siempre que sea distinto de NULL, esto es, si al llamar a la función este parámetro es NULL no se
240//              recogerá dicha salida.
241//______________________________________________________________________________________________________
242
243int interfaceAdmin( char *script,char* parametros,char* salida)
244{
245        int  descr[2];  /* Descriptores de E y S de la turbería */
246        int  bytesleidos;       /* Bytes leidos en el mensaje */
247        int estado;
248        pid_t  pid;
249        char buffer[LONBLK];    // Buffer de lectura de fichero
250        pipe (descr);
251        int i,nargs,resul;
252        int lon;                // Longitud de cadena
253        char msglog[LONSUC];    // Mensaje de registro de sucesos
254        char *argumentos[MAXARGS];
255        char modulo[] = "interfaceAdmin()";
256        if (ndebug>= DEBUG_MEDIO) {
257                sprintf(msglog, "%s:%s", tbMensajes[8], script);
258                infoDebug(msglog);
259        }
260
261        /* Crea matriz de los argumentos */
262        nargs=splitCadena(argumentos,parametros,32);
263        for(i=nargs;i<MAXARGS;i++){
264                argumentos[i]=NULL;
265        }
266        /* Muestra matriz de los argumentos */
267        for(i=1;i<nargs;i++){
268                if (ndebug>= DEBUG_ALTO) {
269                        // Truncar la cadena si es mayor que el tamaño de la línea de log.
270                        sprintf(msglog, "%s: #%d-", tbMensajes[9], i+1);
271                        lon = strlen (msglog);
272                        if (lon + strlen (argumentos[i]) < LONSUC) {
273                                strcat (msglog, argumentos[i]);
274                        }
275                        else
276                        {
277                                strncat (msglog, argumentos[i], LONSUC - lon - 4);
278                                strcat (msglog, "...");
279                        }
280                        infoDebug(msglog);
281                }
282        }
283
284        if((pid=fork())==0)
285        {
286                //_______________________________________________________________
287
288                /* Proceso hijo que ejecuta la función de interface */
289
290                close (descr[LEER]);
291                dup2 (descr[ESCRIBIR], 1);
292                close (descr[ESCRIBIR]);
293                resul=execv(script,argumentos);
294                //resul=execlp (script, script, argumentos[0],argumentos[1],NULL);
295                exit(resul);
296
297                /* Fin de proceso hijo */
298                //_______________________________________________________________
299        }
300        else
301        {
302                //_______________________________________________________________
303
304                /* Proceso padre que espera la ejecución del hijo */
305
306                if (pid ==-1){ // Error en la creación del proceso hijo
307                        scriptLog(modulo,10);
308                        resul=13;
309                        scriptLog(modulo,resul);
310                        return(resul);
311                }
312                close (descr[ESCRIBIR]);
313                bytesleidos = read (descr[LEER], buffer, LONBLK-1);
314                while(bytesleidos>0){
315                        if(salida!=(char*)NULL){ // Si se solicita retorno de información...
316                                buffer[bytesleidos]='\0';
317                                // Error si se supera el tamaño máximo de cadena de salida.
318                                if(strlen(buffer)+strlen(salida)>LONGITUD_SCRIPTSALIDA){
319                                        scriptLog(modulo,10);
320                                        resul=11;
321                                        scriptLog(modulo,resul);
322                                        return(resul);
323                                }
324                                rTrim(buffer);
325                                strcat(salida,buffer);
326                        }
327                        bytesleidos = read (descr[LEER], buffer, LONBLK-1);
328                }
329                close (descr[LEER]);
330                //kill(pid,SIGQUIT);
331                waitpid(pid,&estado,0);
332                resul=WEXITSTATUS(estado);
333                if(resul){
334                        scriptLog(modulo,10);
335                        scriptLog(modulo,resul);
336                        return(resul);
337                }
338                /* Fin de proceso padre */
339                //_______________________________________________________________
340        }
341
342        /* Muestra información de retorno */
343        if(salida!=(char*)NULL){
344                if(ndebug>2){
345                        // Truncar la cadena si es mayor que el tamaño de la línea de log.
346                        strcpy(msglog,"Informacion devuelta ");
347                        lon = strlen (msglog);
348                        if (lon + strlen (salida) < LONSUC) {
349                                strcat (msglog, salida);
350                        }
351                        else
352                        {
353                                strncat (msglog, salida, LONSUC-lon-4);
354                                strcat (msglog, "...");
355                        }
356                        infoDebug(msglog);
357                }
358        }
359        return(resul);
360}
361//______________________________________________________________________________________________________
362// Función: scriptLog
363//
364//      Descripción:
365//              Registra los sucesos de errores de scripts en el fichero de log
366//      Parametros:
367//              - modulo: Módulo donde se produjo el error
368//              - coderr : Código del mensaje de error del script
369//______________________________________________________________________________________________________
370void scriptLog(const char *modulo,int coderr)
371{
372        char msglog[LONSUC];
373
374        if(coderr<MAXERRORSCRIPT)
375                errorInfo(modulo,tbErroresScripts[coderr]); // Se ha producido algún error registrado
376        else{
377                sprintf(msglog,"%s: %d",tbErroresScripts[MAXERRORSCRIPT],coderr);
378                errorInfo(modulo,msglog);
379        }
380}
381//______________________________________________________________________________________________________
382// Función: TomaIPlocal
383//
384//       Descripción:
385//              Recupera la IP local
386//      Parámetros:
387//              Ninguno
388//      Devuelve:
389//              TRUE: Si el proceso es correcto
390//              FALSE: En caso de ocurrir algún error
391//      Especificaciones:
392//              En caso de no encontrar la IP o generarse algún error la IP local sería 0.0.0.0
393//______________________________________________________________________________________________________
394BOOLEAN tomaIPlocal()
395{
396        char modulo[] = "tomaIPlocal()";
397
398        // Para debug
399        //strcpy(IPlocal,"10.1.15.203");
400        //return(TRUE);
401
402        sprintf(interface,"%s/getIpAddress",pathinterface);
403        herror=interfaceAdmin(interface,NULL,IPlocal);
404        if(herror){
405                errorLog(modulo,85,FALSE);
406                return(FALSE);
407        }
408        return(TRUE);
409}
410//______________________________________________________________________________________________________
411//
412// Función: cuestionCache
413//
414//       Descripción:
415//              Procesa la cache en caso de existir.
416//      Parámetros:
417//              tam : Tamaño de la cache
418//      Devuelve:
419//              TRUE: Si el proceso es correcto
420//              FALSE: En caso de ocurrir algún error
421//______________________________________________________________________________________________________
422BOOLEAN cuestionCache(char* tam)
423{
424        return(TRUE);
425        //>>>>>>>>>>>>>>>>>>>>>>>>>>
426        char msglog[LONSTD];
427        char modulo[] = "cuestionCache()";
428
429        sprintf(interface,"%s/%s",pathinterface,"procesaCache");
430        sprintf(parametros,"%s %s","procesaCache",tam);
431
432        herror=interfaceAdmin(interface,parametros,NULL);
433        if(herror){
434                sprintf(msglog,"%s",tbErrores[88]);
435                errorInfo(modulo,msglog);
436                return(FALSE);
437        }
438
439        return(TRUE);
440}
441//______________________________________________________________________________________________________
442// Función: cargaPaginaWeb
443//
444//      Descripción:
445//              Muestra una pégina web usando el browser
446//      Parámetros:
447//        urp: Dirección url de la página
448//      Devuelve:
449//              TRUE: Si el proceso es correcto
450//              FALSE: En caso de ocurrir algún error
451// ________________________________________________________________________________________________________
452int cargaPaginaWeb(char *url)
453{
454        int resul=0;
455        char* argumentos[4];
456        char modulo[] = "cargaPaginaWeb()";
457
458        if(pidbash>0)
459                kill(pidbash,SIGQUIT); // Destruye el proceso hijo del proceso bash si existiera una conmutación
460
461        if(pidbrowser>0)
462                kill(pidbrowser,SIGQUIT); // Destruye el proceso hijo anterior y se queda sólo el actual
463
464        sprintf(interface,"/opt/opengnsys/bin/browser");
465        sprintf(parametros,"browser -qws %s",url);
466
467        splitCadena(argumentos,parametros,' '); // Crea matriz de los argumentos del scripts
468        argumentos[3]=NULL;
469        if((pidbrowser=fork())==0){
470                /* Proceso hijo que ejecuta el script */
471                resul=execv(interface,argumentos);
472                exit(resul);
473        }
474        else {
475                if (pidbrowser ==-1){
476                        scriptLog(modulo,10);
477                        resul=13;
478                        scriptLog(modulo,resul);
479                        return(resul);
480                }
481        }
482        return(resul);
483}
484//________________________________________________________________________________________________________
485//      Función: muestraMenu
486//
487//      Descripción:
488//              Muestra el menu inicial del cliente
489//      Parámetros:
490//              Ninguno
491//      Devuelve:
492//              TRUE: Si el proceso es correcto
493//              FALSE: En caso de ocurrir algún error
494//________________________________________________________________________________________________________
495void muestraMenu()
496{
497        cargaPaginaWeb(urlmenu);
498}
499//______________________________________________________________________________________________________
500// Función: muestraMensaje
501//
502//      Descripción:
503//              Muestra un mensaje en pantalla
504//      Parámetros:
505//              - idx: Indice del mensaje
506//              - msg: Descripción Mensaje
507// ________________________________________________________________________________________________________
508void muestraMensaje(int idx,char*msg)
509{
510        char *msgpan,url[250];
511       
512        if(msg){
513                msgpan=URLEncode(msg);
514                sprintf(url,"%s?msg=%s",urlmsg,msgpan); // Url de la página de mensajes
515                liberaMemoria(msgpan);
516        }
517        else
518                sprintf(url,"%s?idx=%d",urlmsg,idx); // Url de la página de mensajes
519        cargaPaginaWeb(url);
520}
521//______________________________________________________________________________________________________
522// Función: InclusionCliente
523//       Descripción:
524//              Abre una sesión en el servidor de administración y registra al cliente en el sistema
525//      Parámetros:
526//              Ninguno
527//      Devuelve:
528//              TRUE: Si el proceso es correcto
529//              FALSE: En caso de ocurrir algún error
530//______________________________________________________________________________________________________
531BOOLEAN inclusionCliente(TRAMA* ptrTrama)
532{
533        int lon;                // Longitud de cadena
534        char msglog[LONSUC];    // Mensaje de registro de sucesos
535        char *cfg;              // Datos de configuración
536        SOCKET socket_c;
537        char modulo[] = "inclusionCliente()";
538
539        cfg=LeeConfiguracion();
540       
541        if(!cfg){ // No se puede recuperar la configuración del cliente
542                errorLog(modulo,36,FALSE);
543                errorLog(modulo,37,FALSE);
544                return(FALSE);
545        }
546        if (ndebug>= DEBUG_ALTO) {
547                // Truncar la cadena si es mayor que el tamaño de la línea de log.
548                sprintf(msglog, "%s", tbMensajes[14]);
549                lon = strlen (msglog);
550                if (lon + strlen (cfg) < LONSUC) {
551                        strcat (msglog, cfg);
552                }
553                else
554                {
555                        strncat (msglog, cfg, LONSUC - lon - 4);
556                        strcat (msglog, "...");
557                }
558                infoDebug(msglog);
559        }
560        initParametros(ptrTrama,0);
561        lon=sprintf(ptrTrama->parametros,"nfn=InclusionCliente\r"); // Nombre de la función a ejecutar en el servidor
562        lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuración de los Sistemas Operativos del cliente
563        liberaMemoria(cfg);
564       
565        if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_PETICION)){
566                errorLog(modulo,37,FALSE);
567                return(FALSE);
568        }
569        ptrTrama=recibeMensaje(&socket_c);
570        if(!ptrTrama){
571                errorLog(modulo,45,FALSE);
572                return(FALSE);
573        }
574
575        close(socket_c);
576
577        if(!gestionaTrama(ptrTrama)){   // Análisis de la trama
578                errorLog(modulo,39,FALSE);
579                return(FALSE);
580        }
581
582        return(TRUE);
583}
584//______________________________________________________________________________________________________
585// Función: RESPUESTA_InclusionCliente
586//
587//      Descripción:
588//      Respuesta del servidor de administración a la petición de inicio
589//              enviando los datos identificativos del cliente y otras configuraciones
590//      Parámetros:
591//              - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros
592//      Devuelve:
593//              TRUE: Si el proceso es correcto
594//              FALSE: En caso de ocurrir algún error
595//______________________________________________________________________________________________________
596BOOLEAN RESPUESTA_InclusionCliente(TRAMA* ptrTrama)
597{
598        char* res;
599        char modulo[] = "RESPUESTA_InclusionCliente()";
600
601        res=copiaParametro("res",ptrTrama); // Resultado del proceso de inclusión
602        if(atoi(res)==0){ // Error en el proceso de inclusión
603                liberaMemoria(res);
604                errorLog(modulo,41,FALSE);
605                return (FALSE);
606        }
607        liberaMemoria(res);
608
609        idordenador=copiaParametro("ido",ptrTrama); // Identificador del ordenador
610        nombreordenador=copiaParametro("npc",ptrTrama); //  Nombre del ordenador
611        cache=copiaParametro("che",ptrTrama); // Tamaño de la caché reservada al cliente
612        idproautoexec=copiaParametro("exe",ptrTrama); // Procedimento de inicio (Autoexec)
613        idcentro=copiaParametro("idc",ptrTrama); // Identificador de la Unidad Organizativa
614        idaula=copiaParametro("ida",ptrTrama); // Identificador del aula
615
616        if(idordenador==NULL || nombreordenador==NULL){
617                errorLog(modulo,40,FALSE);
618                return (FALSE);
619        }
620        return(TRUE);
621}
622//______________________________________________________________________________________________________
623//
624// Función: LeeConfiguracion
625//       Descripción:
626//              Abre una sesión en el servidor de administración y registra al cliente en el sistema
627//      Parámetros:
628//              Ninguno
629//      Devuelve:
630//              TRUE: Si el proceso es correcto
631//              FALSE: En caso de ocurrir algún error
632//______________________________________________________________________________________________________
633
634char* LeeConfiguracion()
635{
636        char* parametroscfg;
637        char modulo[] = "LeeConfiguracion()";
638
639        // Reservar memoria para los datos de cofiguración.
640        parametroscfg=(char*)reservaMemoria(LONGITUD_SCRIPTSALIDA);
641        if(!parametroscfg){
642                errorLog(modulo,3,FALSE);
643                return(NULL);
644        }
645        // Ejecutar script y obtener datos.
646        sprintf(interface,"%s/%s",pathinterface,"getConfiguration");
647        herror=interfaceAdmin(interface,NULL,parametroscfg);
648
649        if(herror){ // No se puede recuperar la configuración del cliente
650                liberaMemoria(parametroscfg);
651                errorLog(modulo,36,FALSE);
652                return(NULL);
653        }
654        return(parametroscfg);
655}
656//________________________________________________________________________________________________________
657//      Función: autoexecCliente
658//
659//      Descripción:
660//              Solicita procedimiento de autoexec para el cliebnte
661//      Parámetros:
662//              Ninguno
663//      Devuelve:
664//              TRUE: Si el proceso es correcto
665//              FALSE: En caso de ocurrir algún error
666//________________________________________________________________________________________________________
667BOOLEAN autoexecCliente(TRAMA* ptrTrama)
668{
669        SOCKET socket_c;
670        char modulo[] = "autoexecCliente()";
671
672        initParametros(ptrTrama,0);
673        sprintf(ptrTrama->parametros,"nfn=AutoexecCliente\rexe=%s\r",idproautoexec);
674
675        if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_PETICION)){
676                errorLog(modulo,42,FALSE);
677                return(FALSE);
678        }
679        ptrTrama=recibeMensaje(&socket_c);
680        if(!ptrTrama){
681                errorLog(modulo,45,FALSE);
682                return(FALSE);
683        }
684
685        close(socket_c);
686
687        if(!gestionaTrama(ptrTrama)){   // Análisis de la trama
688                errorLog(modulo,39,FALSE);
689                return(FALSE);
690        }
691
692        return(TRUE);
693}
694//________________________________________________________________________________________________________
695//      Función: autoexecCliente
696//
697//      Descripción:
698//              Ejecuta un script de autoexec personalizado en todos los inicios para el cliente
699//      Parámetros:
700//              Ninguno
701//      Devuelve:
702//              TRUE: Si el proceso es correcto
703//              FALSE: En caso de ocurrir algún error
704//________________________________________________________________________________________________________
705BOOLEAN RESPUESTA_AutoexecCliente(TRAMA* ptrTrama)
706{
707        SOCKET socket_c;
708        char *res,*nfl;
709        char modulo[] = "RESPUESTA_AutoexecCliente()";
710
711        res=copiaParametro("res",ptrTrama);
712        if(atoi(res)==0){ // Error en el proceso de autoexec
713                liberaMemoria(res);
714                return (FALSE);
715        }
716        liberaMemoria(res);
717
718        nfl=copiaParametro("nfl",ptrTrama);
719        initParametros(ptrTrama,0);
720        sprintf(ptrTrama->parametros,"nfn=enviaArchivo\rnfl=%s\r",nfl);
721        liberaMemoria(nfl);
722
723        /* Envía petición */
724        if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_PETICION)){
725                errorLog(modulo,42,FALSE);
726                return(FALSE);
727        }
728        /* Nombre del archivo destino (local)*/
729        char fileautoexec[LONPRM];
730        sprintf(fileautoexec,"/tmp/_autoexec_%s",IPlocal);
731
732        /* Recibe archivo */
733        if(!recArchivo(&socket_c,fileautoexec)){
734                errorLog(modulo,58, FALSE);
735                close(socket_c);
736                return(FALSE);
737        }
738
739        close(socket_c);
740
741        /* Ejecuta archivo */
742        ejecutaArchivo(fileautoexec,ptrTrama);
743        return(TRUE);
744}
745//______________________________________________________________________________________________________
746// Función: comandosPendientes
747//
748//       Descripción:
749//               Búsqueda de acciones pendientes en el servidor de administración
750//      Parámetros:
751//              Ninguno
752//      Devuelve:
753//              TRUE: Si el proceso es correcto
754//              FALSE: En caso de ocurrir algún error
755//______________________________________________________________________________________________________
756BOOLEAN comandosPendientes(TRAMA* ptrTrama)
757{
758        SOCKET socket_c;
759        char modulo[] = "comandosPendientes()";
760
761        CMDPTES=TRUE;
762        initParametros(ptrTrama,0);
763
764        while(CMDPTES){
765                sprintf(ptrTrama->parametros,"nfn=ComandosPendientes\r");
766                if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_PETICION)){
767                        errorLog(modulo,42,FALSE);
768                        return(FALSE);
769                }
770                ptrTrama=recibeMensaje(&socket_c);
771                if(!ptrTrama){
772                        errorLog(modulo,45,FALSE);
773                        return(FALSE);
774                }
775
776                close(socket_c);
777
778                if(!gestionaTrama(ptrTrama)){   // Análisis de la trama
779                        errorLog(modulo,39,FALSE);
780                        return(FALSE);
781                }
782        }
783        return(TRUE);
784}
785//______________________________________________________________________________________________________
786// Función: NoComandosPtes
787//
788//       Descripción:
789//               Conmuta el switch de los comandos pendientes y lo pone a false
790//      Parámetros:
791//              - ptrTrama: contenido del mensaje
792//      Devuelve:
793//              TRUE siempre
794//      Especificaciones:
795//              Cuando se ejecuta esta función se sale del bucle que recupera los comandos pendientes en el
796//              servidor y el cliente pasa a a estar disponible para recibir comandos desde el éste.
797//______________________________________________________________________________________________________
798BOOLEAN NoComandosPtes(TRAMA* ptrTrama)
799{
800        CMDPTES=FALSE; // Corta el bucle de comandos pendientes
801        return(TRUE);
802}
803//______________________________________________________________________________________________________
804// Función: ProcesaComandos
805//
806//      Descripción:
807//              Espera comando desde el Servidor de Administración para ejecutarlos
808//      Parámetros:
809//              Ninguno
810//      Devuelve:
811//              TRUE: Si el proceso es correcto
812//              FALSE: En caso de ocurrir algún error
813// ________________________________________________________________________________________________________
814void procesaComandos(TRAMA* ptrTrama)
815{
816        int lon;
817        SOCKET socket_c;
818        char modulo[] = "procesaComandos()";
819
820        initParametros(ptrTrama,0);
821        while(TRUE){
822                lon=sprintf(ptrTrama->parametros,"nfn=DisponibilidadComandos\r");
823                lon+=sprintf(ptrTrama->parametros+lon,"tpc=%s\r",CLIENTE_OPENGNSYS); // Activar disponibilidad
824                if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_INFORMACION)){
825                        errorLog(modulo,43,FALSE);
826                        return;
827                }
828                infoLog(19); // Disponibilidad de cliente activada
829                ptrTrama=recibeMensaje(&socket_c);
830                if(!ptrTrama){
831                        errorLog(modulo,46,FALSE);
832                        return;
833                }
834
835                close(socket_c);
836
837                if(!gestionaTrama(ptrTrama)){   // Análisis de la trama
838                        errorLog(modulo,39,FALSE);
839                        return;
840                }
841                if(!comandosPendientes(ptrTrama)){
842                        errorLog(modulo,42,FALSE);
843                }
844        }
845}
846//______________________________________________________________________________________________________
847// Función: Actualizar
848//
849//       Descripción:
850//              Actualiza los datos de un ordenador como si volviera a solicitar la entrada
851//              en el sistema al  servidor de administración
852//      Parámetros:
853//              ptrTrama: contenido del mensajede
854//      Devuelve:
855//              TRUE: Si el proceso es correcto
856//              FALSE: En caso de ocurrir algún error
857//______________________________________________________________________________________________________
858BOOLEAN Actualizar(TRAMA* ptrTrama)
859{
860        char msglog[LONSTD];    // Mensaje de log
861        char *cfg;              // Cadena de datos de configuración
862        int lon;                // Longitud de cadena
863        char modulo[] = "Actualizar()";
864
865        if (ndebug>=DEBUG_MAXIMO) {
866                sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
867                infoDebug(msglog);
868        }
869        muestraMensaje(1,NULL);
870        if(!comandosPendientes(ptrTrama)){
871                errorLog(modulo,84,FALSE);
872                return(FALSE);
873        }
874
875        cfg=LeeConfiguracion();
876        herror=0;
877        if(!cfg){ // No se puede recuperar la configuración del cliente
878                errorLog(modulo,36,FALSE);
879                herror=3;
880        }
881        // Envia Configuracion al servidor
882        initParametros(ptrTrama,0);
883        lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Configurar");
884        lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuración de los Sistemas Operativos del cliente
885        respuestaEjecucionComando(ptrTrama,herror,0);
886
887        muestraMenu();
888
889        return(TRUE);
890}
891//______________________________________________________________________________________________________
892// Función: Purgar
893//
894//       Descripción:
895//              Detiene la ejecución del browser
896//      Parámetros:
897//              ptrTrama: contenido del mensajede
898//      Devuelve:
899//              TRUE: Si el proceso es correcto
900//              FALSE: En caso de ocurrir algún error
901//______________________________________________________________________________________________________
902int Purgar(TRAMA* ptrTrama)
903{
904
905        exit(EXIT_SUCCESS);
906}
907//______________________________________________________________________________________________________
908// Función: Sondeo
909//
910//       Descripción:
911//              Envía al servidor una confirmación de que está dentro del sistema
912//      Parámetros:
913//              ptrTrama: contenido del mensajede
914//      Devuelve:
915//              TRUE: Si el proceso es correcto
916//              FALSE: En caso de ocurrir algún error
917//______________________________________________________________________________________________________
918BOOLEAN Sondeo(TRAMA* ptrTrama)
919{
920        return(TRUE);
921}
922//______________________________________________________________________________________________________
923// Función: ConsolaRemota
924//
925//      Descripción:
926//              Ejecuta un comando de la Shell y envia el eco al servidor (Consola remota)
927//      Parámetros:
928//              ptrTrama: contenido del mensaje
929//      Devuelve:
930//              TRUE: Si el proceso es correcto
931//              FALSE: En caso de ocurrir algún error
932//______________________________________________________________________________________________________
933BOOLEAN ConsolaRemota(TRAMA* ptrTrama)
934{
935        SOCKET socket_c;
936        char *nfn,*scp,*aux,ecosrc[LONPRM],ecodst[LONPRM],msglog[LONSTD];;
937        char modulo[] = "ConsolaRemota()";
938
939        /* Nombre del archivo de script */
940        char filescript[LONPRM];
941        sprintf(filescript,"/tmp/_script_%s",IPlocal);
942       
943        aux=copiaParametro("scp",ptrTrama);
944        scp=URLDecode(aux);
945        escribeArchivo(filescript,scp);
946        liberaMemoria(aux);
947        liberaMemoria(scp);
948       
949        nfn=copiaParametro("nfn",ptrTrama);
950        sprintf(interface,"%s/%s",pathinterface,nfn);
951        sprintf(ecosrc,"/tmp/_econsola_%s",IPlocal);
952        sprintf(parametros,"%s %s %s",nfn,filescript,ecosrc);
953        herror=interfaceAdmin(interface,parametros,NULL);
954        if(herror){
955                sprintf(msglog,"%s:%s",tbErrores[86],nfn);
956                errorInfo(modulo,msglog);
957        }
958        else{
959                /* Envía fichero de inventario al servidor */
960                sprintf(ecodst,"/tmp/_Seconsola_%s",IPlocal); // Nombre que tendra el archivo en el Servidor
961                initParametros(ptrTrama,0);
962                sprintf(ptrTrama->parametros,"nfn=recibeArchivo\rnfl=%s\r",ecodst);
963                if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_COMANDO)){
964                        errorLog(modulo,42,FALSE);
965                        return(FALSE);
966                }
967                 /* Espera señal para comenzar el envío */
968                liberaMemoria(ptrTrama);
969                recibeFlag(&socket_c,ptrTrama);
970                /* Envía archivo */
971                if(!sendArchivo(&socket_c,ecosrc)){
972                        errorLog(modulo,57, FALSE);
973                        herror=12; // Error de envío de fichero por la red
974                }
975                close(socket_c);
976        }
977        liberaMemoria(nfn);
978        return(TRUE);
979}
980//_____________________________________________________________________________________________________
981// Función: Comando
982//
983//       Descripción:
984//              COmando personalizado enviado desde el servidor
985//      Parámetros:
986//              ptrTrama: contenido del mensaje
987//      Devuelve:
988//              TRUE: Si el proceso es correcto
989//              FALSE: En caso de ocurrir algún error
990//_____________________________________________________________________________________________________
991BOOLEAN Comando(TRAMA* ptrTrama)
992{
993        char *ids,*nfn,msglog[LONSTD];
994        char modulo[] = "Comando()";
995
996        if (ndebug>=DEBUG_MAXIMO) {
997                sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
998                infoDebug(msglog);
999        }
1000        nfn=copiaParametro("nfn",ptrTrama);
1001        ids=copiaParametro("ids",ptrTrama);
1002
1003        sprintf(interface,"%s/%s",pathinterface,nfn);
1004        herror=interfaceAdmin(interface,NULL,NULL);
1005        if(herror){
1006                sprintf(msglog,"%s:%s",tbErrores[86],nfn);
1007                errorInfo(modulo,msglog);
1008        }
1009        /* Envia respuesta de ejecucución del comando */
1010        initParametros(ptrTrama,0);
1011        sprintf(ptrTrama->parametros,"nfn=RESPUESTA_%s\r",nfn);
1012        respuestaEjecucionComando(ptrTrama,herror,ids);
1013        liberaMemoria(nfn);
1014        liberaMemoria(ids);
1015        return(TRUE);
1016}
1017//_____________________________________________________________________________________________________
1018// Función: Arrancar
1019//
1020//       Descripción:
1021//              Responde a un comando de encendido por la red
1022//      Parámetros:
1023//              ptrTrama: contenido del mensaje
1024//      Devuelve:
1025//              TRUE: Si el proceso es correcto
1026//              FALSE: En caso de ocurrir algún error
1027//_____________________________________________________________________________________________________
1028BOOLEAN Arrancar(TRAMA* ptrTrama)
1029{
1030        int lon;
1031        char *ids,msglog[LONSTD];
1032        char modulo[] = "Arrancar()";
1033
1034        if (ndebug>=DEBUG_MAXIMO) {
1035                sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
1036                infoDebug(msglog);
1037        }
1038
1039        ids=copiaParametro("ids",ptrTrama);
1040
1041        /* Envia respuesta de ejecucución del script */
1042        initParametros(ptrTrama,0);
1043        lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Arrancar");
1044        lon+=sprintf(ptrTrama->parametros+lon,"tpc=%s\r",CLIENTE_OPENGNSYS);
1045        respuestaEjecucionComando(ptrTrama,0,ids);
1046        liberaMemoria(ids);
1047        return(TRUE);
1048}
1049//_____________________________________________________________________________________________________
1050// Función: Apagar
1051//
1052//       Descripción:
1053//              Apaga el cliente
1054//      Parámetros:
1055//              ptrTrama: contenido del mensaje
1056//      Devuelve:
1057//              TRUE: Si el proceso es correcto
1058//              FALSE: En caso de ocurrir algún error
1059//_____________________________________________________________________________________________________
1060BOOLEAN Apagar(TRAMA* ptrTrama)
1061{
1062        char *ids,*nfn,msglog[LONSTD];
1063        char modulo[] = "Apagar()";
1064
1065        if (ndebug>=DEBUG_MAXIMO) {
1066                sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
1067                infoDebug(msglog);
1068        }
1069        nfn=copiaParametro("nfn",ptrTrama);
1070        ids=copiaParametro("ids",ptrTrama);
1071
1072        initParametros(ptrTrama,0);
1073        sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Apagar");
1074        respuestaEjecucionComando(ptrTrama,0,ids);
1075
1076        sprintf(interface,"%s/%s",pathinterface,nfn);
1077        herror=interfaceAdmin(interface,NULL,NULL);
1078        if(herror){
1079                sprintf(msglog,"%s:%s",tbErrores[86],nfn);
1080                liberaMemoria(nfn);
1081                liberaMemoria(ids);                     
1082                errorInfo(modulo,msglog);
1083                return(FALSE);
1084        }
1085        liberaMemoria(nfn);
1086        liberaMemoria(ids);     
1087        return(TRUE);
1088}
1089//_____________________________________________________________________________________________________
1090// Función: Reiniciar
1091//
1092//       Descripción:
1093//              Apaga el cliente
1094//      Parámetros:
1095//              ptrTrama: contenido del mensaje
1096//      Devuelve:
1097//              TRUE: Si el proceso es correcto
1098//              FALSE: En caso de ocurrir algún error
1099//_____________________________________________________________________________________________________
1100BOOLEAN Reiniciar(TRAMA* ptrTrama)
1101{
1102        char *nfn,*ids,msglog[LONSTD];
1103        char modulo[] = "Reiniciar()";
1104
1105        if (ndebug>=DEBUG_MAXIMO) {
1106                sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
1107                infoDebug(msglog);
1108        }
1109        nfn=copiaParametro("nfn",ptrTrama);
1110        ids=copiaParametro("ids",ptrTrama);
1111
1112        initParametros(ptrTrama,0);
1113        sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Reiniciar");
1114        respuestaEjecucionComando(ptrTrama,0,ids);
1115
1116        sprintf(interface,"%s/%s",pathinterface,nfn);
1117        herror=interfaceAdmin(interface,NULL,NULL);
1118        if(herror){
1119                sprintf(msglog,"%s:%s",tbErrores[86],nfn);
1120                liberaMemoria(nfn);
1121                liberaMemoria(ids);                     
1122                errorInfo(modulo,msglog);
1123                return(FALSE);
1124        }
1125        liberaMemoria(nfn);
1126        liberaMemoria(ids);             
1127        return(TRUE);
1128}
1129//_____________________________________________________________________________________________________
1130// Función: IniciarSesion
1131//
1132//       Descripción:
1133//              Inicia sesión en el Sistema Operativo de una de las particiones
1134//      Parámetros:
1135//              ptrTrama: contenido del mensaje
1136//      Devuelve:
1137//              TRUE: Si el proceso es correcto
1138//              FALSE: En caso de ocurrir algún error
1139//_____________________________________________________________________________________________________
1140BOOLEAN IniciarSesion(TRAMA* ptrTrama)
1141{
1142        char *nfn,*ids,*disk,*par,msglog[LONSTD];
1143        char modulo[] = "IniciarSesion()";
1144
1145        if (ndebug>=DEBUG_MAXIMO) {
1146                sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
1147                infoDebug(msglog);
1148        }
1149        nfn=copiaParametro("nfn",ptrTrama);
1150        ids=copiaParametro("ids",ptrTrama);
1151        disk=copiaParametro("dsk",ptrTrama);
1152        par=copiaParametro("par",ptrTrama);
1153       
1154        initParametros(ptrTrama,0);
1155        sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_IniciarSesion");
1156        respuestaEjecucionComando(ptrTrama,0,ids);
1157        liberaMemoria(ids);                     
1158
1159        sprintf(interface,"%s/%s",pathinterface,nfn);
1160        sprintf(parametros,"%s %s %s",nfn,disk,par);
1161        liberaMemoria(par);                     
1162       
1163        herror=interfaceAdmin(interface,parametros,NULL);
1164
1165        if(herror){
1166                sprintf(msglog,"%s:%s",tbErrores[86],nfn);
1167                liberaMemoria(nfn);
1168                errorInfo(modulo,msglog);
1169                return(FALSE);
1170        }
1171        liberaMemoria(nfn);
1172        return(TRUE);
1173}
1174//______________________________________________________________________________________________________
1175// Función: CrearImagen
1176//
1177//       Descripción:
1178//              Crea una imagen de una partición
1179//      Parámetros:
1180//              ptrTrama: contenido del mensaje
1181//      Devuelve:
1182//              TRUE: Si el proceso es correcto
1183//              FALSE: En caso de ocurrir algún error
1184//______________________________________________________________________________________________________
1185BOOLEAN CrearImagen(TRAMA* ptrTrama)
1186{
1187        int lon;
1188        char *nfn,*dsk,*par,*cpt,*idi,*ipr,*nci,*ids,msglog[LONSTD];
1189        char modulo[] = "CrearImagen()";
1190
1191        if (ndebug>=DEBUG_MAXIMO) {
1192                sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
1193                infoDebug(msglog);
1194        }
1195
1196        dsk=copiaParametro("dsk",ptrTrama); // Disco
1197        par=copiaParametro("par",ptrTrama); // Número de partición
1198        cpt=copiaParametro("cpt",ptrTrama); // Código de la partición
1199        idi=copiaParametro("idi",ptrTrama); // Identificador de la imagen
1200        nci=copiaParametro("nci",ptrTrama); // Nombre canónico de la imagen
1201        ipr=copiaParametro("ipr",ptrTrama); // Ip del repositorio
1202
1203        nfn=copiaParametro("nfn",ptrTrama);
1204        ids=copiaParametro("ids",ptrTrama);
1205        muestraMensaje(7,NULL);
1206
1207        if(InventariandoSoftware(ptrTrama,FALSE,"InventarioSoftware")){ // Crea inventario Software previamente
1208                muestraMensaje(2,NULL);
1209                sprintf(interface,"%s/%s",pathinterface,nfn);
1210                sprintf(parametros,"%s %s %s %s %s",nfn,dsk,par,nci,ipr);
1211                herror=interfaceAdmin(interface,parametros,NULL);
1212                if(herror){
1213                        sprintf(msglog,"%s:%s",tbErrores[86],nfn);
1214                        errorInfo(modulo,msglog);
1215                        muestraMensaje(10,NULL);
1216                }
1217                else
1218                        muestraMensaje(9,NULL);
1219        }
1220        else{
1221                sprintf(msglog,"%s:%s",tbErrores[86],nfn);
1222                errorInfo(modulo,msglog);
1223        }
1224
1225        /* Envia respuesta de ejecución de la función de interface */
1226        initParametros(ptrTrama,0);
1227        lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_CrearImagen");
1228        lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen
1229        lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Número de partición de donde se creó
1230        lon+=sprintf(ptrTrama->parametros+lon,"cpt=%s\r",cpt); // Tipo o código de partición
1231        lon+=sprintf(ptrTrama->parametros+lon,"ipr=%s\r",ipr); // Ip del repositorio donde se alojó
1232        respuestaEjecucionComando(ptrTrama,herror,ids);
1233       
1234        liberaMemoria(dsk);     
1235        liberaMemoria(par);     
1236        liberaMemoria(cpt);     
1237        liberaMemoria(idi);     
1238        liberaMemoria(nci);     
1239        liberaMemoria(ipr);     
1240        liberaMemoria(nfn);     
1241        liberaMemoria(ids);     
1242
1243        muestraMenu();
1244       
1245        return(TRUE);
1246}
1247//______________________________________________________________________________________________________
1248// Función: CrearImagenBasica
1249//
1250//       Descripción:
1251//              Crea una imagen básica a travers dela sincronización
1252//      Parámetros:
1253//              ptrTrama: contenido del mensaje
1254//
1255//      FDevuelve:
1256//              TRUE: Si el proceso es correcto
1257//              FALSE: En caso de ocurrir algún error
1258//______________________________________________________________________________________________________
1259BOOLEAN CrearImagenBasica(TRAMA* ptrTrama)
1260{
1261        int lon;
1262        char *nfn,*dsk,*par,*cpt,*idi,*nci,*rti,*ipr,*msy,*whl,*eli,*cmp,*bpi,*cpc,*bpc,*nba,*ids,msglog[LONSTD];
1263        char modulo[] = "CrearImagenBasica()";
1264
1265        if (ndebug>=DEBUG_MAXIMO) {
1266                sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
1267                infoDebug(msglog);
1268        }
1269        nfn=copiaParametro("nfn",ptrTrama);
1270        dsk=copiaParametro("dsk",ptrTrama); // Disco
1271        par=copiaParametro("par",ptrTrama); // Número de partición
1272        cpt=copiaParametro("cpt",ptrTrama); // Tipo de partición
1273        idi=copiaParametro("idi",ptrTrama); // Identificador de la imagen
1274        nci=copiaParametro("nci",ptrTrama); // Nombre canónico de la imagen
1275        rti=copiaParametro("rti",ptrTrama); // Ruta de origen de la imagen
1276        ipr=copiaParametro("ipr",ptrTrama); // Ip del repositorio
1277
1278        msy=copiaParametro("msy",ptrTrama); // Método de sincronización
1279       
1280        whl=copiaParametro("whl",ptrTrama); // Envío del fichero completo si hay diferencias           
1281        eli=copiaParametro("eli",ptrTrama); // Elimiar archivos en destino que no estén en origen       
1282        cmp=copiaParametro("cmp",ptrTrama); // Comprimir antes de enviar
1283
1284        bpi=copiaParametro("bpi",ptrTrama); // Borrar la imagen antes de crearla
1285        cpc=copiaParametro("cpc",ptrTrama); // Copiar también imagen a la cache
1286        bpc=copiaParametro("bpc",ptrTrama); // Borrarla de la cache antes de copiarla en ella
1287        nba=copiaParametro("nba",ptrTrama); // No borrar archivos en destino
1288
1289        //muestraMensaje(7,NULL); // Creando Inventario Software
1290        //if(InventariandoSoftware(ptrTrama,FALSE,"InventarioSoftware")){ // Crea inventario Software previamente
1291                muestraMensaje(30,NULL);// Creando Imagen Básica, por favor espere...
1292                sprintf(interface,"%s/%s",pathinterface,nfn);
1293                sprintf(parametros,"%s %s %s %s %s %s%s%s %s%s%s%s %s %s",nfn,dsk,par,nci,ipr,whl,eli,cmp,bpi,cpc,bpc,nba,msy,rti);
1294                herror=interfaceAdmin(interface,parametros,NULL);
1295                if(herror){
1296                        sprintf(msglog,"%s:%s",tbErrores[86],nfn);
1297                        errorInfo(modulo,msglog);
1298                        muestraMensaje(29,NULL);// Ha habido algún error en el proceso de creación de imagen básica
1299                }
1300                else
1301                        muestraMensaje(28,NULL);// El proceso de creación de imagen básica ha terminado correctamente
1302        //}
1303        //else{
1304        //      sprintf(msglog,"%s:%s",tbErrores[86],nfn);
1305        //      errorInfo(modulo,msglog);
1306        //}
1307
1308        ids=copiaParametro("ids",ptrTrama); // Identificador de la sesión
1309
1310        /* Envia respuesta de ejecución de la función de interface */
1311        initParametros(ptrTrama,0);
1312        lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_CrearImagenBasica");
1313        lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen
1314        lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Número de partición de donde se creó
1315        lon+=sprintf(ptrTrama->parametros+lon,"cpt=%s\r",cpt); // Tipo o código de partición
1316        lon+=sprintf(ptrTrama->parametros+lon,"ipr=%s\r",ipr); // Ip del repositorio donde se alojó
1317        respuestaEjecucionComando(ptrTrama,herror,ids);
1318               
1319        liberaMemoria(nfn);     
1320        liberaMemoria(dsk);     
1321        liberaMemoria(par);     
1322        liberaMemoria(cpt);     
1323        liberaMemoria(idi);     
1324        liberaMemoria(nci);     
1325        liberaMemoria(rti);     
1326        liberaMemoria(ipr);     
1327
1328        liberaMemoria(msy);     
1329       
1330        liberaMemoria(whl);     
1331        liberaMemoria(eli);     
1332        liberaMemoria(cmp);     
1333
1334        liberaMemoria(bpi);     
1335        liberaMemoria(cpc);     
1336        liberaMemoria(bpc);     
1337        liberaMemoria(nba);
1338        liberaMemoria(ids);             
1339       
1340        muestraMenu();
1341
1342        return(TRUE);
1343}
1344//______________________________________________________________________________________________________
1345// Función: CrearSoftIncremental
1346//
1347//       Descripción:
1348//              Crea una software incremental comparando una partición con una imagen básica
1349//      Parámetros:
1350//              ptrTrama: contenido del mensaje
1351//
1352//      Devuelve:
1353//              TRUE: Si el proceso es correcto
1354//              FALSE: En caso de ocurrir algún error
1355//______________________________________________________________________________________________________
1356BOOLEAN CrearSoftIncremental(TRAMA* ptrTrama)
1357{
1358        int lon;
1359        char *nfn,*dsk,*par,*idi,*idf,*ipr,*nci,*rti,*ncf,*msy,*whl,*eli,*cmp,*bpi,*cpc,*bpc,*nba,*ids,msglog[LONSTD];
1360        char modulo[] = "CrearSoftIncremental()";
1361
1362        if (ndebug>=DEBUG_MAXIMO) {
1363                sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
1364                infoDebug(msglog);
1365        }
1366        nfn=copiaParametro("nfn",ptrTrama);
1367
1368        dsk=copiaParametro("dsk",ptrTrama); // Disco
1369        par=copiaParametro("par",ptrTrama); // Número de partición
1370        idi=copiaParametro("idi",ptrTrama); // Identificador de la imagen
1371        nci=copiaParametro("nci",ptrTrama); // Nombre canónico de la imagen
1372        rti=copiaParametro("rti",ptrTrama); // Ruta de origen de la imagen
1373        ipr=copiaParametro("ipr",ptrTrama); // Ip del repositorio
1374        idf=copiaParametro("idf",ptrTrama); // Identificador de la imagen diferencial
1375        ncf=copiaParametro("ncf",ptrTrama); // Nombre canónico de la imagen diferencial
1376
1377        msy=copiaParametro("msy",ptrTrama); // Método de sincronización
1378
1379        whl=copiaParametro("whl",ptrTrama); // Envío del fichero completo si hay diferencias   
1380        eli=copiaParametro("eli",ptrTrama); // Elimiar archivos en destino que no estén en origen       
1381        cmp=copiaParametro("cmp",ptrTrama); // Comprimir antes de enviar
1382
1383        bpi=copiaParametro("bpi",ptrTrama); // Borrar la imagen antes de crearla
1384        cpc=copiaParametro("cpc",ptrTrama); // Copiar también imagen a la cache
1385        bpc=copiaParametro("bpc",ptrTrama); // Borrarla de la cache antes de copiarla en ella
1386        nba=copiaParametro("nba",ptrTrama); // No borrar archivos en destino
1387
1388//      muestraMensaje(7,NULL); // Creando Inventario Software
1389//      if(InventariandoSoftware(ptrTrama,FALSE,"InventarioSoftware")){ // Crea inventario Software previamente
1390                muestraMensaje(25,NULL);// Creando Imagen Incremental, por favor espere...
1391                sprintf(interface,"%s/%s",pathinterface,nfn);
1392                sprintf(parametros,"%s %s %s %s %s %s %s%s%s %s%s%s%s %s %s",nfn,dsk,par,nci,ipr,ncf,whl,eli,cmp,bpi,cpc,bpc,nba,msy,rti);
1393
1394                herror=interfaceAdmin(interface,parametros,NULL);
1395                if(herror){
1396                        sprintf(msglog,"%s:%s",tbErrores[86],nfn);
1397                        errorInfo(modulo,msglog);
1398                        muestraMensaje(27,NULL);// Ha habido algún error en el proceso de creación de imagen básica
1399                }
1400                else
1401                        muestraMensaje(26,NULL);// El proceso de creación de imagen incremental ha terminado correctamente
1402//      }
1403//      else{
1404//              sprintf(msglog,"%s:%s",tbErrores[86],nfn);
1405//              errorInfo(modulo,msglog);
1406//      }
1407
1408        ids=copiaParametro("ids",ptrTrama); // Identificador de la sesión
1409
1410        /* Envia respuesta de ejecución de la función de interface */
1411        initParametros(ptrTrama,0);
1412        lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_CrearSoftIncremental");
1413        lon+=sprintf(ptrTrama->parametros+lon,"idf=%s\r",idf); // Identificador de la imagen incremental
1414        lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Número de partición
1415        respuestaEjecucionComando(ptrTrama,herror,ids);
1416       
1417        liberaMemoria(nfn);     
1418        liberaMemoria(dsk);     
1419        liberaMemoria(par);     
1420        liberaMemoria(idi);     
1421        liberaMemoria(nci);     
1422        liberaMemoria(rti);     
1423        liberaMemoria(ipr);     
1424        liberaMemoria(idf);     
1425        liberaMemoria(ncf);     
1426        liberaMemoria(msy);     
1427        liberaMemoria(whl);
1428        liberaMemoria(eli);
1429        liberaMemoria(cmp);
1430        liberaMemoria(bpi);     
1431        liberaMemoria(cpc);     
1432        liberaMemoria(bpc);     
1433        liberaMemoria(nba);
1434        liberaMemoria(ids);             
1435       
1436        muestraMenu();
1437
1438        return(TRUE);
1439}
1440//______________________________________________________________________________________________________
1441// Función: RestaurarImagen
1442//
1443//       Descripción:
1444//              Restaura una imagen en una partición
1445//      Parámetros:
1446//              ptrTrama: contenido del mensaje
1447//      Devuelve:
1448//              TRUE: Si el proceso es correcto
1449//              FALSE: En bpccaso de ocurrir algún error
1450//______________________________________________________________________________________________________
1451BOOLEAN RestaurarImagen(TRAMA* ptrTrama)
1452{
1453        int lon;
1454        char *nfn,*dsk,*par,*idi,*ipr,*ifs,*nci,*ids,*ptc,msglog[LONSTD];
1455        char modulo[] = "RestaurarImagen()";
1456
1457        if (ndebug>=DEBUG_MAXIMO) {
1458                sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
1459                infoDebug(msglog);
1460        }
1461
1462        dsk=copiaParametro("dsk",ptrTrama);
1463        par=copiaParametro("par",ptrTrama);
1464        idi=copiaParametro("idi",ptrTrama);
1465        ipr=copiaParametro("ipr",ptrTrama);
1466        nci=copiaParametro("nci",ptrTrama);
1467        ifs=copiaParametro("ifs",ptrTrama);
1468        ptc=copiaParametro("ptc",ptrTrama);
1469
1470        nfn=copiaParametro("nfn",ptrTrama);
1471        ids=copiaParametro("ids",ptrTrama);
1472        muestraMensaje(3,NULL);
1473        sprintf(interface,"%s/%s",pathinterface,nfn);
1474        sprintf(parametros,"%s %s %s %s %s %s",nfn,dsk,par,nci,ipr,ptc);
1475        herror=interfaceAdmin(interface,parametros,NULL);
1476        if(herror){
1477                sprintf(msglog,"%s:%s",tbErrores[86],nfn);
1478                errorInfo(modulo,msglog);
1479                muestraMensaje(12,NULL);
1480        }
1481        else
1482                muestraMensaje(11,NULL);
1483
1484
1485        /* Envia respuesta de ejecución de la función de interface */
1486        initParametros(ptrTrama,0);
1487        lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_RestaurarImagen");
1488        lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen
1489        lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Número de partición
1490        lon+=sprintf(ptrTrama->parametros+lon,"ifs=%s\r",ifs); // Identificador del perfil software
1491        respuestaEjecucionComando(ptrTrama,herror,ids);
1492       
1493        liberaMemoria(nfn);     
1494        liberaMemoria(dsk);     
1495        liberaMemoria(par);     
1496        liberaMemoria(idi);
1497        liberaMemoria(nci);     
1498        liberaMemoria(ipr);     
1499        liberaMemoria(ifs);     
1500        liberaMemoria(ptc);     
1501        liberaMemoria(ids);                     
1502
1503        muestraMenu();
1504
1505        return(TRUE);
1506}
1507//______________________________________________________________________________________________________
1508// Función: RestaurarImagenBasica
1509//
1510//       Descripción:
1511//              Restaura una imagen básica en una partición
1512//      Parámetros:
1513//              ptrTrama: contenido del mensaje
1514//      Devuelve:
1515//              TRUE: Si el proceso es correcto
1516//              FALSE: En caso de ocurrir algún error
1517//______________________________________________________________________________________________________
1518BOOLEAN RestaurarImagenBasica(TRAMA* ptrTrama)
1519{
1520        int lon;
1521        char *nfn,*dsk,*par,*idi,*ipr,*met,*nci,*rti,*ifs,*msy,*whl,*eli,*cmp,*tpt,*bpi,*cpc,*bpc,*nba,*ids,msglog[LONSTD];
1522        char modulo[] = "RestaurarImagenBasica()";
1523
1524        if (ndebug>=DEBUG_MAXIMO) {
1525                sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
1526                infoDebug(msglog);
1527        }
1528        dsk=copiaParametro("dsk",ptrTrama);
1529        par=copiaParametro("par",ptrTrama);
1530        idi=copiaParametro("idi",ptrTrama);
1531        ipr=copiaParametro("ipr",ptrTrama);
1532        met=copiaParametro("met",ptrTrama); // Método de clonación 0= desde caché 1= desde repositorio
1533        nci=copiaParametro("nci",ptrTrama);
1534        rti=copiaParametro("rti",ptrTrama); // Ruta de origen de la imagen
1535        ifs=copiaParametro("ifs",ptrTrama);
1536
1537        tpt=copiaParametro("tpt",ptrTrama); // Tipo de trasnmisión unicast o multicast 
1538        msy=copiaParametro("msy",ptrTrama); // Metodo de sincronizacion
1539
1540        whl=copiaParametro("whl",ptrTrama); // Envío del fichero completo si hay diferencias   
1541        eli=copiaParametro("eli",ptrTrama); // Elimiar archivos en destino que no estén en origen       
1542        cmp=copiaParametro("cmp",ptrTrama); // Comprimir antes de enviar
1543
1544
1545
1546        bpi=copiaParametro("bpi",ptrTrama); // Borrar la imagen antes de crearla
1547        cpc=copiaParametro("cpc",ptrTrama); // Copiar también imagen a la cache
1548        bpc=copiaParametro("bpc",ptrTrama); // Borrarla de la cache antes de copiarla en ella
1549        nba=copiaParametro("nba",ptrTrama); // No borrar archivos en destino
1550
1551        nfn=copiaParametro("nfn",ptrTrama);
1552        ids=copiaParametro("ids",ptrTrama);
1553        muestraMensaje(31,NULL);
1554        sprintf(interface,"%s/%s",pathinterface,nfn);
1555        sprintf(parametros,"%s %s %s %s %s %s %s%s%s %s%s%s%s %s %s %s",nfn,dsk,par,nci,ipr,tpt,whl,eli,cmp,bpi,cpc,bpc,nba,met,msy,rti);
1556        herror=interfaceAdmin(interface,parametros,NULL);
1557        if(herror){
1558                sprintf(msglog,"%s:%s",tbErrores[86],nfn);
1559                errorInfo(modulo,msglog);
1560                muestraMensaje(33,NULL);
1561        }
1562        else
1563                muestraMensaje(32,NULL);
1564
1565        /* Envia respuesta de ejecución de la función de interface */
1566        initParametros(ptrTrama,0);
1567        lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_RestaurarImagenBasica");
1568        lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen
1569        lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Número de partición
1570        lon+=sprintf(ptrTrama->parametros+lon,"ifs=%s\r",ifs); // Identificador del perfil software
1571        respuestaEjecucionComando(ptrTrama,herror,ids);
1572       
1573        liberaMemoria(nfn);     
1574        liberaMemoria(dsk);     
1575        liberaMemoria(par);     
1576        liberaMemoria(idi);     
1577        liberaMemoria(nci);     
1578        liberaMemoria(rti);     
1579        liberaMemoria(ifs);     
1580        liberaMemoria(ipr);     
1581        liberaMemoria(met);
1582
1583        liberaMemoria(tpt);     
1584        liberaMemoria(msy);     
1585
1586        liberaMemoria(whl);     
1587        liberaMemoria(eli);     
1588        liberaMemoria(cmp);     
1589
1590        liberaMemoria(bpi);     
1591        liberaMemoria(cpc);     
1592        liberaMemoria(bpc);     
1593        liberaMemoria(nba);
1594        liberaMemoria(ids);             
1595
1596        muestraMenu();
1597       
1598        return(TRUE);
1599}
1600//______________________________________________________________________________________________________
1601// Función: RestaurarSoftIncremental
1602//
1603//       Descripción:
1604//              Restaura software incremental en una partición
1605//      Parámetros:
1606//              ptrTrama: contenido del mensaje
1607//      Devuelve:
1608//              TRUE: Si el proceso es correcto
1609//              FALSE: En caso de ocurrir algún error
1610//______________________________________________________________________________________________________
1611BOOLEAN RestaurarSoftIncremental(TRAMA* ptrTrama)
1612{
1613        int lon;
1614        char *nfn,*dsk,*par,*idi,*ipr,*met,*ifs,*nci,*rti,*idf,*ncf,*msy,*whl,*eli,*cmp,*tpt,*bpi,*cpc,*bpc,*nba,*ids,msglog[LONSTD];
1615        char modulo[] = "RestaurarSoftIncremental()";
1616
1617        if (ndebug>=DEBUG_MAXIMO) {
1618                sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
1619                infoDebug(msglog);
1620        }
1621        dsk=copiaParametro("dsk",ptrTrama);
1622        par=copiaParametro("par",ptrTrama);
1623        idi=copiaParametro("idi",ptrTrama);
1624        idf=copiaParametro("idf",ptrTrama);
1625        ipr=copiaParametro("ipr",ptrTrama);
1626        met=copiaParametro("met",ptrTrama); // Método de clonación 0= desde caché 1= desde repositorio
1627        ifs=copiaParametro("ifs",ptrTrama);
1628        nci=copiaParametro("nci",ptrTrama);
1629        rti=copiaParametro("rti",ptrTrama); // Ruta de origen de la imagen
1630        ncf=copiaParametro("ncf",ptrTrama);
1631
1632        tpt=copiaParametro("tpt",ptrTrama); // Tipo de trasnmisión unicast o multicast 
1633        msy=copiaParametro("msy",ptrTrama); // Metodo de sincronizacion
1634
1635        whl=copiaParametro("whl",ptrTrama); // Envío del fichero completo si hay diferencias   
1636        eli=copiaParametro("eli",ptrTrama); // Elimiar archivos en destino que no estén en origen       
1637        cmp=copiaParametro("cmp",ptrTrama); // Comprimir antes de enviar
1638
1639        bpi=copiaParametro("bpi",ptrTrama); // Borrar la imagen antes de crearla
1640        cpc=copiaParametro("cpc",ptrTrama); // Copiar también imagen a la cache
1641        bpc=copiaParametro("bpc",ptrTrama); // Borrarla de la cache antes de copiarla en ella
1642        nba=copiaParametro("nba",ptrTrama); // No borrar archivos en destino
1643
1644        nfn=copiaParametro("nfn",ptrTrama);
1645        ids=copiaParametro("ids",ptrTrama);
1646        muestraMensaje(31,NULL);
1647        sprintf(interface,"%s/%s",pathinterface,nfn);
1648        sprintf(parametros,"%s %s %s %s %s %s %s %s%s%s %s%s%s%s %s %s %s",nfn,dsk,par,nci,ipr,ncf,tpt,whl,eli,cmp,bpi,cpc,bpc,nba,met,msy,rti);
1649        herror=interfaceAdmin(interface,parametros,NULL);
1650        if(herror){
1651                sprintf(msglog,"%s:%s",tbErrores[86],nfn);
1652                errorInfo(modulo,msglog);
1653                muestraMensaje(35,NULL);
1654        }
1655        else
1656                muestraMensaje(34,NULL);
1657
1658        /* Envia respuesta de ejecución de la función de interface */
1659        initParametros(ptrTrama,0);
1660        lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_RestaurarSoftIncremental");
1661        lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idf); // Identificador de la imagen incremental (Forzada a idi)
1662        lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Número de partición
1663        lon+=sprintf(ptrTrama->parametros+lon,"ifs=%s\r",ifs); // Identificador del perfil software
1664
1665        respuestaEjecucionComando(ptrTrama,herror,ids);
1666       
1667        liberaMemoria(nfn);     
1668        liberaMemoria(dsk);     
1669        liberaMemoria(par);     
1670        liberaMemoria(idi);     
1671        liberaMemoria(idf);     
1672        liberaMemoria(nci);     
1673        liberaMemoria(rti);     
1674        liberaMemoria(ncf);     
1675        liberaMemoria(ifs);     
1676        liberaMemoria(ipr);     
1677        liberaMemoria(met);
1678
1679        liberaMemoria(tpt);     
1680        liberaMemoria(msy);     
1681
1682        liberaMemoria(whl);     
1683        liberaMemoria(eli);     
1684        liberaMemoria(cmp);     
1685
1686        liberaMemoria(bpi);     
1687        liberaMemoria(cpc);     
1688        liberaMemoria(bpc);     
1689        liberaMemoria(nba);
1690        liberaMemoria(ids);             
1691       
1692        muestraMenu();
1693
1694        return(TRUE);
1695}
1696//______________________________________________________________________________________________________
1697// Función: Configurar
1698//
1699//       Descripción:
1700//              Configura la tabla de particiones y formatea
1701//      Parámetros:
1702//              ptrTrama: contenido del mensaje
1703//      Devuelve:
1704//              TRUE: Si el proceso es correcto
1705//              FALSE: En caso de ocurrir algún error
1706//______________________________________________________________________________________________________
1707BOOLEAN Configurar(TRAMA* ptrTrama)
1708{
1709        int lon;
1710        char *nfn,*dsk,*cfg,*ids,msglog[LONSTD];
1711        char modulo[] = "Configurar()";
1712
1713        if (ndebug>=DEBUG_MAXIMO) {
1714                sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
1715                infoDebug(msglog);
1716        }
1717
1718        dsk=copiaParametro("dsk",ptrTrama);
1719        cfg=copiaParametro("cfg",ptrTrama);
1720        /* Sustituir caracteres */
1721        sustituir(cfg,'\n','$');
1722        sustituir(cfg,'\t','#');
1723
1724        nfn=copiaParametro("nfn",ptrTrama);
1725        ids=copiaParametro("ids",ptrTrama);
1726        muestraMensaje(4,NULL);
1727        sprintf(interface,"%s/%s",pathinterface,nfn);
1728        sprintf(parametros,"%s %s %s",nfn,dsk,cfg);
1729
1730        herror=interfaceAdmin(interface,parametros,NULL);
1731        if(herror){
1732                sprintf(msglog,"%s:%s",tbErrores[86],nfn);
1733                errorInfo(modulo,msglog);
1734                muestraMensaje(13,NULL);
1735        }
1736        else
1737                muestraMensaje(14,NULL);
1738
1739        cfg=LeeConfiguracion();
1740        if(!cfg){ // No se puede recuperar la configuración del cliente
1741                errorLog(modulo,36,FALSE);
1742                return(FALSE);
1743        }
1744
1745        /* Envia respuesta de ejecución del comando*/
1746        initParametros(ptrTrama,0);
1747        lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Configurar");
1748        lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuración de los Sistemas Operativos del cliente
1749        respuestaEjecucionComando(ptrTrama,herror,ids);
1750       
1751        liberaMemoria(dsk);
1752        liberaMemoria(cfg);
1753        liberaMemoria(nfn);
1754        liberaMemoria(ids);
1755
1756        muestraMenu();
1757
1758        return(TRUE);
1759}
1760// ________________________________________________________________________________________________________
1761// Función: InventarioHardware
1762//
1763//      Descripción:
1764//              Envia al servidor el nombre del archivo de inventario de su hardware para posteriormente
1765//              esperar que éste lo solicite y enviarlo por la red.
1766//      Parámetros:
1767//              ptrTrama: contenido del mensaje
1768//      Devuelve:
1769//              TRUE: Si el proceso es correcto
1770//              FALSE: En caso de ocurrir algún error
1771//______________________________________________________________________________________________________
1772BOOLEAN InventarioHardware(TRAMA* ptrTrama)
1773{
1774        int lon;
1775        SOCKET socket_c;
1776        char *nfn,*ids,msglog[LONSTD],hrdsrc[LONPRM],hrddst[LONPRM];
1777        char modulo[] = "InventarioHardware()";
1778
1779        if (ndebug>=DEBUG_MAXIMO) {
1780                sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
1781                infoDebug(msglog);
1782        }
1783
1784        nfn=copiaParametro("nfn",ptrTrama);
1785        ids=copiaParametro("ids",ptrTrama);
1786        muestraMensaje(6,NULL);
1787
1788        sprintf(interface,"%s/%s",pathinterface,nfn);
1789        sprintf(hrdsrc,"/tmp/Chrd-%s",IPlocal); // Nombre que tendra el archivo de inventario
1790        sprintf(parametros,"%s %s",nfn,hrdsrc);
1791        herror=interfaceAdmin(interface,parametros,NULL);
1792        if(herror){
1793                sprintf(msglog,"%s:%s",tbErrores[86],nfn);
1794                errorInfo(modulo,msglog);
1795                muestraMensaje(18,NULL);
1796        }
1797        else{
1798                /* Envía fichero de inventario al servidor */
1799                sprintf(hrddst,"/tmp/Shrd-%s",IPlocal); // Nombre que tendra el archivo en el Servidor
1800                initParametros(ptrTrama,0);
1801                sprintf(ptrTrama->parametros,"nfn=recibeArchivo\rnfl=%s\r",hrddst);
1802                if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_COMANDO)){
1803                        liberaMemoria(nfn);
1804                        liberaMemoria(ids);
1805                        errorLog(modulo,42,FALSE);
1806                        return(FALSE);
1807                }
1808                 /* Espera señal para comenzar el envío */
1809                liberaMemoria(ptrTrama);
1810                recibeFlag(&socket_c,ptrTrama);
1811                /* Envía archivo */
1812                if(!sendArchivo(&socket_c,hrdsrc)){
1813                        errorLog(modulo,57, FALSE);
1814                        herror=12; // Error de envío de fichero por la red
1815                }
1816                close(socket_c);
1817                muestraMensaje(17,NULL);
1818        }
1819
1820        /* Envia respuesta de ejecución de la función de interface */
1821        initParametros(ptrTrama,0);
1822        lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_InventarioHardware");
1823        lon+=sprintf(ptrTrama->parametros+lon,"hrd=%s\r",hrddst);
1824        respuestaEjecucionComando(ptrTrama,herror,ids);
1825        liberaMemoria(nfn);
1826        liberaMemoria(ids);
1827       
1828        muestraMenu();
1829
1830        return(TRUE);
1831}
1832// ________________________________________________________________________________________________________
1833// Función: InventarioSoftware
1834//
1835//      Descripción:
1836//              Crea el inventario software de un sistema operativo instalado en una partición.
1837//      Parámetros:
1838//              ptrTrama: contenido del mensaje
1839//      Devuelve:
1840//              TRUE: Si el proceso es correcto
1841//              FALSE: En caso de ocurrir algún error
1842//______________________________________________________________________________________________________
1843BOOLEAN InventarioSoftware(TRAMA* ptrTrama)
1844{
1845        char *nfn,*ids,msglog[LONSTD];
1846        char modulo[] = "InventarioSoftware()";
1847
1848        if (ndebug>=DEBUG_MAXIMO) {
1849                sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
1850                infoDebug(msglog);
1851        }
1852        nfn=copiaParametro("nfn",ptrTrama);
1853        ids=copiaParametro("ids",ptrTrama);
1854        muestraMensaje(7,NULL);
1855        InventariandoSoftware(ptrTrama,TRUE,nfn);
1856        respuestaEjecucionComando(ptrTrama,herror,ids);
1857        liberaMemoria(nfn);
1858        liberaMemoria(ids);             
1859        muestraMenu();
1860        return(TRUE);
1861}
1862// ________________________________________________________________________________________________________
1863//
1864// Función: InventariandoSoftware
1865//
1866//      Descripción:
1867//              Envia al servidor el nombre del archivo de inventario de su software para posteriormente
1868//              esperar que éste lo solicite y enviarlo por la red.
1869//      Parámetros:
1870//              ptrTrama: contenido del mensaje
1871//              sw: switch que indica si la función es llamada por el comando InventarioSoftware(true) o CrearImagen(false)
1872//              nfn: Nombre de la función del Interface que implementa el comando
1873//      Devuelve:
1874//              TRUE: Si el proceso es correcto
1875//              FALSE: En caso de ocurrir algún error
1876//______________________________________________________________________________________________________
1877BOOLEAN InventariandoSoftware(TRAMA* ptrTrama,BOOLEAN sw,char *nfn)
1878{
1879        int lon;
1880        SOCKET socket_c;
1881        char *dsk,*par,msglog[LONSTD],sftsrc[LONPRM],sftdst[LONPRM];
1882        char modulo[] = "InventariandoSoftware()";
1883
1884        dsk=copiaParametro("dsk",ptrTrama); // Disco
1885        par=copiaParametro("par",ptrTrama);
1886
1887        sprintf(interface,"%s/%s",pathinterface,nfn);
1888        sprintf(sftsrc,"/tmp/CSft-%s-%s",IPlocal,par); // Nombre que tendra el archivo de inventario
1889        sprintf(parametros,"%s %s %s %s",nfn,dsk,par,sftsrc);
1890
1891        herror=interfaceAdmin(interface,parametros,NULL);
1892        herror=0;
1893        if(herror){
1894                sprintf(msglog,"%s:%s",tbErrores[86],nfn);
1895                errorInfo(modulo,msglog);
1896                muestraMensaje(20,NULL);
1897        }
1898        else{
1899                /* Envía fichero de inventario al servidor */
1900                sprintf(sftdst,"/tmp/Ssft-%s-%s",IPlocal,par); // Nombre que tendra el archivo en el Servidor
1901                initParametros(ptrTrama,0);
1902
1903                sprintf(ptrTrama->parametros,"nfn=recibeArchivo\rnfl=%s\r",sftdst);
1904                if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_COMANDO)){
1905                        errorLog(modulo,42,FALSE);
1906                        liberaMemoria(dsk);
1907                        liberaMemoria(par);                             
1908                        return(FALSE);
1909                }
1910                /* Espera señal para comenzar el envío */
1911                liberaMemoria(ptrTrama);
1912                if(!recibeFlag(&socket_c,ptrTrama)){
1913                        errorLog(modulo,17,FALSE);
1914                }
1915                /* Envía archivo */
1916                if(!sendArchivo(&socket_c,sftsrc)){
1917                        errorLog(modulo,57, FALSE);
1918                        herror=12; // Error de envío de fichero por la red
1919                }
1920                close(socket_c);
1921                muestraMensaje(19,NULL);
1922        }
1923        initParametros(ptrTrama,0);
1924        lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_InventarioSoftware");
1925        lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par);
1926        lon+=sprintf(ptrTrama->parametros+lon,"sft=%s\r",sftdst);
1927        if(!sw)
1928                respuestaEjecucionComando(ptrTrama,herror,"0");
1929
1930        liberaMemoria(dsk);
1931        liberaMemoria(par);                     
1932        return(TRUE);
1933}
1934// ________________________________________________________________________________________________________
1935// Función: EjecutarScript
1936//
1937//      Descripción:
1938//              Ejecuta código de script
1939//      Parámetros:
1940//              ptrTrama: contenido del mensaje
1941//      Devuelve:
1942//              TRUE: Si el proceso es correcto
1943//              FALSE: En caso de ocurrir algún error
1944//______________________________________________________________________________________________________
1945BOOLEAN EjecutarScript(TRAMA* ptrTrama)
1946{
1947        int lon;
1948        char *nfn,*aux,*ids,*scp,*cfg,msglog[LONSTD];
1949        char modulo[] = "EjecutarScript()";
1950
1951        if (ndebug>=DEBUG_MAXIMO) {
1952                sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
1953                infoDebug(msglog);
1954        }
1955        aux=copiaParametro("scp",ptrTrama);
1956        scp=URLDecode(aux);
1957        muestraMensaje(8,NULL);
1958        /* Nombre del archivo de script */
1959        char filescript[LONPRM];
1960        sprintf(filescript,"/tmp/_script_%s",IPlocal);
1961        escribeArchivo(filescript,scp);
1962        nfn=copiaParametro("nfn",ptrTrama);
1963        sprintf(interface,"%s/%s",pathinterface,nfn);
1964        sprintf(parametros,"%s %s",nfn,filescript);
1965        herror=interfaceAdmin(interface,parametros,NULL);
1966        if(herror){
1967                sprintf(msglog,"%s:%s",tbErrores[86],nfn);
1968                errorInfo(modulo,msglog);
1969                muestraMensaje(21,NULL);
1970        }
1971        else
1972                muestraMensaje(22,NULL);
1973
1974        // Toma configuración de particiones
1975        cfg=LeeConfiguracion();
1976        if(!cfg){ // No se puede recuperar la configuración del cliente
1977                errorLog(modulo,36,FALSE);
1978                herror=36;
1979        }
1980
1981        ids=copiaParametro("ids",ptrTrama);
1982
1983        //herror=ejecutarCodigoBash(scp);
1984        initParametros(ptrTrama,0);
1985        lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_EjecutarScript");
1986        lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuración de los Sistemas Operativos del cliente
1987        respuestaEjecucionComando(ptrTrama,herror,ids);
1988       
1989        liberaMemoria(nfn);
1990        liberaMemoria(ids);             
1991        liberaMemoria(aux);             
1992        liberaMemoria(scp);     
1993        liberaMemoria(cfg);
1994
1995        muestraMenu();
1996
1997        return(TRUE);
1998}
1999//______________________________________________________________________________________________________
2000// Función: respuestaEjecucionComando
2001//
2002//      Descripción:
2003//              Envia una respuesta a una ejecucion de comando al servidor de Administración
2004//      Parámetros:
2005//              - ptrTrama: contenido del mensaje
2006//              - res: Resultado de la ejecución (Código de error devuelto por el script ejecutado)
2007//              - ids: Identificador de la sesion (En caso de no haber seguimiento es NULO)
2008//      Devuelve:
2009//              TRUE: Si el proceso es correcto
2010//              FALSE: En caso de ocurrir algún error
2011// ________________________________________________________________________________________________________
2012BOOLEAN respuestaEjecucionComando(TRAMA* ptrTrama,int res,char *ids)
2013{
2014        int lon;
2015        SOCKET socket_c;
2016        char modulo[] = "respuestaEjecucionComando()";
2017
2018        lon=strlen(ptrTrama->parametros);
2019        if(ids){ // Existe seguimiento
2020                lon+=sprintf(ptrTrama->parametros+lon,"ids=%s\r",ids); // Añade identificador de la sesión
2021        }
2022        if (res==0){ // Resultado satisfactorio
2023                lon+=sprintf(ptrTrama->parametros+lon,"res=%s\r","1");
2024                lon+=sprintf(ptrTrama->parametros+lon,"der=%s\r","");
2025        }
2026        else{ // Algún error
2027                lon+=sprintf(ptrTrama->parametros+lon,"res=%s\r","2");
2028                if(res>MAXERRORSCRIPT)
2029                        lon+=sprintf(ptrTrama->parametros+lon,"der=%s (Error de script:%d)\r",tbErroresScripts[0],res);// Descripción del error
2030                else
2031                        lon+=sprintf(ptrTrama->parametros+lon,"der=%s\r",tbErroresScripts[res]);// Descripción del error
2032        }
2033        if(!(enviaMensajeServidor(&socket_c,ptrTrama,MSG_NOTIFICACION))){
2034                errorLog(modulo,44,FALSE);
2035                return(FALSE);
2036        }
2037
2038        close(socket_c);
2039        return(TRUE);
2040}
2041// ________________________________________________________________________________________________________
2042// Función: gestionaTrama
2043//
2044//      Descripción:
2045//              Procesa las tramas recibidas.
2046//      Parametros:
2047//              ptrTrama: contenido del mensaje
2048//      Devuelve:
2049//              TRUE: Si el proceso es correcto
2050//              FALSE: En caso de ocurrir algún error
2051// ________________________________________________________________________________________________________
2052BOOLEAN gestionaTrama(TRAMA *ptrTrama)
2053{
2054        int i, res;
2055        char *nfn;
2056        char modulo[] = "gestionaTrama()";
2057
2058        INTROaFINCAD(ptrTrama);
2059        nfn = copiaParametro("nfn", ptrTrama); // Toma nombre de función
2060        for (i = 0; i < MAXIMAS_FUNCIONES; i++) { // Recorre funciones que procesan las tramas
2061                res = strcmp(tbfuncionesClient[i].nf, nfn);
2062                if (res == 0) { // Encontrada la función que procesa el mensaje
2063                        liberaMemoria(nfn);
2064                        return(tbfuncionesClient[i].fptr(ptrTrama)); // Invoca la función
2065                }
2066        }
2067
2068        liberaMemoria(nfn);
2069
2070        /* Sólo puede ser un comando personalizado
2071        if (ptrTrama->tipo==MSG_COMANDO)
2072                return(Comando(ptrTrama));
2073         */
2074        errorLog(modulo, 18, FALSE);
2075        return (FALSE);
2076}
2077//________________________________________________________________________________________________________
2078//      Función: ejecutaArchivo
2079//
2080//      Descripción:
2081//              Ejecuta los comando contenido en un archivo (cada comando y sus parametros separados por un
2082//              salto de linea.
2083//      Parámetros:
2084//              filecmd: Nombre del archivo de comandos
2085//              ptrTrama: Puntero a una estructura TRAMA usada en las comunicaciones por red (No debe ser NULL)
2086//      Devuelve:
2087//              TRUE: Si el proceso es correcto
2088//              FALSE: En caso de ocurrir algún error
2089//________________________________________________________________________________________________________
2090BOOLEAN ejecutaArchivo(char* filecmd,TRAMA *ptrTrama)
2091{
2092        char* buffer,*lineas[MAXIMAS_LINEAS];
2093        int i,numlin;
2094        char modulo[] = "ejecutaArchivo()";
2095
2096        buffer=leeArchivo(filecmd);
2097        if(buffer){
2098                numlin = splitCadena(lineas, buffer, '@');
2099                initParametros(ptrTrama,0);
2100                for (i = 0; i < numlin; i++) {
2101                        if(strlen(lineas[i])>0){
2102                                strcpy(ptrTrama->parametros,lineas[i]);
2103                                strcat(ptrTrama->parametros,"\rMCDJ@"); // Fin de trama
2104                                if(!gestionaTrama(ptrTrama)){   // Análisis de la trama
2105                                        errorLog(modulo,39,FALSE);
2106                                        //return(FALSE);
2107                                }
2108                        }
2109                }
2110        }
2111        liberaMemoria(buffer);
2112        return(TRUE);
2113}
2114//______________________________________________________________________________________________________
2115// Función: enviaMensajeServidor
2116//
2117//      Descripción:
2118//              Envia un mensaje al servidor de Administración
2119//      Parámetros:
2120//              - socket_c: (Salida) Socket utilizado para el envío
2121//              - ptrTrama: contenido del mensaje
2122//              - tipo: Tipo de mensaje
2123//                              C=Comando, N=Respuesta a un comando, P=Peticion,R=Respuesta a una petición, I=Informacion
2124//      Devuelve:
2125//              TRUE: Si el proceso es correcto
2126//              FALSE: En caso de ocurrir algún error
2127// ________________________________________________________________________________________________________
2128BOOLEAN enviaMensajeServidor(SOCKET *socket_c,TRAMA *ptrTrama,char tipo)
2129{
2130        int lon;
2131        char modulo[] = "enviaMensajeServidor()";
2132
2133        *socket_c=abreConexion();
2134        if(*socket_c==INVALID_SOCKET){
2135                errorLog(modulo,38,FALSE); // Error de conexión con el servidor
2136                return(FALSE);
2137        }
2138        ptrTrama->arroba='@'; // Cabecera de la trama
2139        strncpy(ptrTrama->identificador,"JMMLCAMDJ_MCDJ",14);   // identificador de la trama
2140        ptrTrama->tipo=tipo; // Tipo de mensaje
2141        lon=strlen(ptrTrama->parametros); // Compone la trama
2142        lon+=sprintf(ptrTrama->parametros+lon,"iph=%s\r",IPlocal);      // Ip del ordenador
2143        lon+=sprintf(ptrTrama->parametros+lon,"ido=%s\r",idordenador);  // Identificador del ordenador
2144        lon+=sprintf(ptrTrama->parametros+lon,"npc=%s\r",nombreordenador);      // Nombre del ordenador
2145        lon+=sprintf(ptrTrama->parametros+lon,"idc=%s\r",idcentro);     // Identificador del centro
2146        lon+=sprintf(ptrTrama->parametros+lon,"ida=%s\r",idaula);       // Identificador del aula
2147
2148        if (!mandaTrama(socket_c,ptrTrama)) {
2149                errorLog(modulo,26,FALSE);
2150                return (FALSE);
2151        }
2152        return(TRUE);
2153}
2154// ********************************************************************************************************
2155// PROGRAMA PRINCIPAL (CLIENTE)
2156// ********************************************************************************************************
2157int main(int argc, char *argv[])
2158{
2159        TRAMA *ptrTrama;
2160        char modulo[] = "main()";
2161
2162        ptrTrama=(TRAMA *)reservaMemoria(sizeof(TRAMA));
2163        if (ptrTrama == NULL) { // No hay memoria suficiente para el bufer de las tramas
2164                errorLog(modulo, 3, FALSE);
2165                exit(EXIT_FAILURE);
2166        }
2167        /*--------------------------------------------------------------------------------------------------------
2168                Validación de parámetros de ejecución y fichero de configuración
2169         ---------------------------------------------------------------------------------------------------------*/
2170        if (!validacionParametros(argc, argv,3)) // Valida parámetros de ejecución
2171                exit(EXIT_FAILURE);
2172
2173        if (!tomaConfiguracion(szPathFileCfg)) // Toma parametros de configuración
2174                exit(EXIT_FAILURE);
2175        /*--------------------------------------------------------------------------------------------------------
2176                Carga catálogo de funciones que procesan las tramas
2177         ---------------------------------------------------------------------------------------------------------*/
2178        int cf = 0;
2179
2180        strcpy(tbfuncionesClient[cf].nf, "RESPUESTA_AutoexecCliente");
2181        tbfuncionesClient[cf++].fptr = &RESPUESTA_AutoexecCliente;
2182
2183        strcpy(tbfuncionesClient[cf].nf, "RESPUESTA_InclusionCliente");
2184        tbfuncionesClient[cf++].fptr = &RESPUESTA_InclusionCliente;
2185
2186        strcpy(tbfuncionesClient[cf].nf, "NoComandosPtes");
2187        tbfuncionesClient[cf++].fptr = &NoComandosPtes;
2188
2189        strcpy(tbfuncionesClient[cf].nf, "Actualizar");
2190        tbfuncionesClient[cf++].fptr = &Actualizar;
2191
2192        strcpy(tbfuncionesClient[cf].nf, "Purgar");
2193        tbfuncionesClient[cf++].fptr = &Purgar;
2194
2195        strcpy(tbfuncionesClient[cf].nf, "ConsolaRemota");
2196        tbfuncionesClient[cf++].fptr = &ConsolaRemota;
2197
2198        strcpy(tbfuncionesClient[cf].nf, "Sondeo");
2199        tbfuncionesClient[cf++].fptr = &Sondeo;
2200
2201        strcpy(tbfuncionesClient[cf].nf, "Arrancar");
2202        tbfuncionesClient[cf++].fptr = &Arrancar;
2203
2204        strcpy(tbfuncionesClient[cf].nf, "Apagar");
2205        tbfuncionesClient[cf++].fptr = &Apagar;
2206
2207        strcpy(tbfuncionesClient[cf].nf, "Reiniciar");
2208        tbfuncionesClient[cf++].fptr = &Reiniciar;
2209
2210        strcpy(tbfuncionesClient[cf].nf, "IniciarSesion");
2211        tbfuncionesClient[cf++].fptr = &IniciarSesion;
2212
2213        strcpy(tbfuncionesClient[cf].nf, "CrearImagen");
2214        tbfuncionesClient[cf++].fptr = &CrearImagen;
2215
2216        strcpy(tbfuncionesClient[cf].nf, "CrearImagenBasica");
2217        tbfuncionesClient[cf++].fptr = &CrearImagenBasica;
2218
2219        strcpy(tbfuncionesClient[cf].nf, "CrearSoftIncremental");
2220        tbfuncionesClient[cf++].fptr = &CrearSoftIncremental;
2221
2222        strcpy(tbfuncionesClient[cf].nf, "RestaurarImagen");
2223        tbfuncionesClient[cf++].fptr = &RestaurarImagen;
2224
2225        strcpy(tbfuncionesClient[cf].nf, "RestaurarImagenBasica");
2226        tbfuncionesClient[cf++].fptr = &RestaurarImagenBasica;
2227
2228        strcpy(tbfuncionesClient[cf].nf, "RestaurarSoftIncremental");
2229        tbfuncionesClient[cf++].fptr = &RestaurarSoftIncremental;
2230
2231
2232        strcpy(tbfuncionesClient[cf].nf, "Configurar");
2233        tbfuncionesClient[cf++].fptr = &Configurar;
2234
2235        strcpy(tbfuncionesClient[cf].nf, "EjecutarScript");
2236        tbfuncionesClient[cf++].fptr = &EjecutarScript;
2237
2238        strcpy(tbfuncionesClient[cf].nf, "InventarioHardware");
2239        tbfuncionesClient[cf++].fptr = &InventarioHardware;
2240
2241        strcpy(tbfuncionesClient[cf].nf, "InventarioSoftware");
2242        tbfuncionesClient[cf++].fptr = &InventarioSoftware;
2243
2244        /*--------------------------------------------------------------------------------------------------------
2245                Toma dirección IP del cliente   
2246         ---------------------------------------------------------------------------------------------------------*/
2247        if(!tomaIPlocal()){ // Error al recuperar la IP local
2248                errorLog(modulo,0,FALSE);
2249                exit(EXIT_FAILURE);
2250        }
2251        /*--------------------------------------------------------------------------------------------------------
2252                Inicio de sesión
2253         ---------------------------------------------------------------------------------------------------------*/
2254        infoLog(1); // Inicio de sesión
2255        infoLog(3); // Abriendo sesión en el servidor de Administración;               
2256        /*--------------------------------------------------------------------------------------------------------
2257                Inclusión del cliente en el sistema
2258         ---------------------------------------------------------------------------------------------------------*/
2259        if(!inclusionCliente(ptrTrama)){        // Ha habido algún problema al abrir sesión
2260                errorLog(modulo,0,FALSE);
2261                exit(EXIT_FAILURE);
2262        }
2263        infoLog(4); // Cliente iniciado
2264
2265        /*--------------------------------------------------------------------------------------------------------
2266                Procesamiento de la cache
2267         ---------------------------------------------------------------------------------------------------------*/
2268        infoLog(23); // Abriendo sesión en el servidor de Administración;
2269        if(!cuestionCache(cache)){
2270                errorLog(modulo,0,FALSE);
2271                exit(EXIT_FAILURE);
2272        }
2273        /*--------------------------------------------------------------------------------------------------------
2274                Ejecución del autoexec
2275         ---------------------------------------------------------------------------------------------------------*/
2276        if(atoi(idproautoexec)>0){  // Ejecución de procedimiento Autoexec
2277                infoLog(5);
2278                if(!autoexecCliente(ptrTrama)){  // Ejecución fichero autoexec
2279                        errorLog(modulo,0,FALSE);
2280                        exit(EXIT_FAILURE);
2281                }
2282        }
2283        /*--------------------------------------------------------------------------------------------------------
2284                Comandos pendientes
2285         ---------------------------------------------------------------------------------------------------------*/
2286        infoLog(6); // Procesa comandos pendientes
2287        if(!comandosPendientes(ptrTrama)){  // Ejecución de acciones pendientes
2288                errorLog(modulo,0,FALSE);
2289                exit(EXIT_FAILURE);
2290        }
2291        infoLog(7); // Acciones pendientes procesadas
2292        /*--------------------------------------------------------------------------------------------------------
2293                Bucle de recepción de comandos
2294         ---------------------------------------------------------------------------------------------------------*/
2295        muestraMenu();
2296        procesaComandos(ptrTrama); // Bucle para procesar comandos interactivos
2297        /*--------------------------------------------------------------------------------------------------------
2298                Fin de la sesión
2299         ---------------------------------------------------------------------------------------------------------*/
2300        exit(EXIT_SUCCESS);
2301}
Note: See TracBrowser for help on using the repository browser.