From d0df4ec235f0a813e93a46822cd2a7622db06c9b Mon Sep 17 00:00:00 2001 From: "Ramón M. Gómez" Date: Mon, 25 Feb 2019 10:03:30 +0100 Subject: #872: Adapting commits {{{8e072b9}}}, {{{cfd26b}}}, and {{{79a6616}}} from devel to master branch. --- .../Services/ogAdmAgent/sources/ogAdmAgent.cpp | 1822 ++++++++++---------- doc/CHANGELOG.es.txt | 5 +- installer/vagrant/Vagrantfile-1.0.6b-vbox | 2 +- installer/vagrant/Vagrantfile-devel-vbox | 2 +- installer/vagrant/Vagrantfile-prod-vbox | 2 +- server/lib/security-config | 29 +- 6 files changed, 933 insertions(+), 929 deletions(-) diff --git a/admin/Sources/Services/ogAdmAgent/sources/ogAdmAgent.cpp b/admin/Sources/Services/ogAdmAgent/sources/ogAdmAgent.cpp index cce297fe..07a6eef3 100644 --- a/admin/Sources/Services/ogAdmAgent/sources/ogAdmAgent.cpp +++ b/admin/Sources/Services/ogAdmAgent/sources/ogAdmAgent.cpp @@ -1,911 +1,911 @@ -// ******************************************************************************************************** -// Servicio: ogAdmAgent -// Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla -// Fecha Creación: Marzo-2010 -// Fecha Última modificación: Marzo-2010 -// Nombre del fichero: ogAdmAgent.cpp -// Descripción: Este fichero implementa el servicio agente del sistema. Revisa a intervalos -// regulares la base de datos para comprobar si existen acciones programadas. -// ******************************************************************************************************** -#include "ogAdmAgent.h" -#include "ogAdmLib.c" -//________________________________________________________________________________________________________ -// Función: tomaConfiguracion -// -// Descripción: -// Lee el fichero de configuración del servicio -// Parámetros: -// filecfg : Ruta completa al fichero de configuración -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//________________________________________________________________________________________________________ -BOOLEAN tomaConfiguracion(char* filecfg) -{ - char modulo[] = "tomaConfiguracion()"; - - if (filecfg == NULL || strlen(filecfg) == 0) { - errorLog(modulo, 1, FALSE); // Fichero de configuración del servicio vacío - return (FALSE); - } - FILE *fcfg; - long lSize; - char * buffer, *lineas[MAXPRM], *dualparametro[2]; - int i, numlin, resul; - - fcfg = fopen(filecfg, "rt"); - if (fcfg == NULL) { - errorLog(modulo, 2, FALSE); // No existe fichero de configuración del servicio - return (FALSE); - } - - fseek(fcfg, 0, SEEK_END); - lSize = ftell(fcfg); // Obtiene tamaño del fichero. - rewind(fcfg); - buffer = (char*) reservaMemoria(lSize + 1); // Toma memoria para el buffer de lectura. - if (buffer == NULL) { // No hay memoria suficiente para el buffer - errorLog(modulo, 3, FALSE); - return (FALSE); - } - fread(buffer, 1, lSize, fcfg); // Lee contenido del fichero - buffer[lSize] = (char) NULL; - fclose(fcfg); - - servidoradm[0] = (char) NULL; //inicializar variables globales - puerto[0] = (char) NULL; - usuario[0] = (char) NULL; - pasguor[0] = (char) NULL; - datasource[0] = (char) NULL; - catalog[0] = (char) NULL; - - numlin = splitCadena(lineas, buffer, '\n'); - for (i = 0; i < numlin; i++) { - splitCadena(dualparametro, lineas[i], '='); - resul = strcmp(StrToUpper(dualparametro[0]), "SERVIDORADM"); - if (resul == 0) - strcpy(servidoradm, dualparametro[1]); - resul = strcmp(StrToUpper(dualparametro[0]), "PUERTO"); - if (resul == 0) - strcpy(puerto, dualparametro[1]); - resul = strcmp(StrToUpper(dualparametro[0]), "USUARIO"); - if (resul == 0) - strcpy(usuario, dualparametro[1]); - resul = strcmp(StrToUpper(dualparametro[0]), "PASSWORD"); - if (resul == 0) - strcpy(pasguor, dualparametro[1]); - resul = strcmp(StrToUpper(dualparametro[0]), "DATASOURCE"); - if (resul == 0) - strcpy(datasource, dualparametro[1]); - resul = strcmp(StrToUpper(dualparametro[0]), "CATALOG"); - if (resul == 0) - strcpy(catalog, dualparametro[1]); - } - if (servidoradm[0] == (char) NULL) { - errorLog(modulo, 4, FALSE); // Falta parámetro SERVIDORADM - return (FALSE); - } - if (puerto[0] == (char) NULL) { - errorLog(modulo, 5, FALSE); // Falta parámetro PUERTO - return (FALSE); - } - if (usuario[0] == (char) NULL) { - errorLog(modulo, 6, FALSE); // Falta parámetro USUARIO - return (FALSE); - } - if (pasguor[0] == (char) NULL) { - errorLog(modulo, 7, FALSE); // Falta parámetro PASSWORD - return (FALSE); - } - if (datasource[0] == (char) NULL) { - errorLog(modulo, 8, FALSE); // Falta parámetro DATASOURCE - return (FALSE); - } - if (catalog[0] == (char) NULL) { - errorLog(modulo, 9, FALSE); // Falta parámetro CATALOG - return (FALSE); - } - return (TRUE); -} -// ________________________________________________________________________________________________________ -// -// Función: diadelaSemana -// -// Descripción: -// Calcula el número del día de la semana que corresponde a una fecha -// Parámetros: -// - dia: Un día -// - mes: Un mes -// - anno: Un año -// Devuelve: -// El número del día de la semana: 1=Lunes, 2=martes ... 6=sábado 7=domingo -// ________________________________________________________________________________________________________ - -int diadelaSemana(WORD dia,WORD mes,WORD anno) -{ - int i,cont,dias_anuales; - int desplazamiento_dias=6; - int orddiasem; - - cont =0; - for (i=1900;i0) cociente++; - return(cociente); -} -// ________________________________________________________________________________________________________ -// -// Función: buscaAccion -// -// Descripción: -// Busca en la base de datos, acciones programadas -// Parámetros: -// - db: Objeto base de datos (operativo) -// - dia : Día actual del mes -// - mes : mes en curso -// - anno : Año en curso -// - hora : Hora actual -// - minutos : Minutos actuales -// - diasemana : Dia de la semana 1=lunes,2=martes ... ( 0 Domingo) -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ - -BOOLEAN buscaAccion(Database db,WORD dia,WORD mes,WORD anno,WORD hora,WORD minutos,WORD diasemana) -{ - char msglog[LONSTD], sqlstr[LONSQL]; - Table tbl; - BYTE swampm,bitsemana; - int ordsem,ordulsem,ordiasem_1,maxdias; - int sesionprog; - char modulo[] = "buscaAccion()"; - - /* Año de comienzo */ - anno=anno-ANNOREF; // - /* Preparación hora */ - if(hora>11){ - hora-=12; - swampm=1; // Es P.M. - } - else - swampm=0; // Es am - /* Preparación semana */ - if(diasemana==0) diasemana=7; // El domingo - - // Cuestión semanas - ordiasem_1=diadelaSemana(1,mes,anno+2009); - ordsem=semanadelMes(ordiasem_1,dia); // Calcula el número de la semana - if (mes!=2) // Toma el último día de ese mes - maxdias=dias_meses[mes]; - else{ - if (bisiesto(anno+ANNOREF)) - maxdias=29; - else - maxdias=28; - } - ordulsem=semanadelMes(ordiasem_1,maxdias); // Calcula el número de la última semana - bitsemana=HEX_semanas[ordsem]; - if(ordsem==ordulsem) // Si es la última semana del mes - bitsemana|=HEX_semanas[6]; - - sprintf(sqlstr,"SELECT DISTINCT idprogramacion,tipoaccion,identificador,sesion,idcentro,"\ - "tareas.descripcion as descritarea"\ - " FROM programaciones"\ - " LEFT OUTER JOIN tareas ON tareas.idtarea=programaciones.identificador"\ - " WHERE suspendida=0 "\ - " AND (annos & %d <> 0) "\ - " AND (meses & %d<>0) "\ - " AND ((diario & %d<>0) OR (dias & %d<>0) OR (semanas & %d<>0))"\ - " AND (horas & %d<>0) AND ampm=%d AND minutos=%d",\ - HEX_annos[anno],\ - HEX_meses[mes],\ - HEX_dias[dia],\ - HEX_diasemana[diasemana],\ - bitsemana,\ - HEX_horas[hora],\ - swampm,minutos); - - if (!db.Execute(sqlstr, tbl)) { // Error al leer - errorLog(modulo, 21, FALSE); - db.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - if(tbl.ISEOF()){ - return(TRUE); // No hay acciones programadas - } - - while(!tbl.ISEOF()){ - if(!tbl.Get("idprogramacion",idprogramacion)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - if(!tbl.Get("tipoaccion",tipoaccion)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - if(!tbl.Get("identificador",idtipoaccion)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - if(!tbl.Get("sesion",sesionprog)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - if(!tbl.Get("idcentro",idcentro)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - - if(tipoaccion==EJECUCION_COMANDO){ // Es una programación de un comando - return(ejecutarComando(db,idprogramacion,sesionprog)); - } - else{ - - if(tipoaccion==EJECUCION_TAREA){ - if(!tbl.Get("descritarea",descriaccion)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - return(ejecutarTarea(db,idprogramacion,idtipoaccion)); - } - else{ - if(tipoaccion==EJECUCION_RESERVA){ - EjecutarReserva(idtipoaccion,db); // Es una programación de un trabajo - } - } - } - tbl.MoveNext(); - } - return(TRUE); -} -// ________________________________________________________________________________________________________ -// -// Función: ejecutarComando -// -// Descripción: -// Ejecuta un comando programado -// Parámetros: -// - db: Objeto base de datos (operativo) -// - idcomando: Identificador del comando -// - sesion: Sesión correspondiente al comando cuando se grabó en la tabla acciones -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ - -BOOLEAN ejecutarComando(Database db,int idprogramacion,int sesion ) -{ - struct tm* st; - char msglog[LONSTD], sqlstr[LONSQL]; - char fechahorareg[24]; - char modulo[] = "ejecutarComando()"; - - st = tomaHora(); - 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); - - sprintf(sqlstr,"UPDATE acciones SET estado=%d,idprogramacion=%d,fechahorareg='%s'"\ - " WHERE sesion=%d", ACCION_INICIADA,idprogramacion,fechahorareg,sesion); - - if (!db.Execute(sqlstr)) { // Error al recuperar los datos - errorLog(modulo, 21, FALSE); - db.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - return(enviaPeticion(idprogramacion)); -} -// ________________________________________________________________________________________________________ -// -// Función: ejecutarProcedimiento -// -// Descripción: -// Ejecuta un procedimiento programado -// Parámetros: -// - db: Objeto base de datos (operativo) -// - idprocedimiento: Identificador del procedimiento -// - ambito: Ámbito de aplicación -// - idambito: Identificador del ámbito -// - restrambito: cadena con los identificadores de los ordenadores a los que se aplica la acción -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ - -BOOLEAN ejecutarProcedimiento(Database db,int idprocedimiento,int ambito,int idambito,char* restrambito) -{ - char msglog[LONSTD], sqlstr[LONSQL],*parametros; - Table tbl; - int procedimientoid,idcomando,lonprm; - char modulo[] = "ejecutarProcedimiento()"; - - sprintf(sqlstr,"SELECT idcomando,procedimientoid,parametros,length(parametros) as lonprm"\ - " FROM procedimientos_acciones"\ - " WHERE idprocedimiento=%d ORDER BY orden",idprocedimiento); - - if (!db.Execute(sqlstr, tbl)) { // Error al leer - errorLog(modulo, 21, FALSE); - db.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - - if(tbl.ISEOF()){ - return(TRUE); // No exustde tarea - } - while(!tbl.ISEOF()){ - if(!tbl.Get("procedimientoid",procedimientoid)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - if(procedimientoid>0){ // Procedimiento recursivo - if(!ejecutarProcedimiento(db,procedimientoid,ambito,idambito,restrambito)){ - return(false); - } - } - else{ - if(!tbl.Get("lonprm",lonprm)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - parametros = reservaMemoria(lonprm+1); // Reserva para almacenar los parametros del procedimiento - if (parametros == NULL) { - errorLog(modulo, 3, FALSE); - return (FALSE); - } - if(!tbl.Get("parametros",parametros)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - liberaMemoria(parametros); - return (FALSE); - } - liberaMemoria(parametros); - if(!tbl.Get("idcomando",idcomando)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - - if(!insertaComando(db,idcomando,parametros,idprocedimiento,ambito,idambito,restrambito)) - return(false); - } - tbl.MoveNext(); - } - return(TRUE); -} -// ________________________________________________________________________________________________________ -// -// Función: ejecutarTarea -// -// Descripción: -// Ejecuta una tarea programada -// Parámetros: -// - db: Objeto base de datos (operativo) -// - idtarea: Identificador de la tarea -// - idprogramacion: Identificador de la programación -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ - -BOOLEAN ejecutarTarea(Database db, int idprogramacion, int idtarea) -{ - char msglog[LONSTD], sqlstr[LONSQL]; - Table tbl; - int tareaid,ambito,idambito,idprocedimiento,lonrestrambito; - char* restrambito; - char modulo[] = "ejecutarTarea()"; - - sprintf(sqlstr,"SELECT tareas_acciones.orden,tareas_acciones.idprocedimiento,tareas_acciones.tareaid,"\ - " tareas.ambito,tareas.idambito,tareas.restrambito,length(tareas.restrambito) as lonrestrambito"\ - " FROM tareas"\ - " INNER JOIN tareas_acciones ON tareas_acciones.idtarea=tareas.idtarea"\ - " WHERE tareas_acciones.idtarea=%d ORDER BY tareas_acciones.orden",idtarea); - - if (!db.Execute(sqlstr, tbl)) { // Error al leer - errorLog(modulo, 21, FALSE); - db.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - - if(tbl.ISEOF()){ - return(TRUE); // No existe tarea - } - - while(!tbl.ISEOF()){ - if(!tbl.Get("tareaid",tareaid)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - if(tareaid>0){ // Tarea recursiva - if(!ejecutarTarea(db,idprogramacion,tareaid)){ - return(false); - } - } - else{ - if(!tbl.Get("ambito",ambito)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - if(!tbl.Get("idambito",idambito)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - if(!tbl.Get("lonrestrambito",lonrestrambito)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - restrambito = reservaMemoria(lonrestrambito+1); - if (restrambito == NULL) { - errorLog(modulo, 3, FALSE); - return (FALSE); - } - if(!tbl.Get("restrambito",restrambito)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - liberaMemoria(restrambito); - return (FALSE); - } - liberaMemoria(restrambito); - RecopilaIpesMacs(db,ambito,idambito,restrambito); // Recopila Ipes del ámbito - if(!tbl.Get("idprocedimiento",idprocedimiento)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - sesion=time(NULL); - - if(!ejecutarProcedimiento(db,idprocedimiento,ambito,idambito,restrambito)) - return(FALSE); - } - tbl.MoveNext(); - } - return(enviaPeticion(idprogramacion)); -} -// ________________________________________________________________________________________________________ -// -// Función: ejecutarTarea -// -// Descripción: -// Registra un procedimiento para un ambito concreto -// Parámetros: -// - db: Objeto base de datos (operativo) -// - idcomando: Identificador del comando -// - idprocedimiento: Identificador del procedimiento -// - ambito: Ámbito de aplicación -// - idambito: Identificador del ámbito -// - restrambito: cadena con los identificadores de los ordenadores a los que se aplica la acción -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//________________________________________________________________________________________________________ -BOOLEAN insertaComando(Database db,int idcomando,char*parametros,int idprocedimiento,int ambito,int idambito,char*restrambito) -{ - char msglog[LONSTD], sqlstr[LONSQL]; - struct tm* st; - char *auxID[MAXIMOS_CLIENTES],*auxIP[MAXIMOS_CLIENTES]; - char fechahorareg[24]; - int i; - char modulo[] = "insertaComando()"; - - if(concli==0) return(TRUE); // No hay ordenadores en el ámbito - - st = tomaHora(); - 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); - - splitCadena(auxID,cadenaid,','); - splitCadena(auxIP,cadenaip,';'); - - for (i=0;iparametros,"nfn=envioProgramacion\r"); // Nombre de la función a ejecutar en el servidor - lon+=sprintf(ptrTrama->parametros+lon,"idp=%d\r",idprogramacion); // Configuración de los Sistemas Operativos del cliente - - if(!enviaMensaje(&socket_c,ptrTrama,MSG_PETICION)){ - errorLog(modulo,91,FALSE); - liberaMemoria(ptrTrama); - return(FALSE); - } - liberaMemoria(ptrTrama); - return(TRUE); -} -// _____________________________________________________________________________________________________________ -// -// Función: RecopilaIpesMacs -// -// Descripción : -// Recopila las IPes, las Macs y los identificadores de ordenadores de un ámbito determinado -// -// Especificaciones: -// Esta Función recibe tres parámatros: -// db : Un objeto Base de datos totalmente operativo -// ambito: Tipo de ámbito -// idambito: Identificador del ámbito -// Devuelve: -// Todas los identificadores de ordenadores , las ipes y las macs de los ordenadores que componen el ámbito -// Para ellos habrá que tener declarada tres variables globales : -// cadenaid,cadenaip y cadenamac -// _____________________________________________________________________________________________________________ - -BOOLEAN RecopilaIpesMacs(Database db,int ambito,int idambito,char *restrambito) -{ - char sqlstr[LONSQL]; - - concli=0; - /* Reserva memoria al meno para caracter nulo */ - cadenaid=(char*) reservaMemoria(1); - cadenaip=(char*) reservaMemoria(1); - cadenamac=(char*) reservaMemoria(1); - - switch(ambito){ - case AMBITO_CENTROS : - sprintf(sqlstr,"SELECT idcentro FROM centros WHERE idcentro=%d",idambito); - RecorreCentro(db,sqlstr); - break; - case AMBITO_GRUPOSAULAS : - sprintf(sqlstr,"SELECT idgrupo FROM grupos WHERE idgrupo=%d AND tipo=%d",idambito,AMBITO_GRUPOSAULAS); - RecorreGruposAulas(db,sqlstr); - break; - case AMBITO_AULAS : - sprintf(sqlstr,"SELECT idaula FROM aulas WHERE idaula=%d",idambito); - RecorreAulas(db,sqlstr); - break; - case AMBITO_GRUPOSORDENADORES : - sprintf(sqlstr,"SELECT idgrupo FROM gruposordenadores WHERE idgrupo=%d",idambito); - RecorreGruposOrdenadores(db,sqlstr); - break; - case AMBITO_ORDENADORES : - sprintf(sqlstr,"SELECT ip,mac,idordenador FROM ordenadores WHERE idordenador=%d",idambito); - RecorreOrdenadores(db,sqlstr); - break; - default: // Se trata de un conjunto aleatorio de ordenadores - sprintf(sqlstr,"SELECT ip,mac,idordenador FROM ordenadores WHERE idordenador IN (%s)",restrambito); - RecorreOrdenadores(db,sqlstr); - - } - return (TRUE); -} -//________________________________________________________________________________________________________ - -BOOLEAN RecorreCentro(Database db, char* sqlstr) -{ - char msglog[LONSTD]; - Table tbl; - int idcentro; - char modulo[] = "RecorreCentro()"; - - if (!db.Execute(sqlstr, tbl)) { // Error al leer - errorLog(modulo, 21, FALSE); - db.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - if(!tbl.ISEOF()){ - if(!tbl.Get("idcentro",idcentro)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - sprintf(sqlstr,"SELECT idgrupo FROM grupos WHERE idcentro=%d AND grupoid=0 AND tipo=%d",idcentro,AMBITO_GRUPOSAULAS); - RecorreGruposAulas(db,sqlstr); - sprintf(sqlstr,"SELECT idaula FROM aulas WHERE idcentro=%d AND grupoid=0",idcentro); - RecorreAulas(db,sqlstr); - } - return (TRUE); -} -//________________________________________________________________________________________________________ - -BOOLEAN RecorreGruposAulas(Database db, char* sqlstr) -{ - char msglog[LONSTD]; - Table tbl; - int idgrupo; - char modulo[] = "RecorreGruposAulas()"; - - if (!db.Execute(sqlstr, tbl)) { // Error al leer - errorLog(modulo, 21, FALSE); - db.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - while(!tbl.ISEOF()){ - if(!tbl.Get("idgrupo",idgrupo)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - sprintf(sqlstr,"SELECT idgrupo FROM grupos WHERE grupoid=%d AND tipo=%d",idgrupo,AMBITO_GRUPOSAULAS); - RecorreGruposAulas(db,sqlstr); - sprintf(sqlstr,"SELECT idaula FROM aulas WHERE grupoid=%d",idgrupo); - RecorreAulas(db,sqlstr); - tbl.MoveNext(); - } - return (TRUE); -} -//________________________________________________________________________________________________________ - -BOOLEAN RecorreAulas(Database db, char* sqlstr) -{ - char msglog[LONSTD]; - Table tbl; - int idaula; - char modulo[] = "RecorreAulas()"; - - if (!db.Execute(sqlstr, tbl)) { // Error al leer - errorLog(modulo, 21, FALSE); - db.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - while(!tbl.ISEOF()){ - if(!tbl.Get("idaula",idaula)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - sprintf(sqlstr,"SELECT idgrupo FROM gruposordenadores WHERE idaula=%d AND grupoid=0",idaula); - RecorreGruposOrdenadores(db,sqlstr); - sprintf(sqlstr,"SELECT ip,mac,idordenador FROM ordenadores WHERE idaula=%d AND grupoid=0",idaula); - RecorreOrdenadores(db,sqlstr); - tbl.MoveNext(); - } - return (TRUE); -} -//________________________________________________________________________________________________________ - -BOOLEAN RecorreGruposOrdenadores(Database db, char* sqlstr) -{ - char msglog[LONSTD]; - Table tbl; - int idgrupo; - char modulo[] = "RecorreGruposOrdenadores()"; - - if (!db.Execute(sqlstr, tbl)) { // Error al leer - errorLog(modulo, 21, FALSE); - db.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - while(!tbl.ISEOF()){ - if(!tbl.Get("idgrupo",idgrupo)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - sprintf(sqlstr,"SELECT idgrupo FROM gruposordenadores WHERE grupoid=%d",idgrupo); - RecorreGruposOrdenadores(db,sqlstr); - sprintf(sqlstr,"SELECT ip,mac,idordenador FROM ordenadores WHERE grupoid=%d",idgrupo); - RecorreOrdenadores(db,sqlstr); - tbl.MoveNext(); - } - return (TRUE); -} -//________________________________________________________________________________________________________ - -BOOLEAN RecorreOrdenadores(Database db, char* sqlstr) -{ - char msglog[LONSTD]; - Table tbl; - int idordenador,o,p,m,lon; - char ido[16],ip[LONIP],mac[LONMAC]; - char modulo[] = "RecorreOrdenadores()"; - - if (!db.Execute(sqlstr, tbl)) { // Error al leer - errorLog(modulo, 21, FALSE); - db.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - o=p=m=0; - while(!tbl.ISEOF()){ - if(!tbl.Get("idordenador",idordenador)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - if(!tbl.Get("ip",ip)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - if(!tbl.Get("mac",mac)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - sprintf(ido,"%d",idordenador); - lon=strlen(ido); - if(lon>16) lon=16; - cadenaid=(char*) ampliaMemoria(cadenaid,o+lon+1); - memcpy(&cadenaid[o],ido,lon); - o+=lon; - cadenaid[o++]=','; - - lon=strlen(ip); - if(lon>16) lon=LONIP; - cadenaip=(char*) ampliaMemoria(cadenaip,p+lon+1); - memcpy(&cadenaip[p],ip,lon); - p+=lon; - cadenaip[p++]=';'; - - lon=strlen(mac); - if(lon>16) lon=LONMAC; - cadenamac=(char*) ampliaMemoria(cadenamac,m+lon+1); - memcpy(&cadenamac[m],mac,lon); - m+=lon; - cadenamac[m++]=';'; - - concli++; - tbl.MoveNext(); - } - if(o>0) o--; - if(p>0) p--; - if(m>0) m--; - cadenaid[o]='\0'; - cadenaip[p]='\0'; - cadenamac[m]='\0'; - - return (TRUE); -} -// ******************************************************************************************************** -// PROGRAMA PRINCIPAL (SERVICIO) -// ******************************************************************************************************** -int main(int argc, char *argv[]) -{ - int pseg; - char msglog[LONSTD]; - struct tm* st; - Database db; - char modulo[] = "main()"; - - /* Validación de parámetros de ejecución y lectura del fichero de configuración del servicio */ - - if (!validacionParametros(argc, argv, 5)) // Valida parámetros de ejecución - exit(EXIT_FAILURE); - - if (!tomaConfiguracion(szPathFileCfg)) { // Toma parametros de configuracion - exit(EXIT_FAILURE); - } - - /* Bucle principal del servicio */ - - while (TRUE){ - st = tomaHora(); - pseg=65-st->tm_sec; // Calcula segundos de inactividad de la hebra - sleep(pseg); - - // Toma la hora - st = tomaHora(); - - if (!db.Open(usuario, pasguor, datasource, catalog)) { // Error de conexion - errorLog(modulo, 20, FALSE); - db.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - exit(EXIT_FAILURE); - } - buscaAccion(db,st->tm_mday,st->tm_mon+1,st->tm_year+1900,st->tm_hour,st->tm_min,st->tm_wday ); - db.Close(); // Cierra conexión - } - exit(EXIT_SUCCESS); -} - - +// ******************************************************************************************************** +// Servicio: ogAdmAgent +// Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla +// Fecha Creación: Marzo-2010 +// Fecha Última modificación: Marzo-2010 +// Nombre del fichero: ogAdmAgent.cpp +// Descripción: Este fichero implementa el servicio agente del sistema. Revisa a intervalos +// regulares la base de datos para comprobar si existen acciones programadas. +// ******************************************************************************************************** +#include "ogAdmAgent.h" +#include "ogAdmLib.c" +//________________________________________________________________________________________________________ +// Función: tomaConfiguracion +// +// Descripción: +// Lee el fichero de configuración del servicio +// Parámetros: +// filecfg : Ruta completa al fichero de configuración +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algún error +//________________________________________________________________________________________________________ +BOOLEAN tomaConfiguracion(char* filecfg) +{ + char modulo[] = "tomaConfiguracion()"; + + if (filecfg == NULL || strlen(filecfg) == 0) { + errorLog(modulo, 1, FALSE); // Fichero de configuración del servicio vacío + return (FALSE); + } + FILE *fcfg; + long lSize; + char * buffer, *lineas[MAXPRM], *dualparametro[2]; + int i, numlin, resul; + + fcfg = fopen(filecfg, "rt"); + if (fcfg == NULL) { + errorLog(modulo, 2, FALSE); // No existe fichero de configuración del servicio + return (FALSE); + } + + fseek(fcfg, 0, SEEK_END); + lSize = ftell(fcfg); // Obtiene tamaño del fichero. + rewind(fcfg); + buffer = (char*) reservaMemoria(lSize + 1); // Toma memoria para el buffer de lectura. + if (buffer == NULL) { // No hay memoria suficiente para el buffer + errorLog(modulo, 3, FALSE); + return (FALSE); + } + fread(buffer, 1, lSize, fcfg); // Lee contenido del fichero + buffer[lSize] = (char) NULL; + fclose(fcfg); + + servidoradm[0] = (char) NULL; //inicializar variables globales + puerto[0] = (char) NULL; + usuario[0] = (char) NULL; + pasguor[0] = (char) NULL; + datasource[0] = (char) NULL; + catalog[0] = (char) NULL; + + numlin = splitCadena(lineas, buffer, '\n'); + for (i = 0; i < numlin; i++) { + splitCadena(dualparametro, lineas[i], '='); + resul = strcmp(StrToUpper(dualparametro[0]), "SERVIDORADM"); + if (resul == 0) + strcpy(servidoradm, dualparametro[1]); + resul = strcmp(StrToUpper(dualparametro[0]), "PUERTO"); + if (resul == 0) + strcpy(puerto, dualparametro[1]); + resul = strcmp(StrToUpper(dualparametro[0]), "USUARIO"); + if (resul == 0) + strcpy(usuario, dualparametro[1]); + resul = strcmp(StrToUpper(dualparametro[0]), "PASSWORD"); + if (resul == 0) + strcpy(pasguor, dualparametro[1]); + resul = strcmp(StrToUpper(dualparametro[0]), "DATASOURCE"); + if (resul == 0) + strcpy(datasource, dualparametro[1]); + resul = strcmp(StrToUpper(dualparametro[0]), "CATALOG"); + if (resul == 0) + strcpy(catalog, dualparametro[1]); + } + if (servidoradm[0] == (char) NULL) { + errorLog(modulo, 4, FALSE); // Falta parámetro SERVIDORADM + return (FALSE); + } + if (puerto[0] == (char) NULL) { + errorLog(modulo, 5, FALSE); // Falta parámetro PUERTO + return (FALSE); + } + if (usuario[0] == (char) NULL) { + errorLog(modulo, 6, FALSE); // Falta parámetro USUARIO + return (FALSE); + } + if (pasguor[0] == (char) NULL) { + errorLog(modulo, 7, FALSE); // Falta parámetro PASSWORD + return (FALSE); + } + if (datasource[0] == (char) NULL) { + errorLog(modulo, 8, FALSE); // Falta parámetro DATASOURCE + return (FALSE); + } + if (catalog[0] == (char) NULL) { + errorLog(modulo, 9, FALSE); // Falta parámetro CATALOG + return (FALSE); + } + return (TRUE); +} +// ________________________________________________________________________________________________________ +// +// Función: diadelaSemana +// +// Descripción: +// Calcula el número del día de la semana que corresponde a una fecha +// Parámetros: +// - dia: Un día +// - mes: Un mes +// - anno: Un año +// Devuelve: +// El número del día de la semana: 1=Lunes, 2=martes ... 6=sábado 7=domingo +// ________________________________________________________________________________________________________ + +int diadelaSemana(WORD dia,WORD mes,WORD anno) +{ + int i,cont,dias_anuales; + int desplazamiento_dias=6; + int orddiasem; + + cont =0; + for (i=1900;i0) cociente++; + return(cociente); +} +// ________________________________________________________________________________________________________ +// +// Función: buscaAccion +// +// Descripción: +// Busca en la base de datos, acciones programadas +// Parámetros: +// - db: Objeto base de datos (operativo) +// - dia : Día actual del mes +// - mes : mes en curso +// - anno : Año en curso +// - hora : Hora actual +// - minutos : Minutos actuales +// - diasemana : Dia de la semana 1=lunes,2=martes ... ( 0 Domingo) +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algún error +// ________________________________________________________________________________________________________ + +BOOLEAN buscaAccion(Database db,WORD dia,WORD mes,WORD anno,WORD hora,WORD minutos,WORD diasemana) +{ + char msglog[LONSTD], sqlstr[LONSQL]; + Table tbl; + BYTE swampm,bitsemana; + int ordsem,ordulsem,ordiasem_1,maxdias; + int sesionprog; + char modulo[] = "buscaAccion()"; + + /* Año de comienzo */ + anno=anno-ANNOREF; // + /* Preparación hora */ + if(hora>11){ + hora-=12; + swampm=1; // Es P.M. + } + else + swampm=0; // Es am + /* Preparación semana */ + if(diasemana==0) diasemana=7; // El domingo + + // Cuestión semanas + ordiasem_1=diadelaSemana(1,mes,anno+2009); + ordsem=semanadelMes(ordiasem_1,dia); // Calcula el número de la semana + if (mes!=2) // Toma el último día de ese mes + maxdias=dias_meses[mes]; + else{ + if (bisiesto(anno+ANNOREF)) + maxdias=29; + else + maxdias=28; + } + ordulsem=semanadelMes(ordiasem_1,maxdias); // Calcula el número de la última semana + bitsemana=HEX_semanas[ordsem]; + if(ordsem==ordulsem) // Si es la última semana del mes + bitsemana|=HEX_semanas[6]; + + sprintf(sqlstr,"SELECT DISTINCT idprogramacion,tipoaccion,identificador,sesion,idcentro,"\ + "tareas.descripcion as descritarea"\ + " FROM programaciones"\ + " LEFT OUTER JOIN tareas ON tareas.idtarea=programaciones.identificador"\ + " WHERE suspendida=0 "\ + " AND (annos & %d <> 0) "\ + " AND (meses & %d<>0) "\ + " AND ((diario & %d<>0) OR (dias & %d<>0) OR (semanas & %d<>0))"\ + " AND (horas & %d<>0) AND ampm=%d AND minutos=%d",\ + HEX_annos[anno],\ + HEX_meses[mes],\ + HEX_dias[dia],\ + HEX_diasemana[diasemana],\ + bitsemana,\ + HEX_horas[hora],\ + swampm,minutos); + + if (!db.Execute(sqlstr, tbl)) { // Error al leer + errorLog(modulo, 21, FALSE); + db.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + if(tbl.ISEOF()){ + return(TRUE); // No hay acciones programadas + } + + while(!tbl.ISEOF()){ + if(!tbl.Get("idprogramacion",idprogramacion)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + if(!tbl.Get("tipoaccion",tipoaccion)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + if(!tbl.Get("identificador",idtipoaccion)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + if(!tbl.Get("sesion",sesionprog)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + if(!tbl.Get("idcentro",idcentro)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + + if(tipoaccion==EJECUCION_COMANDO){ // Es una programación de un comando + return(ejecutarComando(db,idprogramacion,sesionprog)); + } + else{ + + if(tipoaccion==EJECUCION_TAREA){ + if(!tbl.Get("descritarea",descriaccion)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + return(ejecutarTarea(db,idprogramacion,idtipoaccion)); + } + else{ + if(tipoaccion==EJECUCION_RESERVA){ + EjecutarReserva(idtipoaccion,db); // Es una programación de un trabajo + } + } + } + tbl.MoveNext(); + } + return(TRUE); +} +// ________________________________________________________________________________________________________ +// +// Función: ejecutarComando +// +// Descripción: +// Ejecuta un comando programado +// Parámetros: +// - db: Objeto base de datos (operativo) +// - idcomando: Identificador del comando +// - sesion: Sesión correspondiente al comando cuando se grabó en la tabla acciones +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algún error +// ________________________________________________________________________________________________________ + +BOOLEAN ejecutarComando(Database db,int idprogramacion,int sesion ) +{ + struct tm* st; + char msglog[LONSTD], sqlstr[LONSQL]; + char fechahorareg[24]; + char modulo[] = "ejecutarComando()"; + + st = tomaHora(); + 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); + + sprintf(sqlstr,"UPDATE acciones SET estado=%d,idprogramacion=%d,fechahorareg='%s'"\ + " WHERE sesion=%d", ACCION_INICIADA,idprogramacion,fechahorareg,sesion); + + if (!db.Execute(sqlstr)) { // Error al recuperar los datos + errorLog(modulo, 21, FALSE); + db.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + return(enviaPeticion(idprogramacion)); +} +// ________________________________________________________________________________________________________ +// +// Función: ejecutarProcedimiento +// +// Descripción: +// Ejecuta un procedimiento programado +// Parámetros: +// - db: Objeto base de datos (operativo) +// - idprocedimiento: Identificador del procedimiento +// - ambito: Ámbito de aplicación +// - idambito: Identificador del ámbito +// - restrambito: cadena con los identificadores de los ordenadores a los que se aplica la acción +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algún error +// ________________________________________________________________________________________________________ + +BOOLEAN ejecutarProcedimiento(Database db,int idprocedimiento,int ambito,int idambito,char* restrambito) +{ + char msglog[LONSTD], sqlstr[LONSQL],*parametros; + Table tbl; + int procedimientoid,idcomando,lonprm; + char modulo[] = "ejecutarProcedimiento()"; + + sprintf(sqlstr,"SELECT idcomando,procedimientoid,parametros,length(parametros) as lonprm"\ + " FROM procedimientos_acciones"\ + " WHERE idprocedimiento=%d ORDER BY orden",idprocedimiento); + + if (!db.Execute(sqlstr, tbl)) { // Error al leer + errorLog(modulo, 21, FALSE); + db.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + + if(tbl.ISEOF()){ + return(TRUE); // No exustde tarea + } + while(!tbl.ISEOF()){ + if(!tbl.Get("procedimientoid",procedimientoid)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + if(procedimientoid>0){ // Procedimiento recursivo + if(!ejecutarProcedimiento(db,procedimientoid,ambito,idambito,restrambito)){ + return(false); + } + } + else{ + if(!tbl.Get("lonprm",lonprm)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + parametros = reservaMemoria(lonprm+1); // Reserva para almacenar los parametros del procedimiento + if (parametros == NULL) { + errorLog(modulo, 3, FALSE); + return (FALSE); + } + if(!tbl.Get("parametros",parametros)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + liberaMemoria(parametros); + return (FALSE); + } + liberaMemoria(parametros); + if(!tbl.Get("idcomando",idcomando)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + + if(!insertaComando(db,idcomando,parametros,idprocedimiento,ambito,idambito,restrambito)) + return(false); + } + tbl.MoveNext(); + } + return(TRUE); +} +// ________________________________________________________________________________________________________ +// +// Función: ejecutarTarea +// +// Descripción: +// Ejecuta una tarea programada +// Parámetros: +// - db: Objeto base de datos (operativo) +// - idtarea: Identificador de la tarea +// - idprogramacion: Identificador de la programación +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algún error +// ________________________________________________________________________________________________________ + +BOOLEAN ejecutarTarea(Database db, int idprogramacion, int idtarea) +{ + char msglog[LONSTD], sqlstr[LONSQL]; + Table tbl; + int tareaid,ambito,idambito,idprocedimiento,lonrestrambito; + char* restrambito; + char modulo[] = "ejecutarTarea()"; + + sprintf(sqlstr,"SELECT tareas_acciones.orden,tareas_acciones.idprocedimiento,tareas_acciones.tareaid,"\ + " tareas.ambito,tareas.idambito,tareas.restrambito,length(tareas.restrambito) as lonrestrambito"\ + " FROM tareas"\ + " INNER JOIN tareas_acciones ON tareas_acciones.idtarea=tareas.idtarea"\ + " WHERE tareas_acciones.idtarea=%d ORDER BY tareas_acciones.orden",idtarea); + + if (!db.Execute(sqlstr, tbl)) { // Error al leer + errorLog(modulo, 21, FALSE); + db.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + + if(tbl.ISEOF()){ + return(TRUE); // No existe tarea + } + + while(!tbl.ISEOF()){ + if(!tbl.Get("tareaid",tareaid)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + if(tareaid>0){ // Tarea recursiva + if(!ejecutarTarea(db,idprogramacion,tareaid)){ + return(false); + } + } + else{ + if(!tbl.Get("ambito",ambito)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + if(!tbl.Get("idambito",idambito)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + if(!tbl.Get("lonrestrambito",lonrestrambito)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + restrambito = reservaMemoria(lonrestrambito+1); + if (restrambito == NULL) { + errorLog(modulo, 3, FALSE); + return (FALSE); + } + if(!tbl.Get("restrambito",restrambito)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + liberaMemoria(restrambito); + return (FALSE); + } + liberaMemoria(restrambito); + RecopilaIpesMacs(db,ambito,idambito,restrambito); // Recopila Ipes del ámbito + if(!tbl.Get("idprocedimiento",idprocedimiento)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + sesion=time(NULL); + + if(!ejecutarProcedimiento(db,idprocedimiento,ambito,idambito,restrambito)) + return(FALSE); + } + tbl.MoveNext(); + } + return(enviaPeticion(idprogramacion)); +} +// ________________________________________________________________________________________________________ +// +// Función: ejecutarTarea +// +// Descripción: +// Registra un procedimiento para un ambito concreto +// Parámetros: +// - db: Objeto base de datos (operativo) +// - idcomando: Identificador del comando +// - idprocedimiento: Identificador del procedimiento +// - ambito: Ámbito de aplicación +// - idambito: Identificador del ámbito +// - restrambito: cadena con los identificadores de los ordenadores a los que se aplica la acción +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algún error +//________________________________________________________________________________________________________ +BOOLEAN insertaComando(Database db,int idcomando,char*parametros,int idprocedimiento,int ambito,int idambito,char*restrambito) +{ + char msglog[LONSTD], sqlstr[LONSQL]; + struct tm* st; + char *auxID[MAXIMOS_CLIENTES],*auxIP[MAXIMOS_CLIENTES]; + char fechahorareg[24]; + int i; + char modulo[] = "insertaComando()"; + + if(concli==0) return(TRUE); // No hay ordenadores en el ámbito + + st = tomaHora(); + 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); + + splitCadena(auxID,cadenaid,','); + splitCadena(auxIP,cadenaip,';'); + + for (i=0;iparametros,"nfn=envioProgramacion\r"); // Nombre de la función a ejecutar en el servidor + lon+=sprintf(ptrTrama->parametros+lon,"idp=%d\r",idprogramacion); // Configuración de los Sistemas Operativos del cliente + + if(!enviaMensaje(&socket_c,ptrTrama,MSG_PETICION)){ + errorLog(modulo,91,FALSE); + liberaMemoria(ptrTrama); + return(FALSE); + } + liberaMemoria(ptrTrama); + return(TRUE); +} +// _____________________________________________________________________________________________________________ +// +// Función: RecopilaIpesMacs +// +// Descripción : +// Recopila las IPes, las Macs y los identificadores de ordenadores de un ámbito determinado +// +// Especificaciones: +// Esta Función recibe tres parámatros: +// db : Un objeto Base de datos totalmente operativo +// ambito: Tipo de ámbito +// idambito: Identificador del ámbito +// Devuelve: +// Todas los identificadores de ordenadores , las ipes y las macs de los ordenadores que componen el ámbito +// Para ellos habrá que tener declarada tres variables globales : +// cadenaid,cadenaip y cadenamac +// _____________________________________________________________________________________________________________ + +BOOLEAN RecopilaIpesMacs(Database db,int ambito,int idambito,char *restrambito) +{ + char sqlstr[LONSQL]; + + concli=0; + /* Reserva memoria al meno para caracter nulo */ + cadenaid=(char*) reservaMemoria(1); + cadenaip=(char*) reservaMemoria(1); + cadenamac=(char*) reservaMemoria(1); + + switch(ambito){ + case AMBITO_CENTROS : + sprintf(sqlstr,"SELECT idcentro FROM centros WHERE idcentro=%d",idambito); + RecorreCentro(db,sqlstr); + break; + case AMBITO_GRUPOSAULAS : + sprintf(sqlstr,"SELECT idgrupo FROM grupos WHERE idgrupo=%d AND tipo=%d",idambito,AMBITO_GRUPOSAULAS); + RecorreGruposAulas(db,sqlstr); + break; + case AMBITO_AULAS : + sprintf(sqlstr,"SELECT idaula FROM aulas WHERE idaula=%d",idambito); + RecorreAulas(db,sqlstr); + break; + case AMBITO_GRUPOSORDENADORES : + sprintf(sqlstr,"SELECT idgrupo FROM gruposordenadores WHERE idgrupo=%d",idambito); + RecorreGruposOrdenadores(db,sqlstr); + break; + case AMBITO_ORDENADORES : + sprintf(sqlstr,"SELECT ip,mac,idordenador FROM ordenadores WHERE idordenador=%d",idambito); + RecorreOrdenadores(db,sqlstr); + break; + default: // Se trata de un conjunto aleatorio de ordenadores + sprintf(sqlstr,"SELECT ip,mac,idordenador FROM ordenadores WHERE idordenador IN (%s)",restrambito); + RecorreOrdenadores(db,sqlstr); + + } + return (TRUE); +} +//________________________________________________________________________________________________________ + +BOOLEAN RecorreCentro(Database db, char* sqlstr) +{ + char msglog[LONSTD]; + Table tbl; + int idcentro; + char modulo[] = "RecorreCentro()"; + + if (!db.Execute(sqlstr, tbl)) { // Error al leer + errorLog(modulo, 21, FALSE); + db.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + if(!tbl.ISEOF()){ + if(!tbl.Get("idcentro",idcentro)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + sprintf(sqlstr,"SELECT idgrupo FROM grupos WHERE idcentro=%d AND grupoid=0 AND tipo=%d",idcentro,AMBITO_GRUPOSAULAS); + RecorreGruposAulas(db,sqlstr); + sprintf(sqlstr,"SELECT idaula FROM aulas WHERE idcentro=%d AND grupoid=0",idcentro); + RecorreAulas(db,sqlstr); + } + return (TRUE); +} +//________________________________________________________________________________________________________ + +BOOLEAN RecorreGruposAulas(Database db, char* sqlstr) +{ + char msglog[LONSTD]; + Table tbl; + int idgrupo; + char modulo[] = "RecorreGruposAulas()"; + + if (!db.Execute(sqlstr, tbl)) { // Error al leer + errorLog(modulo, 21, FALSE); + db.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + while(!tbl.ISEOF()){ + if(!tbl.Get("idgrupo",idgrupo)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + sprintf(sqlstr,"SELECT idgrupo FROM grupos WHERE grupoid=%d AND tipo=%d",idgrupo,AMBITO_GRUPOSAULAS); + RecorreGruposAulas(db,sqlstr); + sprintf(sqlstr,"SELECT idaula FROM aulas WHERE grupoid=%d",idgrupo); + RecorreAulas(db,sqlstr); + tbl.MoveNext(); + } + return (TRUE); +} +//________________________________________________________________________________________________________ + +BOOLEAN RecorreAulas(Database db, char* sqlstr) +{ + char msglog[LONSTD]; + Table tbl; + int idaula; + char modulo[] = "RecorreAulas()"; + + if (!db.Execute(sqlstr, tbl)) { // Error al leer + errorLog(modulo, 21, FALSE); + db.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + while(!tbl.ISEOF()){ + if(!tbl.Get("idaula",idaula)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + sprintf(sqlstr,"SELECT idgrupo FROM gruposordenadores WHERE idaula=%d AND grupoid=0",idaula); + RecorreGruposOrdenadores(db,sqlstr); + sprintf(sqlstr,"SELECT ip,mac,idordenador FROM ordenadores WHERE idaula=%d AND grupoid=0",idaula); + RecorreOrdenadores(db,sqlstr); + tbl.MoveNext(); + } + return (TRUE); +} +//________________________________________________________________________________________________________ + +BOOLEAN RecorreGruposOrdenadores(Database db, char* sqlstr) +{ + char msglog[LONSTD]; + Table tbl; + int idgrupo; + char modulo[] = "RecorreGruposOrdenadores()"; + + if (!db.Execute(sqlstr, tbl)) { // Error al leer + errorLog(modulo, 21, FALSE); + db.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + while(!tbl.ISEOF()){ + if(!tbl.Get("idgrupo",idgrupo)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + sprintf(sqlstr,"SELECT idgrupo FROM gruposordenadores WHERE grupoid=%d",idgrupo); + RecorreGruposOrdenadores(db,sqlstr); + sprintf(sqlstr,"SELECT ip,mac,idordenador FROM ordenadores WHERE grupoid=%d",idgrupo); + RecorreOrdenadores(db,sqlstr); + tbl.MoveNext(); + } + return (TRUE); +} +//________________________________________________________________________________________________________ + +BOOLEAN RecorreOrdenadores(Database db, char* sqlstr) +{ + char msglog[LONSTD]; + Table tbl; + int idordenador,o,p,m,lon; + char ido[16],ip[LONIP],mac[LONMAC]; + char modulo[] = "RecorreOrdenadores()"; + + if (!db.Execute(sqlstr, tbl)) { // Error al leer + errorLog(modulo, 21, FALSE); + db.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + o=p=m=0; + while(!tbl.ISEOF()){ + if(!tbl.Get("idordenador",idordenador)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + if(!tbl.Get("ip",ip)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + if(!tbl.Get("mac",mac)){ + tbl.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + return (FALSE); + } + sprintf(ido,"%d",idordenador); + lon=strlen(ido); + if(lon>16) lon=16; + cadenaid=(char*) ampliaMemoria(cadenaid,o+lon+1); + memcpy(&cadenaid[o],ido,lon); + o+=lon; + cadenaid[o++]=','; + + lon=strlen(ip); + if(lon>16) lon=LONIP; + cadenaip=(char*) ampliaMemoria(cadenaip,p+lon+1); + memcpy(&cadenaip[p],ip,lon); + p+=lon; + cadenaip[p++]=';'; + + lon=strlen(mac); + if(lon>16) lon=LONMAC; + cadenamac=(char*) ampliaMemoria(cadenamac,m+lon+1); + memcpy(&cadenamac[m],mac,lon); + m+=lon; + cadenamac[m++]=';'; + + concli++; + tbl.MoveNext(); + } + if(o>0) o--; + if(p>0) p--; + if(m>0) m--; + cadenaid[o]='\0'; + cadenaip[p]='\0'; + cadenamac[m]='\0'; + + return (TRUE); +} +// ******************************************************************************************************** +// PROGRAMA PRINCIPAL (SERVICIO) +// ******************************************************************************************************** +int main(int argc, char *argv[]) +{ + int pseg; + char msglog[LONSTD]; + struct tm* st; + Database db; + char modulo[] = "main()"; + + /* Validación de parámetros de ejecución y lectura del fichero de configuración del servicio */ + + if (!validacionParametros(argc, argv, 5)) // Valida parámetros de ejecución + exit(EXIT_FAILURE); + + if (!tomaConfiguracion(szPathFileCfg)) { // Toma parametros de configuracion + exit(EXIT_FAILURE); + } + + /* Bucle principal del servicio */ + + while (TRUE){ + st = tomaHora(); + pseg=65-st->tm_sec; // Calcula segundos de inactividad de la hebra + sleep(pseg); + + // Toma la hora + st = tomaHora(); + + if (!db.Open(usuario, pasguor, datasource, catalog)) { // Error de conexion + errorLog(modulo, 20, FALSE); + db.GetErrorErrStr(msglog); + errorInfo(modulo, msglog); + exit(EXIT_FAILURE); + } + buscaAccion(db,st->tm_mday,st->tm_mon+1,st->tm_year+1900,st->tm_hour,st->tm_min,st->tm_wday ); + db.Close(); // Cierra conexión + } + exit(EXIT_SUCCESS); +} + + diff --git a/doc/CHANGELOG.es.txt b/doc/CHANGELOG.es.txt index 22c9edac..f8cd9eda 100644 --- a/doc/CHANGELOG.es.txt +++ b/doc/CHANGELOG.es.txt @@ -17,7 +17,7 @@ Tickets resueltos en módulo OpenGnsys Client: Tickets resueltos en módulo OpenGnsys Server: #846 Configuración de logrotate para que incluya todos los servicios de OpenGnsys (corrección) #859 Gestor de los ficheros PXE duplicado -#886 Actualización de la 1.0.6b a la 1.1.0 da errores a la hora de agregar ordenadores/aulas (no válido) +#904 ogAdmClient se cuelga al programar una tarea para un equipo Tickets resueltos en módulo OpenGnsys Repository Server: #850 Problema con repositorio recién instalado (corrección) @@ -32,7 +32,8 @@ Tickets resueltos en módulo OpenGnsys Web Admin Console: Tickets resueltos en módulo OpenGnsys Installer: #876 Problemas al actualizar desde Subversion a Git (corrección) #879 Función checkVersion de opengnsys_update.sh del tar.gz da error si se ejecuta sobre la misma versión de OpenGnsys (corrección) -#880 openGnsys_update.sh no deja la revisión, solo deja 1.1.0a (corrección +#880 openGnsys_update.sh no deja la revisión, solo deja 1.1.0a (corrección) +#886 Actualización de la 1.0.6b a la 1.1.0 da errores a la hora de agregar ordenadores/aulas (no válido) Tickets genéricos resueltos: #839 Errores detectado en API REST para Remote PC (corrección) diff --git a/installer/vagrant/Vagrantfile-1.0.6b-vbox b/installer/vagrant/Vagrantfile-1.0.6b-vbox index 2db25e1c..4317c654 100644 --- a/installer/vagrant/Vagrantfile-1.0.6b-vbox +++ b/installer/vagrant/Vagrantfile-1.0.6b-vbox @@ -42,7 +42,7 @@ fi # Install OpenGnsys and change server address. wget -q https://opengnsys.es/svn/tags/opengnsys-1.0.6b/installer/opengnsys_installer.sh -O - | bash || exit $? mv /opt/opengnsys/log/bash.log /opt/opengnsys/log/opengnsys_installer.log -echo y | /opt/opengnsys/bin/setserveraddr eth1 +echo y | /opt/opengnsys/bin/setserveraddr $(ip -o link show | tail -1 | cut -d: -f2) # Insert DHCP data. for ((i=#{NCLIENTS+10}; i>10; i--)); do sed -i "/^}$/ i host pc${i} { hardware ethernet #{MACPREFIX}:${i}; fixed-address #{NETPREFIX}.${i}; }" /etc/dhcp/dhcpd.conf diff --git a/installer/vagrant/Vagrantfile-devel-vbox b/installer/vagrant/Vagrantfile-devel-vbox index 2e0bdce7..23757f0d 100644 --- a/installer/vagrant/Vagrantfile-devel-vbox +++ b/installer/vagrant/Vagrantfile-devel-vbox @@ -45,7 +45,7 @@ elif which wget &>/dev/null; then fi $DOWNLOAD -s https://raw.githubusercontent.com/opengnsys/OpenGnsys/devel/installer/opengnsys_installer.sh | bash || exit $? mv /opt/opengnsys/log/bash.log /opt/opengnsys/log/opengnsys_installer.log -echo y | /opt/opengnsys/bin/setserveraddr enp0s8 +echo y | /opt/opengnsys/bin/setserveraddr $(ip -o link show | tail -1 | cut -d: -f2) # Insert DHCP data. for ((i=#{NCLIENTS+10}; i>10; i--)); do sed -i "/^}$/ i host pc${i} { hardware ethernet #{MACPREFIX}:${i}; fixed-address #{NETPREFIX}.${i}; }" /etc/dhcp/dhcpd.conf diff --git a/installer/vagrant/Vagrantfile-prod-vbox b/installer/vagrant/Vagrantfile-prod-vbox index fa6f6ded..fbb7543b 100644 --- a/installer/vagrant/Vagrantfile-prod-vbox +++ b/installer/vagrant/Vagrantfile-prod-vbox @@ -45,7 +45,7 @@ elif which wget &>/dev/null; then fi $DOWNLOAD -s https://raw.githubusercontent.com/opengnsys/OpenGnsys/master/installer/opengnsys_installer.sh | bash || exit $? mv /opt/opengnsys/log/bash.log /opt/opengnsys/log/opengnsys_installer.log -echo y | /opt/opengnsys/bin/setserveraddr enp0s8 +echo y | /opt/opengnsys/bin/setserveraddr $(ip -o link show | tail -1 | cut -d: -f2) # Insert DHCP data. for ((i=#{NCLIENTS+10}; i>10; i--)); do sed -i "/^}$/ i host pc${i} { hardware ethernet #{MACPREFIX}:${i}; fixed-address #{NETPREFIX}.${i}; }" /etc/dhcp/dhcpd.conf diff --git a/server/lib/security-config b/server/lib/security-config index eb8bf5cf..d7f90d4a 100755 --- a/server/lib/security-config +++ b/server/lib/security-config @@ -22,13 +22,13 @@ fi if which ufw 2>/dev/null; then # Adding active services. ufw allow "Apache Secure" + ufw allow from 127.0.0.1/8 to any port mysql proto tcp # MySQL from the loopback ufw allow OpenSSH ufw allow Samba - ufw allow mysql ufw allow rsync ufw allow tftp ufw allow 67,68/udp # DHCP - ufw allow 2002,2008/tcp # OpenGnsys services + ufw allow 2002,2008,2009,2011/tcp # OpenGnsys services ufw allow 9000:9051/udp # Multicast ufw allow 6881:6999/udp # BitTorrent # Applying configuration. @@ -41,11 +41,11 @@ import firewall.core.io.service as ios s=ios.Service() s.short = 'OpenGnsys Server' s.name = 'ogAdmServer' -s.ports = [('2008', 'tcp')] +s.ports = [('2008', 'tcp'), ('2011', 'tcp')] ios.service_writer(s, '/etc/firewalld/services') s.short = 'OpenGnsys Repository' s.name = 'ogAdmRepo' -s.ports = [('2002', 'tcp')] +s.ports = [('2002', 'tcp'), ('2009', 'tcp')] ios.service_writer(s, '/etc/firewalld/services')" # Adding active services. firewall-cmd --permanent --add-service=dhcp @@ -71,15 +71,18 @@ fi # SELinux configuration. if which setsebool 2>/dev/null; then - # Configuring Apache. - setsebool -P httpd_can_connect_ldap on - semanage fcontext -at httpd_sys_content_t "$OPENGNSYS/www(/.*)?" - # Configuring Samba. - setsebool -P samba_export_all_ro=1 samba_export_all_rw=1 - semanage fcontext -at samba_share_t "$OPENGNSYS/client(/.*)?" - semanage fcontext -at samba_share_t "$OPENGNSYS/images(/.*)?" - # Applying configuration. - restorecon -R $OPENGNSYS + if selinuxenabled 2>/dev/null; then + # Configuring Apache. + setsebool -P httpd_can_connect_ldap on + semanage fcontext -at httpd_sys_content_t "$OPENGNSYS/www(/.*)?" + # Configuring Samba. + setsebool -P samba_export_all_ro=1 samba_export_all_rw=1 + semanage fcontext -at samba_share_t "$OPENGNSYS/client(/.*)?" + semanage fcontext -at samba_share_t "$OPENGNSYS/images(/.*)?" + # Applying configuration. + restorecon -R $OPENGNSYS + else + echo "$PROG: Warning: SELinux is disabled, it won't be configured." else echo "$PROG: Warning: SELinux won't be configured (policycoreutils is not installed)." fi -- cgit v1.2.3-18-g5258