source: admin/Sources/Services/ogAdmAgent/sources/ogAdmAgent.cpp @ 99d1786

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 99d1786 was 3ec149c, checked in by alonso <alonso@…>, 15 years ago

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

  • Property mode set to 100644
File size: 28.5 KB
Line 
1// ********************************************************************************************************
2// Servicio: ogAdmAgent
3// Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla
4// Fecha Creación: Marzo-2010
5// Fecha Última modificación: Marzo-2010
6// Nombre del fichero: ogAdmAgent.cpp
7// Descripción: Este fichero implementa el servicio agente del sistema. Revisa a intervalos
8//                              regulares la base de datos para comprobar si existen acciones programadas.
9// ********************************************************************************************************
10#include "ogAdmAgent.h"
11#include "ogAdmLib.c"
12//________________________________________________________________________________________________________
13//      Función: tomaConfiguracion
14//
15//      Descripción:
16//              Lee el fichero de configuración del servicio
17//      Parámetros:
18//              filecfg : Ruta completa al fichero de configuración
19//      Devuelve:
20//              TRUE: Si el proceso es correcto
21//              FALSE: En caso de ocurrir algún error
22//________________________________________________________________________________________________________
23BOOLEAN tomaConfiguracion(char* filecfg)
24{
25        char modulo[] = "tomaConfiguracion()";
26
27        if (filecfg == NULL || strlen(filecfg) == 0) {
28                errorLog(modulo, 1, FALSE); // Fichero de configuración del servicio vacío
29                return (FALSE);
30        }
31        FILE *fcfg;
32        long lSize;
33        char * buffer, *lineas[MAXPRM], *dualparametro[2];
34        int i, numlin, resul;
35
36        fcfg = fopen(filecfg, "rt");
37        if (fcfg == NULL) {
38                errorLog(modulo, 2, FALSE); // No existe fichero de configuración del servicio
39                return (FALSE);
40        }
41
42        fseek(fcfg, 0, SEEK_END);
43        lSize = ftell(fcfg); // Obtiene tamaño del fichero.
44        rewind(fcfg);
45        buffer = (char*) reservaMemoria(lSize + 1); // Toma memoria para el buffer de lectura.
46        if (buffer == NULL) { // No hay memoria suficiente para el buffer
47                errorLog(modulo, 3, FALSE);
48                return (FALSE);
49        }
50        fread(buffer, 1, lSize, fcfg); // Lee contenido del fichero
51        buffer[lSize] = (char) NULL;
52        fclose(fcfg);
53
54        servidoradm[0] = (char) NULL; //inicializar variables globales
55        puerto[0] = (char) NULL;
56        usuario[0] = (char) NULL;
57        pasguor[0] = (char) NULL;
58        datasource[0] = (char) NULL;
59        catalog[0] = (char) NULL;
60
61        numlin = splitCadena(lineas, buffer, '\n');
62        for (i = 0; i < numlin; i++) {
63                splitCadena(dualparametro, lineas[i], '=');
64                resul = strcmp(StrToUpper(dualparametro[0]), "SERVIDORADM");
65                if (resul == 0)
66                        strcpy(servidoradm, dualparametro[1]);
67                resul = strcmp(StrToUpper(dualparametro[0]), "PUERTO");
68                if (resul == 0)
69                        strcpy(puerto, dualparametro[1]);
70                resul = strcmp(StrToUpper(dualparametro[0]), "USUARIO");
71                if (resul == 0)
72                        strcpy(usuario, dualparametro[1]);
73                resul = strcmp(StrToUpper(dualparametro[0]), "PASSWORD");
74                if (resul == 0)
75                        strcpy(pasguor, dualparametro[1]);
76                resul = strcmp(StrToUpper(dualparametro[0]), "DATASOURCE");
77                if (resul == 0)
78                        strcpy(datasource, dualparametro[1]);
79                resul = strcmp(StrToUpper(dualparametro[0]), "CATALOG");
80                if (resul == 0)
81                        strcpy(catalog, dualparametro[1]);
82        }
83        if (servidoradm[0] == (char) NULL) {
84                errorLog(modulo, 4, FALSE); // Falta parámetro SERVIDORADM
85                return (FALSE);
86        }
87        if (puerto[0] == (char) NULL) {
88                errorLog(modulo, 5, FALSE); // Falta parámetro PUERTO
89                return (FALSE);
90        }
91        if (usuario[0] == (char) NULL) {
92                errorLog(modulo, 6, FALSE); // Falta parámetro USUARIO
93                return (FALSE);
94        }
95        if (pasguor[0] == (char) NULL) {
96                errorLog(modulo, 7, FALSE); // Falta parámetro PASSWORD
97                return (FALSE);
98        }
99        if (datasource[0] == (char) NULL) {
100                errorLog(modulo, 8, FALSE); // Falta parámetro DATASOURCE
101                return (FALSE);
102        }
103        if (catalog[0] == (char) NULL) {
104                errorLog(modulo, 9, FALSE); // Falta parámetro CATALOG
105                return (FALSE);
106        }
107        return (TRUE);
108}
109// ________________________________________________________________________________________________________
110//
111// Función: diadelaSemana
112//
113//      Descripción:
114//              Calcula el número del día de la semana que corresponde a una fecha
115//      Parámetros:
116//              - dia: Un día
117//              - mes: Un mes
118//              - anno: Un año
119//      Devuelve:
120//              El número del día de la semana: 1=Lunes, 2=martes ... 6=sábado  7=domingo
121// ________________________________________________________________________________________________________
122
123int diadelaSemana(WORD dia,WORD mes,WORD anno)
124{
125        int i,cont,dias_anuales;
126        int desplazamiento_dias=6;
127        int orddiasem;
128
129        cont =0;
130        for (i=1900;i<anno;i++){
131                if (bisiesto(i)) dias_anuales=366; else dias_anuales=365;
132                cont+=dias_anuales;
133        }
134        for (i=1;i<mes;i++){
135                if (i!=2)
136                        cont+=dias_meses[i];
137                else{
138                        if (bisiesto(anno))
139                                cont+=29;
140                        else
141                                cont+=28;
142                }
143        }
144        cont+=dia+desplazamiento_dias;
145        orddiasem=(cont%7);
146        if(orddiasem==0) orddiasem=7;
147        return(orddiasem);
148}
149// ________________________________________________________________________________________________________
150//
151// Función: bisiesto
152//
153//      Descripción:
154//              Calcula si un año es bisiesto o no lo es
155//      Parámetros:
156//              - anno: Un año
157//      Devuelve:
158//              TRUE si el año es bisiesto
159//              FALSE si no es bisiesto
160// ________________________________________________________________________________________________________
161
162BOOLEAN bisiesto(WORD anno){
163        return(anno%4==0);
164}
165// ________________________________________________________________________________________________________
166//
167// Función: semanadelMes
168//
169//      Descripción:
170//              Calcula el número de semana perteneciente a un día del mes
171//      Parámetros:
172//              - ordiasem_1: Orden semanal (1,2...) del primer dia del mes que se pasa como parámetro
173//              - diames: El mes concreto
174//      Devuelve:
175//              El número del día de la semana: 1=Lunes, 2=martes ... 6=sábado  7=domingo , de ese mes
176// ________________________________________________________________________________________________________
177
178int semanadelMes(int ordiasem_1,int diames)
179{
180        int nwdia,resto,cociente;
181
182        nwdia=diames+ordiasem_1-1;
183        cociente=nwdia/7;
184        resto=nwdia%7;
185        if(resto>0) cociente++;
186        return(cociente);
187}
188// ________________________________________________________________________________________________________
189//
190// Función: buscaAccion
191//
192//      Descripción:
193//              Busca en la base de datos, acciones programadas
194//      Parámetros:
195//              - db: Objeto base de datos (operativo)
196//              - dia : Día actual del mes
197//              - mes : mes en curso
198//              - anno : Año en curso
199//              - hora : Hora actual
200//              - minutos : Minutos actuales
201//              - diasemana : Dia de la semana 1=lunes,2=martes ... ( 0 Domingo)
202//      Devuelve:
203//              TRUE: Si el proceso es correcto
204//              FALSE: En caso de ocurrir algún error
205// ________________________________________________________________________________________________________
206
207BOOLEAN buscaAccion(Database db,WORD dia,WORD mes,WORD anno,WORD hora,WORD minutos,WORD diasemana)
208{
209        char msglog[LONSTD], sqlstr[LONSQL];
210        Table tbl;
211        BYTE swampm,bitsemana;
212        int ordsem,ordulsem,ordiasem_1,maxdias;
213        int sesionprog;
214        char modulo[] = "buscaAccion()";
215
216        /* Año de comienzo */
217        anno=anno-ANNOREF; //
218        /* Preparación hora */
219        if(hora>11){
220                hora-=12;
221                swampm=1; // Es P.M.
222        }
223        else
224                swampm=0; // Es am
225        /* Preparación semana */
226        if(diasemana==0) diasemana=7; // El domingo
227
228        // Cuestión semanas
229        ordiasem_1=diadelaSemana(1,mes,anno+2009);
230        ordsem=semanadelMes(ordiasem_1,dia); // Calcula el número de la semana
231        if (mes!=2) // Toma el último día de ese mes
232                maxdias=dias_meses[mes];
233        else{
234                if (bisiesto(anno+ANNOREF))
235                        maxdias=29;
236                else
237                        maxdias=28;
238        }
239        ordulsem=semanadelMes(ordiasem_1,maxdias); // Calcula el número de la última semana
240        bitsemana=HEX_semanas[ordsem];
241        if(ordsem==ordulsem) // Si es la última semana del mes
242                bitsemana|=HEX_semanas[6];
243
244        sprintf(sqlstr,"SELECT DISTINCT idprogramacion,tipoaccion,identificador,sesion,idcentro,"\
245                                        "tareas.descripcion as descritarea"\
246                                        " FROM programaciones"\
247                                        " LEFT OUTER JOIN tareas ON tareas.idtarea=programaciones.identificador"\
248                                        " WHERE suspendida=0 "\
249                                        " AND (annos & %d <> 0) "\
250                                        " AND (meses & %d<>0) "\
251                                        " AND ((diario & %d<>0) OR (dias & %d<>0) OR (semanas & %d<>0))"\
252                                        " AND (horas & %d<>0) AND ampm=%d AND minutos=%d",\
253                                        HEX_annos[anno],\
254                                        HEX_meses[mes],\
255                                        HEX_dias[dia],\
256                                        HEX_diasemana[diasemana],\
257                                        bitsemana,\
258                                        HEX_horas[hora],\
259                                        swampm,minutos);
260
261        if (!db.Execute(sqlstr, tbl)) { // Error al leer
262                errorLog(modulo, 21, FALSE);
263                db.GetErrorErrStr(msglog);
264                errorInfo(modulo, msglog);
265                return (FALSE);
266        }
267        if(tbl.ISEOF()){
268                return(TRUE);  // No hay acciones programadas
269        }
270       
271        while(!tbl.ISEOF()){
272                if(!tbl.Get("idprogramacion",idprogramacion)){
273                        tbl.GetErrorErrStr(msglog);
274                        errorInfo(modulo, msglog);
275                        return (FALSE);
276                }
277                if(!tbl.Get("tipoaccion",tipoaccion)){
278                        tbl.GetErrorErrStr(msglog);
279                        errorInfo(modulo, msglog);
280                        return (FALSE);
281                }
282                if(!tbl.Get("identificador",idtipoaccion)){
283                        tbl.GetErrorErrStr(msglog);
284                        errorInfo(modulo, msglog);
285                        return (FALSE);
286                }
287                if(!tbl.Get("sesion",sesionprog)){
288                        tbl.GetErrorErrStr(msglog);
289                        errorInfo(modulo, msglog);
290                        return (FALSE);
291                }
292                if(!tbl.Get("idcentro",idcentro)){
293                        tbl.GetErrorErrStr(msglog);
294                        errorInfo(modulo, msglog);
295                        return (FALSE);
296                }               
297
298                if(tipoaccion==EJECUCION_COMANDO){ // Es una programación de un comando
299                        return(ejecutarComando(db,idprogramacion,sesionprog));
300                }
301                else{
302               
303                        if(tipoaccion==EJECUCION_TAREA){
304                                if(!tbl.Get("descritarea",descriaccion)){
305                                        tbl.GetErrorErrStr(msglog);
306                                        errorInfo(modulo, msglog);
307                                        return (FALSE);
308                                }                                       
309                                return(ejecutarTarea(db,idprogramacion,idtipoaccion));
310                        }
311                        else{
312                                if(tipoaccion==EJECUCION_RESERVA){
313                                        EjecutarReserva(idtipoaccion,db); // Es una programación de un trabajo
314                                }
315                        }
316                }
317                tbl.MoveNext();
318        }
319        return(TRUE);
320}
321// ________________________________________________________________________________________________________
322//
323// Función: ejecutarComando
324//
325//      Descripción:
326//              Ejecuta un comando programado
327//      Parámetros:
328//              - db: Objeto base de datos (operativo)
329//              - idcomando: Identificador del comando
330//              - sesion: Sesión correspondiente al comando cuando se grabó en la tabla acciones
331//      Devuelve:
332//              TRUE: Si el proceso es correcto
333//              FALSE: En caso de ocurrir algún error
334// ________________________________________________________________________________________________________
335
336BOOLEAN ejecutarComando(Database db,int idprogramacion,int sesion )
337{
338        struct tm* st;
339        char msglog[LONSTD], sqlstr[LONSQL];
340        char fechahorareg[24];
341        char modulo[] = "ejecutarComando()";
342
343        st = tomaHora();
344        sprintf(fechahorareg,"%d/%d/%d %d:%d:%d", st->tm_year + 1900, st->tm_mon + 1,
345                        st->tm_mday, st->tm_hour, st->tm_min, st->tm_sec);
346
347        sprintf(sqlstr,"UPDATE acciones SET estado=%d,idprogramacion=%d,fechahorareg='%s'"\
348                                " WHERE sesion=%d",     ACCION_INICIADA,idprogramacion,fechahorareg,sesion);
349
350        if (!db.Execute(sqlstr)) { // Error al recuperar los datos
351                errorLog(modulo, 21, FALSE);
352                db.GetErrorErrStr(msglog);
353                errorInfo(modulo, msglog);
354                return (FALSE);
355        }
356        return(enviaPeticion(idprogramacion));
357}
358// ________________________________________________________________________________________________________
359//
360// Función: ejecutarProcedimiento
361//
362//      Descripción:
363//              Ejecuta un procedimiento programado
364//      Parámetros:
365//              - db: Objeto base de datos (operativo)
366//              - idprocedimiento: Identificador del procedimiento
367//              - ambito: Ámbito de aplicación
368//              - idambito: Identificador del ámbito
369//              - restrambito: cadena con los identificadores de los ordenadores a los que se aplica la acción
370//      Devuelve:
371//              TRUE: Si el proceso es correcto
372//              FALSE: En caso de ocurrir algún error
373// ________________________________________________________________________________________________________
374
375BOOLEAN ejecutarProcedimiento(Database db,int idprocedimiento,int ambito,int idambito,char* restrambito)
376{       
377        char msglog[LONSTD], sqlstr[LONSQL],*parametros;
378        Table tbl;
379        int procedimientoid,idcomando,lonprm;
380        char modulo[] = "ejecutarProcedimiento()";
381       
382        sprintf(sqlstr,"SELECT idcomando,procedimientoid,parametros,length(parametros) as lonprm"\
383                                        " FROM procedimientos_acciones"\
384                                        " WHERE idprocedimiento=%d ORDER BY orden",idprocedimiento);
385
386        if (!db.Execute(sqlstr, tbl)) { // Error al leer
387                errorLog(modulo, 21, FALSE);
388                db.GetErrorErrStr(msglog);
389                errorInfo(modulo, msglog);
390                return (FALSE);
391        }
392       
393        if(tbl.ISEOF()){
394                return(TRUE);  // No exustde tarea
395        }
396        while(!tbl.ISEOF()){
397                if(!tbl.Get("procedimientoid",procedimientoid)){
398                        tbl.GetErrorErrStr(msglog);
399                        errorInfo(modulo, msglog);
400                        return (FALSE);
401                }
402                if(procedimientoid>0){ // Procedimiento recursivo
403                        if(!ejecutarProcedimiento(db,procedimientoid,ambito,idambito,restrambito)){
404                                return(false);
405                        }
406                }
407                else{
408                        if(!tbl.Get("lonprm",lonprm)){
409                                tbl.GetErrorErrStr(msglog);
410                                errorInfo(modulo, msglog);
411                                return (FALSE);
412                        }       
413                        parametros = reservaMemoria(lonprm+1); // Reserva para almacenar los parametros del procedimiento
414                        if (parametros == NULL) {
415                                errorLog(modulo, 3, FALSE);
416                                return (FALSE);
417                        }                       
418                        if(!tbl.Get("parametros",parametros)){
419                                tbl.GetErrorErrStr(msglog);
420                                errorInfo(modulo, msglog);
421                                return (FALSE);
422                        }       
423                        if(!tbl.Get("idcomando",idcomando)){
424                                tbl.GetErrorErrStr(msglog);
425                                errorInfo(modulo, msglog);
426                                return (FALSE);
427                        }                               
428
429                        if(!insertaComando(db,idcomando,parametros,idprocedimiento,ambito,idambito,restrambito))
430                                return(false);
431                }
432                tbl.MoveNext();
433        }               
434        return(TRUE);
435}
436// ________________________________________________________________________________________________________
437//
438// Función: ejecutarTarea
439//
440//      Descripción:
441//              Ejecuta una tarea programada
442//      Parámetros:
443//              - db: Objeto base de datos (operativo)
444//              - idtarea: Identificador de la tarea
445//              - idprogramacion: Identificador de la programación
446//      Devuelve:
447//              TRUE: Si el proceso es correcto
448//              FALSE: En caso de ocurrir algún error
449// ________________________________________________________________________________________________________
450
451BOOLEAN ejecutarTarea(Database db, int idprogramacion, int idtarea)
452{
453        char msglog[LONSTD], sqlstr[LONSQL];
454        Table tbl;
455        int tareaid,ambito,idambito,idprocedimiento,lonrestrambito;
456        char* restrambito;
457        char modulo[] = "ejecutarTarea()";
458
459        sprintf(sqlstr,"SELECT tareas_acciones.orden,tareas_acciones.idprocedimiento,tareas_acciones.tareaid,"\
460                                        " tareas.ambito,tareas.idambito,tareas.restrambito,length(tareas.restrambito) as lonrestrambito"\
461                                        " FROM tareas"\
462                                        " INNER JOIN tareas_acciones ON tareas_acciones.idtarea=tareas.idtarea"\
463                                        " WHERE tareas_acciones.idtarea=%d ORDER BY tareas_acciones.orden",idtarea);
464
465        if (!db.Execute(sqlstr, tbl)) { // Error al leer
466                errorLog(modulo, 21, FALSE);
467                db.GetErrorErrStr(msglog);
468                errorInfo(modulo, msglog);
469                return (FALSE);
470        }
471       
472        if(tbl.ISEOF()){
473                return(TRUE);  // No existe tarea
474        }       
475
476        while(!tbl.ISEOF()){
477                if(!tbl.Get("tareaid",tareaid)){
478                        tbl.GetErrorErrStr(msglog);
479                        errorInfo(modulo, msglog);
480                        return (FALSE);
481                }
482                if(tareaid>0){ // Tarea recursiva
483                        if(!ejecutarTarea(db,idprogramacion,tareaid)){
484                                return(false);
485                        }
486                }
487                else{
488                        if(!tbl.Get("ambito",ambito)){
489                                tbl.GetErrorErrStr(msglog);
490                                errorInfo(modulo, msglog);
491                                return (FALSE);
492                        }       
493                        if(!tbl.Get("idambito",idambito)){
494                                tbl.GetErrorErrStr(msglog);
495                                errorInfo(modulo, msglog);
496                                return (FALSE);
497                        }               
498                        if(!tbl.Get("lonrestrambito",lonrestrambito)){
499                                tbl.GetErrorErrStr(msglog);
500                                errorInfo(modulo, msglog);
501                                return (FALSE);
502                        }
503                        restrambito = reservaMemoria(lonrestrambito+1);
504                        if (restrambito == NULL) {
505                                errorLog(modulo, 3, FALSE);
506                                return (FALSE);
507                        }                       
508                        if(!tbl.Get("restrambito",restrambito)){
509                                tbl.GetErrorErrStr(msglog);
510                                errorInfo(modulo, msglog);
511                                return (FALSE);
512                        }                       
513                        RecopilaIpesMacs(db,ambito,idambito,restrambito); // Recopila Ipes del ámbito
514                        if(!tbl.Get("idprocedimiento",idprocedimiento)){
515                                tbl.GetErrorErrStr(msglog);
516                                errorInfo(modulo, msglog);
517                                return (FALSE);
518                        }                               
519                        sesion=time(NULL);
520                       
521                        if(!ejecutarProcedimiento(db,idprocedimiento,ambito,idambito,restrambito))
522                                return(FALSE);
523                }
524                tbl.MoveNext();
525        }               
526        return(enviaPeticion(idprogramacion)); 
527}
528// ________________________________________________________________________________________________________
529//
530// Función: ejecutarTarea
531//
532//      Descripción:
533//              Registra un procedimiento para un ambito concreto
534//      Parámetros:
535//              - db: Objeto base de datos (operativo)
536//              - idcomando: Identificador del comando
537//              - idprocedimiento: Identificador del procedimiento
538//              - ambito: Ámbito de aplicación
539//              - idambito: Identificador del ámbito
540//              - restrambito: cadena con los identificadores de los ordenadores a los que se aplica la acción
541//      Devuelve:
542//              TRUE: Si el proceso es correcto
543//              FALSE: En caso de ocurrir algún error
544//________________________________________________________________________________________________________
545BOOLEAN insertaComando(Database db,int idcomando,char*parametros,int idprocedimiento,int ambito,int idambito,char*restrambito)
546{
547        char msglog[LONSTD], sqlstr[LONSQL];
548        struct tm* st;
549        char *auxID[MAXIMOS_CLIENTES],*auxIP[MAXIMOS_CLIENTES];
550        char fechahorareg[24];
551        int i;
552        char modulo[] = "insertaComando()";
553
554        if(concli==0) return(TRUE); // No hay ordenadores en el ámbito
555
556        st = tomaHora();
557        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);       
558
559        splitCadena(auxID,cadenaid,',');
560        splitCadena(auxIP,cadenaip,';');
561
562        for (i=0;i<concli;i++){
563                sprintf(sqlstr,"INSERT INTO acciones (idordenador,tipoaccion,idtipoaccion,descriaccion,ip,"\
564                                                "sesion,idcomando,parametros,fechahorareg,estado,resultado,ambito,idambito,"\
565                                                "restrambito,idprocedimiento,idcentro,idprogramacion)"\
566                                                " VALUES (%s,%d,%d,'%s','%s',%d,%d,'%s','%s',%d,%d,%d,%d,'%s',%d,%d,%d)",\
567                                                auxID[i],tipoaccion,idtipoaccion,descriaccion,auxIP[i],sesion,idcomando,parametros,fechahorareg,\
568                                                ACCION_INICIADA,ACCION_SINRESULTADO,ambito,idambito,restrambito,idprocedimiento,idcentro,idprogramacion);
569                        if (!db.Execute(sqlstr)) { // Error al recuperar los datos
570                        errorLog(modulo, 21, FALSE);
571                        db.GetErrorErrStr(msglog);
572                        errorInfo(modulo, msglog);
573                        return (FALSE);
574                }
575        }
576        return(TRUE);
577}
578// _____________________________________________________________________________________________________________
579// Función: EjecutarReserva
580//
581//              Descripción:
582//                      Registra una acción (Tarea) y la envía para su ejecución
583//              Parámetros:
584//                      - idreserva : Identificador de la reserva
585//                      - db: una conexion ADO operativa
586//                      - parametros: Parámetros de la acción
587// _____________________________________________________________________________________________________________
588BOOLEAN EjecutarReserva(int idreserva,Database db )
589{
590
591
592        return(true);
593}
594// _____________________________________________________________________________________________________________
595// Función: enviaPeticion
596//
597//              Descripción:
598//                      Hace una petición al servidor para que actualice los ordenadores implicados en la programación
599//              Parámetros:
600//                      - idprogramacion: Identificador de la programación
601// _____________________________________________________________________________________________________________
602BOOLEAN enviaPeticion(int idprogramacion)
603{
604        int lon;
605        TRAMA *ptrTrama;
606        SOCKET socket_c;
607        char modulo[] = "enviaPeticion()";
608
609        /* Envio de comandos a clientes */
610        ptrTrama=(TRAMA *)reservaMemoria(sizeof(TRAMA));
611        if (ptrTrama == NULL) { // No hay memoria suficiente para el bufer de las tramas
612                errorLog(modulo, 3, FALSE);
613                return(FALSE);
614        }
615        initParametros(ptrTrama,0);
616        lon=sprintf(ptrTrama->parametros,"nfn=envioProgramacion\r"); // Nombre de la función a ejecutar en el servidor
617        lon+=sprintf(ptrTrama->parametros+lon,"idp=%d\r",idprogramacion); // Configuración de los Sistemas Operativos del cliente
618
619        if(!enviaMensaje(&socket_c,ptrTrama,MSG_PETICION)){
620                errorLog(modulo,91,FALSE);
621                return(FALSE);
622        }
623        return(TRUE);
624}
625// _____________________________________________________________________________________________________________
626//
627// Función: RecopilaIpesMacs
628//
629// Descripción :
630//              Recopila las IPes, las Macs y los identificadores de ordenadores de un ámbito determinado
631//
632// Especificaciones:
633//              Esta Función recibe tres parámatros:
634//                      db : Un objeto Base de datos totalmente operativo
635//                      ambito:  Tipo de ámbito
636//                      idambito: Identificador del ámbito
637//      Devuelve:
638//              Todas los identificadores de ordenadores , las ipes y las macs de los ordenadores que componen el ámbito
639//              Para ellos habrá que tener declarada tres variables globales :
640//                              cadenaid,cadenaip y cadenamac
641// _____________________________________________________________________________________________________________
642
643BOOLEAN RecopilaIpesMacs(Database db,int ambito,int idambito,char *restrambito)
644{
645        char sqlstr[LONSQL];
646
647        concli=0;
648        /* Reserva memoria al meno para caracter nulo */
649        cadenaid=(char*) reservaMemoria(1);
650        cadenaip=(char*) reservaMemoria(1);
651        cadenamac=(char*) reservaMemoria(1);
652       
653        switch(ambito){
654                case AMBITO_CENTROS :
655                        sprintf(sqlstr,"SELECT idcentro FROM centros WHERE idcentro=%d",idambito);
656                        RecorreCentro(db,sqlstr);
657                        break;
658                case AMBITO_GRUPOSAULAS :
659                        sprintf(sqlstr,"SELECT idgrupo FROM grupos WHERE idgrupo=%d AND tipo=%d",idambito,AMBITO_GRUPOSAULAS);
660                        RecorreGruposAulas(db,sqlstr);
661                        break;
662                case AMBITO_AULAS :
663                        sprintf(sqlstr,"SELECT idaula FROM aulas WHERE idaula=%d",idambito);
664                        RecorreAulas(db,sqlstr);
665                        break;
666                case AMBITO_GRUPOSORDENADORES :
667                        sprintf(sqlstr,"SELECT idgrupo FROM gruposordenadores WHERE idgrupo=%d",idambito);
668                        RecorreGruposOrdenadores(db,sqlstr);
669                        break;
670                case AMBITO_ORDENADORES :
671                        sprintf(sqlstr,"SELECT ip,mac,idordenador FROM ordenadores WHERE idordenador=%d",idambito);
672                        RecorreOrdenadores(db,sqlstr);
673                        break;
674                default: // Se trata de un conjunto aleatorio de ordenadores
675                        sprintf(sqlstr,"SELECT ip,mac,idordenador  FROM ordenadores WHERE idordenador IN (%s)",restrambito);
676                        RecorreOrdenadores(db,sqlstr);
677                       
678        }
679        return (TRUE);
680}
681//________________________________________________________________________________________________________
682
683BOOLEAN RecorreCentro(Database db, char* sqlstr)
684{
685        char msglog[LONSTD];
686        Table tbl;
687        int idcentro;
688        char modulo[] = "RecorreCentro()";
689       
690        if (!db.Execute(sqlstr, tbl)) { // Error al leer
691                errorLog(modulo, 21, FALSE);
692                db.GetErrorErrStr(msglog);
693                errorInfo(modulo, msglog);
694                return (FALSE);
695        }
696        if(!tbl.ISEOF()){
697                if(!tbl.Get("idcentro",idcentro)){
698                        tbl.GetErrorErrStr(msglog);
699                        errorInfo(modulo, msglog);
700                        return (FALSE);
701                }               
702                sprintf(sqlstr,"SELECT idgrupo FROM grupos WHERE idcentro=%d AND grupoid=0  AND tipo=%d",idcentro,AMBITO_GRUPOSAULAS);
703                RecorreGruposAulas(db,sqlstr);
704                sprintf(sqlstr,"SELECT idaula FROM aulas WHERE idcentro=%d AND grupoid=0",idcentro);
705                RecorreAulas(db,sqlstr);
706        }
707        return (TRUE);
708}
709//________________________________________________________________________________________________________
710
711BOOLEAN RecorreGruposAulas(Database db, char* sqlstr)
712{
713        char msglog[LONSTD];
714        Table tbl;
715        int idgrupo;
716        char modulo[] = "RecorreGruposAulas()";
717       
718        if (!db.Execute(sqlstr, tbl)) { // Error al leer
719                errorLog(modulo, 21, FALSE);
720                db.GetErrorErrStr(msglog);
721                errorInfo(modulo, msglog);
722                return (FALSE);
723        }
724        while(!tbl.ISEOF()){
725                if(!tbl.Get("idgrupo",idgrupo)){
726                        tbl.GetErrorErrStr(msglog);
727                        errorInfo(modulo, msglog);
728                        return (FALSE);
729                }               
730                sprintf(sqlstr,"SELECT idgrupo FROM grupos WHERE grupoid=%d AND tipo=%d",idgrupo,AMBITO_GRUPOSAULAS);
731                RecorreGruposAulas(db,sqlstr);
732                sprintf(sqlstr,"SELECT idaula FROM aulas WHERE  grupoid=%d",idgrupo);
733                RecorreAulas(db,sqlstr);
734                tbl.MoveNext();
735        }
736        return (TRUE);
737}
738//________________________________________________________________________________________________________
739
740BOOLEAN RecorreAulas(Database db, char* sqlstr)
741{
742        char msglog[LONSTD];
743        Table tbl;
744        int idaula;
745        char modulo[] = "RecorreAulas()";
746
747        if (!db.Execute(sqlstr, tbl)) { // Error al leer
748                errorLog(modulo, 21, FALSE);
749                db.GetErrorErrStr(msglog);
750                errorInfo(modulo, msglog);
751                return (FALSE);
752        }
753        while(!tbl.ISEOF()){
754                if(!tbl.Get("idaula",idaula)){
755                        tbl.GetErrorErrStr(msglog);
756                        errorInfo(modulo, msglog);
757                        return (FALSE);
758                }
759                sprintf(sqlstr,"SELECT idgrupo FROM gruposordenadores WHERE idaula=%d AND grupoid=0",idaula);
760                RecorreGruposOrdenadores(db,sqlstr);
761                sprintf(sqlstr,"SELECT ip,mac,idordenador FROM ordenadores WHERE  idaula=%d AND grupoid=0",idaula);
762                RecorreOrdenadores(db,sqlstr);
763                tbl.MoveNext();
764        }
765        return (TRUE);
766}
767//________________________________________________________________________________________________________
768
769BOOLEAN  RecorreGruposOrdenadores(Database db, char* sqlstr)
770{
771        char msglog[LONSTD];
772        Table tbl;
773        int idgrupo;
774        char modulo[] = "RecorreGruposOrdenadores()";
775
776        if (!db.Execute(sqlstr, tbl)) { // Error al leer
777                errorLog(modulo, 21, FALSE);
778                db.GetErrorErrStr(msglog);
779                errorInfo(modulo, msglog);
780                return (FALSE);
781        }
782        while(!tbl.ISEOF()){
783                if(!tbl.Get("idgrupo",idgrupo)){
784                        tbl.GetErrorErrStr(msglog);
785                        errorInfo(modulo, msglog);
786                        return (FALSE);
787                }
788                sprintf(sqlstr,"SELECT idgrupo FROM gruposordenadores WHERE grupoid=%d",idgrupo);
789                RecorreGruposOrdenadores(db,sqlstr);
790                sprintf(sqlstr,"SELECT ip,mac,idordenador FROM ordenadores WHERE grupoid=%d",idgrupo);
791                RecorreOrdenadores(db,sqlstr);
792                tbl.MoveNext();
793        }
794        return (TRUE);
795}
796//________________________________________________________________________________________________________
797
798BOOLEAN RecorreOrdenadores(Database db, char* sqlstr)
799{
800        char msglog[LONSTD];
801        Table tbl;
802        int idordenador,o,p,m,lon;
803        char ido[16],ip[LONIP],mac[LONMAC];
804        char modulo[] = "RecorreOrdenadores()";
805
806        if (!db.Execute(sqlstr, tbl)) { // Error al leer
807                errorLog(modulo, 21, FALSE);
808                db.GetErrorErrStr(msglog);
809                errorInfo(modulo, msglog);
810                return (FALSE);
811        }
812        o=p=m=0;
813        while(!tbl.ISEOF()){
814                if(!tbl.Get("idordenador",idordenador)){
815                        tbl.GetErrorErrStr(msglog);
816                        errorInfo(modulo, msglog);
817                        return (FALSE);
818                }       
819                if(!tbl.Get("ip",ip)){
820                        tbl.GetErrorErrStr(msglog);
821                        errorInfo(modulo, msglog);
822                        return (FALSE);
823                }       
824                if(!tbl.Get("mac",mac)){
825                        tbl.GetErrorErrStr(msglog);
826                        errorInfo(modulo, msglog);
827                        return (FALSE);
828                }
829                sprintf(ido,"%d",idordenador);
830                lon=strlen(ido);
831                if(lon>16) lon=16;
832                cadenaid=(char*) ampliaMemoria(cadenaid,o+lon+1);
833                memcpy(&cadenaid[o],ido,lon);
834                o+=lon;
835                cadenaid[o++]=',';
836               
837                lon=strlen(ip);
838                if(lon>16) lon=LONIP;
839                cadenaip=(char*) ampliaMemoria(cadenaip,p+lon+1);
840                memcpy(&cadenaip[p],ip,lon);
841                p+=lon;
842                cadenaip[p++]=';';
843
844                lon=strlen(mac);
845                if(lon>16) lon=LONMAC;
846                cadenamac=(char*) ampliaMemoria(cadenamac,m+lon+1);
847                memcpy(&cadenamac[m],mac,lon);
848                m+=lon;
849                cadenamac[m++]=';';
850               
851                concli++;
852                tbl.MoveNext();
853        }
854        if(o>0) o--;
855        if(p>0) p--;
856        if(m>0) m--;
857        cadenaid[o]='\0';
858        cadenaip[p]='\0';
859        cadenamac[m]='\0';
860
861        return (TRUE);
862}
863// ********************************************************************************************************
864// PROGRAMA PRINCIPAL (SERVICIO)
865// ********************************************************************************************************
866int main(int argc, char *argv[])
867{
868        int pseg;
869        char msglog[LONSTD];
870        struct tm* st;
871        Database db;
872        char modulo[] = "main()";
873
874        /* Validación de parámetros de ejecución y lectura del fichero de configuración del servicio */
875
876        if (!validacionParametros(argc, argv, 5)) // Valida parámetros de ejecución
877                exit(EXIT_FAILURE);
878
879        if (!tomaConfiguracion(szPathFileCfg)) { // Toma parametros de configuracion
880                exit(EXIT_FAILURE);
881        }
882       
883        /* Bucle principal del servicio */
884
885        while (TRUE){
886                st = tomaHora();
887                pseg=65-st->tm_sec; // Calcula segundos de inactividad de la hebra
888                sleep(pseg);
889
890                // Toma la hora
891                st = tomaHora();
892
893                if (!db.Open(usuario, pasguor, datasource, catalog)) { // Error de conexion
894                        errorLog(modulo, 20, FALSE);
895                        db.GetErrorErrStr(msglog);
896                        errorInfo(modulo, msglog);
897                        exit(EXIT_FAILURE);
898                }
899                buscaAccion(db,st->tm_mday,st->tm_mon+1,st->tm_year+1900,st->tm_hour,st->tm_min,st->tm_wday );
900                db.Close(); // Cierra conexión
901        }
902        exit(EXIT_SUCCESS);
903}
904
905       
Note: See TracBrowser for help on using the repository browser.