source: admin/Services/ogAdmServer/sources/ogAdmServer.cpp @ 11956a9

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 11956a9 was dc00c0f, checked in by alonso <alonso@…>, 16 years ago

Fin pruebas primeros ficheros.

git-svn-id: https://opengnsys.es/svn/trunk@599 a21b9725-9963-47de-94b9-378ad31fedc9

  • Property mode set to 100644
File size: 139.4 KB
Line 
1// ****************************************************************************************************************************************************
2// Aplicación HIDRA
3// Copyright 2003-2005 JosnManuel Alonso. Todos los derechos reservados.
4// Fichero: hidra.cpp
5//      Descripcin:
6//              Este proyecto implementa el servicio hidra en un ordenador con plataforma windows NT. Este fichero aporta las funciones de
7//              envn de comandos y recepcin de respuestas
8// ****************************************************************************************************************************************************
9#include "ogAdmServer.h"
10#include "encriptacion.c"
11// ________________________________________________________________________________________________________
12// Funcin: RegistraLog
13//
14//              Descripción:
15//                      Esta funcin registra los evento de errores en un fichero log
16//              Parametros:
17//                      - msg : Mensage de error
18//                      - swerrno: Switch que indica que recupere literal de error del sistema
19// ________________________________________________________________________________________________________
20void RegistraLog(const char *msg,int swerrno)
21{
22        struct tm * timeinfo;
23        timeinfo = TomaHora();
24
25        FLog=fopen(szPathFileLog,"at");
26        if(swerrno)
27                fprintf (FLog,"%02d/%02d/%d %02d:%02d ***%s:%s\n",timeinfo->tm_mday,timeinfo->tm_mon+1,timeinfo->tm_year+1900,timeinfo->tm_hour,timeinfo->tm_min,msg,strerror(errno));
28        else
29                fprintf (FLog,"%02d/%02d/%d %02d:%02d ***%s\n",timeinfo->tm_mday,timeinfo->tm_mon+1,timeinfo->tm_year+1900,timeinfo->tm_hour,timeinfo->tm_min,msg);
30        fclose(FLog);
31}
32
33// ________________________________________________________________________________________________________
34// Funcin: TomaHora
35//
36//              Descripcin:
37//                      Esta funcin toma la hora actual  del sistema y devuelve una estructura conlos datos
38//              Parametros:
39//                      - msg : Mensage de error
40//                      - swerrno: Switch que indica que recupere literal de error del sistema
41// ________________________________________________________________________________________________________
42struct tm * TomaHora()
43{
44        time_t rawtime;
45        time ( &rawtime );
46        return(gmtime(&rawtime));
47}
48//________________________________________________________________________________________________________
49//
50// Función: TomaConfiguracion
51//
52//              Descripción:
53//              Esta función lee el fichero de configuración del programa hidralinuxcli  y toma los parametros
54//              Parametros:
55//                              - pathfilecfg : Ruta al fichero de configuración
56//________________________________________________________________________________________________________
57int TomaConfiguracion(char* pathfilecfg)
58{
59        long lSize;
60        char * buffer,*lineas[100],*dualparametro[2];
61        char ch[2];
62        int i,numlin,resul;
63
64        if(pathfilecfg==NULL) return(FALSE); // Nombre del fichero en blanco
65
66        Fconfig = fopen ( pathfilecfg , "rb" );
67        if (Fconfig==NULL)      return(FALSE);
68        fseek (Fconfig , 0 , SEEK_END);  // Obtiene tamaño del fichero.
69        lSize = ftell (Fconfig);
70        rewind (Fconfig);
71        buffer = (char*) malloc (lSize);  // Toma memoria para el buffer de lectura.
72        if (buffer == NULL)             return(FALSE);
73        fread (buffer,1,lSize,Fconfig);         // Lee contenido del fichero
74        fclose(Fconfig);
75
76        //inicializar
77        IPlocal[0]=(char)NULL;
78        servidorhidra[0]=(char)NULL;
79        Puerto[0]=(char)NULL;
80        usuario[0]=(char)NULL;
81        pasguor[0]=(char)NULL;
82        datasource[0]=(char)NULL;
83        catalog[0]=(char)NULL;
84       
85       
86        strcpy(ch,"\n");// caracter delimitador ( salto de linea)
87        numlin=split_parametros(lineas,buffer,ch);
88        for (i=0;i<numlin;i++){
89                strcpy(ch,"=");// caracter delimitador
90                split_parametros(dualparametro,lineas[i],ch); // Toma primer nombre del parametros
91
92                resul=strcmp(dualparametro[0],"IPhidra");
93                if(resul==0) strcpy(IPlocal,dualparametro[1]);
94
95                resul=strcmp(dualparametro[0],"IPhidra");
96                if(resul==0) strcpy(servidorhidra,dualparametro[1]);
97
98                resul=strcmp(dualparametro[0],"Puerto");
99                if(resul==0) strcpy(Puerto,dualparametro[1]);
100               
101                resul=strcmp(dualparametro[0],"AulaUp");
102                if(resul==0) strcpy(AulaUp,dualparametro[1]);
103       
104                resul=strcmp(dualparametro[0],"Usuario");
105                if(resul==0) strcpy(usuario,dualparametro[1]);
106
107                resul=strcmp(dualparametro[0],"PassWord");
108                if(resul==0) strcpy(pasguor,dualparametro[1]);
109
110                resul=strcmp(dualparametro[0],"DataSource");
111                if(resul==0) strcpy(datasource,dualparametro[1]);
112
113                resul=strcmp(dualparametro[0],"Catalog");
114                if(resul==0) strcpy(catalog,dualparametro[1]);
115        }
116        if(IPlocal[0]==(char)NULL){
117                RegistraLog("IPlocal, NO se ha definido este parámetro",false);
118                return(FALSE);
119        }
120        if(servidorhidra[0]==(char)NULL){
121                RegistraLog("IPhidra, NO se ha definido este parámetro",false);
122                return(FALSE);
123        }
124        if(Puerto[0]==(char)NULL){
125                RegistraLog("Puerto, NO se ha definido este parámetro",false);
126                return(FALSE);
127        }
128        puerto=atoi(Puerto);
129       
130        if(AulaUp[0]==(char)NULL){
131                RegistraLog("AulaUp, NO se ha definido este parámetro",false);
132                return(FALSE);
133        }       
134        aulaup=atoi(AulaUp);
135                       
136        if(usuario[0]==(char)NULL){
137                RegistraLog("Usuario, NO se ha definido este parámetro",false);
138                return(FALSE);
139        }       
140        if(pasguor[0]==(char)NULL){
141                RegistraLog("PassWord, NO se ha definido este parámetro",false);
142                return(FALSE);
143        }       
144        if(datasource[0]==(char)NULL){
145                RegistraLog("DataSource, NO se ha definido este parámetro",false);
146                return(FALSE);
147        }       
148        if(catalog[0]==(char)NULL){
149                RegistraLog("Catalog, NO se ha definido este parámetro",false);
150                return(FALSE);
151        }       
152        return(TRUE);
153}
154// ________________________________________________________________________________________________________
155// Funcin: GestionaConexion
156//
157//              Descripcin:
158//                      Esta hebra es la encargada de comunicarse con los clientes  a travn del socket enviado como parnetro.
159//              Parametros:
160//                      - lpParam : Socket usado
161// ________________________________________________________________________________________________________
162void * GestionaConexion(void* s)
163{
164        SOCKET socket_c=*(SOCKET*)s;
165        TRAMA trama;           
166       
167        if (recibe_trama(socket_c,&trama)){
168                if (strncmp(trama.identificador,"JMMLCAMDJ",9)==0) // Es una trama hidra
169                        gestiona_comando(socket_c,trama);
170        }
171        return(s);
172}
173// ________________________________________________________________________________________________________
174// Funcin: gestiona_comando
175//
176//              Descripcin:
177//                      Analiza el comando enviado por el servidor web y lo reenvia al cliente rembo o lo ejecuta n mismo
178//              Parametros:
179//                      - s : Socket usado
180//                      - trama : La trama con los parametrso del comando
181// ________________________________________________________________________________________________________
182void gestiona_comando(SOCKET s,TRAMA trama)
183{
184        int i,resul,idaccion,numipes,cont,estado_cliente;
185        char *parametros,*nombrefuncion;
186        char *iph,*ids,*coletilla;
187        char pids[20],ipes[MAXLON_PARAMETROSIPH];
188
189        parametros=&trama.parametros[0];
190       
191        if (trama.ejecutor=='1'){       // Debe ejecutar el servidor
192                INTROaFINCAD(parametros);
193                nombrefuncion=toma_parametro("nfn",parametros);
194                resul=strcmp(nombrefuncion,"InclusionCliente");
195                if(resul==0){
196                        if(!InclusionCliente(s,parametros))
197                                respuesta_cortesia(s);
198                        return;
199                }
200
201                resul=strcmp(nombrefuncion,"inclusion_cliWINLNX");
202                if(resul==0){
203                        inclusion_cliWINLNX(s,parametros);
204                        return;
205                }
206               
207                resul=strcmp(nombrefuncion,"inclusion_REPO");
208                if(resul==0){
209                        inclusion_REPO(s,parametros);
210                        return;
211                }               
212
213                resul=strcmp(nombrefuncion,"ComandosPendientes");
214                if(resul==0){
215                        if(!ComandosPendientes(s,parametros))
216                                respuesta_cortesia(s);
217                        return;
218                }
219
220                resul=strcmp(nombrefuncion,"RecuperaItem");
221                if(resul==0){
222                        if(!RecuperaItem(s,parametros))
223                                respuesta_cortesia(s);
224                        return;
225                }
226
227                resul=strcmp(nombrefuncion,"EjecutarItem");
228                if(resul==0){
229                        if(!EjecutarItem(s,parametros))
230                                respuesta_cortesia(s);
231                        return;
232                }
233                resul=strcmp(nombrefuncion,"DisponibilidadComandos");
234                if(resul==0){
235                        DisponibilidadComandos(s,parametros);
236                        respuesta_cortesia(s);
237                        return;
238                }
239                resul=strcmp(nombrefuncion,"Sondeo");
240                if(resul==0){
241                        Sondeo(s,parametros);
242                        return;
243                }
244                resul=strcmp(nombrefuncion,"Arrancar");
245                if(resul==0){
246                        Arrancar(parametros);
247                        return;
248                }
249
250                resul=strcmp(nombrefuncion,"Actualizar");
251                if(resul==0){
252                        Actualizar(parametros);
253                        return;
254                }
255
256                resul=strcmp(nombrefuncion,"Conmutar");
257                if(resul==0){
258                        Conmutar(parametros);
259                        return;
260                }
261                resul=strcmp(nombrefuncion,"Purgar");
262                if(resul==0){
263                        PurgarTablaSockets(parametros);
264                        return;
265                }
266       
267                resul=strcmp(nombrefuncion,"RESPUESTA_Arrancar");
268                if(resul==0){
269                        RESPUESTA_Arrancar(s,parametros);
270                        respuesta_cortesia(s);
271                        return;
272                }
273
274                resul=strcmp(nombrefuncion,"RESPUESTA_Apagar");
275                if(resul==0){
276                        RESPUESTA_Apagar(s,parametros);
277                        respuesta_cortesia(s);
278                        return;
279                }
280
281                resul=strcmp(nombrefuncion,"RESPUESTA_RemboOffline");
282                if(resul==0){
283                        RESPUESTA_RemboOffline(s,parametros);
284                        respuesta_cortesia(s);
285                        return;
286                }
287
288                resul=strcmp(nombrefuncion,"RESPUESTA_Reiniciar");
289                if(resul==0){
290                        RESPUESTA_Reiniciar(s,parametros);
291                        respuesta_cortesia(s);
292                        return;
293                }
294               
295                resul=strcmp(nombrefuncion,"RESPUESTA_IniciarSesion");
296                if(resul==0){
297                        RESPUESTA_Reiniciar(s,parametros);
298                        respuesta_cortesia(s);
299                        return;
300                }               
301                resul=strcmp(nombrefuncion,"RESPUESTA_ExecShell");
302                if(resul==0){
303                        RESPUESTA_ExecShell(s,parametros);
304                        respuesta_cortesia(s);
305                        return;
306                }
307                resul=strcmp(nombrefuncion,"RESPUESTA_CrearPerfilSoftware");
308                if(resul==0){
309                        RESPUESTA_CrearPerfilSoftware(s,parametros);
310                        respuesta_cortesia(s);
311                        return;
312                }
313
314                resul=strcmp(nombrefuncion,"RESPUESTA_CrearSoftwareIncremental");
315                if(resul==0){
316                        RESPUESTA_CrearSoftwareIncremental(s,parametros);
317                        respuesta_cortesia(s);
318                        return;
319                }
320                resul=strcmp(nombrefuncion,"RESPUESTA_RestaurarImagen");
321                if(resul==0){
322                        RESPUESTA_RestaurarImagen(s,parametros);
323                        respuesta_cortesia(s);
324                        return;
325                }
326                resul=strcmp(nombrefuncion,"RESPUESTA_ParticionaryFormatear");
327                if(resul==0){
328                        RESPUESTA_ParticionaryFormatear(s,parametros);
329                        respuesta_cortesia(s);
330                        return;
331                }
332                resul=strcmp(nombrefuncion,"RESPUESTA_Configurar");
333                if(resul==0){
334                        RESPUESTA_Configurar(s,parametros);
335                        respuesta_cortesia(s);
336                        return;
337                }
338                resul=strcmp(nombrefuncion,"RESPUESTA_TomaConfiguracion");
339                if(resul==0){
340                        RESPUESTA_TomaConfiguracion(s,parametros);
341                        respuesta_cortesia(s);
342                        return;
343                }
344                resul=strcmp(nombrefuncion,"RESPUESTA_TomaHardware");
345                if(resul==0){
346                        RESPUESTA_TomaHardware(s,parametros);
347                        respuesta_cortesia(s);
348                        return;
349                }       
350                resul=strcmp(nombrefuncion,"RESPUESTA_TomaSoftware");
351                if(resul==0){
352                        RESPUESTA_TomaSoftware(s,parametros);
353                        respuesta_cortesia(s);
354                        return;
355                }               
356        }
357        else{   // Debe ejecutar elcliente rembo
358                coletilla=corte_iph(parametros); // toma el puntero al comienzo del parametros iph
359                INTROaFINCAD(coletilla);
360                iph=toma_parametro("iph",coletilla); // Toma ipes
361                ids=toma_parametro("ids",coletilla); // Toma identificador de la accion
362                coletilla[0]='\0';// Corta la trama en la ip
363                strcpy(ipes,iph); // Copia la cadena de ipes
364                if(ids!=NULL){
365                        idaccion=atoi(ids);
366                        sprintf(pids,"ids=%d\r",idaccion);
367                        strcat(parametros,pids); // Le ande el identificador de la accion
368                }
369                numipes=cuenta_ipes(ipes); // Numero de ipes a los que enviar las tramas
370                cont=0;
371                DesmarcaServidoresRembo();
372                for (i=0;i<MAXIMOS_SOCKETS;i++){
373                        if (strncmp(tbsockets[i].ip,"\0",1)!=0){ // Si es un cliente activo
374                                if (IgualIP(ipes,tbsockets[i].ip)){ // Si existe la IP en la cadena
375                                        estado_cliente=strcmp(tbsockets[i].estado,CLIENTE_REMBO);
376                                        if(estado_cliente==0){ // Cliente Rembo ...
377                                                strcpy(tbsockets[i].estado,CLIENTE_OCUPADO);
378                                                MarcaServidoresRembo(tbsockets[i].ipsrvrmb,tbsockets[i].ip);
379                                        }
380                                        else{
381                                                estado_cliente=strcmp(tbsockets[i].estado,CLIENTE_OCUPADO);
382                                                if(estado_cliente!=0){ // Cliente Windows(Windows98,Windows2000,windows XP...) y Linux
383                                                        strcpy(tbsockets[i].estado,CLIENTE_OCUPADO);
384                                                        manda_comando(tbsockets[i].sock,parametros);
385                                                }
386                                        }
387                                        cont++; // Contador de envios de tramas a  ordenadores
388                                        if(cont==numipes) break;
389                                }
390                        }
391                }
392                EnviaServidoresRembo(parametros);
393        }
394}
395// ________________________________________________________________________________________________________
396// Funcin: manda_comando
397//
398//              Descripcin:
399//                      Esta funcin envia un comando por la red (TCP) desde el servidor hidra al servidor rembo que controla al cliente que lo ejecutarn
400//              Parametros:
401//                      - sock : El socket del cliente
402//                      - parametros: El contenido del comando
403// ________________________________________________________________________________________________________
404int manda_comando(SOCKET sock,char* parametros)
405{
406        TRAMA trama;           
407        int resul;
408
409        trama.arroba='@';
410        strncpy(trama.identificador,"JMMLCAMDJ",9);
411        trama.ejecutor='0';
412        strcpy(trama.parametros,parametros);
413        resul=manda_trama(sock,&trama);
414        return(resul);
415}
416// ________________________________________________________________________________________________________
417// Funcin: manda_trama
418//
419//              Descripcin:
420//                      Esta funcin envia una trama por la red (TCP)
421//              Parametros:
422//                      - sock : El socket del host al que se dirige la trama
423//                      - trama: El contenido de la trama
424// ________________________________________________________________________________________________________
425int manda_trama(SOCKET sock,TRAMA* trama)
426{
427        int nLeft,idx,ret;
428        Encriptar((char*)trama);
429        nLeft = strlen((char*)trama);
430        idx = 0;
431        while(nLeft > 0){
432                ret = send(sock,(char*)&trama[idx], nLeft, 0);
433               
434                if (ret == 0){
435                        break;
436                }
437                else
438                        if (ret == SOCKET_ERROR){
439                                RegistraLog("***send() fallo en hebra cliente",true);
440                                return(FALSE);
441                        }
442                nLeft -= ret;
443                idx += ret;
444        }
445        return(TRUE);
446}
447// ________________________________________________________________________________________________________
448// Funcin: recibe_trama
449//
450//              Descripcin:
451//                      Esta funcin recibe una trama por la red (TCP)
452//              Parametros:
453//                      - sock : El socket del cliente
454//                      - trama: El buffer para recibir la trama
455// ________________________________________________________________________________________________________
456int recibe_trama(SOCKET sock,TRAMA* trama)
457{
458        int ret;
459
460        while(1){ // Bucle para recibir datos del cliente
461                ret = recv(sock,(char*)trama,LONGITUD_TRAMA,0);
462                if (ret == 0) // Conexin cerrada por parte del cliente (Graceful close)
463                        break;
464                else{
465                        if (ret == SOCKET_ERROR){
466                                RegistraLog("***recv() fallo en recepcion trama",true);
467                                return (FALSE);
468                        }
469                        else // Datos recibidos
470                                break;
471                }
472        }
473        Desencriptar((char*)trama);
474        trama->parametros[ret-11]=(char)NULL; // Coloca caracter fin de cadena en trama
475        return(TRUE);
476}
477// ________________________________________________________________________________________________________
478// Funcin: hay_hueco
479//
480//              Descripcin:
481//                      Esta funcin devuelve true o false dependiendo de que haya hueco en la tabla de sockets para un nuevo cliente.
482//                      Parametros:
483//                              - idx:   Primer indice libre que se podrn utilizar
484// ________________________________________________________________________________________________________
485int hay_hueco(int *idx)
486{
487        int i;
488
489        for (i=0;i<MAXIMOS_SOCKETS;i++){
490                if (strncmp(tbsockets[i].ip,"\0",1)==0){ // Hay un hueco
491                        *idx=i;
492                        return(TRUE);
493                }
494        }
495        return(FALSE);
496}
497// ________________________________________________________________________________________________________
498// Funcin: cliente_existente
499//
500//               Descripcin:
501//                      Esta funcin devuelve true o false dependiendo de si el cliente estnya registrado en  la tabla de sockets
502//              Parametros:
503//                              - ip : La ip del cliente a buscar
504//                              - idx:   Indice que ocuparn el cliente, de estar ya registrado
505// ________________________________________________________________________________________________________
506BOOLEAN cliente_existente(char *ip,int* idx)
507{
508        int i;
509        for (i=0;i<MAXIMOS_SOCKETS;i++){
510                if (strcmp(ip,tbsockets[i].ip)==0){ // Si existe la IP ...
511                        *idx=i;
512                        return(TRUE);
513                }
514        }
515        return(FALSE);
516}
517// ________________________________________________________________________________________________________
518// Funcin: hay_huecoservidorrembo
519//
520//              Descripcin:
521//                      Esta funcin devuelve true o false dependiendo de que haya hueco en la tabla de sockets para un nuevo servidor rembo.
522//              Parametros:
523//                      - idx:   Primer indice libre que se podrn utilizar
524// ________________________________________________________________________________________________________
525int hay_huecoservidorrembo(int *idx)
526{
527        int i;
528        for (i=0;i<MAXIMOS_SRVRMB;i++){
529                if (strncmp(tbsocketsSRVRMB[i].ip,"\0",1)==0){ // Hay un hueco
530                        *idx=i;
531                        return(TRUE);
532                }
533        }
534        return(FALSE);
535}
536// ________________________________________________________________________________________________________
537// Funcin: servidorrembo_existente
538//
539//              Descripcin:
540//                      Esta funcin devuelve true o false dependiendo de si el servidor estnya registrado en  la tabla de sockets
541//              Parametros:
542//                              - ip : La ip delcliente a buscar
543//                              - idx   Indice que ocuparn el servidor, de existir
544// ________________________________________________________________________________________________________
545BOOLEAN servidorrembo_existente(char *ip,int* idx)
546{
547        int i;
548        for (i=0;i<MAXIMOS_SRVRMB;i++){
549                if (strcmp(ip,tbsocketsSRVRMB[i].ip)==0){ // Si existe la IP ...
550                        *idx=i;
551                        return(TRUE);
552                }
553        }
554        return(FALSE);
555}
556// ________________________________________________________________________________________________________
557// Funcin: INTROaFINCAD
558//
559//              Descripcin:
560//                      Cambia INTROS por caracteres fin de cadena ('\0') en una cadena
561//              Parametros:
562//                              - parametros : La cadena a explorar
563// ________________________________________________________________________________________________________
564void INTROaFINCAD(char* parametros)
565{
566        int lon,i;
567        lon=strlen(parametros);
568        for(i=0;i<lon;i++){
569                if(parametros[i]=='\r') parametros[i]='\0';
570        }
571}
572// ________________________________________________________________________________________________________
573// Funcinn: FINCADaINTRO
574//
575//              Descripcinn?:
576//                      Cambia caracteres fin de cadena ('\0') por INTROS en una cadena
577//              Parametros:
578//                              - parametros : La cadena a explorar
579// ________________________________________________________________________________________________________
580void FINCADaINTRO(char* a,char *b)
581{
582        char *i;
583        for(i=a;i<b;i++){ // Cambia los NULOS por INTROS
584                if(*i=='\0') *i='\r';
585        }
586}
587// ________________________________________________________________________________________________________
588// Funcin: cuenta_ipes
589//
590//              Descripcin:
591//                      Cuenta las comas (caracter de separacion) de las cadenas de ipes
592//              Parnetros:
593//                      - parametros : La cadena a explorar
594// ________________________________________________________________________________________________________
595int cuenta_ipes(char* iph)
596{
597        int lon,i,cont=1;
598        lon=strlen(iph);
599        for(i=0;i<lon;i++){
600                if(iph[i]==';') cont++;
601        }
602        return(cont);
603}
604// ________________________________________________________________________________________________________
605// Funcin: toma_parametro
606//
607//              Descripcin:
608//                      Esta funcin devuelve el valor de un parametro incluido en la trama.
609//                      El formato del protocolo es: "nombre_parametro=valor_parametro"
610//              Parnetros:
611//                      - nombre_parametro: Es el nombre del parnetro a recuperar
612//                      - parametros: Es la matriz que contiene todos los parnetros
613// ________________________________________________________________________________________________________
614char * toma_parametro(const char* nombre_parametro,char *parametros)
615{
616        int i=0;
617        char* pos;
618
619        for(i=0;i<LONGITUD_PARAMETROS-4;i++){
620                if(parametros[i]==nombre_parametro[0]){
621                        if(parametros[i+1]==nombre_parametro[1]){
622                                if(parametros[i+2]==nombre_parametro[2]){
623                                        if(parametros[i+3]=='='){
624                                                pos=&parametros[i+4];
625                                                return(pos);
626                                        }
627                                }
628                        }
629                }
630        }
631        return(NULL);
632}
633// ________________________________________________________________________________________________________
634// Funcin: split_parametros
635//
636//              Descripcin:
637//                      Esta funcin trocea una cadena segn un carnter delimitador, Devuelve el nmero de trozos
638//              Parnetros:
639//                      - trozos: Array de punteros a cadenas
640//                      - cadena: Cadena a trocear
641//                      - ch: Carnter delimitador
642// ________________________________________________________________________________________________________
643int split_parametros(char **trozos,char *cadena, char * ch){
644        int w=0;
645        char* token;
646
647        token= strtok(cadena,ch); // Trocea segn delimitador
648        while( token != NULL ){
649                trozos[w++]=token;
650                token=strtok(NULL,ch); // Siguiente token
651        }
652        trozos[w++]=token;
653        return(w-1); // Devuelve el numero de trozos
654}
655// ________________________________________________________________________________________________________
656// Funcin: corte_iph
657//
658//              Descripcin:
659//                      Esta funcin devuelve el valor del parametro iph incluido en la trama que debe ser el ltimo parnetro de la trama.
660//        Parnetros:
661//                      - parametros: Parnetros de la trama
662// ________________________________________________________________________________________________________
663char* corte_iph(char *parametros)
664{
665        int i=0;
666        char nombre_parametro[5];
667
668        strcpy(nombre_parametro,"iph=");
669        for(i=0;i<LONGITUD_PARAMETROS-4;i++){
670                if(parametros[i]==nombre_parametro[0]){
671                        if(parametros[i+1]==nombre_parametro[1]){
672                                if(parametros[i+2]==nombre_parametro[2]){
673                                        if(parametros[i+3]=='='){
674                                                return(&parametros[i]); //Devuelve la posicion de comienzo de la iph
675                                        }
676                                }
677                        }
678                }
679        }
680        return(NULL);
681}
682// ________________________________________________________________________________________________________
683// Funcin: respuesta_cortesia
684//
685//       Descripcin:
686//              Envn respuesta de cortesn al cliente rembo
687//        Parnetros:
688//                      - s: Socket usado por el cliente para comunicarse con el servidor HIDRA
689// ________________________________________________________________________________________________________
690int respuesta_cortesia(SOCKET s)
691{
692        char nwparametros[100];
693
694        nwparametros[0]='\0';
695        strcat(nwparametros,"nfn=Cortesia");
696        strcat(nwparametros,"\r");
697        return(manda_comando(s,nwparametros));
698}
699// ________________________________________________________________________________________________________
700// Funcin: NoComandosPendientes
701//
702//              Descripcin:
703//                      Envn respuesta de cortesn al cliente rembo
704//        Parnetros:
705//                      - s: Socket usado por el cliente para comunicarse con el servidor HIDRA
706// ________________________________________________________________________________________________________
707int NoComandosPendientes(SOCKET s)
708{
709        char nwparametros[100];
710
711        nwparametros[0]='\0';
712        strcat(nwparametros,"nfn=NoComandosPtes");
713        strcat(nwparametros,"\r");
714        return(manda_comando(s,nwparametros));
715}
716// ________________________________________________________________________________________________________
717// Funcin: InclusionCliente
718//
719//              Descripcin:
720//                      Esta funcin incorpora el socket de un nuevo cliente a la tabla de sockets y le devuelve alguna de sus propiedades: nombre,
721//                      dentificador, perfil hardware , mens...
722//              Parnetros:
723//                      - s: Socket del cliente
724//                      - parametros: Parnetros de la trama recibida
725// ________________________________________________________________________________________________________
726int InclusionCliente(SOCKET s,char *parametros)
727{
728        char ErrStr[200],sqlstr[1000];
729        Database db;
730        Table tbl;
731
732        char *iph,*cfg,*mac,*nau,*nor,*ipr,*ipd;
733        int i,lon,glon,idx,resul,puertorepo;
734        char nwparametros[LONGITUD_PARAMETROS];
735        char ipservidordhcp[16],ipservidorrembo[16],nombreordenador[100];
736        int idordenador,idaula,idconfiguracion,idparticion,idperfilhard,idmenu,cache;
737
738        // Toma parnetros
739        iph=toma_parametro("iph",parametros); // Toma ip
740        mac=toma_parametro("mac",parametros); // Toma mac
741        cfg=toma_parametro("cfg",parametros); // Toma configuracion
742        nau=toma_parametro("nau",parametros); // Toma nombre del grupo em el           fichero config de rembo
743        nor=toma_parametro("nor",parametros); // Toma nombre del ordenador en el  fichero config de rembo
744        ipd=toma_parametro("ipd",parametros); // Toma ip del servidor dhcpd
745        ipr=toma_parametro("ipr",parametros); // Toma ip del servidor rembo
746
747        // Toma las propiedades del ordenador
748        if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
749                RegistraLog("Error de conexión con la base de datos",false);
750                db.GetErrorErrStr(ErrStr);
751                return(false);
752        }
753        // Recupera los datos del ordenador
754        sprintf(sqlstr,"SELECT ordenadores.idordenador,ordenadores.idaula,ordenadores.nombreordenador, ordenadores.idperfilhard, ordenadores.idconfiguracion,ordenadores.idparticion,servidoresrembo.ip AS ipservidorrembo,servidoresrembo.puertorepo, ordenadores.idmenu,ordenadores.cache FROM ordenadores INNER JOIN  servidoresrembo ON ordenadores.idservidorrembo = servidoresrembo.idservidorrembo  WHERE ordenadores.ip = '%s'",iph);
755
756        if(!db.Execute(sqlstr,tbl)){ // Error al consultar
757                RegistraLog("Error al ejecutar la consulta",false);
758                db.GetErrorErrStr(ErrStr);
759                return(false);
760        }
761        if(tbl.ISEOF()){ // Si No existe registro
762                RegistraLog("Cliente No encontrado, se rechaza la petición",false);
763                if(aulaup==AUTOINCORPORACION_OFF) // No estnactivada la incorporacin automnica
764                        return(false);
765                if(!cuestion_nuevoordenador(db,tbl,&idordenador,nau,nor,iph,mac,cfg,ipd,ipr)) // Ha habido algn error en la incorporacin automnica
766                        return(false);
767                // Valores por defecto del nuevo ordenador
768                strcpy(nombreordenador,nor);
769                idperfilhard=0;
770                strcpy(ipservidordhcp,ipd);
771                strcpy(ipservidorrembo,ipr);
772                idmenu=0;
773        }
774        else{
775         //     sprintf(msglog,"Petición de Inclusión del CLiente:%s",iph);
776        //      RegistraLog(msglog,false);
777
778                if(!tbl.Get("idordenador",idordenador)){ // Toma dato
779                                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
780                                return(false);
781                }
782                if(!tbl.Get("nombreordenador",nombreordenador)){ // Toma dato
783                                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
784                                return(false);
785                }       
786                if(!tbl.Get("idaula",idaula)){ // Toma dato
787                                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
788                                return(false);
789                }
790
791                if(!tbl.Get("idconfiguracion",idconfiguracion)){ // Toma dato
792                                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
793                                return(false);
794                }
795                if(!tbl.Get("idparticion",idparticion)){ // Toma dato
796                                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
797                                return(false);
798                }
799                if(!tbl.Get("idperfilhard",idperfilhard)){ // Toma dato
800                                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
801                                return(false);
802                }
803                /*
804                if(!tbl.Get("ipservidordhcp",ipservidordhcp)){ // Toma dato
805                                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
806                                return(false);
807                }
808
809                lon=strlen(ipservidordhcp);
810                for (i=0;i<lon;i++){
811                        if(ipservidordhcp[i]==' ') {
812                                ipservidordhcp[i]='\0';
813                                break;
814                        }
815                }
816                */
817                if(!tbl.Get("ipservidorrembo",ipservidorrembo)){ // Toma dato
818                                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
819                                return(false);
820                }
821                lon=strlen(ipservidorrembo);
822                for (i=0;i<lon;i++){
823                        if(ipservidorrembo[i]==' ') {
824                                ipservidorrembo[i]='\0';
825                                break;
826                        }
827                }
828                if(!tbl.Get("puertorepo",puertorepo)){ // Toma dato
829                                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
830                                return(false);
831                }               
832               
833                if(!tbl.Get("idmenu",idmenu)){ // Toma dato
834                                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
835                                return(false);
836                }
837                if(!tbl.Get("cache",cache)){ // Toma dato
838                                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
839                                return(false);
840                }                                       
841                resul=actualiza_configuracion(db,tbl,cfg,idconfiguracion,idparticion,iph); // Actualiza la configuracin del ordenador
842                if(!resul){
843                        pthread_mutex_unlock(&guardia);
844                        return(false);
845                }
846        }
847        // Incluyendo al cliente en la tabla de sokets
848        if (cliente_existente(iph,&i)){ // Si ya existe la IP ...
849                idx=i;
850                //close(tbsockets[idx].sock);
851        }
852        else{
853                if (hay_hueco(&i)){ // Busca hueco para el nuevo cliente
854                        idx=i;
855                        strcpy(tbsockets[idx].ip,iph);// Copia IP
856                }
857                else
858                        return(false); // No hay huecos
859        }
860        strcpy(tbsockets[idx].estado,CLIENTE_INICIANDO); // Actualiza el estado del cliente
861        tbsockets[idx].sock=s; // Guarda el socket
862        //strcpy(tbsockets[idx].ipsrvdhcp,ipservidordhcp);// Guarda IP servidor dhcp
863        strcpy(tbsockets[idx].ipsrvrmb,ipservidorrembo);// Guarda IP servidor rembo
864
865        inclusion_srvRMB(ipservidorrembo,puertorepo); // Actualiza tabla de servidores rembo
866
867        // Prepara la trama
868        lon=sprintf(nwparametros,"nfn=RESPUESTA_InclusionCliente\r");
869        lon+=sprintf(nwparametros+lon,"ido=%d\r",idordenador);
870        lon+=sprintf(nwparametros+lon,"npc=%s\r",nombreordenador);
871        lon+=sprintf(nwparametros+lon,"ida=%d\r",idaula);
872        lon+=sprintf(nwparametros+lon,"hrd=%s\r",servidorhidra);
873        lon+=sprintf(nwparametros+lon,"prt=%d\r",puerto);
874        lon+=sprintf(nwparametros+lon,"ifh=%d\r",idperfilhard);
875        lon+=sprintf(nwparametros+lon,"che=%d\r",cache);
876        lon+=sprintf(nwparametros+lon,"ipr=%s\r",ipservidorrembo);
877        lon+=sprintf(nwparametros+lon,"rep=%d\r",puertorepo);
878        glon=lon;
879        if(!Toma_menu(db,tbl,nwparametros,idmenu,lon)) nwparametros[glon]=(char)NULL;
880        db.Close();
881        return(manda_comando(s,nwparametros));
882}
883// ________________________________________________________________________________________________________
884// Función: Toma menu
885//
886//              Descripcin:
887//                      Esta funcin toma los parametros del menu inicial del cliente rembo y se los envn en el proceso de inclusin
888//              Parnetros:
889//                      - nwparametros: Cadena con los parnetros a enviar al cliente
890//                      - idmenu: Identificador del men
891//                      - lon : Longitud inicial de la cadena de parnetros
892// ________________________________________________________________________________________________________
893int Toma_menu(Database db, Table tbl,char* nwparametros,int idmenu,int lon)
894{
895        Table littbl;
896
897        char sqlstr[1000],ErrStr[200],titulo[250],descripitem[250],urlimg[250];
898        int idaccionmenu,idtipoaccion,coorx,coory,idurlimg;
899        int modalidad,resolucion,tipoaccion,tipoitem;
900        char htmlmenupub[250],htmlmenupri[250];
901
902        sprintf(sqlstr,"SELECT menus.resolucion,menus.titulo,menus.coorx,menus.coory,menus.modalidad,menus.scoorx,menus.scoory,menus.smodalidad,menus.htmlmenupub,menus.htmlmenupri,acciones_menus.tipoaccion,acciones_menus.idaccionmenu,acciones_menus.idtipoaccion,acciones_menus.tipoitem,acciones_menus.descripitem,acciones_menus.idurlimg FROM acciones_menus INNER JOIN menus ON acciones_menus.idmenu = menus.idmenu WHERE menus.idmenu=%d order by acciones_menus.orden",idmenu);
903               
904        if(!db.Execute(sqlstr,tbl)){ // Error al leer
905                db.GetErrorErrStr(ErrStr);
906                return(false);
907        }
908        if (tbl.ISEOF()) return(true);
909       
910        if(!tbl.Get("titulo",titulo)){ // Toma dato
911                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
912                return(false);
913        }
914        if(!tbl.Get("coorx",coorx)){ // Toma dato
915                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
916                return(false);
917        }
918        if(!tbl.Get("coory",coory)){ // Toma dato
919                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
920                return(false);
921        }
922        if(!tbl.Get("modalidad",modalidad)){ // Toma dato
923                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
924                return(false);
925        }
926        lon+=sprintf(nwparametros+lon,"cmn=%s&%d&%d&%d&",titulo,coorx,coory,modalidad); // Cabecera de menu
927
928        if(!tbl.Get("scoorx",coorx)){ // Toma dato
929                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
930                return(false);
931        }
932        if(!tbl.Get("scoory",coory)){ // Toma dato
933                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
934                return(false);
935        }
936        if(!tbl.Get("smodalidad",modalidad)){ // Toma dato
937                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
938                return(false);
939        }
940        lon+=sprintf(nwparametros+lon,"%d&%d&%d",coorx,coory,modalidad); // Cabecera de menu
941
942        if(!tbl.Get("resolucion",resolucion)){ // Toma dato
943                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
944                return(false);
945        }
946        lon+=sprintf(nwparametros+lon,"&%d\r",resolucion); // Resolucion de la pantalla
947
948        if(!tbl.Get("htmlmenupub",htmlmenupub)){ // Toma dato
949                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
950                return(false);
951        }
952        if(!tbl.Get("htmlmenupri",htmlmenupri)){ // Toma dato
953                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
954                return(false);
955        }
956        lon+=sprintf(nwparametros+lon,"htm=%s;%s\r",htmlmenupub,htmlmenupri); // Html de menu
957
958        lon+=sprintf(nwparametros+lon,"mnu=");
959        while(!tbl.ISEOF()){ // Recorre acciones del menu
960                if(!tbl.Get("tipoaccion",tipoaccion)){ // Toma dato
961                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
962                        return(false);
963                }
964                if(!tbl.Get("tipoitem",tipoitem)){ // Toma dato
965                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
966                        return(false);
967                }
968                if(!tbl.Get("idtipoaccion",idtipoaccion)){ // Toma dato
969                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
970                        return(false);
971                }
972                if(!tbl.Get("idaccionmenu",idaccionmenu)){ // Toma dato
973                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
974                        return(false);
975                }
976                if(!tbl.Get("descripitem",descripitem)){ // Toma dato
977                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
978                        return(false);
979                }
980                if(!tbl.Get("idurlimg",idurlimg)){ // Toma dato
981                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
982                        return(false);
983                }
984       
985                sprintf(sqlstr,"SELECT urlicono FROM iconos WHERE idicono=%d",idurlimg);
986                if(!db.Execute(sqlstr,littbl)){ // Error al leer
987                        db.GetErrorErrStr(ErrStr);
988                        return(false);
989                }
990                if (!littbl.ISEOF()){
991                        if(!littbl.Get("urlicono",urlimg)){ // Toma dato
992                                littbl.GetErrorErrStr(ErrStr); // error al acceder al registro
993                                return(false);
994                        }
995                }
996                else
997                        sprintf(urlimg,"itemdefault.pcx");
998
999                lon+=sprintf(nwparametros+lon,"%d&%s&%s&%d&%d\?",idaccionmenu,urlimg,descripitem,tipoitem,tipoaccion);
1000                tbl.MoveNext();
1001        }
1002        nwparametros[lon-1]='\r';
1003        nwparametros[lon]=(char)NULL;
1004        return(true);
1005}
1006// ________________________________________________________________________________________________________
1007// Funcin:RecuperaItem
1008//
1009//              Descripcin:
1010//                      Esta funcin busca en la base de datos, los parametros de un items de un menu
1011//              Parnetros:
1012//                      - s: Socket del cliente
1013//                      - parametros: Parnetros de la trama recibida
1014// ________________________________________________________________________________________________________
1015int RecuperaItem(SOCKET s,char *parametros)
1016{
1017        char ErrStr[200],sqlstr[1000];
1018        Database db;
1019        Table tbl;
1020        char *ida;
1021        int idtipoaccion,tipoaccion;
1022
1023        // Toma parnetros
1024        ida=toma_parametro("ida",parametros); // Toma identificador de la accin
1025
1026        //  Abre conexin con la base de datos
1027        if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
1028                db.GetErrorErrStr(ErrStr);
1029                return(false);
1030        }
1031        sprintf(sqlstr,"SELECT tipoaccion,idtipoaccion FROM acciones_menus  WHERE idaccionmenu=%s",ida);
1032        if(!db.Execute(sqlstr,tbl)){ // Error al leer
1033                db.GetErrorErrStr(ErrStr);
1034                return(false);
1035        }
1036        if (tbl.ISEOF()) return(false);
1037       
1038        if(!tbl.Get("tipoaccion",tipoaccion)){ // Toma tipo de accin
1039                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1040                return(false);
1041        }
1042        if(!tbl.Get("idtipoaccion",idtipoaccion)){ // Toma identificador del tipo de accin
1043                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1044                return(false);
1045        }
1046        switch(tipoaccion){
1047                case EJECUCION_PROCEDIMIENTO :
1048                        sprintf(sqlstr,"SELECT  procedimientos_comandos.parametros FROM procedimientos_comandos  WHERE procedimientos_comandos.idprocedimiento=%d",idtipoaccion);
1049                        if(!db.Execute(sqlstr,tbl)){ // Error al leer
1050                                db.GetErrorErrStr(ErrStr);
1051                                return(false);
1052                        }
1053                        if(tbl.ISEOF()) // No existe procedimiento
1054                                return(false);
1055
1056                        while(!tbl.ISEOF()){
1057                                if(!tbl.Get("parametros",parametros)){ // Toma dato
1058                                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1059                                        return(false);
1060                                }
1061                                tbl.MoveNext();
1062                        }
1063                        break;
1064                case EJECUCION_TAREA :
1065                        //Las tareas no se recuperan como fichero de items;
1066                        break;
1067                case EJECUCION_TRABAJO :
1068                        //Los t rabajos no se recuperan como fichero de items;
1069                        break;
1070        }
1071        db.Close();
1072        return(manda_comando(s,parametros));
1073}
1074
1075// ________________________________________________________________________________________________________
1076// Funcin: actualiza_configuracion
1077//
1078//              Descripcin:
1079//                      Esta funcin actualiza la base de datos con la configuracion de sistemas operativos y particiones de un ordenador
1080//              Parnetros:
1081//                      - db: Objeto base de datos (ya operativo)
1082//                      - tbl: Objeto tabla
1083//                      - cfg: cadena con una configuracin
1084//                      - idcfgo: Identificador de la configuracin actual del ordenador
1085//                      - ipho: Identificador de la configuracin actual de las particiones del ordenador
1086//                      - ipho: Ipe del ordenador
1087// ________________________________________________________________________________________________________
1088int actualiza_hardware(Database db, Table tbl,char* hrd,char* ip,char*ido)
1089{
1090        int idtipohardware;
1091        int i,lon=0,idcentro,widcentro;
1092        char *tbHardware[MAXHARDWARE];
1093        int tbidhardware[MAXHARDWARE];
1094        char *dualHardware[2];
1095        char ch[2]; // Carnter delimitador
1096        char sqlstr[1000],ErrStr[200],descripcion[250],nombreordenador[250];
1097
1098
1099        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1100        // ACCESO atnico A TRAVEZ DE OBJETO MUTEX a este trozo de cnigo
1101        pthread_mutex_lock(&guardia);
1102       
1103        // Toma Centro
1104        sprintf(sqlstr,"SELECT aulas.idcentro,ordenadores.nombreordenador FROM aulas INNER JOIN ordenadores ON aulas.idaula=ordenadores.idaula WHERE ordenadores.idordenador=%s",ido);
1105        if(!db.Execute(sqlstr,tbl)){ // Error al leer
1106                db.GetErrorErrStr(ErrStr);
1107                pthread_mutex_unlock(&guardia);
1108                return(false);
1109        }               
1110        if(!tbl.Get("idcentro",widcentro)){ // Toma dato
1111                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1112                pthread_mutex_unlock(&guardia);
1113                return(false);
1114        }                       
1115        idcentro=widcentro+0; // Bug Mysql
1116
1117        if(!tbl.Get("nombreordenador",nombreordenador)){ // Toma dato
1118                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1119                pthread_mutex_unlock(&guardia);
1120                return(false);
1121        }                       
1122       
1123        if(lon>MAXHARDWARE) lon=MAXHARDWARE;
1124                // Trocea la cadena de configuracin
1125        strcpy(ch,"\n");// caracter delimitador
1126        lon=split_parametros(tbHardware,hrd,ch);
1127       
1128        // Trocea las cadenas de parametros de particin
1129        for (i=0;i<lon;i++){
1130                strcpy(ch,"=");// caracter delimitador "="
1131                split_parametros(dualHardware,tbHardware[i],ch); // Nmero de particin
1132                sprintf(sqlstr,"SELECT idtipohardware,descripcion FROM tipohardwares WHERE nemonico='%s'",dualHardware[0]);
1133                if(!db.Execute(sqlstr,tbl)){ // Error al leer
1134                        db.GetErrorErrStr(ErrStr);
1135                        pthread_mutex_unlock(&guardia);
1136                        return(false);
1137                }               
1138                if(tbl.ISEOF()){ //  Tipo de Hardware NO existente
1139                        RegistraLog("Existe un tipo de hardware que no está registrado. Se rechaza proceso de inventario",false);
1140                        pthread_mutex_unlock(&guardia);
1141                        return(false);
1142                }
1143                else{  //  Tipo de Hardware Existe
1144                        if(!tbl.Get("idtipohardware",idtipohardware)){ // Toma dato
1145                                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1146                                pthread_mutex_unlock(&guardia);
1147                                return(false);
1148                        }
1149                        if(!tbl.Get("descripcion",descripcion)){ // Toma dato
1150                                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1151                                pthread_mutex_unlock(&guardia);
1152                                return(false);
1153                        }
1154
1155                        sprintf(sqlstr,"SELECT idhardware FROM hardwares WHERE idtipohardware=%d AND descripcion='%s'",idtipohardware,dualHardware[1]);
1156                       
1157                        // EJecuta consulta
1158                        if(!db.Execute(sqlstr,tbl)){ // Error al leer
1159                                db.GetErrorErrStr(ErrStr);
1160                                pthread_mutex_unlock(&guardia);
1161                                return(false);
1162                        }       
1163
1164                        if(tbl.ISEOF()){ //  Hardware NO existente
1165                                sprintf(sqlstr,"INSERT hardwares (idtipohardware,descripcion,idcentro,grupoid) VALUES(%d,'%s',%d,0)",idtipohardware,dualHardware[1],idcentro);
1166                                if(!db.Execute(sqlstr,tbl)){ // Error al insertar
1167                                        db.GetErrorErrStr(ErrStr);
1168                                        pthread_mutex_unlock(&guardia);
1169                                        return(false);
1170                                }               
1171                                // Recupera el identificador del hardware       
1172                                sprintf(sqlstr,"SELECT LAST_INSERT_ID() as identificador");
1173                                if(!db.Execute(sqlstr,tbl)){ // Error al leer
1174                                        db.GetErrorErrStr(ErrStr);
1175                                        pthread_mutex_unlock(&guardia);
1176                                        return(false);
1177                                }
1178                                if(!tbl.ISEOF()){ // Si existe registro
1179                                        if(!tbl.Get("identificador",tbidhardware[i])){
1180                                                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1181                                                        pthread_mutex_unlock(&guardia);
1182                                                        return(false);
1183                                        }
1184                                }                                       
1185                        }
1186                        else{
1187                                if(!tbl.Get("idhardware",tbidhardware[i])){ // Toma dato
1188                                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1189                                        pthread_mutex_unlock(&guardia);
1190                                        return(false);
1191                                }                                                       
1192                        }
1193                }       // Fin for
1194        }
1195         // Comprueba existencia de perfil hardware y actualización de éste para el ordenador
1196        if(!CuestionPerfilHardware(db, tbl,idcentro,ido,tbidhardware,i,nombreordenador)){
1197                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1198                pthread_mutex_unlock(&guardia);
1199                return(false);
1200        }       
1201        pthread_mutex_unlock(&guardia);
1202        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////         
1203        return(true);
1204}
1205// ________________________________________________________________________________________________________
1206// Funcin: CuestionPerfilHardware
1207//________________________________________________________________________________________________________/
1208int CuestionPerfilHardware(Database db, Table tbl,int idcentro,char* ido,int *tbidhardware,int i,char *nombreordenador){
1209        char sqlstr[1000],ErrStr[200];
1210        int tbidhardwareperfil[MAXHARDWARE];
1211        int j=0;
1212        int idperfilhard;
1213        // Busca perfil hard del ordenador
1214        sprintf(sqlstr,"SELECT perfileshard_hardwares.idhardware FROM ordenadores INNER JOIN perfileshard ON ordenadores.idperfilhard = perfileshard.idperfilhard       INNER JOIN perfileshard_hardwares ON perfileshard_hardwares.idperfilhard = perfileshard.idperfilhard WHERE ordenadores.idordenador =%s",ido);
1215        // EJecuta consulta
1216        if(!db.Execute(sqlstr,tbl)){ // Error al leer
1217                db.GetErrorErrStr(ErrStr);
1218                return(false);
1219        }               
1220        while(!tbl.ISEOF()){ // Recorre acciones del menu
1221                if(!tbl.Get("idhardware",tbidhardwareperfil[j++])){ // Toma dato
1222                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1223                        return(false);
1224                }               
1225                tbl.MoveNext();
1226        }
1227        // Comprueba si el perfil del ordenador contiene todo el hardware enviado
1228        int k,q,sw=false;
1229        for(k=0;k<i;k++){ // Elemento hardware
1230                for(q=0;q<j;q++){
1231                        if(tbidhardware[k]==tbidhardwareperfil[q]){
1232                                sw=true;
1233                                break;
1234                        }
1235                }
1236                if(!sw) break;                 
1237        }
1238        // La variable sw contiene false si se ha encontrado algún hardware que no está en el perfil hardware del ordenador
1239        if(sw) return(true); // Todo el hardware está en el perfil actual
1240       
1241        // Crea perfil nuevo con todo el hardware inventariado
1242        sprintf(sqlstr,"INSERT perfileshard  (descripcion,idcentro,grupoid) VALUES('Perfil Hardware (%s)',%d,0)",nombreordenador,idcentro);
1243        if(!db.Execute(sqlstr,tbl)){ // Error al insertar
1244                db.GetErrorErrStr(ErrStr);
1245                return(false);
1246        }               
1247        // Recupera el identificador del hardware       
1248        sprintf(sqlstr,"SELECT LAST_INSERT_ID() as identificador");
1249        if(!db.Execute(sqlstr,tbl)){ // Error al leer
1250                db.GetErrorErrStr(ErrStr);
1251                return(false);
1252        }
1253        if(!tbl.ISEOF()){ // Si existe registro
1254                if(!tbl.Get("identificador",idperfilhard)){
1255                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1256                        return(false);
1257                }
1258        }       
1259        for(k=0;k<i;k++){ // relaciona elementos hardwares con el nuevo perfil hardware
1260                sprintf(sqlstr,"INSERT perfileshard_hardwares  (idperfilhard,idhardware) VALUES(%d,%d)",idperfilhard,tbidhardware[k]);
1261                if(!db.Execute(sqlstr,tbl)){ // Error al insertar
1262                        db.GetErrorErrStr(ErrStr);
1263                        return(false);
1264                }               
1265        }                               
1266        sprintf(sqlstr,"UPDATE  ordenadores SET idperfilhard=%d WHERE idordenador=%s",idperfilhard,ido);
1267        if(!db.Execute(sqlstr,tbl)){ // Error al insertar
1268                db.GetErrorErrStr(ErrStr);
1269                return(false);
1270        }                       
1271        return(true);
1272}
1273// ________________________________________________________________________________________________________
1274// Funcin: actualiza_configuracion
1275//
1276//              Descripcin:
1277//                      Esta funcin actualiza la base de datos con la configuracion de sistemas operativos y particiones de un ordenador
1278//              Parnetros:
1279//                      - db: Objeto base de datos (ya operativo)
1280//                      - tbl: Objeto tabla
1281//                      - cfg: cadena con una configuracin
1282//                      - idcfgo: Identificador de la configuracin actual del ordenador
1283//                      - ipho: Identificador de la configuracin actual de las particiones del ordenador
1284//                      - ipho: Ipe del ordenador
1285// ________________________________________________________________________________________________________
1286int actualiza_software(Database db, Table tbl,char* sft,char* par,char* tfs,char* ip,char*ido)
1287{
1288        int i,lon=0,idcentro,auxint,idtiposo;
1289        char *tbSoftware[MAXSOFTWARE];
1290        int tbidsoftware[MAXSOFTWARE];
1291        char ch[2],descripso[50]; // Caracter delimitador y nombre del estandar sistema operativo
1292        char sqlstr[1000],ErrStr[200],nombreordenador[250];
1293
1294        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1295        // ACCESO atnico A TRAVEZ DE OBJETO MUTEX a este trozo de cnigo
1296        pthread_mutex_lock(&guardia);
1297       
1298        // Toma Centro
1299        sprintf(sqlstr,"SELECT aulas.idcentro,ordenadores.nombreordenador FROM aulas INNER JOIN ordenadores ON aulas.idaula=ordenadores.idaula WHERE ordenadores.idordenador=%s",ido);
1300        if(!db.Execute(sqlstr,tbl)){ // Error al leer
1301                db.GetErrorErrStr(ErrStr);
1302                pthread_mutex_unlock(&guardia);
1303                return(false);
1304        }               
1305        if(!tbl.Get("idcentro",auxint)){ // Toma dato
1306                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1307                pthread_mutex_unlock(&guardia);
1308                return(false);
1309        }                       
1310        idcentro=auxint+0; // Bug Mysql
1311
1312        if(!tbl.Get("nombreordenador",nombreordenador)){ // Toma dato
1313                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1314                pthread_mutex_unlock(&guardia);
1315                return(false);
1316        }                       
1317       
1318        if(lon>MAXSOFTWARE) lon=MAXSOFTWARE;
1319                // Trocea la cadena de configuracin
1320        strcpy(ch,"\n");// caracter delimitador
1321
1322
1323// Lee archivo de inventario software
1324        FILE *Finv;
1325        char *buffer;
1326        long lSize;
1327        Finv = fopen ( sft , "rb" ); // EL parametro sft contiene el path del archivo de inventario
1328        if (Finv==NULL) return(false);
1329        fseek (Finv , 0 , SEEK_END);  // Obtiene tamaño del fichero.
1330        lSize = ftell (Finv);
1331        rewind (Finv);
1332        buffer = (char*) malloc (lSize);  // Toma memoria para el buffer de lectura.
1333        if (buffer == NULL) return(false);
1334        fread (buffer,1,lSize,Finv);    // Lee contenido del fichero
1335        fclose(Finv);
1336// trocea las lineas
1337        lon=split_parametros(tbSoftware,buffer,ch);
1338
1339        // Incorpora el sistema Operativo de la partición
1340        sprintf(sqlstr,"SELECT idtiposo,descripcion FROM tiposos WHERE tipopar ='%s'",tfs);
1341        // Ejecuta consulta
1342        if(!db.Execute(sqlstr,tbl)){ // Error al leer
1343                db.GetErrorErrStr(ErrStr);
1344                pthread_mutex_unlock(&guardia);
1345                return(false);
1346        }       
1347        if(tbl.ISEOF()){ //  Software NO existente
1348                pthread_mutex_unlock(&guardia);
1349                return(false);
1350        }       
1351        else{
1352                if(!tbl.Get("idtiposo",auxint)){
1353                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1354                        pthread_mutex_unlock(&guardia);
1355                        return(false);
1356                }
1357                idtiposo=auxint+0; // Bug Mysql
1358                if(!tbl.Get("descripcion",descripso)){
1359                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1360                        pthread_mutex_unlock(&guardia);
1361                        return(false);
1362                }       
1363                tbSoftware[lon++]=descripso;
1364        }       
1365        // Trocea las cadenas de parametros de particin
1366        for (i=0;i<lon;i++){
1367                        sprintf(sqlstr,"SELECT idsoftware FROM softwares WHERE descripcion ='%s'",tbSoftware[i]);
1368                       
1369                        // EJecuta consulta
1370                        if(!db.Execute(sqlstr,tbl)){ // Error al leer
1371                                db.GetErrorErrStr(ErrStr);
1372                                pthread_mutex_unlock(&guardia);
1373                                return(false);
1374                        }       
1375                        if(tbl.ISEOF()){ //  Software NO existente
1376                                if((lon-i)>1) // No es el último elemento que es el S.O. el idtiposoftware es 2 (Aplicaciones)
1377                                        sprintf(sqlstr,"INSERT softwares (idtiposoftware,descripcion,idcentro,grupoid) VALUES(2,'%s',%d,0)",tbSoftware[i],idcentro);
1378                                else // Es el último elemento que es el S.O. el idtiposoftware es 1 (Sistemas operativos)
1379                                        sprintf(sqlstr,"INSERT softwares (idtiposoftware,idtiposo,descripcion,idcentro,grupoid) VALUES(1,%d,'%s',%d,0)",idtiposo,tbSoftware[i],idcentro);
1380                               
1381                                if(!db.Execute(sqlstr,tbl)){ // Error al insertar
1382                                        db.GetErrorErrStr(ErrStr);
1383                                        pthread_mutex_unlock(&guardia);
1384                                        return(false);
1385                                }               
1386                                // Recupera el identificador del software       
1387                                sprintf(sqlstr,"SELECT LAST_INSERT_ID() as identificador");
1388                                if(!db.Execute(sqlstr,tbl)){ // Error al leer
1389                                        db.GetErrorErrStr(ErrStr);
1390                                        pthread_mutex_unlock(&guardia);
1391                                        return(false);
1392                                }
1393                                if(!tbl.ISEOF()){ // Si existe registro
1394                                        if(!tbl.Get("identificador",tbidsoftware[i])){
1395                                                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1396                                                        pthread_mutex_unlock(&guardia);
1397                                                        return(false);
1398                                        }
1399                                }                                       
1400                        }
1401                        else{
1402                                if(!tbl.Get("idsoftware",tbidsoftware[i])){ // Toma dato
1403                                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1404                                        pthread_mutex_unlock(&guardia);
1405                                        return(false);
1406                                }                                                       
1407                }       // Fin for
1408        }
1409         // Comprueba existencia de perfil software y actualización de éste para el ordenador
1410        if(!CuestionPerfilSoftware(db, tbl,idcentro,ido,tbidsoftware,i,nombreordenador,par)){
1411                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1412                pthread_mutex_unlock(&guardia);
1413                return(false);
1414        }       
1415        pthread_mutex_unlock(&guardia);
1416        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////         
1417        return(true);
1418}
1419// ________________________________________________________________________________________________________
1420// Funcin: CuestionPerfilSoftware
1421//________________________________________________________________________________________________________/
1422int CuestionPerfilSoftware(Database db, Table tbl,int idcentro,char* ido,int *tbidsoftware,int i,char *nombreordenador,char *particion){
1423        char sqlstr[1000],ErrStr[200];
1424        int tbidsoftwareperfil[MAXSOFTWARE];
1425        int j=0;
1426        int idperfilsoft;
1427        // Busca perfil soft del ordenador
1428        sprintf(sqlstr,"SELECT perfilessoft_softwares.idsoftware FROM ordenador_perfilsoft INNER JOIN perfilessoft ON ordenador_perfilsoft.idperfilsoft = perfilessoft.idperfilsoft INNER JOIN perfilessoft_softwares ON perfilessoft_softwares.idperfilsoft=perfilessoft.idperfilsoft WHERE ordenador_perfilsoft.idordenador =%s",ido);
1429        // EJecuta consulta
1430        if(!db.Execute(sqlstr,tbl)){ // Error al leer
1431                db.GetErrorErrStr(ErrStr);
1432                return(false);
1433        }               
1434        while(!tbl.ISEOF()){ // Recorre software del perfils
1435                if(!tbl.Get("idsoftware",tbidsoftwareperfil[j++])){ // Toma dato
1436                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1437                        return(false);
1438                }               
1439                tbl.MoveNext();
1440        }
1441        // Comprueba si el perfil del ordenador contiene todo el software enviado
1442        int k,q,sw=false;
1443        if(i==j){ // Si son el mismo número de componenetes software ...
1444                for(k=0;k<i;k++){ // Elemento software
1445                        for(q=0;q<j;q++){
1446                                if(tbidsoftware[k]==tbidsoftwareperfil[q]){
1447                                        sw=true;
1448                                        break;
1449                                }
1450                        }
1451                        if(!sw) break;                 
1452                }
1453        }
1454       
1455        // La variable sw contiene false si se ha encontrado algún software que no está en el perfil software del ordenador
1456        if(sw) return(true); // Todo el software está en el perfil actual
1457       
1458        // Crea perfil nuevo con todo el software inventariado
1459        sprintf(sqlstr,"INSERT perfilessoft  (descripcion,idcentro,grupoid) VALUES('Perfil Software (%s, Part:%s) ',%d,0)",nombreordenador,particion,idcentro);
1460        if(!db.Execute(sqlstr,tbl)){ // Error al insertar
1461                db.GetErrorErrStr(ErrStr);
1462                return(false);
1463        }               
1464        // Recupera el identificador del software       
1465        sprintf(sqlstr,"SELECT LAST_INSERT_ID() as identificador");
1466        if(!db.Execute(sqlstr,tbl)){ // Error al leer
1467                db.GetErrorErrStr(ErrStr);
1468                return(false);
1469        }
1470        if(!tbl.ISEOF()){ // Si existe registro
1471                if(!tbl.Get("identificador",idperfilsoft)){
1472                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1473                        return(false);
1474                }
1475        }       
1476        for(k=0;k<i;k++){ // relaciona elementos softwares con el nuevo perfil software
1477                sprintf(sqlstr,"INSERT perfilessoft_softwares  (idperfilsoft,idsoftware) VALUES(%d,%d)",idperfilsoft,tbidsoftware[k]);
1478                if(!db.Execute(sqlstr,tbl)){ // Error al insertar
1479                        db.GetErrorErrStr(ErrStr);
1480                        return(false);
1481                }               
1482        }
1483        // Busca si existe un perfil software para ese ordenador y esa partición       
1484        sprintf(sqlstr,"SELECT idperfilsoft FROM ordenador_perfilsoft WHERE idordenador =%s AND particion=%s",ido,particion);
1485        // Ejecuta consulta
1486        if(!db.Execute(sqlstr,tbl)){ // Error al leer
1487                db.GetErrorErrStr(ErrStr);
1488                return(false);
1489        }               
1490        if(!tbl.ISEOF()){ // existe un perfilsoft que se cambia al nuevo
1491                sprintf(sqlstr,"UPDATE  ordenador_perfilsoft SET idperfilsoft=%d WHERE idordenador=%s AND particion=%s",idperfilsoft,ido,particion);
1492                if(!db.Execute(sqlstr,tbl)){ // Error al insertar
1493                        db.GetErrorErrStr(ErrStr);
1494                        return(false);
1495                }                       
1496        }
1497        else{
1498                sprintf(sqlstr,"INSERT INTO ordenador_perfilsoft (idordenador,particion,idperfilsoft) VALUE (%s,%s,%d)",ido,particion,idperfilsoft);
1499                if(!db.Execute(sqlstr,tbl)){ // Error al insertar
1500                        db.GetErrorErrStr(ErrStr);
1501                        return(false);
1502                }                       
1503               
1504        }
1505        return(true);
1506}
1507// ________________________________________________________________________________________________________
1508// Funcin: actualiza_configuracion
1509//
1510//              Descripcin:
1511//                      Esta funcin actualiza la base de datos con la configuracion de sistemas operativos y particiones de un ordenador
1512//              Parnetros:
1513//                      - db: Objeto base de datos (ya operativo)
1514//                      - tbl: Objeto tabla
1515//                      - cfg: cadena con una configuracin
1516//                      - idcfgo: Identificador de la configuracin actual del ordenador
1517//                      - ipho: Identificador de la configuracin actual de las particiones del ordenador
1518//                      - ipho: Ipe del ordenador
1519// ________________________________________________________________________________________________________
1520int actualiza_configuracion(Database db, Table tbl,char* cfg,int idcfgo,int idprto,char* ipho)
1521{
1522        char sqlstr[1000],ErrStr[200]; 
1523        int idconfiguracion,idparticion,lon;
1524        char * part;
1525
1526
1527        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1528        // ACCESO atnico A TRAVEZ DE OBJETO MUTEX a este trozo de cnigo
1529        pthread_mutex_lock(&guardia);
1530        sprintf(sqlstr,"SELECT idconfiguracion FROM configuraciones WHERE configuracion LIKE '%s'",cfg);
1531        if(!db.Execute(sqlstr,tbl)){ // Error al leer
1532                db.GetErrorErrStr(ErrStr);
1533                                pthread_mutex_unlock(&guardia);
1534                return(false);
1535        }
1536        if(!tbl.ISEOF()){ // Configuracin ya existente
1537                if(!tbl.Get("idconfiguracion",idconfiguracion)){ // Toma dato
1538                                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1539                                                pthread_mutex_unlock(&guardia);
1540                                return(false);
1541                }
1542        }
1543        else{ // Nueva configuracin
1544                        sprintf(sqlstr,"INSERT configuraciones (configuracion) VALUES('%s')",cfg);
1545                        if(!db.Execute(sqlstr,tbl)){ // Error al insertar
1546                                db.GetErrorErrStr(ErrStr);
1547                                pthread_mutex_unlock(&guardia);
1548                                return(false);
1549                        }
1550                        sprintf(sqlstr,"SELECT LAST_INSERT_ID() as identificador");
1551                        if(!db.Execute(sqlstr,tbl)){ // Error al leer
1552                                db.GetErrorErrStr(ErrStr);
1553                                pthread_mutex_unlock(&guardia);
1554                                return(false);
1555                        }
1556                        if(!tbl.ISEOF()){ // Si existe registro
1557                                if(!tbl.Get("identificador",idconfiguracion)){
1558                                                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1559                                                pthread_mutex_unlock(&guardia);
1560                                                return(false);
1561                                }
1562                        }
1563        }
1564        // Genera cadena de particiones
1565        lon=strlen(cfg);
1566        part=(char*)malloc(lon);
1567        TomaParticiones(cfg,part,lon);
1568        sprintf(sqlstr,"SELECT idparticion FROM particiones WHERE particion LIKE '%s'",part);
1569        if(!db.Execute(sqlstr,tbl)){ // Error al leer
1570                db.GetErrorErrStr(ErrStr);
1571                pthread_mutex_unlock(&guardia);
1572                return(false);
1573        }
1574        if(!tbl.ISEOF()){ // Configuracin ya existente
1575                if(!tbl.Get("idparticion",idparticion)){ // Toma dato
1576                                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1577                                                pthread_mutex_unlock(&guardia);
1578                                return(false);
1579                }
1580        }
1581        else{ // Nueva particion
1582                        sprintf(sqlstr,"INSERT particiones (particion) VALUES('%s')",part);
1583                        if(!db.Execute(sqlstr,tbl)){ // Error al insertar
1584                                db.GetErrorErrStr(ErrStr);
1585                                                pthread_mutex_unlock(&guardia);
1586                                return(false);
1587                        }
1588                        sprintf(sqlstr,"SELECT LAST_INSERT_ID() as identificador");
1589                        if(!db.Execute(sqlstr,tbl)){ // Error al leer
1590                                db.GetErrorErrStr(ErrStr);
1591                                                pthread_mutex_unlock(&guardia);
1592                                return(false);
1593                        }
1594                        if(!tbl.ISEOF()){ // Si existe registro
1595                                if(!tbl.Get("identificador",idparticion)){
1596                                                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1597                                                                pthread_mutex_unlock(&guardia);
1598                                                return(false);
1599                                }
1600                        }
1601        }                       
1602        if(idconfiguracion!=idcfgo ||  idparticion!=idprto){ // Si el odenador tiene una configuracin distinta ...
1603                sprintf(sqlstr,"Update ordenadores set idconfiguracion=%d, idparticion=%d WHERE ip='%s'",idconfiguracion,idparticion,ipho);
1604                if(!db.Execute(sqlstr,tbl)){ // Error al actualizar
1605                        db.GetErrorErrStr(ErrStr);
1606                                        pthread_mutex_unlock(&guardia);
1607                        return(false);
1608                }
1609        }
1610                        pthread_mutex_unlock(&guardia);
1611        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1612        return(true);
1613}
1614// ________________________________________________________________________________________________________
1615// Funcin: TomaParticiones
1616//
1617//              Descripcin:
1618//                      Esta funcin compone basndose en la cadena de configuracin que devuelve el ordenador, una cadena de particiones con
1619//                      los valores "n0=PPPP;n1=PPPP..."  con las duplas:el nmero de particin y el tipo, separados por coma
1620//              Parnetros:
1621//                      - cfg: Cadena de configuracin
1622//                      - parts: Cadena devuelta con el formato anterior descrito
1623//                      - lonprt: Longitud mnmima para las cadenas
1624// ________________________________________________________________________________________________________
1625void TomaParticiones(char* cfg, char* parts,int lonprt)
1626{
1627        int i;
1628        int lon=0;
1629        char *tbParticiones[10]; // Para albergar hasta 10 particiones ( Normalmente Mnimo 8);
1630        char *tbParticion[8]; // Para albergar hasta 8 parnetros de particin;
1631        char *tbIgualdad[2]; // Para albergar hasta 8 parnetros de particin;
1632        char ch[2]; // Carnter delimitador
1633        char *apun;
1634        int p;
1635        // Toma memoria para cada elemento de particin
1636        for(i=0;i<10;i++)
1637                tbParticiones[i]=(char*)malloc(lonprt);
1638
1639        // Toma memoria para cada parametro de particin
1640        for(i=0;i<8;i++)
1641                tbParticion[i]=(char*)malloc(lonprt);
1642
1643        // Toma memoria para cada igualdad
1644        for(i=0;i<2;i++)
1645                tbIgualdad[i]=(char*)malloc(20); 
1646
1647        // Trocea la cadena de configuracin
1648        strcpy(ch,"\t");// caracter delimitador (tabulador)
1649        lonprt=split_parametros(tbParticiones,cfg,ch);
1650        // Trocea las cadenas de parametros de particin
1651        for (p=0;p<lonprt;p++){
1652                strcpy(ch,"\n");// caracter delimitador (salto de linea)
1653                split_parametros(tbParticion,tbParticiones[p],ch);
1654                strcpy(ch,"=");// caracter delimitador "="
1655                split_parametros(tbIgualdad,tbParticion[4],ch); // Nmero de particin
1656                lon+=sprintf(parts+lon,"%s=",tbIgualdad[1]);
1657                split_parametros(tbIgualdad,tbParticion[2],ch); // Tipo de particion
1658                apun=tbIgualdad[1];
1659                //if(apun[0]=='H') apun++; // Si es oculta ...
1660                lon+=sprintf(parts+lon,"%s;",apun);
1661        }
1662        lon+=sprintf(parts+lon,"@prt");
1663}
1664// ________________________________________________________________________________________________________
1665// Funcin: ComandosPendientes
1666//
1667//              Descripcin:
1668//                      Esta funcin busca en la base de datos,comandos pendientes de ejecutar por un  ordenador  concreto
1669//              Parnetros:
1670//                      - s: Socket del cliente
1671//                      - parametros: Parnetros de la trama recibida
1672// ________________________________________________________________________________________________________
1673int ComandosPendientes(SOCKET s,char *parametros)
1674{
1675        char *iph,*ido,*coletilla;
1676        int ids;
1677        char pids[20],ipe[16],idord[16];
1678
1679        iph=toma_parametro("iph",parametros); // Toma ip
1680        ido=toma_parametro("ido",parametros); // Toma identificador del ordenador
1681        strcpy(ipe,iph);
1682        strcpy(idord,ido);
1683
1684        if(busca_comandos(ipe,idord,parametros,&ids)){
1685                Coloca_estado(ipe,CLIENTE_OCUPADO,s);
1686                //Manda el comando pendiente
1687                coletilla=corte_iph(parametros);
1688                coletilla[0]='\0';// Corta la trama en la ip
1689                sprintf(pids,"ids=%d\r",ids);
1690                strcat(parametros,pids); // Le ande el identificador de la accion
1691                return(manda_comando(s,parametros));
1692        }
1693        NoComandosPendientes(s);  // Indica al cliente rembo que ya no hay mn comandos pendientes
1694        return(true);
1695}
1696// ________________________________________________________________________________________________________
1697// Funcin: EjecutarItem
1698//
1699//              Descripcin:
1700//                      Esta funcin ejecuta un item de un men concreto solicitado por algn cliente rembo
1701//              Parnetros:
1702//                      - s: Socket del cliente
1703//                      - parametros: Parnetros de la trama recibida
1704// ________________________________________________________________________________________________________
1705int EjecutarItem(SOCKET s,char *parametros)
1706{
1707        char sqlstr[1000],ErrStr[200];
1708        Database db;
1709        Table tbl,tbln;
1710        int idtipoaccion,lon,cont_comandos=0,i,puertorepo;
1711        char tipoaccion,*iph,*idt,ipe[16];
1712        char *tbComandosparametros[100];
1713
1714        iph=toma_parametro("iph",parametros); // Toma ip
1715        idt=toma_parametro("idt",parametros); // Toma idemtificador del item
1716        strcpy(ipe,iph);
1717
1718        if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
1719                db.GetErrorErrStr(ErrStr);
1720                return(false);
1721        }
1722        sprintf(sqlstr,"SELECT acciones_menus.tipoaccion, acciones_menus.idtipoaccion FROM acciones_menus WHERE acciones_menus.idaccionmenu=%s",idt);
1723        if(!db.Execute(sqlstr,tbl)){ // Error al leer
1724                db.GetErrorErrStr(ErrStr);
1725                return(false);
1726        }
1727        if(tbl.ISEOF()){
1728                return(false);  // No hay comandos pendientes
1729        }
1730
1731        if(!tbl.Get("tipoaccion",tipoaccion)){ // Toma dato
1732                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1733                return(false);
1734        }
1735
1736        if(!tbl.Get("idtipoaccion",idtipoaccion)){ // Toma dato
1737                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1738                return(false);
1739        }
1740       
1741        switch(tipoaccion){
1742                case EJECUCION_PROCEDIMIENTO :
1743                        sprintf(sqlstr,"SELECT  procedimientos_comandos.parametros  FROM  procedimientos_comandos  WHERE procedimientos_comandos.idprocedimiento=%d",idtipoaccion);
1744                        if(!db.Execute(sqlstr,tbl)){ // Error al leer
1745                                db.GetErrorErrStr(ErrStr);
1746                                return(false);
1747                        }
1748                        if(tbl.ISEOF()) // No existe procedimiento
1749                                return(false);
1750
1751                        while(!tbl.ISEOF()){
1752                                if(!tbl.Get("parametros",parametros)){ // Toma dato
1753                                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1754                                        return(false);
1755                                }
1756                                lon=strlen(parametros);
1757                                tbComandosparametros[cont_comandos]=(char*)malloc(lon);
1758                                if(tbComandosparametros[cont_comandos]==NULL)
1759                                        return(false); // No hay memoria bastante
1760                                strcpy(tbComandosparametros[cont_comandos++],parametros);
1761                                tbl.MoveNext();
1762                        }
1763                        strcpy(parametros,tbComandosparametros[0]);
1764                        strcat(parametros,"iph=");
1765                        strcat(parametros,ipe);
1766                        strcat(parametros,"\r");
1767                        for(i=1;i<cont_comandos;i++){
1768                                strcat(parametros,"\n");
1769                                strcat(parametros,tbComandosparametros[i]);
1770                                strcat(parametros,"iph=");
1771                                strcat(parametros,ipe);
1772                                strcat(parametros,"\r");
1773                        }
1774                        if(TomaIPServidorRembo(ipe,&puertorepo))
1775                                return(manda_trama_servidorrembo(ipe,parametros,puertorepo));
1776                        break;
1777                case EJECUCION_TAREA :
1778                        EjecutarTarea(idtipoaccion,0,0,0,db,parametros);
1779                        break;
1780                case EJECUCION_TRABAJO :
1781                        EjecutarTrabajo(idtipoaccion,db,parametros); // Es una programacin de un trabajo
1782                        break;
1783        }
1784        db.Close();
1785        return(true);
1786}
1787// ________________________________________________________________________________________________________
1788// Funcin: DisponibilidadComandos
1789//
1790//              Descripcin:
1791//                      Esta funcin habilita a un clinte rembo para recibir o no, comandos iteractivos
1792//              Parnetros:
1793//                      - s: Socket del cliente
1794//                      - parametros: Parmetros de la trama recibida
1795// ________________________________________________________________________________________________________
1796int DisponibilidadComandos(SOCKET s,char *parametros)
1797{
1798        char *iph,*swd;
1799        int resul=0,i;
1800
1801        iph=toma_parametro("iph",parametros); // Toma ip
1802        swd=toma_parametro("swd",parametros); // Toma switch de diponibilidad
1803
1804        if(strcmp(swd,"1")==0) // Cliente disponible
1805                resul=Coloca_estado(iph,CLIENTE_REMBO,s);
1806        else{
1807                if (cliente_existente(iph,&i)) // Si ya existe la IP ...
1808                        resul=borra_entrada(i); // Cliente apagado
1809        }
1810        return(resul);
1811}
1812// ________________________________________________________________________________________________________
1813// Funcin: Coloca_estado
1814//
1815//              Descripcin:
1816//                      Esta funcin coloca el estado de un ordenador en la tabla de sockets
1817//              Parnetros:
1818//                      - iph: Ip del ordenador
1819//                      - e: Nuevo estado
1820//                      - s: Socket usado por el cliente para comunicarse con el servidor HIDRA
1821// ________________________________________________________________________________________________________
1822int Coloca_estado(char *iph,const char *e,SOCKET s)
1823{
1824        int i;
1825        for (i=0;i<MAXIMOS_SOCKETS;i++){
1826                if (strncmp(tbsockets[i].ip,"\0",1)!=0){         // Si es un cliente activo
1827                        if (IgualIP(iph,tbsockets[i].ip)){      // Si existe la IP en la cadena
1828                                strcpy(tbsockets[i].estado,e);  // Cambia el estado
1829                                tbsockets[i].sock=s;            // Guarda el socket
1830                                return(true);
1831                        }
1832                }
1833        }
1834        return(false);
1835}
1836// ________________________________________________________________________________________________________
1837// Funcin: IgualIP
1838//
1839//               Descripcin:
1840//                      Comprueba si una cadena con una ipe estnincluidad en otra que  contienen varias direcciones ipes separas por punto y coma
1841//              Parnetros:
1842//                      - cadenaiph: Cadena de IPes
1843//                      - ipcliente: Cadena de la ip a buscar
1844// ________________________________________________________________________________________________________
1845BOOLEAN IgualIP(char *cadenaiph,char *ipcliente)
1846{
1847        char *posa,*posb;
1848        int lon;
1849
1850        posa=strstr(cadenaiph,ipcliente);
1851        if(posa==NULL) return(FALSE); // No existe la IP en la cadena
1852        posb=posa; // Iguala direcciones
1853        while(TRUE){
1854                posb++;
1855                if(*posb==';') break;
1856                if(*posb=='\0') break;
1857                if(*posb=='\r') break;
1858        }
1859        lon=strlen(ipcliente);
1860        if((posb-posa)==lon) return(TRUE); // IP encontrada !!!!
1861               
1862        return(FALSE);
1863}
1864// ________________________________________________________________________________________________________
1865// Funcin: inclusion_srvRMB
1866//
1867//              Descripcin:
1868//                      Esta funcin incorpora el socket de un nuevo servidor rembo a la tabla de sockets
1869//              Parnetros:
1870//                      - s: Socket del servidor rembo
1871//                      - parametros: Parnetros de la trama recibida
1872// ________________________________________________________________________________________________________
1873int inclusion_srvRMB(char *iphsrvrmb,int puertorepo)
1874{
1875        int i,idx;
1876       
1877        // Incluyendo al cliente en la tabla de sokets
1878        if (servidorrembo_existente(iphsrvrmb,&i)){ // Si ya existe la IP ...
1879                idx=i;
1880        }
1881        else{
1882                if (hay_huecoservidorrembo(&i)){ // Busca hueco para el nuevo cliente
1883                        idx=i;
1884                        strcpy(tbsocketsSRVRMB[idx].ip,iphsrvrmb);// Copia IP
1885                        tbsocketsSRVRMB[idx].puertorepo=puertorepo;
1886                }
1887                else
1888                        return(false); // No hay huecos
1889        }
1890        return(true);
1891}
1892// ________________________________________________________________________________________________________
1893// Funcin: inclusion_cliWINLNX
1894//
1895//               Descripcin:
1896//                      Esta funcin incorpora el socket de un nuevo cliente rembo a la tabla de sockets
1897//              Parnetros:
1898//                      - s: Socket del servidor rembo
1899//                      - parametros: Parnetros de la trama recibida
1900// ________________________________________________________________________________________________________
1901int inclusion_cliWINLNX(SOCKET s,char *parametros)
1902{
1903        char *iph,*tso;
1904        int i,idx;
1905
1906        // Toma parnetros
1907        iph=toma_parametro("iph",parametros); // Toma ip
1908        tso=toma_parametro("tso",parametros); // Toma ip
1909        // Incluyendo al cliente en la tabla de sokets
1910        if (cliente_existente(iph,&i)){ // Si ya existe la IP ...
1911                idx=i;
1912                close(tbsockets[idx].sock);
1913        }
1914        else{
1915                if (hay_hueco(&i)){ // Busca hueco para el nuevo cliente
1916                        idx=i;
1917                        strcpy(tbsockets[idx].ip,iph);// Copia IP
1918                }
1919                else
1920                        return(false); // No hay huecos
1921        }
1922        tbsockets[idx].sock=s; // Guarda el socket
1923        strcpy(tbsockets[idx].estado,tso);
1924        return(true);
1925}
1926// ________________________________________________________________________________________________________
1927// Funcin: inclusion_REPO
1928//
1929//               Descripcin:
1930//                      Esta funcin incorpora el socket de un nuevo repositorio hidra
1931// ________________________________________________________________________________________________________
1932int inclusion_REPO(SOCKET s,char *parametros)
1933{
1934        char ErrStr[200],sqlstr[1000];
1935        Database db;
1936        Table tbl;
1937       
1938        char *iph;
1939        char PathHidra[250],PathPXE[250]; // path al directorio base de Hidra
1940        int puertorepo,lon;
1941       
1942
1943        // Toma parnetros
1944        iph=toma_parametro("iph",parametros); // Toma ip
1945       
1946        // Toma las propiedades del ordenador
1947        if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
1948                db.GetErrorErrStr(ErrStr);
1949                return(false);
1950        }
1951        // Recupera los datos del ordenador
1952        sprintf(sqlstr,"SELECT puertorepo,pathrembod,pathpxe FROM servidoresrembo WHERE ip = '%s'",iph);
1953       
1954        if(!db.Execute(sqlstr,tbl)){ // Error al consultar
1955                db.GetErrorErrStr(ErrStr);
1956                return(false);
1957        }
1958        if(tbl.ISEOF()){ // Si No existe registro
1959                RegistraLog("No existe el Repositorio, se rechaza la petición",false);
1960                return(false);
1961        }
1962        if(!tbl.Get("puertorepo",puertorepo)){ // Toma dato
1963                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1964                return(false);
1965        }
1966        if(!tbl.Get("pathrembod",PathHidra)){ // Toma dato
1967                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1968                return(false);
1969        }
1970        if(!tbl.Get("pathpxe",PathPXE)){ // Toma dato
1971                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
1972                return(false);
1973        }       
1974        inclusion_srvRMB(iph,puertorepo); // Actualiza tabla de servidores rembo
1975        TRAMA *trama=(TRAMA*)malloc(LONGITUD_TRAMA);
1976        if(!trama)
1977                return(false);
1978        // Envia la trama
1979       
1980        trama->arroba='@';
1981        strncpy(trama->identificador,"JMMLCAMDJ",9);
1982        trama->ejecutor='1';
1983        lon=sprintf(trama->parametros,"nfn=RESPUESTA_inclusionREPO\r");
1984        lon+=sprintf(trama->parametros+lon,"prp=%d\r",puertorepo);
1985        lon+=sprintf(trama->parametros+lon,"pth=%s\r",PathHidra);
1986        lon+=sprintf(trama->parametros+lon,"ptx=%s\r",PathPXE);
1987        lon+=sprintf(trama->parametros+lon,"usu=%s\r",usuario);
1988        lon+=sprintf(trama->parametros+lon,"pwd=%s\r",pasguor);
1989        lon+=sprintf(trama->parametros+lon,"dat=%s\r",datasource);
1990        lon+=sprintf(trama->parametros+lon,"cat=%s\r",catalog);
1991        return(manda_trama(s,trama));
1992}
1993// ________________________________________________________________________________________________________
1994// Funcin: Sondeo
1995//
1996//              Descripcin:
1997//                      Esta funcin recupera el estado de los ordenadores solicitados
1998//              Parnetros:
1999//                      - s: Socket del servidor web que envn el comando
2000//                      - parametros: Parnetros de la trama enviada por nte
2001// ________________________________________________________________________________________________________
2002int Sondeo(SOCKET s,char *parametros)
2003{
2004        char *iph;
2005        char nwparametros[LONGITUD_PARAMETROS];
2006        int j;
2007
2008        iph=toma_parametro("iph",parametros); // Toma ip
2009    nwparametros[0]='\0';
2010        strcat(nwparametros,"tso="); // Compone retorno tso ( sistemas operativos de los clientes )
2011    for (j=0;j<MAXIMOS_SOCKETS;j++){
2012                if (strncmp(tbsockets[j].ip,"\0",1)!=0){ // Si es un cliente activo
2013                        if (IgualIP(iph,tbsockets[j].ip)){ // Si existe la IP en la cadena
2014                                 strcat( nwparametros, tbsockets[j].ip); // Compone retorno
2015                                 strcat( nwparametros,"/");                     // "ip=sistemaoperatico;"
2016                                 strcat( nwparametros, tbsockets[j].estado);
2017                                 strcat( nwparametros,";");
2018                        }
2019                }
2020        }
2021        return(manda_comando(s,nwparametros));
2022}
2023// ________________________________________________________________________________________________________
2024// Funcin: Actualizar
2025//
2026//              Descripcin:
2027//                      Esta funcin actualiza la vista de ordenadores
2028//              Parnetros:
2029//                      - parametros: parametros del comando
2030// ________________________________________________________________________________________________________
2031int Actualizar(char *parametros)
2032{
2033        TRAMA *trama=(TRAMA*)malloc(LONGITUD_TRAMA);
2034        if(!trama)return(false);
2035        int i,estado_cliente,lon;
2036        char *iph,*rmb;
2037
2038        iph=toma_parametro("iph",parametros); // Toma ip
2039        rmb=toma_parametro("rmb",parametros); // Toma ipe del servidor rembo
2040        for (i=0;i<MAXIMOS_SOCKETS;i++){
2041                if (strncmp(tbsockets[i].ip,"\0",1)!=0){ // Si es un cliente activo
2042                        if (IgualIP(iph,tbsockets[i].ip)){ // Si existe la IP en la cadena
2043                                estado_cliente=strcmp(tbsockets[i].estado,CLIENTE_OCUPADO);
2044                                if(estado_cliente!=0){ // Cliente NO OCUPADO ...
2045                                        estado_cliente=strcmp(tbsockets[i].estado,CLIENTE_INICIANDO);
2046                                        if(estado_cliente!=0){ // Cliente NO INICIANDO ...
2047                                                estado_cliente=strcmp(tbsockets[i].estado,CLIENTE_REMBO);
2048                                                if(estado_cliente!=0){ // Cliente windows o linux ...
2049                                                        lon=sprintf(trama->parametros,"nfn=Actualizar\r");
2050                                                        manda_comando(tbsockets[i].sock,(char*)trama->parametros);
2051                                                }
2052                                                borra_entrada(i);
2053                                        }
2054                                }
2055                        }
2056                }
2057        }
2058        int j;
2059        for (j=0;j<MAXIMOS_SRVRMB;j++){
2060                if (strcmp(rmb,tbsocketsSRVRMB[j].ip)==0){ // Si existe la IP ...
2061                        FINCADaINTRO(parametros,iph);
2062                        return(manda_trama_servidorrembo(rmb,parametros,tbsocketsSRVRMB[j].puertorepo));
2063                }
2064        }
2065        return(false);
2066}
2067// ________________________________________________________________________________________________________
2068// Funcin: FicheroOperador
2069//
2070//              Descripcin:
2071//                      Esta funcin envia al servidor datos de un operador para crear fichero de login
2072//              Parnetros:
2073//                      - parametros: parametros del comando
2074// ________________________________________________________________________________________________________
2075int FicheroOperador(char *parametros)
2076{
2077        TRAMA trama;           
2078        SOCKET s;
2079        char *rmb,*amb,*usu,*psw,*ida;
2080        int resul,lon;
2081
2082        rmb=toma_parametro("rmb",parametros); // Toma ipe del servidor rembo
2083
2084        // Abre conexion con el servidor rembo y envia trama
2085        s=AbreConexion(rmb,puerto+1);
2086        if(!s){
2087                RegistraLog("Fallo al conectar con el servidor rembo para envio de tramas",true);
2088                return(FALSE);
2089        }
2090
2091        amb=toma_parametro("amb",parametros); // Toma tipo de operacion
2092        usu=toma_parametro("usu",parametros); // Toma usuario
2093        psw=toma_parametro("psw",parametros); // Toma passwrod
2094        ida=toma_parametro("ida",parametros); // Toma identificador del aula
2095
2096        // Envia la trama
2097        trama.arroba='@';
2098        strncpy(trama.identificador,"JMMLCAMDJ",9);
2099        trama.ejecutor='1';
2100        lon=sprintf(trama.parametros,"nfn=FicheroOperador\r");
2101        lon+=sprintf(trama.parametros+lon,"amb=%s\r",amb);
2102        lon+=sprintf(trama.parametros+lon,"usu=%s\r",usu);
2103        lon+=sprintf(trama.parametros+lon,"psw=%s\r",psw);
2104        lon+=sprintf(trama.parametros+lon,"ida=%s\r",ida);
2105        resul=(manda_trama(s,&trama));
2106        if(!resul)
2107                RegistraLog("Fallo en el envio de trama al servidor rembo",true);
2108        return(resul);
2109}
2110// ________________________________________________________________________________________________________
2111// Funcin: Conmutar
2112//
2113//              Descripcin:
2114//                      Esta funcin conmuta un cliente rembo del modo NO administrado al modo admnistrado
2115//              Parnetros:
2116//                      - parametros: parametros del comando
2117// ________________________________________________________________________________________________________
2118int Conmutar(char *parametros)
2119{
2120        TRAMA trama;           
2121        SOCKET s;
2122        int i,estado_cliente,lon,resul;
2123        char *iph,*rmb;
2124
2125        iph=toma_parametro("iph",parametros); // Toma ip
2126        rmb=toma_parametro("rmb",parametros); // Toma ipe del servidor rembo
2127        for (i=0;i<MAXIMOS_SOCKETS;i++){
2128                if (strncmp(tbsockets[i].ip,"\0",1)!=0){ // Si es un cliente activo
2129                        if (IgualIP(iph,tbsockets[i].ip)){ // Si existe la IP en la cadena
2130                                estado_cliente=strcmp(tbsockets[i].estado,CLIENTE_OCUPADO);
2131                                if(estado_cliente!=0){ // Cliente NO OCUPADO ...
2132                                        estado_cliente=strcmp(tbsockets[i].estado,CLIENTE_INICIANDO);
2133                                        if(estado_cliente!=0){ // Cliente NO INICIANDO ...
2134                                                estado_cliente=strcmp(tbsockets[i].estado,CLIENTE_REMBO);
2135                                                if(estado_cliente!=0){ // Cliente windows o linux ...
2136                                                        lon=sprintf(trama.parametros,"nfn=Conmutar\r");
2137                                                        manda_comando(tbsockets[i].sock,trama.parametros);
2138                                                }
2139                                        }
2140                                }
2141                        }
2142                }
2143        }
2144
2145        // Abre conexion con el servidor rembo y envia trama
2146        s=AbreConexion(rmb,puerto+1);
2147        if(!s){
2148                RegistraLog("Fallo al conectar con el servidor rembo para envio de tramas",true);
2149                resul=FALSE;
2150        }
2151        else{
2152                // Envia la trama
2153                trama.arroba='@';
2154                strncpy(trama.identificador,"JMMLCAMDJ",9);
2155                trama.ejecutor='2';
2156                lon=sprintf(trama.parametros,"nfn=Conmutar\r");
2157                lon+=sprintf(trama.parametros+lon,"iph=%s\r",iph);
2158                resul=(manda_trama(s,&trama));
2159                if(!resul){
2160                        RegistraLog("Fallo en el envio de trama al servidor rembo",true);
2161                }
2162        }
2163        return(resul);
2164}
2165// ________________________________________________________________________________________________________
2166// Funcin: PurgarTablaSockets
2167//
2168//              Descripcin:
2169//                      Borra ordenadores de la tabla de sockets
2170//              Parnetros:
2171//                      - parametros: parametros del comando
2172// ________________________________________________________________________________________________________
2173void PurgarTablaSockets(char *parametros)
2174{
2175        int i;
2176        char *iph;
2177
2178        iph=toma_parametro("iph",parametros); // Toma ip
2179    for (i=0;i<MAXIMOS_SOCKETS;i++){
2180                if (strncmp(tbsockets[i].ip,"\0",1)!=0){ // Si es un cliente activo
2181                        if (IgualIP(iph,tbsockets[i].ip)){ // Si existe la IP en la cadena
2182                                borra_entrada(i);
2183                        }
2184                }
2185        }
2186}
2187// _____________________________________________________________________________________________________________
2188// Función: Arrancar
2189//
2190//              Descripción:
2191//                      Esta función arranca los ordenadores solicitados. PAra ello le envía el comando arrancar al servidor rembo que lo controla y
2192//                      es éste el que le envía la trama de wake-up
2193//              Parámetros:
2194//                      - mac: Dirección mac del cliente rembo
2195//                      - iph: Dirección ip del cliente rembo
2196//                      - rmb: ip del servidor rembo
2197// _____________________________________________________________________________________________________________
2198int Arrancar(char *parametros)
2199{
2200        TRAMA *trama=(TRAMA*)malloc(LONGITUD_TRAMA);
2201        if(!trama)return(false);
2202        char *iph,*rmb,*mac;
2203        int j;
2204
2205        rmb=toma_parametro("rmb",parametros);
2206        mac=toma_parametro("mac",parametros);
2207        iph=toma_parametro("iph",parametros);
2208
2209        for (j=0;j<MAXIMOS_SRVRMB;j++){
2210                if (strcmp(rmb,tbsocketsSRVRMB[j].ip)==0){ // Si existe la IP ...
2211                        FINCADaINTRO(parametros,iph);
2212                        return(manda_trama_servidorrembo(rmb,parametros,tbsocketsSRVRMB[j].puertorepo));
2213                }
2214        }
2215        return(false);
2216}
2217// ________________________________________________________________________________________________________
2218// Funcin: RESPUESTA_Arrancar
2219//
2220//              Descripcin:
2221//                      Responde al comando Apagar
2222//              Parnetros:
2223//                      - s: Socket que el cliente rembo usa para comunicarse con el servidor HIDRA
2224//                      - parametros: parametros del comando
2225// ________________________________________________________________________________________________________
2226int RESPUESTA_Arrancar(SOCKET s,char *parametros)
2227{
2228        char ErrStr[200];
2229        Database db;
2230        Table tbl;
2231       
2232        char *res,*der,*iph,*ido,*ids;
2233
2234        res=toma_parametro("res",parametros); // Toma resultado
2235        der=toma_parametro("der",parametros); // Toma descripcin del error ( si hubiera habido)
2236        iph=toma_parametro("iph",parametros); // Toma ip
2237        ido=toma_parametro("ido",parametros); // Toma identificador del ordenador
2238        ids=toma_parametro("ids",parametros); // Toma identificador de la accin
2239
2240        if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
2241                db.GetErrorErrStr(ErrStr);
2242                return(false);
2243        }
2244        if(!RespuestaEstandar(res,der,ids,ido,db,tbl)){
2245                return(false); // Error al registrar notificacion
2246        }
2247        db.Close();
2248        return(true);
2249}
2250// ________________________________________________________________________________________________________
2251// Funcin: RESPUESTA_Apagar
2252//
2253//              Descripcin:
2254//                      Responde al comando Apagar
2255//              Parnetros:
2256//                      - s: Socket que el cliente rembo usa para comunicarse con el servidor HIDRA
2257//                      - parametros: parametros del comando
2258// ________________________________________________________________________________________________________
2259int RESPUESTA_Apagar(SOCKET s,char *parametros)
2260{
2261        char ErrStr[200];
2262        Database db;
2263        Table tbl;
2264        int i;
2265        char *res,*der,*iph,*ido,*ids;
2266
2267        res=toma_parametro("res",parametros); // Toma resultado
2268        der=toma_parametro("der",parametros); // Toma descripcin del error ( si hubiera habido)
2269        iph=toma_parametro("iph",parametros); // Toma ip
2270        ido=toma_parametro("ido",parametros); // Toma identificador del ordenador
2271        ids=toma_parametro("ids",parametros); // Toma identificador de la accin
2272
2273        if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
2274                db.GetErrorErrStr(ErrStr);
2275                return(false);
2276        }
2277        if(!RespuestaEstandar(res,der,ids,ido,db,tbl)){
2278                return(false); // Error al registrar notificacion
2279        }
2280
2281        if(strcmp(res,ACCION_FALLIDA)==0) return(TRUE); // Error en la ejecucin de la accin en el cliente rembo
2282
2283        if (cliente_existente(iph,&i)) // Si ya existe la IP ...
2284                borra_entrada(i);
2285        db.Close();
2286        return(true);
2287}
2288// ________________________________________________________________________________________________________
2289// Funcin:RESPUESTA_RemboOffline
2290//
2291//              Descripcin:
2292//                      Responde al comando Apagar
2293//              Parnetros:
2294//                      - s: Socket que el cliente rembo usa para comunicarse con el servidor HIDRA
2295//                      - parametros: parametros del comando
2296// ________________________________________________________________________________________________________
2297int RESPUESTA_RemboOffline(SOCKET s,char *parametros)
2298{
2299        char ErrStr[200];
2300        Database db;
2301        Table tbl;
2302        int i;
2303
2304        char *res,*der,*iph,*ido,*ids;
2305
2306        res=toma_parametro("res",parametros); // Toma resultado
2307        der=toma_parametro("der",parametros); // Toma descripcin del error ( si hubiera habido)
2308        iph=toma_parametro("iph",parametros); // Toma ip
2309        ido=toma_parametro("ido",parametros); // Toma identificador del ordenador
2310        ids=toma_parametro("ids",parametros); // Toma identificador de la accin
2311
2312        if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
2313                db.GetErrorErrStr(ErrStr);
2314                return(false);
2315        }
2316        if(!RespuestaEstandar(res,der,ids,ido,db,tbl)){
2317                return(false); // Error al registrar notificacion
2318        }
2319
2320        if(strcmp(res,ACCION_FALLIDA)==0) return(TRUE); // Error en la ejecucin de la accin en el cliente rembo
2321
2322        if (cliente_existente(iph,&i)) // Si ya existe la IP ...
2323                borra_entrada(i);
2324        db.Close();
2325        return(true);
2326}
2327// ________________________________________________________________________________________________________
2328// Funcin: RESPUESTA_Reiniciar
2329//
2330//              Descripcin:
2331//                      Responde al comando Reiniciar
2332//              Parnetros:
2333//                      - s: Socket que el cliente rembo usa para comunicarse con el servidor HIDRA
2334//                      - parametros: parametros del comando
2335// ________________________________________________________________________________________________________
2336int RESPUESTA_Reiniciar(SOCKET s,char *parametros)
2337{
2338        int i;
2339        char ErrStr[200];
2340        Database db;
2341        Table tbl;
2342       
2343        char *res,*der,*iph,*ido,*ids;
2344
2345        res=toma_parametro("res",parametros); // Toma resultado
2346        der=toma_parametro("der",parametros); // Toma descripcin del error ( si hubiera habido)
2347        iph=toma_parametro("iph",parametros); // Toma ip
2348        ido=toma_parametro("ido",parametros); // Toma identificador del ordenador
2349        ids=toma_parametro("ids",parametros); // Toma identificador de la accin
2350
2351        if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
2352                db.GetErrorErrStr(ErrStr);
2353                return(false);
2354        }
2355        if(!RespuestaEstandar(res,der,ids,ido,db,tbl)){
2356                return(false); // Error al registrar notificacion
2357        }
2358        if(strcmp(res,ACCION_FALLIDA)==0) return(TRUE); // Error en la ejecucin de la accin en el cliente rembo
2359
2360        if (cliente_existente(iph,&i)) // Si ya existe la IP ...
2361                borra_entrada(i);
2362        db.Close();
2363        return(true);
2364}
2365// ________________________________________________________________________________________________________
2366//
2367// Funcin: borra_entrada
2368//
2369//              Descripcin:
2370//                       Borra la entrada de un ordenador en la tabla de socket
2371//              Parnetros:
2372//                      - i: Indice dentro de la tabla
2373// ________________________________________________________________________________________________________
2374int borra_entrada(int i)
2375{
2376        tbsockets[i].ip[0]=(char)NULL;
2377        tbsockets[i].estado[0]=(char)NULL;
2378        if(!tbsockets[i].sock)
2379                        close(tbsockets[i].sock);
2380        tbsockets[i].sock=INVALID_SOCKET;
2381        //tbsockets[i].ipsrvdhcp[0]=(char)NULL;
2382        tbsockets[i].ipsrvrmb[0]=(char)NULL;
2383
2384        return(true);
2385}
2386// ________________________________________________________________________________________________________
2387// Funcin: RESPUESTA_ExecShell
2388//
2389//              Descripcin:
2390//                      Responde al comando Ejecutar script
2391//              Parnetros:
2392//                      - s: Socket que el cliente rembo usa para comunicarse con el servidor HIDRA
2393//                      - parametros: parametros del comando
2394// ________________________________________________________________________________________________________
2395int RESPUESTA_ExecShell(SOCKET s,char *parametros)
2396{
2397        char ErrStr[200];
2398        Database db;
2399        Table tbl;
2400       
2401        char *res,*der,*ids,*iph,*ido,*cfg;
2402
2403        res=toma_parametro("res",parametros); // Toma resultado
2404        der=toma_parametro("der",parametros); // Toma descripcin del error ( si hubiera habido)
2405        ids=toma_parametro("ids",parametros); // Toma idperfilsoft
2406        iph=toma_parametro("iph",parametros); // Toma ip
2407        ido=toma_parametro("ido",parametros); // Toma identificador del ordenador
2408        cfg=toma_parametro("cfg",parametros); // Toma configuracin
2409       
2410        if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
2411                db.GetErrorErrStr(ErrStr);
2412                return(false);
2413        }
2414        if(!RespuestaEstandar(res,der,ids,ido,db,tbl)){
2415                return(false); // Error al registrar notificacion
2416        }
2417
2418        if(strcmp(res,ACCION_FALLIDA)!=0) { // Ha habido algn error en la ejecucin de la accin del cliente rembo
2419                if(!actualiza_configuracion(db,tbl,cfg,0,0,iph)) // El ordenador ha cambiado de configuracin
2420                        return(false);
2421        }
2422        db.Close();
2423        return(true);
2424}
2425// ________________________________________________________________________________________________________
2426// Funcin: RespuestaEstandar
2427//
2428//              Descripcin:
2429//                      Esta funcin actualiza la base de datos con el resultado de la ejecucin de un comando con seguimiento
2430//              Parnetros:
2431//                      - res: resultado de la ejecucin del comando
2432//                      - der: Descripcin del error si hubiese habido
2433//                      - ids: identificador de la accin notificada
2434//                      - ido: Identificador del ordenador que notifica
2435//                      - db: Objeto base de datos (operativo)
2436//                      - tbl: Objeto tabla
2437// ________________________________________________________________________________________________________
2438int RespuestaEstandar(char *res,char *der,char *ids,char* ido,Database db,Table tbl)
2439{
2440        char ErrStr[200],sqlstr[1000];
2441        char parametros[LONGITUD_PARAMETROS];
2442        char fechareg[100];
2443        int i,resul;
2444        int idaccion,accionid,idnotificador;
2445        char *iph;
2446    struct tm* st;
2447
2448        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2449        // ACCESO atnico A TRAVEZ DE OBJETO MUTEX a este trozo de cnigo
2450        pthread_mutex_lock(&guardia);
2451
2452        sprintf(sqlstr,"Select * from acciones WHERE idaccion=%s",ids);
2453        if(!db.Execute(sqlstr,tbl)){ // Error al consultar
2454                db.GetErrorErrStr(ErrStr);
2455                                pthread_mutex_unlock(&guardia);
2456                return(false);
2457        }
2458        if(tbl.ISEOF()){ // No existe registro de acciones
2459                                pthread_mutex_unlock(&guardia);
2460                return(true);
2461        }
2462        if(!tbl.Get("parametros",parametros)){ // Toma parametros de la accin
2463                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
2464                                        pthread_mutex_unlock(&guardia);
2465                        return(false);
2466        }
2467        char resultado[2]; // comprueba si ya ha fallado la accin
2468        if(!tbl.Get("resultado",resultado)){ // Toma resultado actual de la accin
2469                        tbl.GetErrorErrStr(ErrStr); // error al recuperar el campo resultado
2470                                        pthread_mutex_unlock(&guardia);
2471                        return(false);
2472        }
2473        if(!tbl.Get("idaccion",idaccion)){ // Toma el identificador de la accin para tener el dato en formato "int"
2474                        tbl.GetErrorErrStr(ErrStr); // error al recuperar el campo resultado
2475                                        pthread_mutex_unlock(&guardia);
2476                        return(false);
2477        }
2478        if(!tbl.Get("accionid",accionid)){ // Toma la accion padre
2479                        tbl.GetErrorErrStr(ErrStr); // error al recuperar el campo resultado
2480                                        pthread_mutex_unlock(&guardia);
2481                        return(false);
2482        }
2483        if(!tbl.Get("idnotificador",idnotificador)){ // Toma el identificador del notificador
2484                        tbl.GetErrorErrStr(ErrStr); // error al recuperar el campo resultado
2485                                        pthread_mutex_unlock(&guardia);
2486                        return(false);
2487        }
2488       
2489    st=TomaHora();
2490        sprintf(fechareg,"%d/%d/%d %d:%d:%d",st->tm_year+1900,st->tm_mon+1,st->tm_mday,st->tm_hour,st->tm_min,st->tm_sec);
2491
2492        // Graba notificacin
2493        sprintf(sqlstr,"INSERT INTO notificaciones (accionid,idnotificador,fechahorareg,resultado,descrinotificacion) VALUES (%s,%s,'%s','%s','%s')",ids,ido,fechareg,res,der);
2494        if(!db.Execute(sqlstr)){ // Error al insertar
2495                db.GetErrorErrStr(ErrStr);
2496                                pthread_mutex_unlock(&guardia);
2497                return(false);
2498        }
2499 
2500        if(strcmp(res,ACCION_FALLIDA)==0 && strcmp(resultado,ACCION_SINERRORES)==0){ // Accion fallida en el cliente rembo
2501                sprintf(sqlstr,"Update acciones set resultado='%s' WHERE idaccion=%s",ACCION_CONERRORES,ids);
2502                strcpy(resultado,ACCION_CONERRORES);
2503                if(!db.Execute(sqlstr)){ // Error al actualizar
2504                        db.GetErrorErrStr(ErrStr);
2505                                        pthread_mutex_unlock(&guardia);
2506                        return(false);
2507                }
2508        }
2509        // Comprueba si la accin se ejecutncorrectamente para el ambito sumando notificaciones
2510        INTROaFINCAD(parametros);
2511        iph=toma_parametro("iph",parametros); // Toma cadenaip
2512        int tbnumipes=0,totalipes=1,lon;
2513
2514        lon=strlen(iph);
2515        for (i=0;i<lon;i++){
2516                if(iph[i]==';')
2517                        totalipes++; // ip detectada
2518        }
2519       
2520        sprintf(sqlstr,"SELECT COUNT(*) AS tbnumipes FROM notificaciones WHERE accionid=%s",ids);
2521        if(!db.Execute(sqlstr,tbl)){ // Error al insertar
2522                                pthread_mutex_unlock(&guardia);
2523                db.GetErrorErrStr(ErrStr);
2524                                pthread_mutex_unlock(&guardia);
2525                return(false);
2526        }
2527               
2528        if(!tbl.Get("tbnumipes",tbnumipes)){ // Recupera el numero de ordenadores que ya han notificado
2529                        tbl.GetErrorErrStr(ErrStr); // error al recuperar el campo
2530                                        pthread_mutex_unlock(&guardia);
2531                        return(false);
2532        }
2533        if(tbnumipes!=totalipes){
2534                                pthread_mutex_unlock(&guardia);
2535                return(true); // No es el ultimo ordenador en notificar
2536        }
2537
2538    st=TomaHora();
2539        sprintf(fechareg,"%d/%d/%d %d:%d:%d",st->tm_year+1900,st->tm_mon+1,st->tm_mday,st->tm_hour,st->tm_min,st->tm_sec);
2540
2541        // Actualizacion despues de que todos los ordenadores han notificado
2542        if(strcmp(resultado,ACCION_SINERRORES)==0){ // Accion finalizada con exito
2543                sprintf(sqlstr,"Update acciones set estado='%s',resultado='%s',fechahorafin='%s' WHERE idaccion=%s",ACCION_FINALIZADA,ACCION_EXITOSA,fechareg,ids);
2544                if(!db.Execute(sqlstr,tbl)){ // Error al actualizar
2545                        db.GetErrorErrStr(ErrStr);
2546                                        pthread_mutex_unlock(&guardia);
2547                        return(false);
2548                }
2549        }
2550        if(strcmp(resultado,ACCION_CONERRORES)==0){ // Accion finalizada con errores
2551                sprintf(sqlstr,"Update acciones set estado='%s',resultado='%s',fechahorafin='%s' WHERE idaccion=%s",ACCION_FINALIZADA,ACCION_FALLIDA,fechareg,ids);
2552                if(!db.Execute(sqlstr,tbl)){ // Error al actualizar
2553                        db.GetErrorErrStr(ErrStr);
2554                                        pthread_mutex_unlock(&guardia);
2555                        return(false);
2556                }
2557        }
2558        resul=true;
2559        if(accionid>0){ // Existe accion padre que hay que actualizar
2560                resul=InsertaNotificaciones(idaccion,idnotificador,accionid,resultado,db);
2561                if(resul)
2562                        resul=comprueba_resultados(accionid,db);
2563        }
2564                        pthread_mutex_unlock(&guardia);
2565        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2566        return(resul);
2567}
2568// ________________________________________________________________________________________________________
2569// Funcin: RESPUESTA_CrearPerfilSoftware
2570//
2571//              Descripcin:
2572//                      Responde al comando Crear Perfil Software
2573//              Parnetros:
2574//                      - s: Socket que el cliente rembo usa para comunicarse con el servidor HIDRA
2575//                      - parametros: parametros del comando
2576// ________________________________________________________________________________________________________
2577int RESPUESTA_CrearPerfilSoftware(SOCKET s,char *parametros)
2578{
2579        char ErrStr[200],sqlstr[1000];
2580        char *res,*der,*ids,*ifh,*ifs,*iph,*ido;
2581        Database db;
2582        Table tbl;
2583       
2584        if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
2585                db.GetErrorErrStr(ErrStr);
2586                return(false);
2587        }
2588
2589        res=toma_parametro("res",parametros); // Toma resultado
2590        der=toma_parametro("der",parametros); // Toma descripcin del error ( si hubiera habido)
2591        ids=toma_parametro("ids",parametros); // Toma idperfilsoft
2592        iph=toma_parametro("iph",parametros); // Toma ip
2593        ido=toma_parametro("ido",parametros); // Toma dentificador del ordenador
2594        ifh=toma_parametro("ifh",parametros); // Toma idperfilhard
2595        ifs=toma_parametro("ifs",parametros); // Toma idperfilsoft
2596
2597        if(!RespuestaEstandar(res,der,ids,ido,db,tbl)){
2598                return(false); // Error al registrar notificacion
2599        }
2600
2601        if(strcmp(res,ACCION_FALLIDA)==0) { // Ha habido algn error en la ejecucin de la accin en el cliente rembo
2602                db.Close();
2603                return(false);
2604        }
2605
2606        sprintf(sqlstr,"Select * from perfileshard_perfilessoft WHERE idperfilhard=%s AND idperfilsoft=%s",ifh,ifs);
2607        if(!db.Execute(sqlstr,tbl)){ // Error al consultar
2608                db.GetErrorErrStr(ErrStr);
2609                return(false);
2610        }
2611        if(!tbl.ISEOF()){ // Si ya existe el registro ... no hace falta insertarlo
2612                db.Close();
2613                return(false); 
2614        }
2615        sprintf(sqlstr,"INSERT INTO perfileshard_perfilessoft (idperfilhard,idperfilsoft) VALUES(%s,%s)",ifh,ifs);
2616        if(!db.Execute(sqlstr,tbl)){ // Error al insertar
2617                db.GetErrorErrStr(ErrStr);
2618                return(false);
2619        }
2620        db.Close();
2621        return(true);
2622}
2623// ________________________________________________________________________________________________________
2624// Funcin: RESPUESTA_CrearSoftwareIncremental
2625//
2626//              Descripcin:
2627//                      Esta funcin responde a un comando de creacin de un software incremental. Ademn actualiza  la base de datos insertando
2628//                      en su caso la nueva combinacin de perfil software con incremental.
2629//              Parnetros:
2630//                      - s: Socket que el cliente rembo usa para comunicarse con el servidor HIDRA
2631//                      - parametros: parametros del comando
2632// ________________________________________________________________________________________________________
2633int RESPUESTA_CrearSoftwareIncremental(SOCKET s,char *parametros)
2634{
2635        char ErrStr[200],sqlstr[1000];
2636        char *res,*der,*ids,*ifh,*ifs,*icr,*iph,*ido;
2637        int idphardidpsoft;
2638        Database db;
2639        Table tbl;
2640       
2641        if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
2642                db.GetErrorErrStr(ErrStr);
2643                return(false);
2644        }
2645
2646        res=toma_parametro("res",parametros); // Toma resultado
2647        der=toma_parametro("der",parametros); // Toma descripcin del error ( si hubiera habido)
2648        ids=toma_parametro("ids",parametros); // Toma idperfilsoft
2649        iph=toma_parametro("iph",parametros); // Toma ip
2650        ido=toma_parametro("ido",parametros); // Toma dentificador del ordenador
2651        ifh=toma_parametro("ifh",parametros); // Toma idperfilhard
2652        ifs=toma_parametro("ifs",parametros); // Toma idperfilsoft
2653        icr=toma_parametro("icr",parametros); // Toma idsoftincremental
2654
2655        if(!RespuestaEstandar(res,der,ids,ido,db,tbl)){
2656                return(false); // Error al registrar notificacion
2657        }
2658
2659        if(strcmp(res,ACCION_FALLIDA)==0) { // Ha habido algn error en la ejecucin de la accin en el cliente rembo
2660                db.Close();
2661                return(false);
2662        }
2663
2664        sprintf(sqlstr,"Select idphardidpsoft from perfileshard_perfilessoft WHERE idperfilhard=%s AND idperfilsoft=%s",ifh,ifs);
2665        if(!db.Execute(sqlstr,tbl)){ // Error al consultar
2666                db.GetErrorErrStr(ErrStr);
2667                return(false);
2668        }
2669
2670        if(tbl.ISEOF()){ // Si no existe el registro ...
2671                db.Close();
2672                return(false); 
2673        }
2674
2675        if(!tbl.Get("idphardidpsoft",idphardidpsoft)){ // Recupera el identificador de la combinacin de perfiles
2676                tbl.GetErrorErrStr(ErrStr); // error al recuperar el campo
2677                return(false);
2678        }
2679
2680        sprintf(sqlstr,"Select * from phard_psoft_softincremental WHERE idphardidpsoft=%d AND idsoftincremental=%s",idphardidpsoft,icr);
2681        if(!db.Execute(sqlstr,tbl)){ // Error al consultar
2682                db.GetErrorErrStr(ErrStr);
2683                return(false);
2684        }
2685
2686        if(!tbl.ISEOF()){ // Si ya existe el registro ...
2687                db.Close();
2688                return(false); 
2689        }
2690
2691        sprintf(sqlstr,"INSERT INTO phard_psoft_softincremental (idphardidpsoft,idsoftincremental) VALUES(%d,%s)",idphardidpsoft,icr);
2692        if(!db.Execute(sqlstr,tbl)){ // Error al insertar
2693                db.GetErrorErrStr(ErrStr);
2694                return(false);
2695        }
2696        db.Close();     
2697        return(true);
2698}
2699// ________________________________________________________________________________________________________
2700// Funcin: RESPUESTA_RestaurarImagen
2701//
2702//              Descripcin:
2703//                      Esta funcin responde a un comando de restauracin de una imagen. Ademn actualiza  la base de datos.
2704//              Parnetros:
2705//                      - s: Socket que el cliente rembo usa para comunicarse con el servidor HIDRA
2706//                      - parametros: parametros del comando
2707// ________________________________________________________________________________________________________
2708int RESPUESTA_RestaurarImagen(SOCKET s,char *parametros)
2709{
2710        char ErrStr[200],gido[20];
2711        char *res,*der,*ids,*iph,*ido,*idi,*par,*cfg;
2712        Database db;
2713        Table tbl;
2714
2715        if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
2716                db.GetErrorErrStr(ErrStr);
2717                return(false);
2718        }
2719
2720        INTROaFINCAD(parametros);
2721
2722        res=toma_parametro("res",parametros); // Toma resultado
2723        der=toma_parametro("der",parametros); // Toma descripcin del error ( si hubiera habido)
2724        ids=toma_parametro("ids",parametros); // Toma identificador de la accion
2725        iph=toma_parametro("iph",parametros); // Toma ip
2726        ido=toma_parametro("ido",parametros); // Toma identificador del ordenador
2727        cfg=toma_parametro("cfg",parametros); // Toma configuracin
2728        par=toma_parametro("par",parametros); // particion
2729        idi=toma_parametro("idi",parametros); // identificador de la imagen
2730
2731        strcpy(gido,ido); // Guarda el identificador del ordenador
2732
2733        if(!RespuestaEstandar(res,der,ids,ido,db,tbl)){
2734                return(false); // Error al registrar notificacion
2735        }
2736        if(strcmp(res,ACCION_FALLIDA)==0) { // Ha habido algn error en la ejecucin de la accin del cliente rembo
2737                db.Close();
2738                return(false);
2739        }
2740
2741        if(!actualiza_configuracion(db,tbl,cfg,0,0,iph))        return(false); // Erro al actualiza la configuracin
2742        if(!Actualiza_ordenador_imagen(par,idi,gido,db)) return(false);
2743        db.Close();
2744        return(true);   
2745}
2746// ________________________________________________________________________________________________________
2747// Funcin: Actualiza_ordenador_imagen
2748//
2749//              Descripcin:
2750//                      Esta funcin actualiza la tabla ordenador_imagen
2751//              Parnetros:
2752//                      - par: particion
2753//                      - idi: identificador de la imagen ( 0 ninguna )
2754//                      - ido: identificador del ordenador
2755//                      - db: Conexin ADO operativa
2756// ________________________________________________________________________________________________________
2757int Actualiza_ordenador_imagen(char *par,const char *idi,char *ido,Database db)
2758{
2759        char ErrStr[200],sqlstr[1000];
2760        Table tbl;
2761        int idimagen,idimagenres;
2762
2763        idimagenres=atoi(idi);
2764        if(idimagenres==0){ // Se ha formateado la particin y se ha borrado la imagen por tanto
2765                sprintf(sqlstr,"DELETE FROM ordenador_imagen WHERE idordenador=%s AND particion=%s",ido,par);
2766                if(!db.Execute(sqlstr)){ // Error al insertar
2767                        db.GetErrorErrStr(ErrStr);
2768                        return(false);
2769                }
2770                return(true);
2771        }
2772
2773        sprintf(sqlstr,"SELECT idimagen FROM ordenador_imagen INNER JOIN ordenadores ON ordenador_imagen.idordenador = ordenadores.idordenador WHERE ordenadores.idordenador = %s AND ordenador_imagen.particion = %s",ido,par);
2774        if(!db.Execute(sqlstr,tbl)){ // Error al consultar
2775                db.GetErrorErrStr(ErrStr);
2776                return(false);
2777        }
2778        if(!tbl.ISEOF()){ // Existe registro
2779                if(!tbl.Get("idimagen",idimagen)){
2780                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
2781                        return(false);
2782                }
2783                else{
2784                        if (idimagenres!=idimagen){
2785                                sprintf(sqlstr,"Update ordenador_imagen set idimagen=%s WHERE idordenador=%s AND particion=%s",idi,ido,par);
2786                                if(!db.Execute(sqlstr)){ // Error al actualizar
2787                                        db.GetErrorErrStr(ErrStr);
2788                                        return(false);
2789                                }
2790                        }
2791                }
2792        }
2793        else{ // No existe el registro
2794                        sprintf(sqlstr,"INSERT INTO ordenador_imagen (idordenador,particion,idimagen) VALUES(%s,%s,%s)",ido,par,idi);
2795                        if(!db.Execute(sqlstr)){ // Error al insertar
2796                                db.GetErrorErrStr(ErrStr);
2797                                return(false);
2798                        }
2799        }
2800        return(true);
2801}
2802// ________________________________________________________________________________________________________
2803// Funcin: RESPUESTA_ParticionaryFormatear
2804//
2805//              Descripcin:
2806//                      Esta funcin responde a un comando de particionar y formatear.  Ademn actualiza  la base de datos.
2807//              Parnetros:
2808//                      - s: Socket que el cliente rembo usa para comunicarse con el servidor HIDRA
2809//                      - parametros: parametros del comando
2810// ________________________________________________________________________________________________________
2811int RESPUESTA_ParticionaryFormatear(SOCKET s,char *parametros)
2812{
2813        char sqlstr[1000],ErrStr[200],gido[20];
2814        Database db;
2815        Table tbl;
2816        char *res,*der,*ids,*iph,*ido,*cfg;
2817
2818        res=toma_parametro("res",parametros); // Toma resultado
2819        der=toma_parametro("der",parametros); // Toma descripcin del error ( si hubiera habido)
2820        ids=toma_parametro("ids",parametros); // Toma identificador de la accin
2821        iph=toma_parametro("iph",parametros); // Toma ip
2822        ido=toma_parametro("ido",parametros); // Toma identificador del ordenador
2823        cfg=toma_parametro("cfg",parametros); // Toma configuracin
2824       
2825        strcpy(gido,ido); // Guarda el identificador del ordenador
2826
2827        if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
2828                db.GetErrorErrStr(ErrStr);
2829                return(false);
2830        }
2831        if(!RespuestaEstandar(res,der,ids,ido,db,tbl)){
2832                return(false); // Error al registrar notificacion
2833        }
2834        if(strcmp(res,ACCION_FALLIDA)==0){
2835                db.Close();
2836                 return(true); // Ha habido algn error en la ejecucin de la accin del cliente rembo
2837        }
2838        if(!actualiza_configuracion(db,tbl,cfg,0,0,iph))        return(false); // Erro al actualiza la configuracin
2839
2840        // Elimina informacin sobre imagenes en este ordenador, al haber sido formateado
2841        sprintf(sqlstr,"DELETE FROM ordenador_imagen WHERE idordenador=%s",gido);
2842        if(!db.Execute(sqlstr)){ // Error al insertar
2843                db.GetErrorErrStr(ErrStr);
2844                return(false);
2845        }
2846        db.Close();
2847        return(true);
2848}
2849// ________________________________________________________________________________________________________
2850// Funcin: RESPUESTA_Configurar
2851//
2852//              Descripcin:
2853//                      Esta funcin responde a un comando de Configurar.  Ademn actualiza  la base de datos.
2854//              Parnetros:
2855//                      - s: Socket que el cliente rembo usa para comunicarse con el servidor HIDRA
2856//                      - parametros: parametros del comando
2857// ________________________________________________________________________________________________________
2858int RESPUESTA_Configurar(SOCKET s,char *parametros)
2859{
2860        char ErrStr[200],gids[20],gido[20];
2861        Database db;
2862        Table tbl;
2863        int lon,resul,i;
2864        char *res,*der,*ids,*iph,*ido,*cfg,*hdc;
2865
2866        res=toma_parametro("res",parametros); // Toma resultado
2867        der=toma_parametro("der",parametros); // Toma descripcin del error ( si hubiera habido)
2868        ids=toma_parametro("ids",parametros); // Toma idperfilsoft
2869        iph=toma_parametro("iph",parametros); // Toma ip
2870        ido=toma_parametro("ido",parametros); // Toma identificador del ordenador
2871        cfg=toma_parametro("cfg",parametros); // Toma configuracin
2872        hdc=toma_parametro("hdc",parametros); // Toma participaciones a formatear
2873
2874        strcpy(gids,ids); // Guarda el identificador de la accin
2875        strcpy(gido,ido); // Guarda el identificador del ordenador
2876
2877        if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
2878                db.GetErrorErrStr(ErrStr);
2879                return(false);
2880        }
2881        if(!RespuestaEstandar(res,der,ids,ido,db,tbl)){
2882                return(false); // Error al registrar notificacion
2883        }
2884
2885        if(strcmp(res,ACCION_FALLIDA)==0){
2886                db.Close();
2887                 return(true); // Ha habido algn error en la ejecucin de la accin del cliente rembo
2888        }
2889        if(!actualiza_configuracion(db,tbl,cfg,0,0,iph))        return(false); // Erro al actualiza la configuracin
2890       
2891        lon=strlen(hdc);
2892        for(i=0;i<lon;i++){
2893                if(hdc[i]==';') hdc[i]='\0';
2894        }
2895        for(i=0;i<lon;i++){
2896                if(*hdc!='\0'){
2897                        resul=Actualiza_ordenador_imagen(hdc,"0",gido,db);
2898                        if(!resul){
2899                                db.Close();
2900                                 return(false);
2901                        }
2902                }
2903                hdc++;
2904        }
2905        db.Close();
2906        return(true);
2907}
2908// ________________________________________________________________________________________________________
2909// Funcin: RESPUESTA_TomaConfiguracion
2910//
2911//              Descripcin:
2912//                      Esta funcin responde a un comando de Toma Comfiguracin.  Ademn actualiza  la base de datos.
2913//              Parnetros:
2914//                      - s: Socket que el cliente rembo usa para comunicarse con el servidor HIDRA
2915//                      - parametros: parametros del comando
2916// ________________________________________________________________________________________________________
2917int RESPUESTA_TomaConfiguracion(SOCKET s,char *parametros)
2918{
2919        char ErrStr[200];
2920        Database db;
2921        Table tbl;
2922       
2923        char *res,*der,*ids,*iph,*ido,*cfg;
2924
2925        res=toma_parametro("res",parametros); // Toma resultado
2926        der=toma_parametro("der",parametros); // Toma descripcin del error ( si hubiera habido)
2927        ids=toma_parametro("ids",parametros); // Toma identificador de la accin
2928        iph=toma_parametro("iph",parametros); // Toma ip
2929        ido=toma_parametro("ido",parametros); // Toma identificador del ordenador
2930        cfg=toma_parametro("cfg",parametros); // Toma configuracin
2931       
2932        if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
2933                db.GetErrorErrStr(ErrStr);
2934                return(false);
2935        }
2936        if(!RespuestaEstandar(res,der,ids,ido,db,tbl)){
2937                return(false); // Error al registrar notificacion
2938        }
2939        if(strcmp(res,ACCION_FALLIDA)!=0) { // Ha habido algn error en la ejecucin de la accin del cliente rembo
2940                if(!actualiza_configuracion(db,tbl,cfg,0,0,iph)) // El ordenador ha cambiado de configuracin
2941                        return(false);
2942        }
2943        db.Close();
2944        return(true);
2945}
2946// ________________________________________________________________________________________________________
2947// Funcin: RESPUESTA_TomaHardware
2948//
2949//              Descripcin:
2950//                      Esta funcin responde a un comando de Toma HArdware.  Ademn actualiza  la base de datos.
2951//              Parnetros:
2952//                      - s: Socket que el cliente rembo usa para comunicarse con el servidor HIDRA
2953//                      - parametros: parametros del comando
2954// ________________________________________________________________________________________________________
2955int RESPUESTA_TomaHardware(SOCKET s,char *parametros)
2956{
2957        char ErrStr[200];
2958        Database db;
2959        Table tbl;
2960       
2961        char *res,*der,*ids,*iph,*ido,*hrd;
2962
2963        res=toma_parametro("res",parametros); // Toma resultado
2964        der=toma_parametro("der",parametros); // Toma descripcin del error ( si hubiera habido)
2965        ids=toma_parametro("ids",parametros); // Toma identificador de la accin
2966        iph=toma_parametro("iph",parametros); // Toma ip
2967        ido=toma_parametro("ido",parametros); // Toma identificador del ordenador
2968       
2969        hrd=toma_parametro("hrd",parametros); // Toma configuracin
2970       
2971        if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
2972                db.GetErrorErrStr(ErrStr);
2973                return(false);
2974        }
2975        if(!RespuestaEstandar(res,der,ids,ido,db,tbl)){
2976                return(false); // Error al registrar notificacion
2977        }
2978        if(strcmp(res,ACCION_FALLIDA)!=0) { // Ha habido algn error en la ejecucin de la accin del cliente rembo
2979                if(!actualiza_hardware(db,tbl,hrd,iph,ido)) // El ordenador ha cambiado de configuracin
2980                        return(false);
2981        }
2982        db.Close();
2983        return(true);
2984}
2985// ________________________________________________________________________________________________________
2986// Funcin: RESPUESTA_TomaSoftware
2987//
2988//              Descripcin:
2989//                      Esta funcin responde a un comando de Inventario Software.  Además actualiza  la base de datos.
2990//              Parnetros:
2991//                      - s: Socket que el cliente rembo usa para comunicarse con el servidor HIDRA
2992//                      - parametros: parametros del comando
2993// ________________________________________________________________________________________________________
2994int RESPUESTA_TomaSoftware(SOCKET s,char *parametros)
2995{
2996        char ErrStr[200];
2997        Database db;
2998        Table tbl;
2999       
3000        char *res,*der,*ids,*iph,*ido,*sft,*par,*tfs;
3001
3002        res=toma_parametro("res",parametros); // Toma resultado
3003        der=toma_parametro("der",parametros); // Toma descripcin del error ( si hubiera habido)
3004        ids=toma_parametro("ids",parametros); // Toma identificador de la accin
3005        iph=toma_parametro("iph",parametros); // Toma ip
3006        ido=toma_parametro("ido",parametros); // Toma identificador del ordenador
3007       
3008        sft=toma_parametro("sft",parametros); // Toma software
3009        par=toma_parametro("par",parametros); // Toma partición
3010        tfs=toma_parametro("tfs",parametros); // Toma tipo partición
3011       
3012        if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
3013                db.GetErrorErrStr(ErrStr);
3014                return(false);
3015        }
3016        if(!RespuestaEstandar(res,der,ids,ido,db,tbl)){
3017                return(false); // Error al registrar notificacion
3018        }
3019        if(strcmp(res,ACCION_FALLIDA)!=0) { // Ha habido algn error en la ejecucin de la accin del cliente rembo
3020                if(!actualiza_software(db,tbl,sft,par,tfs,iph,ido)) // El ordenador ha cambiado de configuracin
3021                        return(false);
3022        }
3023        db.Close();
3024        return(true);
3025}
3026// ________________________________________________________________________________________________________
3027// Funcin: busca_comandos
3028//
3029//              Descripcin:
3030//                      Esta funcin busca en la base de datos,comandos pendientes de ejecutar   para el ordenador cocreto
3031//              Parnetros:
3032//                      - iph: Direccin IP del ordenador
3033//                      - ido: Identificador del ordenador
3034//                      - parametros: parametros de la accin buscada
3035//                      - ids: Identificador de la accin
3036// ________________________________________________________________________________________________________
3037int busca_comandos(char* iph,char *ido,char *parametros,int *ids)
3038{
3039        char sqlstr[1000],ErrStr[200];
3040        Database db;
3041        Table tbl,tbln;
3042
3043        if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
3044                db.GetErrorErrStr(ErrStr);
3045                return(false);
3046        }
3047        sprintf(sqlstr,"SELECT idaccion,resultado,estado,parametros FROM acciones WHERE tipoaccion=%d AND estado = '%s' AND (resultado='%s' OR resultado='%s') AND parametros LIKE '%c%s%c' ORDER BY idaccion",EJECUCION_COMANDO,ACCION_INICIADA,ACCION_SINERRORES,ACCION_CONERRORES,37,iph,37);
3048        if(!db.Execute(sqlstr,tbl)){ // Error al leer
3049                db.GetErrorErrStr(ErrStr);
3050                return(false);
3051        }
3052        if(tbl.ISEOF()){
3053                db.Close();
3054                return(false);  // No hay comandos pendientes
3055        }
3056
3057        while(!tbl.ISEOF()){ // Busca entre todas las acciones de diversos ambitos
3058
3059                if(!tbl.Get("parametros",parametros)){ // Toma parametros
3060                                tbl.GetErrorErrStr(ErrStr); // error al recuperar el campo parametros
3061                                return(false);
3062                }
3063
3064                if(IgualIP(parametros,iph)){ // Si existe la IP en la cadena
3065                        if(!tbl.Get("idaccion",*ids)){ // Toma identificador de la accin
3066                                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3067                                return(false);
3068                        }
3069
3070                        // Comprueba que aunque el resultado es ACCION_INICIADA, este ordenador an no ha notificado
3071                        sprintf(sqlstr,"SELECT idnotificador FROM notificaciones WHERE accionid=%d AND idnotificador=%s",*ids,ido);
3072                        if(!db.Execute(sqlstr,tbln)){ // Error al leer
3073                                db.GetErrorErrStr(ErrStr);
3074                                return(false);
3075                        }
3076                        if(tbln.ISEOF()){
3077                                db.Close();                             
3078                                return(true);  // No ha notificado este ordenador
3079                        }
3080                }
3081                tbl.MoveNext();
3082        }
3083        db.Close();
3084        return(false);  // No hay mn acciones
3085}
3086// ________________________________________________________________________________________________________
3087int InsertaNotificaciones(int idaccion,int idnotificador, int accionid, char *resultado,Database db){
3088       
3089    struct tm* st;
3090        char ErrStr[200],sqlstr[1000];
3091        char fechahorareg[100];
3092        char descrinotificacion[100];
3093
3094
3095    st=TomaHora();
3096        sprintf(fechahorareg,"%d/%d/%d %d:%d:%d",st->tm_year+1900,st->tm_mon+1,st->tm_mday,st->tm_hour,st->tm_min,st->tm_sec);
3097
3098        strcpy(descrinotificacion," ");
3099
3100        if(strcmp(resultado,ACCION_CONERRORES)==0) {
3101                strcpy(descrinotificacion,"Ha ocurrido algn error en la ejecucin de esta tarea.");
3102                strcpy(resultado,ACCION_FALLIDA);
3103        }
3104        if(strcmp(resultado,ACCION_SINERRORES)==0)
3105                strcpy(resultado,ACCION_EXITOSA);
3106       
3107        sprintf(sqlstr,"INSERT INTO notificaciones (accionid,idnotificador,fechahorareg,resultado,descrinotificacion,idaccion) VALUES (%d,%d,'%s','%s','%s',%d)",accionid,idnotificador,fechahorareg,resultado,descrinotificacion,idaccion);
3108        if(!db.Execute(sqlstr)){ // Error al insertar
3109                db.GetErrorErrStr(ErrStr);
3110                return(false);
3111        }
3112        return(true);
3113}
3114// ________________________________________________________________________________________________________
3115int comprueba_resultados(int idaccion,Database db){
3116
3117        char ErrStr[200],sqlstr[1000];
3118        int numfallidas;
3119        char finalaccion[2];
3120        Table tbl;
3121
3122        sprintf(sqlstr,"SELECT COUNT(*) as numfallidas FROM notificaciones WHERE resultado='%s' AND accionid=%d",ACCION_FALLIDA,idaccion);
3123        if(!db.Execute(sqlstr,tbl)){ // Error al consultar
3124                db.GetErrorErrStr(ErrStr);
3125                return(false);
3126        }
3127        if(tbl.ISEOF()) return(false); // No existe registro de acciones
3128               
3129        if(!tbl.Get("numfallidas",numfallidas)){ // Toma dato
3130                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3131                        return(false);
3132        }
3133
3134        if(numfallidas>0)
3135                strcpy(finalaccion,ACCION_CONERRORES);
3136        else
3137                strcpy(finalaccion,ACCION_SINERRORES);
3138
3139        sprintf(sqlstr,"UPDATE acciones SET resultado='%s' WHERE idaccion=%d",finalaccion,idaccion);
3140        if(!db.Execute(sqlstr,tbl)){ // Error al actualizar
3141                db.GetErrorErrStr(ErrStr);
3142                return(false);
3143        }
3144        // Comprueba si ha finalizado esta accin e inserta su notificador correspondiente
3145        return(comprueba_finalizada(idaccion,finalaccion,db));
3146}
3147// ________________________________________________________________________________________________________
3148int comprueba_finalizada(int idaccion,char *resultado,Database db){
3149
3150        char ErrStr[200],sqlstr[1000];
3151        int numnotificaciones,tipoaccion,idnotificador;
3152        char parametros[LONGITUD_PARAMETROS],*cadenanot;
3153        char fechareg[100];
3154        int accionid,cont,i,resul,lon;
3155        Table tbl;
3156    struct tm* st;
3157
3158        sprintf(sqlstr,"SELECT COUNT(*) as numnotificaciones FROM notificaciones WHERE accionid=%d",idaccion);
3159        if(!db.Execute(sqlstr,tbl)){ // Error al consultar
3160                db.GetErrorErrStr(ErrStr);
3161                return(false);
3162        }
3163        if(tbl.ISEOF()) return(false); // No existe registro de acciones
3164
3165        if(!tbl.Get("numnotificaciones",numnotificaciones)){ // Toma dato
3166                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3167                        return(false);
3168        }
3169
3170        sprintf(sqlstr,"SELECT tipoaccion,parametros,idnotificador,accionid FROM acciones WHERE idaccion=%d",idaccion);
3171        if(!db.Execute(sqlstr,tbl)){ // Error al consultar
3172                db.GetErrorErrStr(ErrStr);
3173                return(false);
3174        }
3175        if(tbl.ISEOF()) return(true); // No existe registro de acciones
3176               
3177        if(!tbl.Get("tipoaccion",tipoaccion)){ // Toma dato
3178                        tbl.GetErrorErrStr(ErrStr); // error al recuperar el campo resultado
3179                        return(false);
3180        }
3181        if(!tbl.Get("parametros",parametros)){ // Toma dato
3182                        tbl.GetErrorErrStr(ErrStr); // error al recuperar el campo resultado
3183                        return(false);
3184        }
3185        if(!tbl.Get("idnotificador",idnotificador)){ // Toma dato
3186                        tbl.GetErrorErrStr(ErrStr); // error al recuperar el campo resultado
3187                        return(false);
3188        }
3189        if(!tbl.Get("accionid",accionid)){ // Toma dato
3190                                tbl.GetErrorErrStr(ErrStr); // error al recuperar el campo resultado
3191                                return(false);
3192        }
3193
3194        INTROaFINCAD(parametros);
3195        switch(tipoaccion){
3196                case EJECUCION_COMANDO :
3197                        cadenanot=toma_parametro("iph",parametros); // Toma cadenaip
3198                        break;
3199                case EJECUCION_TAREA :
3200                        cadenanot=toma_parametro("cmd",parametros); // Toma comandos
3201                        break;
3202                case EJECUCION_TRABAJO :
3203                        cadenanot=toma_parametro("tsk",parametros); // Toma tareas
3204                        break;
3205                default:
3206                        return(false);
3207        }
3208        cont=1;
3209        lon=strlen(cadenanot);
3210        for (i=0;i<lon;i++){
3211                if(cadenanot[i]==';') cont++;
3212        }
3213        resul=true;
3214        if(numnotificaciones==cont){
3215                st=TomaHora();
3216                sprintf(fechareg,"%d/%d/%d %d:%d:%d",st->tm_year+1900,st->tm_mon+1,st->tm_mday,st->tm_hour,st->tm_min,st->tm_sec);
3217
3218                if(strcmp(resultado,ACCION_CONERRORES)==0)
3219                        sprintf(sqlstr,"UPDATE acciones SET resultado='%s',estado='%s',fechahorafin='%s' WHERE idaccion=%d",ACCION_FALLIDA,ACCION_FINALIZADA,fechareg,idaccion);
3220                else
3221                        sprintf(sqlstr,"UPDATE acciones SET resultado='%s',estado='%s',fechahorafin='%s' WHERE idaccion=%d",ACCION_EXITOSA,ACCION_FINALIZADA,fechareg,idaccion);
3222
3223                if(!db.Execute(sqlstr)){ // Error al actualizar
3224                        db.GetErrorErrStr(ErrStr);
3225                        return(false);
3226                }
3227
3228                if(accionid>0){ // Esto no se ejecutarnsi la tarea tiene un trabajo padre
3229                        resul=InsertaNotificaciones(idaccion,idnotificador,accionid,resultado,db);
3230                        if(resul)
3231                                return(comprueba_resultados(accionid,db));
3232                }
3233        }
3234        return(resul);
3235}
3236// ________________________________________________________________________________________________________
3237// Funcin: EnviaServidoresRembo
3238//
3239//              Descripcin:
3240//                      Esta funcin envia una  trama a un servidor rembo para que sus clientes ejecuten un comando
3241//              Parnetros:
3242//                      - parametros: parametros del comando
3243// ________________________________________________________________________________________________________
3244void EnviaServidoresRembo(char * parametros)
3245{
3246        int i,lon;
3247        for (i=0;i<MAXIMOS_SRVRMB;i++){
3248                if (tbsocketsSRVRMB[i].swenv==1){ // El switch de envio estna uno hay que enviar al servidor trama ...
3249                        strcat(parametros,"iph=");
3250                        strcat(parametros,tbsocketsSRVRMB[i].ipes);
3251                        lon=strlen(parametros);
3252                        parametros[lon-1]='\r'; // Quita la coma final
3253                        manda_trama_servidorrembo(tbsocketsSRVRMB[i].ip,parametros,tbsocketsSRVRMB[i].puertorepo);
3254                }
3255        }
3256}
3257// ________________________________________________________________________________________________________
3258// Funcin: manda_comando_servidorrembo
3259//
3260//              Descripcin:
3261//                      Esta funcin envia una  trama a un servidor rembo para que sus clientes ejecuten un comando
3262//              Parnetros:
3263//                      - ip_srvrbm: Direccin IP del servidor REMBO
3264//                      - parametros: parametros del comando
3265// ________________________________________________________________________________________________________
3266int manda_trama_servidorrembo(char* ip_srvrbm,char *parametros,int puertorepo)
3267{       int ret;
3268        TRAMA *trama=(TRAMA*)malloc(LONGITUD_TRAMA);
3269        if(!trama)
3270                return(false);
3271        strcpy(trama->parametros,parametros);
3272        SOCKET udpsock;
3273        udpsock=UDPConnect(IPlocal);
3274        if (udpsock == INVALID_SOCKET) return(false);
3275        ret=envia_comandos(udpsock,trama,ip_srvrbm,puertorepo);
3276        close(udpsock);
3277        return(ret);
3278}
3279//_______________________________________________________________________________________________________________
3280//
3281// Crea un socket en un puerto determinado para la conversacin UDP con el repositorio
3282//
3283//_______________________________________________________________________________________________________________
3284SOCKET UDPConnect(char *ips)
3285{
3286        SOCKET socket_c; // Socket para hebras (UDP)
3287    struct sockaddr_in cliente;
3288        int puerto;
3289
3290        socket_c = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // Crea socket para UDP
3291
3292        if (socket_c == SOCKET_ERROR)
3293                return (INVALID_SOCKET);
3294
3295        cliente.sin_addr.s_addr = inet_addr(ips); // selecciona interface
3296        cliente.sin_family = AF_INET;
3297        puerto=PUERTOMINUSER;
3298        while(puerto<PUERTOMAXUSER){ // Busca puerto libre
3299                cliente.sin_port = htons(puerto); // Puerto asignado
3300                if (bind(socket_c,(struct sockaddr *)&cliente,sizeof(cliente)) == SOCKET_ERROR)
3301                        puerto++;
3302                else
3303                        break;
3304        }
3305        if(puerto>=PUERTOMAXUSER){ // No hay puertos libres
3306                return(INVALID_SOCKET);
3307        }
3308        return(socket_c);
3309}
3310//________________________________________________________________________________________________________
3311// Funcin: envia_comandos
3312//
3313//              Descripcin:
3314//                      Enva trama UDP
3315// ________________________________________________________________________________________________________
3316int envia_comandos(SOCKET s,TRAMA* trama, char* ipsrv,int puerto)
3317{
3318        int ret,lon;
3319        struct sockaddr_in addrRepo;
3320         
3321        trama->arroba='@';                                                                              // cabecera de la trama
3322        strcpy(trama->identificador,"JMMLCAMDJ");       // identificador de la trama
3323        trama->ejecutor='1';                                                                            // ejecutor de la trama 1=el servidor hidra  2=el cliente hidra
3324       
3325        addrRepo.sin_family = AF_INET;
3326    addrRepo.sin_port = htons((short)puerto);
3327    addrRepo.sin_addr.s_addr = inet_addr(ipsrv); //  Direccin IP repositorio
3328    Encriptar((char*)trama);
3329        lon=strlen((char*)trama);
3330        ret = sendto(s,(char *)trama,lon,0,(struct sockaddr *)&addrRepo, sizeof(addrRepo));
3331    if (ret == SOCKET_ERROR){
3332        RegistraLog("***send() fallo en envío al repositorio",true);
3333                return(FALSE);
3334    }
3335        return true;
3336}
3337// ________________________________________________________________________________________________________
3338// Funcin: DesmarcaServidoresRembo
3339//
3340//       Descripcin:
3341//              Esta funcin desmarca la tabla completa de servidores rembo para iniciar la cuesation de envio
3342// ________________________________________________________________________________________________________
3343void DesmarcaServidoresRembo(void)
3344{
3345        int i;
3346        for (i=0;i<MAXIMOS_SRVRMB;i++){
3347                tbsocketsSRVRMB[i].swenv=0;
3348                tbsocketsSRVRMB[i].ipes[0]=(char)NULL;
3349        }
3350}
3351// ________________________________________________________________________________________________________
3352// Funcin: MarcaServidoresRembo
3353//
3354//              Descripcin:
3355//                      Esta funcin marca la tabla de servidores Rembo y coloca la ip del cliente en el buffer
3356//              Parnetros:
3357//                      - ipsrvrmb: ip del servidor rembo
3358//                      - ipclrmb: ip del cliente rembo
3359// ________________________________________________________________________________________________________
3360void MarcaServidoresRembo(char* ipsrvrmb,char*ipclrmb)
3361{
3362        int i,resul;
3363        for (i=0;i<MAXIMOS_SRVRMB;i++){
3364                resul=strcmp(tbsocketsSRVRMB[i].ip,ipsrvrmb);
3365                if(resul==0) {// servidor rembo encontrado
3366                        strcat(tbsocketsSRVRMB[i].ipes,ipclrmb);
3367                        strcat(tbsocketsSRVRMB[i].ipes,";");
3368                        tbsocketsSRVRMB[i].swenv=1;
3369                        return;
3370                }
3371        }
3372}
3373// ________________________________________________________________________________________________________
3374// Funcin: TomaIPServidorRembo
3375//
3376//              Descripcin:
3377//                      Esta funcin devuelve true o false dependiendo si el Servidor REMBO estnen la tabla  de servidores.
3378//              Parnetros:
3379//                      - ip : La ip del servidor a buscar
3380// ________________________________________________________________________________________________________
3381BOOLEAN TomaIPServidorRembo(char *ip,int *p)
3382{
3383        int i,j;
3384        for (i=0;i<MAXIMOS_SOCKETS;i++){
3385                if (strcmp(ip,tbsockets[i].ip)==0){ // Si existe la IP ...
3386                        strcpy(ip,tbsockets[i].ipsrvrmb);
3387                        for (j=0;j<MAXIMOS_SRVRMB;j++){
3388                                if (strcmp(ip,tbsocketsSRVRMB[j].ip)==0){ // Si existe la IP ...
3389                                        *p=tbsocketsSRVRMB[j].puertorepo;
3390                                        return(TRUE);
3391                                }
3392                        }
3393                }
3394        }                       
3395        return(FALSE);
3396}
3397// ________________________________________________________________________________________________________
3398// Funcin: AbreConexion
3399//
3400//              Descripcin:
3401//                      Crea un socket y lo conecta a una interface de red. Devuelve el socket
3402//              Parnetros:
3403//                      - ips : La direccin IP con la que se comunicarnel socket
3404//                      - port : Puerto para la  comunicacin
3405// ________________________________________________________________________________________________________
3406SOCKET AbreConexion(char *ips,int port)
3407{
3408    struct sockaddr_in server;
3409        SOCKET s;
3410
3411        // Crea el socket y se intenta conectar
3412        s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
3413        if (s == SOCKET_ERROR){
3414                RegistraLog("Error en la creacin del socket. Modulo: AbreConexion()",true);
3415                return INVALID_SOCKET;
3416        }
3417
3418        server.sin_family = AF_INET;
3419        server.sin_port = htons((short)port);
3420        server.sin_addr.s_addr = inet_addr(ips);
3421
3422        if (connect(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR){
3423                RegistraLog("connect() fallo",true);
3424                return INVALID_SOCKET;
3425        }
3426        return(s);
3427       
3428}
3429// ________________________________________________________________________________________________________
3430// Funcin: EjecutarTarea
3431//
3432//              Descripcin:
3433//                      Registra una accin (Tarea) y la envn para su ejecucin
3434//              Parnetros:
3435//                      - idtarea : Identificador de la tarea
3436//                      - accionid: identificador del trabajo padre (si existe)
3437//                      - idnotificador:  identificador del trabajo_tarea incluido en trabajo padre (si existe)
3438//                      - idcentro: Centro propietario del trabjo padre (si existe este trabajo)
3439//                      - Database: una conexion ADO operativa
3440//                      - parametros: parnetros de la accin
3441// ________________________________________________________________________________________________________
3442int EjecutarTarea(int idtarea,int accionid,int idnotificador,int idcentro,Database db,char* parametros )
3443{
3444        char sqlstr[1000],ErrStr[200],ambito;
3445        Table tbl;
3446        int cont_comandos=0,lon;
3447        int  idcomando,idambito,idtareacomando,accionidcmd;
3448        char wambitarea[20],ambitarea[4000];
3449        char wparamtarea[20],paramtarea[1000],pids[20];
3450        int  tblon[100],tbComandosidcomando[100],tbComandosambito[100],tbComandosidnotificador[100],tbComandosidambito[100];
3451        char *tbComandosparametros[100];
3452
3453        ambitarea[0]=(char)NULL; // Inicializacin
3454        strcpy(paramtarea,"cmd="); // Inicializacin
3455        if(idcentro==0){
3456                // recupera el identificador del Centro propietario de la tarea
3457                sprintf(sqlstr,"SELECT idcentro FROM tareas WHERE idtarea=%d",idtarea);
3458                if(!db.Execute(sqlstr,tbl)){ // Error al leer
3459                        db.GetErrorErrStr(ErrStr);
3460                        return(false);
3461                }
3462                if(tbl.ISEOF()) return(true);
3463                if(!tbl.Get("idcentro",idcentro)){ // Toma dato
3464                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3465                        return(false);
3466                }
3467        }
3468        // Recupera los comandos que forman parte de la tarea
3469        sprintf(sqlstr,"SELECT * FROM tareas_comandos WHERE idtarea=%d ORDER by orden",idtarea);
3470        if(!db.Execute(sqlstr,tbl)){ // Error al leer
3471                db.GetErrorErrStr(ErrStr);
3472                return(false);
3473        }
3474        if(tbl.ISEOF()) return(true);
3475               
3476        // Recorre tareas-comandos
3477        while(!tbl.ISEOF()){
3478                if(!tbl.Get("idcomando",idcomando)){ // Toma dato
3479                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3480                        return(false);
3481                }
3482                tbComandosidcomando[cont_comandos]=idcomando;
3483
3484                if(!tbl.Get("ambito",ambito)){ // Toma dato
3485                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3486                        return(false);
3487                }
3488                tbComandosambito[cont_comandos]=ambito;
3489
3490                if(!tbl.Get("idambito",idambito)){ // Toma dato
3491                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3492                        return(false);
3493                }
3494                tbComandosidambito[cont_comandos]=idambito;
3495
3496
3497                if(!tbl.Get("parametros",parametros)){ // Toma dato
3498                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3499                        return(false);
3500                }
3501
3502                lon=strlen(parametros);
3503                tblon[cont_comandos]=lon;
3504                tbComandosparametros[cont_comandos]=(char*)malloc(lon+20);
3505                if(tbComandosparametros[cont_comandos]==NULL)
3506                        return(false); // No hay memoria bastante
3507
3508                strcpy(tbComandosparametros[cont_comandos],parametros);
3509               
3510                if(!tbl.Get("idtareacomando",idtareacomando)){ // Toma dato
3511                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3512                        return(false);
3513                }
3514                tbComandosidnotificador[cont_comandos]=idtareacomando;
3515
3516                sprintf(wambitarea,"%d:%d;",ambito,idambito);
3517                strcat(ambitarea,wambitarea);
3518
3519                sprintf(wparamtarea,"%d;",idtareacomando);
3520                strcat(paramtarea,wparamtarea);
3521
3522                cont_comandos++;
3523                tbl.MoveNext();
3524        }
3525        lon=strlen(ambitarea);
3526        ambitarea[lon-1]=(char)NULL; // Quita la coma final
3527
3528        lon=strlen(paramtarea);
3529        paramtarea[lon-1]=(char)NULL; // Quita la coma final
3530
3531        char _fechahorareg[100];
3532    struct tm* st;
3533    st=TomaHora();
3534        sprintf(_fechahorareg,"%d/%d/%d %d:%d:%d",st->tm_year+1900,st->tm_mon+1,st->tm_mday,st->tm_hour,st->tm_min,st->tm_sec);
3535
3536        sprintf(sqlstr,"INSERT INTO acciones (tipoaccion,idtipoaccion,cateaccion,ambito,idambito,ambitskwrk,fechahorareg,estado,resultado,idcentro,parametros,accionid,idnotificador) VALUES (%d,%d,%d,0,0,'%s','%s','%s','%s',%d,'%s',%d,%d)",EJECUCION_TAREA,idtarea,PROCESOS,ambitarea,_fechahorareg,ACCION_INICIADA,ACCION_SINERRORES,idcentro,paramtarea,accionid,idnotificador);
3537        if(!db.Execute(sqlstr)){ // Error al insertar
3538                db.GetErrorErrStr(ErrStr);
3539                return(false);
3540        }
3541        accionid=0;
3542        // Toma identificador dela accin
3543        sprintf(sqlstr,"SELECT LAST_INSERT_ID() as identificador");
3544        if(!db.Execute(sqlstr,tbl)){ // Error al leer
3545                db.GetErrorErrStr(ErrStr);
3546                return(false);
3547        }
3548        if(!tbl.ISEOF()){ // Si existe registro
3549                if(!tbl.Get("identificador",accionid)){
3550                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3551                        return(false);
3552                }
3553        }
3554        int i;
3555        // Insertar acciones:comandos
3556        for (i=0;i<cont_comandos;i++){
3557            st=TomaHora();
3558                sprintf(_fechahorareg,"%d/%d/%d %d:%d:%d",st->tm_year+1900,st->tm_mon+1,st->tm_mday,st->tm_hour,st->tm_min,st->tm_sec);
3559                sprintf(sqlstr,"INSERT INTO acciones (tipoaccion,idtipoaccion,cateaccion,ambito,idambito,fechahorareg,estado,resultado,idcentro,parametros,accionid,idnotificador) VALUES (%d,%d,%d,%d,%d,'%s','%s','%s',%d,'%s',%d,%d)",EJECUCION_COMANDO,tbComandosidcomando[i],PROCESOS,tbComandosambito[i],tbComandosidambito[i],_fechahorareg,ACCION_EXITOSA,ACCION_SINERRORES,idcentro,tbComandosparametros[i],accionid,tbComandosidnotificador[i]);     
3560                if(!db.Execute(sqlstr)){ // Error al insertar
3561                        db.GetErrorErrStr(ErrStr);
3562                         free(tbComandosparametros[i]);
3563                        return(false);
3564                }
3565                // Toma identificador dela accin
3566                sprintf(sqlstr,"SELECT LAST_INSERT_ID() as identificador");
3567                if(!db.Execute(sqlstr,tbl)){ // Error al leer
3568                        db.GetErrorErrStr(ErrStr);
3569                        return(false);
3570                }
3571                if(!tbl.ISEOF()){ // Si existe registro
3572                        if(!tbl.Get("identificador",accionidcmd)){
3573                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3574                        return(false);
3575                        }
3576                }
3577                sprintf(pids,"ids=%d\r",accionidcmd);
3578                strcat((char*)tbComandosparametros[i],pids); // Le ande el identificador de la accion
3579                envia_tarea(tbComandosparametros[i]);
3580                free(tbComandosparametros[i]);
3581        }
3582        return(true);
3583}
3584// ________________________________________________________________________________________________________
3585// Funcin: manda peticin de inclusion
3586//
3587//              Descripcin:
3588//                      Esta funcin envia una tarea  por la red.
3589//              Parnetros:
3590//                      - parametros: El contenido de la tarea
3591// ________________________________________________________________________________________________________
3592void envia_tarea(char* parametros)
3593{
3594        TRAMA trama;   
3595
3596        trama.arroba='@';
3597        strncpy(trama.identificador,"JMMLCAMDJ",9);
3598        trama.ejecutor=parametros[0];
3599        strcpy(trama.parametros,(char*)&parametros[1]);
3600        gestiona_comando(INVALID_SOCKET,trama);
3601}
3602// ________________________________________________________________________________________________________
3603// Funcin: EjecutarTrabajo
3604//
3605//              Descripcin:
3606//                      Registra una accin (Trabajo y la envn para su ejecucin
3607//              Parnetros:
3608//                      - idtrabajo : Identificador del trabajo
3609//                      - Database: una conexion ADO operativa
3610//                      - parametros: parnetros de la accin
3611// ________________________________________________________________________________________________________
3612int EjecutarTrabajo(int idtrabajo,Database db,char*parametros )
3613{
3614        char sqlstr[1000],ErrStr[200];
3615        Table tbl;
3616        int cont_tareas=0,lon;
3617        int  idtarea,idtrabajotarea,idcentro;
3618        char wambitrabajo[500],ambitrabajo[4000];
3619        char wparamtrabajo[20],paramtrabajo[1000];
3620        int  tbTareasidtarea[100],tbTareasidnotificador[100];
3621        char ambitskwrk[500];
3622
3623        ambitrabajo[0]=(char)NULL; // Inicializacin
3624        strcpy(paramtrabajo,"tsk="); // Inicializacin
3625
3626        // recupera el identificador del Centro propietario de la tarea
3627        sprintf(sqlstr,"SELECT idcentro FROM trabajos WHERE idtrabajo=%d",idtrabajo);
3628        if(!db.Execute(sqlstr,tbl)){ // Error al leer
3629                db.GetErrorErrStr(ErrStr);
3630                return(false);
3631        }
3632        if(tbl.ISEOF()) return(true);
3633        if(!tbl.Get("idcentro",idcentro)){ // Toma dato
3634                tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3635                return(false);
3636        }
3637        // Recupera las tareas que forman parte del trabajo
3638        sprintf(sqlstr,"SELECT * FROM trabajos_tareas WHERE idtrabajo=%d ORDER by orden",idtrabajo);
3639        if(!db.Execute(sqlstr,tbl)){ // Error al leer
3640                db.GetErrorErrStr(ErrStr);
3641                return(false);
3642        }
3643        if(tbl.ISEOF()) return(true);
3644        // Recorre trabajos-tareas
3645        while(!tbl.ISEOF()){   
3646                if(!tbl.Get("idtrabajotarea",idtrabajotarea)){ // Toma dato
3647                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3648                        return(false);
3649                }
3650                tbTareasidnotificador[cont_tareas]=idtrabajotarea;
3651
3652                if(!tbl.Get("idtarea",idtarea)){ // Toma dato
3653                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3654                        return(false);
3655                }
3656                tbTareasidtarea[cont_tareas]=idtarea;
3657
3658                if(!tbl.Get("parametros",parametros)){ // Toma dato
3659                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3660                        return(false);
3661                }
3662               
3663                if(!tbl.Get("ambitskwrk",ambitskwrk)){ // Toma dato
3664                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3665                        return(false);
3666                }
3667                sprintf(wambitrabajo,"%s;",ambitskwrk);
3668                strcat(ambitrabajo,wambitrabajo);
3669
3670                sprintf(wparamtrabajo,"%d;",idtrabajotarea);
3671                strcat(paramtrabajo,wparamtrabajo);
3672
3673                cont_tareas++;
3674                tbl.MoveNext();
3675        }
3676        lon=strlen(ambitrabajo);
3677        ambitrabajo[lon-1]=(char)NULL; // Quita la coma final
3678
3679        lon=strlen(paramtrabajo);
3680        paramtrabajo[lon-1]=(char)NULL; // Quita la coma final
3681
3682        char _fechahorareg[100];
3683    struct tm* st;
3684    st=TomaHora();
3685        sprintf(_fechahorareg,"%d/%d/%d %d:%d:%d",st->tm_year+1900,st->tm_mon+1,st->tm_mday,st->tm_hour,st->tm_min,st->tm_sec);
3686
3687        sprintf(sqlstr,"INSERT INTO acciones (tipoaccion,idtipoaccion,cateaccion,ambito,idambito,ambitskwrk,fechahorareg,estado,resultado,idcentro,parametros,accionid,idnotificador) VALUES (%d,%d,%d,0,0,'%s','%s','%s','%s',%d,'%s',0,0)",EJECUCION_TRABAJO,idtrabajo,PROCESOS,ambitrabajo,_fechahorareg,ACCION_INICIADA,ACCION_SINERRORES,idcentro,paramtrabajo);
3688        if(!db.Execute(sqlstr)){ // Error al insertar
3689                db.GetErrorErrStr(ErrStr);
3690                return(false);
3691        }
3692        int accionid=0;
3693        // Toma identificador dela accin
3694        sprintf(sqlstr,"SELECT LAST_INSERT_ID() as identificador");
3695        if(!db.Execute(sqlstr,tbl)){ // Error al leer
3696                db.GetErrorErrStr(ErrStr);
3697                return(false);
3698        }
3699        if(!tbl.ISEOF()){ // Si existe registro
3700                if(!tbl.Get("identificador",accionid)){
3701                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3702                        return(false);
3703                }
3704        }
3705        int i;
3706        // Insertar acciones:tareas
3707        for (i=0;i<cont_tareas;i++){
3708                if(!EjecutarTarea(tbTareasidtarea[i],accionid,tbTareasidnotificador[i],idcentro,db,parametros)){
3709                        return(false);
3710                }
3711        }
3712        return(true);
3713}
3714// ________________________________________________________________________________________________________
3715// Funcin: cuestion_nuevoordenador
3716//
3717//       Descripcin:
3718//              Esta funcin da de alta un ordenador  y un aula si el sistema estnconfigurado para ello
3719//              Parnetros:
3720//                      - db: Objeto base de datos (ya operativo)
3721//                      - tbl: Objeto tabla
3722//                      - ido: identificador del ordenador que se darnde alta automnicamente( se devuelve)
3723//                      - nau: Nombre del grupo donde estnel ordenador( rembo.conf)
3724//                      - nor: Nombre del ordenador dado por rembo(dhcpd)
3725//                      - iph: IP del ordenador
3726//                      - mac: MAC del ordenador
3727//                      - cfg: configuracin
3728//                      - ipd: ip del servidor dhcp
3729//                      - ipr: ip del servidor rembo
3730// ________________________________________________________________________________________________________
3731int cuestion_nuevoordenador(Database db,Table tbl,int*ido,char *nau,char *nor,char *iph,char *mac,char*cfg,char*ipd,char*ipr)
3732{
3733        char sqlstr[1000],ErrStr[200];
3734        int ida,isd,isr;
3735
3736        // Recupera los datos del aula
3737        sprintf(sqlstr,"SELECT idaula FROM aulas  WHERE nombreaula= '%s'",nau);
3738
3739        if(!db.Execute(sqlstr,tbl)){ // Error al consultar
3740                db.GetErrorErrStr(ErrStr);
3741                return(false);
3742        }
3743        if(tbl.ISEOF()){ // Si NO existe el aula
3744                sprintf(sqlstr,"SELECT idaula FROM aulas  WHERE nombreaula= '%s'","Default");
3745                if(!db.Execute(sqlstr,tbl)){ // Error al consultar
3746                        db.GetErrorErrStr(ErrStr);
3747                        return(false);
3748                }
3749                if(tbl.ISEOF()){ // Inserta el aula por defecto
3750                        sprintf(sqlstr,"INSERT INTO aulas (nombreaula) VALUES ('Default')");
3751                        if(!db.Execute(sqlstr)){ // Error al insertar
3752                                db.GetErrorErrStr(ErrStr);
3753                                return(false);
3754                        }
3755                        ida=0;
3756                        sprintf(sqlstr,"SELECT LAST_INSERT_ID() as identificador");
3757                        if(!db.Execute(sqlstr,tbl)){ // Error al leer
3758                                db.GetErrorErrStr(ErrStr);
3759                                return(false);
3760                        }
3761                        if(!tbl.ISEOF()){ // Si existe registro
3762                                if(!tbl.Get("identificador",ida)){
3763                                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3764                                        return(false);
3765                                }
3766                        }                               
3767                }
3768        }
3769        else{
3770                if(!tbl.Get("idaula",ida)){ // Toma dato
3771                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3772                        return(false);
3773                }
3774        }
3775        if(!Toma_idservidorres(db,tbl,ipd,ipr,&isd,&isr)) return(false);
3776        if(!alta_ordenador(db,tbl,ido,nor,iph,mac,ida,isd,isr)) return(false); // Alta del ordenador
3777        if(!actualiza_configuracion(db,tbl,cfg,0,0,iph)){ // Actualiza la configuracin del ordenador
3778                return(false);
3779        }
3780        return(true);
3781}
3782// ________________________________________________________________________________________________________
3783// Funcin: alta_ordenador
3784//
3785//              Descripcin:
3786//                      Esta funcin da de alta un ordenador
3787//              Parnetros:
3788//                      - db: Objeto base de datos (ya operativo)
3789//                      - tbl: Objeto tabla
3790//                      - mac: MAC del ordenador
3791//                      - ida: Identificador del aula
3792//                      - isd: Identificador del servidor dhcp
3793//                      - isr: Identificador del servidor rembo
3794// ________________________________________________________________________________________________________
3795int alta_ordenador(Database db,Table tbl,int* ido,char *nor,char *iph,char*mac,int ida,int isd,int isr)
3796{
3797        char sqlstr[1000],ErrStr[200],strmac[20];
3798        int idordenador,lon,i,p;
3799
3800        // Prepara mac
3801        lon=strlen(mac);
3802        p=0;
3803        for (i=0;i<lon;i++){
3804                if(mac[i]!=' ') // Si no es espacio
3805                        strmac[p++]=mac[i];
3806        }
3807        strmac[p]=(char)NULL;
3808
3809        sprintf(sqlstr,"INSERT INTO ordenadores(nombreordenador,ip,mac,idperfilhard,idservidordhcp,idservidorrembo,idmenu,idaula,grupoid,idconfiguracion) VALUES ('%s','%s','%s',0,%d,%d,0,%d,0,0)",nor,iph,strmac,isd,isr,ida);
3810        if(!db.Execute(sqlstr)){ // Error al insertar
3811                db.GetErrorErrStr(ErrStr);
3812                return(false);
3813        }
3814        idordenador=0;
3815        // Toma identificador dela accin
3816        sprintf(sqlstr,"SELECT LAST_INSERT_ID() as identificador");
3817        if(!db.Execute(sqlstr,tbl)){ // Error al leer
3818                db.GetErrorErrStr(ErrStr);
3819                return(false);
3820        }
3821        if(!tbl.ISEOF()){ // Si existe registro
3822                if(!tbl.Get("identificador",idordenador)){
3823                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3824                        return(false);
3825                }
3826        }
3827        *ido=idordenador;
3828        return(true);
3829}
3830// ________________________________________________________________________________________________________
3831// Funcin: Toma_idservidorres
3832//
3833//              Descripcin:
3834//                      Esta funcin devuelve los identificadores de los servidores rembo y dhcp de un determinado ordenador
3835//              Parnetros:
3836//                              db: Objeto base de datos (ya operativo)
3837//                              tbl: Objeto tabla
3838//                              ipd: ip del servidor dhcp
3839//                              ipr: ip del servidor rembo
3840//                              isd: identificador del servidor dhcp
3841//                              isr: identificador del servidor rembo
3842// ________________________________________________________________________________________________________
3843int Toma_idservidorres(Database db,Table tbl,char*ipd,char*ipr,int*isd,int*isr)
3844{
3845        char sqlstr[1000],ErrStr[200];
3846        int identificador_dhcp=0;
3847        int identificador_rembo;
3848       
3849        /* Servidor dhcp
3850        sprintf(sqlstr,"SELECT idservidordhcp FROM servidoresdhcp where ip='%s'",ipd);
3851        if(!db.Execute(sqlstr,tbl)){ // Error al leer
3852                db.GetErrorErrStr(ErrStr);
3853                return(false);
3854        }
3855        if(!tbl.ISEOF()){ // Si existe registro
3856                if(!tbl.Get("idservidordhcp",identificador_dhcp)){
3857                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3858                        return(false);
3859                }
3860        }
3861        */
3862        // Servidor rembo
3863        sprintf(sqlstr,"SELECT idservidorrembo FROM servidoresrembo where ip='%s'",ipr);
3864        if(!db.Execute(sqlstr,tbl)){ // Error al leer
3865                db.GetErrorErrStr(ErrStr);
3866                return(false);
3867        }
3868        if(!tbl.ISEOF()){ // Si existe registro
3869                if(!tbl.Get("idservidorrembo",identificador_rembo)){
3870                        tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
3871                        return(false);
3872                }
3873        }
3874        *isd=identificador_dhcp;
3875        *isr=identificador_rembo;
3876        return(true);
3877}
3878//************************************************************************************************************************************************
3879// PROGRAMA PRINCIPAL ( SERVICIO)
3880//***************************************************************************************************************************************************
3881  int main (int argc, char *argv[])
3882{
3883    SOCKET      socket_s; // Socket donde escucha el servidor
3884    SOCKET      socket_c; // Socket de los clientes que se conectan
3885    int         i;// Tamao de la estructura de direccionamiento IP del cliente
3886    socklen_t   iAddrSize;
3887    struct      sockaddr_in local,cliente;
3888        //pthread_t hThread;
3889        //void *resul
3890        // Validación de parámetros
3891       
3892        strcpy(szPathFileCfg,"ogAdmServer.cfg");
3893        strcpy(szPathFileLog,"ogAdmServer.log");       
3894       
3895    for(i = 1; (i+1) < argc; i+=2){
3896        if (argv[i][0] == '-'){
3897            switch (tolower(argv[i][1])){
3898                case 'f':
3899                    if (argv[i+1]!=NULL)
3900                        strcpy(szPathFileCfg, argv[i+1]);
3901                    else{
3902                        RegistraLog("Fallo en los parámetros: Debe especificar el fichero de configuración del servicio",false);
3903                        exit(EXIT_FAILURE);
3904                        }
3905                    break;
3906                case 'l':
3907                    if (argv[i+1]!=NULL)
3908                        strcpy(szPathFileLog, argv[i+1]);
3909                    else{
3910                        RegistraLog("Fallo en los parámetros: Debe especificar el fichero de log para el servicio",false);
3911                        exit(EXIT_FAILURE);
3912                        }
3913                    break;
3914                default:
3915                        RegistraLog("Fallo de sintaxis en los parámetros: Debe especificar -f nombre_del_fichero_de_configuración_del_servicio",false);
3916                        exit(EXIT_FAILURE);
3917                    break;
3918            }
3919        }
3920    }
3921        if (szPathFileCfg==NULL){
3922                printf ("***Error. No se ha especificado fichero de configuración\n");
3923                exit(EXIT_FAILURE);
3924        }
3925        if(!TomaConfiguracion(szPathFileCfg)){ // Toma parametros de configuracion
3926                RegistraLog("El fichero de configuración contiene un error de sintaxis",false);
3927                exit(EXIT_FAILURE);
3928        }
3929        pthread_mutex_init(&guardia,NULL); // Creación del mutex para control de hebras
3930
3931        for (i=0;i<MAXIMOS_SOCKETS;i++){
3932                tbsockets[i].ip[0]='\0'; // Inicializa IP
3933                tbsockets[i].sock=INVALID_SOCKET; // Inicializa Socket
3934        }
3935        RegistraLog("***Inicio de sesion***",false);
3936
3937        socket_s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Crea socket
3938        if (socket_s == SOCKET_ERROR){
3939                RegistraLog("***socket() fallo:",true);
3940        }
3941        local.sin_addr.s_addr = htonl(INADDR_ANY); // selecciona interface
3942        local.sin_family = AF_INET;     
3943        local.sin_port = htons(puerto); // Puerto
3944
3945        if (bind(socket_s,(struct sockaddr *)&local, // Enlaza socket
3946                sizeof(local)) == SOCKET_ERROR){
3947                RegistraLog("***bind() fallo:",true);
3948        }
3949
3950        listen(socket_s,250); // Pone a escuchar al socket
3951        iAddrSize = sizeof(cliente);
3952
3953        while (true) {  // Bucle para escuchar peticiones de clientes
3954                socket_c = accept(socket_s, (struct sockaddr *)&cliente,&iAddrSize);   
3955                if (socket_c == INVALID_SOCKET){
3956                        RegistraLog("***accept() fallo:",true);
3957                    break;
3958                }
3959                //resul=pthread_create(&hThread,NULL,GestionaConexion,(void*)&socket_c);
3960                GestionaConexion(&socket_c);
3961                /*if(resul!=0){2
3962                        RegistraLog("***Fallo al crear la hebra cliente",false);
3963                    break;
3964        }
3965        */
3966                //pthread_detach(hThread);
3967                close(socket_c); // Cierra la conexion con el servidor hidra
3968        }
3969        close(socket_s);
3970        exit(EXIT_SUCCESS);
3971}
Note: See TracBrowser for help on using the repository browser.