// **************************************************************************************************************************************************** // Aplicación HIDRA // Copyright 2003-2005 JosnManuel Alonso. Todos los derechos reservados. // Fichero: hidra.cpp // Descripcin: // Este proyecto implementa el servicio hidra en un ordenador con plataforma windows NT. Este fichero aporta las funciones de // envn de comandos y recepcin de respuestas // **************************************************************************************************************************************************** #include "ogAdmServer.h" #include "encriptacion.c" // ________________________________________________________________________________________________________ // Funcin: RegistraLog // // Descripción: // Esta funcin registra los evento de errores en un fichero log // Parametros: // - msg : Mensage de error // - swerrno: Switch que indica que recupere literal de error del sistema // ________________________________________________________________________________________________________ void RegistraLog(const char *msg,int swerrno) { struct tm * timeinfo; timeinfo = TomaHora(); FLog=fopen(szPathFileLog,"at"); if(swerrno) fprintf (FLog,"%02d/%02d/%d %02d:%02d ***%s:%s\n",timeinfo->tm_mday,timeinfo->tm_mon+1,timeinfo->tm_year+1900,timeinfo->tm_hour,timeinfo->tm_min,msg,strerror(errno)); else fprintf (FLog,"%02d/%02d/%d %02d:%02d ***%s\n",timeinfo->tm_mday,timeinfo->tm_mon+1,timeinfo->tm_year+1900,timeinfo->tm_hour,timeinfo->tm_min,msg); fclose(FLog); } // ________________________________________________________________________________________________________ // Funcin: TomaHora // // Descripcin: // Esta funcin toma la hora actual del sistema y devuelve una estructura conlos datos // Parametros: // - msg : Mensage de error // - swerrno: Switch que indica que recupere literal de error del sistema // ________________________________________________________________________________________________________ struct tm * TomaHora() { time_t rawtime; time ( &rawtime ); return(gmtime(&rawtime)); } //________________________________________________________________________________________________________ // // Función: TomaConfiguracion // // Descripción: // Esta función lee el fichero de configuración del programa hidralinuxcli y toma los parametros // Parametros: // - pathfilecfg : Ruta al fichero de configuración //________________________________________________________________________________________________________ int TomaConfiguracion(char* pathfilecfg) { long lSize; char * buffer,*lineas[100],*dualparametro[2]; char ch[2]; int i,numlin,resul; if(pathfilecfg==NULL) return(FALSE); // Nombre del fichero en blanco Fconfig = fopen ( pathfilecfg , "rb" ); if (Fconfig==NULL) return(FALSE); fseek (Fconfig , 0 , SEEK_END); // Obtiene tamaño del fichero. lSize = ftell (Fconfig); rewind (Fconfig); buffer = (char*) malloc (lSize); // Toma memoria para el buffer de lectura. if (buffer == NULL) return(FALSE); fread (buffer,1,lSize,Fconfig); // Lee contenido del fichero fclose(Fconfig); //inicializar IPlocal[0]=(char)NULL; servidorhidra[0]=(char)NULL; Puerto[0]=(char)NULL; usuario[0]=(char)NULL; pasguor[0]=(char)NULL; datasource[0]=(char)NULL; catalog[0]=(char)NULL; strcpy(ch,"\n");// caracter delimitador ( salto de linea) numlin=split_parametros(lineas,buffer,ch); for (i=0;i 0){ ret = send(sock,(char*)&trama[idx], nLeft, 0); if (ret == 0){ break; } else if (ret == SOCKET_ERROR){ RegistraLog("***send() fallo en hebra cliente",true); return(FALSE); } nLeft -= ret; idx += ret; } return(TRUE); } // ________________________________________________________________________________________________________ // Funcin: recibe_trama // // Descripcin: // Esta funcin recibe una trama por la red (TCP) // Parametros: // - sock : El socket del cliente // - trama: El buffer para recibir la trama // ________________________________________________________________________________________________________ int recibe_trama(SOCKET sock,TRAMA* trama) { int ret; while(1){ // Bucle para recibir datos del cliente ret = recv(sock,(char*)trama,LONGITUD_TRAMA,0); if (ret == 0) // Conexin cerrada por parte del cliente (Graceful close) break; else{ if (ret == SOCKET_ERROR){ RegistraLog("***recv() fallo en recepcion trama",true); return (FALSE); } else // Datos recibidos break; } } Desencriptar((char*)trama); trama->parametros[ret-11]=(char)NULL; // Coloca caracter fin de cadena en trama return(TRUE); } // ________________________________________________________________________________________________________ // Funcin: hay_hueco // // Descripcin: // Esta funcin devuelve true o false dependiendo de que haya hueco en la tabla de sockets para un nuevo cliente. // Parametros: // - idx: Primer indice libre que se podrn utilizar // ________________________________________________________________________________________________________ int hay_hueco(int *idx) { int i; for (i=0;iMAXHARDWARE) lon=MAXHARDWARE; // Trocea la cadena de configuracin strcpy(ch,"\n");// caracter delimitador lon=split_parametros(tbHardware,hrd,ch); // Trocea las cadenas de parametros de particin for (i=0;iarroba='@'; strncpy(trama->identificador,"JMMLCAMDJ",9); trama->ejecutor='1'; lon=sprintf(trama->parametros,"nfn=RESPUESTA_inclusionREPO\r"); lon+=sprintf(trama->parametros+lon,"prp=%d\r",puertorepo); lon+=sprintf(trama->parametros+lon,"pth=%s\r",PathHidra); lon+=sprintf(trama->parametros+lon,"ptx=%s\r",PathPXE); lon+=sprintf(trama->parametros+lon,"usu=%s\r",usuario); lon+=sprintf(trama->parametros+lon,"pwd=%s\r",pasguor); lon+=sprintf(trama->parametros+lon,"dat=%s\r",datasource); lon+=sprintf(trama->parametros+lon,"cat=%s\r",catalog); return(manda_trama(s,trama)); } // ________________________________________________________________________________________________________ // Funcin: Sondeo // // Descripcin: // Esta funcin recupera el estado de los ordenadores solicitados // Parnetros: // - s: Socket del servidor web que envn el comando // - parametros: Parnetros de la trama enviada por nte // ________________________________________________________________________________________________________ int Sondeo(SOCKET s,char *parametros) { char *iph; char nwparametros[LONGITUD_PARAMETROS]; int j; iph=toma_parametro("iph",parametros); // Toma ip nwparametros[0]='\0'; strcat(nwparametros,"tso="); // Compone retorno tso ( sistemas operativos de los clientes ) for (j=0;jparametros,"nfn=Actualizar\r"); manda_comando(tbsockets[i].sock,(char*)trama->parametros); } borra_entrada(i); } } } } } int j; for (j=0;jtm_year+1900,st->tm_mon+1,st->tm_mday,st->tm_hour,st->tm_min,st->tm_sec); // Graba notificacin sprintf(sqlstr,"INSERT INTO notificaciones (accionid,idnotificador,fechahorareg,resultado,descrinotificacion) VALUES (%s,%s,'%s','%s','%s')",ids,ido,fechareg,res,der); if(!db.Execute(sqlstr)){ // Error al insertar db.GetErrorErrStr(ErrStr); pthread_mutex_unlock(&guardia); return(false); } if(strcmp(res,ACCION_FALLIDA)==0 && strcmp(resultado,ACCION_SINERRORES)==0){ // Accion fallida en el cliente rembo sprintf(sqlstr,"Update acciones set resultado='%s' WHERE idaccion=%s",ACCION_CONERRORES,ids); strcpy(resultado,ACCION_CONERRORES); if(!db.Execute(sqlstr)){ // Error al actualizar db.GetErrorErrStr(ErrStr); pthread_mutex_unlock(&guardia); return(false); } } // Comprueba si la accin se ejecutncorrectamente para el ambito sumando notificaciones INTROaFINCAD(parametros); iph=toma_parametro("iph",parametros); // Toma cadenaip int tbnumipes=0,totalipes=1,lon; lon=strlen(iph); for (i=0;itm_year+1900,st->tm_mon+1,st->tm_mday,st->tm_hour,st->tm_min,st->tm_sec); // Actualizacion despues de que todos los ordenadores han notificado if(strcmp(resultado,ACCION_SINERRORES)==0){ // Accion finalizada con exito sprintf(sqlstr,"Update acciones set estado='%s',resultado='%s',fechahorafin='%s' WHERE idaccion=%s",ACCION_FINALIZADA,ACCION_EXITOSA,fechareg,ids); if(!db.Execute(sqlstr,tbl)){ // Error al actualizar db.GetErrorErrStr(ErrStr); pthread_mutex_unlock(&guardia); return(false); } } if(strcmp(resultado,ACCION_CONERRORES)==0){ // Accion finalizada con errores sprintf(sqlstr,"Update acciones set estado='%s',resultado='%s',fechahorafin='%s' WHERE idaccion=%s",ACCION_FINALIZADA,ACCION_FALLIDA,fechareg,ids); if(!db.Execute(sqlstr,tbl)){ // Error al actualizar db.GetErrorErrStr(ErrStr); pthread_mutex_unlock(&guardia); return(false); } } resul=true; if(accionid>0){ // Existe accion padre que hay que actualizar resul=InsertaNotificaciones(idaccion,idnotificador,accionid,resultado,db); if(resul) resul=comprueba_resultados(accionid,db); } pthread_mutex_unlock(&guardia); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// return(resul); } // ________________________________________________________________________________________________________ // Funcin: RESPUESTA_CrearPerfilSoftware // // Descripcin: // Responde al comando Crear Perfil Software // Parnetros: // - s: Socket que el cliente rembo usa para comunicarse con el servidor HIDRA // - parametros: parametros del comando // ________________________________________________________________________________________________________ int RESPUESTA_CrearPerfilSoftware(SOCKET s,char *parametros) { char ErrStr[200],sqlstr[1000]; char *res,*der,*ids,*ifh,*ifs,*iph,*ido; Database db; Table tbl; if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion db.GetErrorErrStr(ErrStr); return(false); } res=toma_parametro("res",parametros); // Toma resultado der=toma_parametro("der",parametros); // Toma descripcin del error ( si hubiera habido) ids=toma_parametro("ids",parametros); // Toma idperfilsoft iph=toma_parametro("iph",parametros); // Toma ip ido=toma_parametro("ido",parametros); // Toma dentificador del ordenador ifh=toma_parametro("ifh",parametros); // Toma idperfilhard ifs=toma_parametro("ifs",parametros); // Toma idperfilsoft if(!RespuestaEstandar(res,der,ids,ido,db,tbl)){ return(false); // Error al registrar notificacion } if(strcmp(res,ACCION_FALLIDA)==0) { // Ha habido algn error en la ejecucin de la accin en el cliente rembo db.Close(); return(false); } sprintf(sqlstr,"Select * from perfileshard_perfilessoft WHERE idperfilhard=%s AND idperfilsoft=%s",ifh,ifs); if(!db.Execute(sqlstr,tbl)){ // Error al consultar db.GetErrorErrStr(ErrStr); return(false); } if(!tbl.ISEOF()){ // Si ya existe el registro ... no hace falta insertarlo db.Close(); return(false); } sprintf(sqlstr,"INSERT INTO perfileshard_perfilessoft (idperfilhard,idperfilsoft) VALUES(%s,%s)",ifh,ifs); if(!db.Execute(sqlstr,tbl)){ // Error al insertar db.GetErrorErrStr(ErrStr); return(false); } db.Close(); return(true); } // ________________________________________________________________________________________________________ // Funcin: RESPUESTA_CrearSoftwareIncremental // // Descripcin: // Esta funcin responde a un comando de creacin de un software incremental. Ademn actualiza la base de datos insertando // en su caso la nueva combinacin de perfil software con incremental. // Parnetros: // - s: Socket que el cliente rembo usa para comunicarse con el servidor HIDRA // - parametros: parametros del comando // ________________________________________________________________________________________________________ int RESPUESTA_CrearSoftwareIncremental(SOCKET s,char *parametros) { char ErrStr[200],sqlstr[1000]; char *res,*der,*ids,*ifh,*ifs,*icr,*iph,*ido; int idphardidpsoft; Database db; Table tbl; if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion db.GetErrorErrStr(ErrStr); return(false); } res=toma_parametro("res",parametros); // Toma resultado der=toma_parametro("der",parametros); // Toma descripcin del error ( si hubiera habido) ids=toma_parametro("ids",parametros); // Toma idperfilsoft iph=toma_parametro("iph",parametros); // Toma ip ido=toma_parametro("ido",parametros); // Toma dentificador del ordenador ifh=toma_parametro("ifh",parametros); // Toma idperfilhard ifs=toma_parametro("ifs",parametros); // Toma idperfilsoft icr=toma_parametro("icr",parametros); // Toma idsoftincremental if(!RespuestaEstandar(res,der,ids,ido,db,tbl)){ return(false); // Error al registrar notificacion } if(strcmp(res,ACCION_FALLIDA)==0) { // Ha habido algn error en la ejecucin de la accin en el cliente rembo db.Close(); return(false); } sprintf(sqlstr,"Select idphardidpsoft from perfileshard_perfilessoft WHERE idperfilhard=%s AND idperfilsoft=%s",ifh,ifs); if(!db.Execute(sqlstr,tbl)){ // Error al consultar db.GetErrorErrStr(ErrStr); return(false); } if(tbl.ISEOF()){ // Si no existe el registro ... db.Close(); return(false); } if(!tbl.Get("idphardidpsoft",idphardidpsoft)){ // Recupera el identificador de la combinacin de perfiles tbl.GetErrorErrStr(ErrStr); // error al recuperar el campo return(false); } sprintf(sqlstr,"Select * from phard_psoft_softincremental WHERE idphardidpsoft=%d AND idsoftincremental=%s",idphardidpsoft,icr); if(!db.Execute(sqlstr,tbl)){ // Error al consultar db.GetErrorErrStr(ErrStr); return(false); } if(!tbl.ISEOF()){ // Si ya existe el registro ... db.Close(); return(false); } sprintf(sqlstr,"INSERT INTO phard_psoft_softincremental (idphardidpsoft,idsoftincremental) VALUES(%d,%s)",idphardidpsoft,icr); if(!db.Execute(sqlstr,tbl)){ // Error al insertar db.GetErrorErrStr(ErrStr); return(false); } db.Close(); return(true); } // ________________________________________________________________________________________________________ // Funcin: RESPUESTA_RestaurarImagen // // Descripcin: // Esta funcin responde a un comando de restauracin de una imagen. Ademn actualiza la base de datos. // Parnetros: // - s: Socket que el cliente rembo usa para comunicarse con el servidor HIDRA // - parametros: parametros del comando // ________________________________________________________________________________________________________ int RESPUESTA_RestaurarImagen(SOCKET s,char *parametros) { char ErrStr[200],gido[20]; char *res,*der,*ids,*iph,*ido,*idi,*par,*cfg; Database db; Table tbl; if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion db.GetErrorErrStr(ErrStr); return(false); } INTROaFINCAD(parametros); res=toma_parametro("res",parametros); // Toma resultado der=toma_parametro("der",parametros); // Toma descripcin del error ( si hubiera habido) ids=toma_parametro("ids",parametros); // Toma identificador de la accion iph=toma_parametro("iph",parametros); // Toma ip ido=toma_parametro("ido",parametros); // Toma identificador del ordenador cfg=toma_parametro("cfg",parametros); // Toma configuracin par=toma_parametro("par",parametros); // particion idi=toma_parametro("idi",parametros); // identificador de la imagen strcpy(gido,ido); // Guarda el identificador del ordenador if(!RespuestaEstandar(res,der,ids,ido,db,tbl)){ return(false); // Error al registrar notificacion } if(strcmp(res,ACCION_FALLIDA)==0) { // Ha habido algn error en la ejecucin de la accin del cliente rembo db.Close(); return(false); } if(!actualiza_configuracion(db,tbl,cfg,0,0,iph)) return(false); // Erro al actualiza la configuracin if(!Actualiza_ordenador_imagen(par,idi,gido,db)) return(false); db.Close(); return(true); } // ________________________________________________________________________________________________________ // Funcin: Actualiza_ordenador_imagen // // Descripcin: // Esta funcin actualiza la tabla ordenador_imagen // Parnetros: // - par: particion // - idi: identificador de la imagen ( 0 ninguna ) // - ido: identificador del ordenador // - db: Conexin ADO operativa // ________________________________________________________________________________________________________ int Actualiza_ordenador_imagen(char *par,const char *idi,char *ido,Database db) { char ErrStr[200],sqlstr[1000]; Table tbl; int idimagen,idimagenres; idimagenres=atoi(idi); if(idimagenres==0){ // Se ha formateado la particin y se ha borrado la imagen por tanto sprintf(sqlstr,"DELETE FROM ordenador_imagen WHERE idordenador=%s AND particion=%s",ido,par); if(!db.Execute(sqlstr)){ // Error al insertar db.GetErrorErrStr(ErrStr); return(false); } return(true); } sprintf(sqlstr,"SELECT idimagen FROM ordenador_imagen INNER JOIN ordenadores ON ordenador_imagen.idordenador = ordenadores.idordenador WHERE ordenadores.idordenador = %s AND ordenador_imagen.particion = %s",ido,par); if(!db.Execute(sqlstr,tbl)){ // Error al consultar db.GetErrorErrStr(ErrStr); return(false); } if(!tbl.ISEOF()){ // Existe registro if(!tbl.Get("idimagen",idimagen)){ tbl.GetErrorErrStr(ErrStr); // error al acceder al registro return(false); } else{ if (idimagenres!=idimagen){ sprintf(sqlstr,"Update ordenador_imagen set idimagen=%s WHERE idordenador=%s AND particion=%s",idi,ido,par); if(!db.Execute(sqlstr)){ // Error al actualizar db.GetErrorErrStr(ErrStr); return(false); } } } } else{ // No existe el registro sprintf(sqlstr,"INSERT INTO ordenador_imagen (idordenador,particion,idimagen) VALUES(%s,%s,%s)",ido,par,idi); if(!db.Execute(sqlstr)){ // Error al insertar db.GetErrorErrStr(ErrStr); return(false); } } return(true); } // ________________________________________________________________________________________________________ // Funcin: RESPUESTA_ParticionaryFormatear // // Descripcin: // Esta funcin responde a un comando de particionar y formatear. Ademn actualiza la base de datos. // Parnetros: // - s: Socket que el cliente rembo usa para comunicarse con el servidor HIDRA // - parametros: parametros del comando // ________________________________________________________________________________________________________ int RESPUESTA_ParticionaryFormatear(SOCKET s,char *parametros) { char sqlstr[1000],ErrStr[200],gido[20]; Database db; Table tbl; char *res,*der,*ids,*iph,*ido,*cfg; res=toma_parametro("res",parametros); // Toma resultado der=toma_parametro("der",parametros); // Toma descripcin del error ( si hubiera habido) ids=toma_parametro("ids",parametros); // Toma identificador de la accin iph=toma_parametro("iph",parametros); // Toma ip ido=toma_parametro("ido",parametros); // Toma identificador del ordenador cfg=toma_parametro("cfg",parametros); // Toma configuracin strcpy(gido,ido); // Guarda el identificador del ordenador if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion db.GetErrorErrStr(ErrStr); return(false); } if(!RespuestaEstandar(res,der,ids,ido,db,tbl)){ return(false); // Error al registrar notificacion } if(strcmp(res,ACCION_FALLIDA)==0){ db.Close(); return(true); // Ha habido algn error en la ejecucin de la accin del cliente rembo } if(!actualiza_configuracion(db,tbl,cfg,0,0,iph)) return(false); // Erro al actualiza la configuracin // Elimina informacin sobre imagenes en este ordenador, al haber sido formateado sprintf(sqlstr,"DELETE FROM ordenador_imagen WHERE idordenador=%s",gido); if(!db.Execute(sqlstr)){ // Error al insertar db.GetErrorErrStr(ErrStr); return(false); } db.Close(); return(true); } // ________________________________________________________________________________________________________ // Funcin: RESPUESTA_Configurar // // Descripcin: // Esta funcin responde a un comando de Configurar. Ademn actualiza la base de datos. // Parnetros: // - s: Socket que el cliente rembo usa para comunicarse con el servidor HIDRA // - parametros: parametros del comando // ________________________________________________________________________________________________________ int RESPUESTA_Configurar(SOCKET s,char *parametros) { char ErrStr[200],gids[20],gido[20]; Database db; Table tbl; int lon,resul,i; char *res,*der,*ids,*iph,*ido,*cfg,*hdc; res=toma_parametro("res",parametros); // Toma resultado der=toma_parametro("der",parametros); // Toma descripcin del error ( si hubiera habido) ids=toma_parametro("ids",parametros); // Toma idperfilsoft iph=toma_parametro("iph",parametros); // Toma ip ido=toma_parametro("ido",parametros); // Toma identificador del ordenador cfg=toma_parametro("cfg",parametros); // Toma configuracin hdc=toma_parametro("hdc",parametros); // Toma participaciones a formatear strcpy(gids,ids); // Guarda el identificador de la accin strcpy(gido,ido); // Guarda el identificador del ordenador if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion db.GetErrorErrStr(ErrStr); return(false); } if(!RespuestaEstandar(res,der,ids,ido,db,tbl)){ return(false); // Error al registrar notificacion } if(strcmp(res,ACCION_FALLIDA)==0){ db.Close(); return(true); // Ha habido algn error en la ejecucin de la accin del cliente rembo } if(!actualiza_configuracion(db,tbl,cfg,0,0,iph)) return(false); // Erro al actualiza la configuracin lon=strlen(hdc); for(i=0;itm_year+1900,st->tm_mon+1,st->tm_mday,st->tm_hour,st->tm_min,st->tm_sec); strcpy(descrinotificacion," "); if(strcmp(resultado,ACCION_CONERRORES)==0) { strcpy(descrinotificacion,"Ha ocurrido algn error en la ejecucin de esta tarea."); strcpy(resultado,ACCION_FALLIDA); } if(strcmp(resultado,ACCION_SINERRORES)==0) strcpy(resultado,ACCION_EXITOSA); sprintf(sqlstr,"INSERT INTO notificaciones (accionid,idnotificador,fechahorareg,resultado,descrinotificacion,idaccion) VALUES (%d,%d,'%s','%s','%s',%d)",accionid,idnotificador,fechahorareg,resultado,descrinotificacion,idaccion); if(!db.Execute(sqlstr)){ // Error al insertar db.GetErrorErrStr(ErrStr); return(false); } return(true); } // ________________________________________________________________________________________________________ int comprueba_resultados(int idaccion,Database db){ char ErrStr[200],sqlstr[1000]; int numfallidas; char finalaccion[2]; Table tbl; sprintf(sqlstr,"SELECT COUNT(*) as numfallidas FROM notificaciones WHERE resultado='%s' AND accionid=%d",ACCION_FALLIDA,idaccion); if(!db.Execute(sqlstr,tbl)){ // Error al consultar db.GetErrorErrStr(ErrStr); return(false); } if(tbl.ISEOF()) return(false); // No existe registro de acciones if(!tbl.Get("numfallidas",numfallidas)){ // Toma dato tbl.GetErrorErrStr(ErrStr); // error al acceder al registro return(false); } if(numfallidas>0) strcpy(finalaccion,ACCION_CONERRORES); else strcpy(finalaccion,ACCION_SINERRORES); sprintf(sqlstr,"UPDATE acciones SET resultado='%s' WHERE idaccion=%d",finalaccion,idaccion); if(!db.Execute(sqlstr,tbl)){ // Error al actualizar db.GetErrorErrStr(ErrStr); return(false); } // Comprueba si ha finalizado esta accin e inserta su notificador correspondiente return(comprueba_finalizada(idaccion,finalaccion,db)); } // ________________________________________________________________________________________________________ int comprueba_finalizada(int idaccion,char *resultado,Database db){ char ErrStr[200],sqlstr[1000]; int numnotificaciones,tipoaccion,idnotificador; char parametros[LONGITUD_PARAMETROS],*cadenanot; char fechareg[100]; int accionid,cont,i,resul,lon; Table tbl; struct tm* st; sprintf(sqlstr,"SELECT COUNT(*) as numnotificaciones FROM notificaciones WHERE accionid=%d",idaccion); if(!db.Execute(sqlstr,tbl)){ // Error al consultar db.GetErrorErrStr(ErrStr); return(false); } if(tbl.ISEOF()) return(false); // No existe registro de acciones if(!tbl.Get("numnotificaciones",numnotificaciones)){ // Toma dato tbl.GetErrorErrStr(ErrStr); // error al acceder al registro return(false); } sprintf(sqlstr,"SELECT tipoaccion,parametros,idnotificador,accionid FROM acciones WHERE idaccion=%d",idaccion); if(!db.Execute(sqlstr,tbl)){ // Error al consultar db.GetErrorErrStr(ErrStr); return(false); } if(tbl.ISEOF()) return(true); // No existe registro de acciones if(!tbl.Get("tipoaccion",tipoaccion)){ // Toma dato tbl.GetErrorErrStr(ErrStr); // error al recuperar el campo resultado return(false); } if(!tbl.Get("parametros",parametros)){ // Toma dato tbl.GetErrorErrStr(ErrStr); // error al recuperar el campo resultado return(false); } if(!tbl.Get("idnotificador",idnotificador)){ // Toma dato tbl.GetErrorErrStr(ErrStr); // error al recuperar el campo resultado return(false); } if(!tbl.Get("accionid",accionid)){ // Toma dato tbl.GetErrorErrStr(ErrStr); // error al recuperar el campo resultado return(false); } INTROaFINCAD(parametros); switch(tipoaccion){ case EJECUCION_COMANDO : cadenanot=toma_parametro("iph",parametros); // Toma cadenaip break; case EJECUCION_TAREA : cadenanot=toma_parametro("cmd",parametros); // Toma comandos break; case EJECUCION_TRABAJO : cadenanot=toma_parametro("tsk",parametros); // Toma tareas break; default: return(false); } cont=1; lon=strlen(cadenanot); for (i=0;itm_year+1900,st->tm_mon+1,st->tm_mday,st->tm_hour,st->tm_min,st->tm_sec); if(strcmp(resultado,ACCION_CONERRORES)==0) sprintf(sqlstr,"UPDATE acciones SET resultado='%s',estado='%s',fechahorafin='%s' WHERE idaccion=%d",ACCION_FALLIDA,ACCION_FINALIZADA,fechareg,idaccion); else sprintf(sqlstr,"UPDATE acciones SET resultado='%s',estado='%s',fechahorafin='%s' WHERE idaccion=%d",ACCION_EXITOSA,ACCION_FINALIZADA,fechareg,idaccion); if(!db.Execute(sqlstr)){ // Error al actualizar db.GetErrorErrStr(ErrStr); return(false); } if(accionid>0){ // Esto no se ejecutarnsi la tarea tiene un trabajo padre resul=InsertaNotificaciones(idaccion,idnotificador,accionid,resultado,db); if(resul) return(comprueba_resultados(accionid,db)); } } return(resul); } // ________________________________________________________________________________________________________ // Funcin: EnviaServidoresRembo // // Descripcin: // Esta funcin envia una trama a un servidor rembo para que sus clientes ejecuten un comando // Parnetros: // - parametros: parametros del comando // ________________________________________________________________________________________________________ void EnviaServidoresRembo(char * parametros) { int i,lon; for (i=0;iejecutor='1'; // ejecutor de la trama 1=el servidor hidra 2=el cliente hidra addrRepo.sin_family = AF_INET; addrRepo.sin_port = htons((short)puerto); addrRepo.sin_addr.s_addr = inet_addr(ipsrv); // Direccin IP repositorio Encriptar((char*)trama); lon=strlen((char*)trama); ret = sendto(s,(char *)trama,lon,0,(struct sockaddr *)&addrRepo, sizeof(addrRepo)); if (ret == SOCKET_ERROR){ RegistraLog("***send() fallo en envío al repositorio",true); return(FALSE); } return true; } // ________________________________________________________________________________________________________ // Funcin: DesmarcaServidoresRembo // // Descripcin: // Esta funcin desmarca la tabla completa de servidores rembo para iniciar la cuesation de envio // ________________________________________________________________________________________________________ void DesmarcaServidoresRembo(void) { int i; for (i=0;itm_year+1900,st->tm_mon+1,st->tm_mday,st->tm_hour,st->tm_min,st->tm_sec); sprintf(sqlstr,"INSERT INTO acciones (tipoaccion,idtipoaccion,cateaccion,ambito,idambito,ambitskwrk,fechahorareg,estado,resultado,idcentro,parametros,accionid,idnotificador) VALUES (%d,%d,%d,0,0,'%s','%s','%s','%s',%d,'%s',%d,%d)",EJECUCION_TAREA,idtarea,PROCESOS,ambitarea,_fechahorareg,ACCION_INICIADA,ACCION_SINERRORES,idcentro,paramtarea,accionid,idnotificador); if(!db.Execute(sqlstr)){ // Error al insertar db.GetErrorErrStr(ErrStr); return(false); } accionid=0; // Toma identificador dela accin sprintf(sqlstr,"SELECT LAST_INSERT_ID() as identificador"); if(!db.Execute(sqlstr,tbl)){ // Error al leer db.GetErrorErrStr(ErrStr); return(false); } if(!tbl.ISEOF()){ // Si existe registro if(!tbl.Get("identificador",accionid)){ tbl.GetErrorErrStr(ErrStr); // error al acceder al registro return(false); } } int i; // Insertar acciones:comandos for (i=0;itm_year+1900,st->tm_mon+1,st->tm_mday,st->tm_hour,st->tm_min,st->tm_sec); sprintf(sqlstr,"INSERT INTO acciones (tipoaccion,idtipoaccion,cateaccion,ambito,idambito,fechahorareg,estado,resultado,idcentro,parametros,accionid,idnotificador) VALUES (%d,%d,%d,%d,%d,'%s','%s','%s',%d,'%s',%d,%d)",EJECUCION_COMANDO,tbComandosidcomando[i],PROCESOS,tbComandosambito[i],tbComandosidambito[i],_fechahorareg,ACCION_EXITOSA,ACCION_SINERRORES,idcentro,tbComandosparametros[i],accionid,tbComandosidnotificador[i]); if(!db.Execute(sqlstr)){ // Error al insertar db.GetErrorErrStr(ErrStr); free(tbComandosparametros[i]); return(false); } // Toma identificador dela accin sprintf(sqlstr,"SELECT LAST_INSERT_ID() as identificador"); if(!db.Execute(sqlstr,tbl)){ // Error al leer db.GetErrorErrStr(ErrStr); return(false); } if(!tbl.ISEOF()){ // Si existe registro if(!tbl.Get("identificador",accionidcmd)){ tbl.GetErrorErrStr(ErrStr); // error al acceder al registro return(false); } } sprintf(pids,"ids=%d\r",accionidcmd); strcat((char*)tbComandosparametros[i],pids); // Le ande el identificador de la accion envia_tarea(tbComandosparametros[i]); free(tbComandosparametros[i]); } return(true); } // ________________________________________________________________________________________________________ // Funcin: manda peticin de inclusion // // Descripcin: // Esta funcin envia una tarea por la red. // Parnetros: // - parametros: El contenido de la tarea // ________________________________________________________________________________________________________ void envia_tarea(char* parametros) { TRAMA trama; trama.arroba='@'; strncpy(trama.identificador,"JMMLCAMDJ",9); trama.ejecutor=parametros[0]; strcpy(trama.parametros,(char*)¶metros[1]); gestiona_comando(INVALID_SOCKET,trama); } // ________________________________________________________________________________________________________ // Funcin: EjecutarTrabajo // // Descripcin: // Registra una accin (Trabajo y la envn para su ejecucin // Parnetros: // - idtrabajo : Identificador del trabajo // - Database: una conexion ADO operativa // - parametros: parnetros de la accin // ________________________________________________________________________________________________________ int EjecutarTrabajo(int idtrabajo,Database db,char*parametros ) { char sqlstr[1000],ErrStr[200]; Table tbl; int cont_tareas=0,lon; int idtarea,idtrabajotarea,idcentro; char wambitrabajo[500],ambitrabajo[4000]; char wparamtrabajo[20],paramtrabajo[1000]; int tbTareasidtarea[100],tbTareasidnotificador[100]; char ambitskwrk[500]; ambitrabajo[0]=(char)NULL; // Inicializacin strcpy(paramtrabajo,"tsk="); // Inicializacin // recupera el identificador del Centro propietario de la tarea sprintf(sqlstr,"SELECT idcentro FROM trabajos WHERE idtrabajo=%d",idtrabajo); if(!db.Execute(sqlstr,tbl)){ // Error al leer db.GetErrorErrStr(ErrStr); return(false); } if(tbl.ISEOF()) return(true); if(!tbl.Get("idcentro",idcentro)){ // Toma dato tbl.GetErrorErrStr(ErrStr); // error al acceder al registro return(false); } // Recupera las tareas que forman parte del trabajo sprintf(sqlstr,"SELECT * FROM trabajos_tareas WHERE idtrabajo=%d ORDER by orden",idtrabajo); if(!db.Execute(sqlstr,tbl)){ // Error al leer db.GetErrorErrStr(ErrStr); return(false); } if(tbl.ISEOF()) return(true); // Recorre trabajos-tareas while(!tbl.ISEOF()){ if(!tbl.Get("idtrabajotarea",idtrabajotarea)){ // Toma dato tbl.GetErrorErrStr(ErrStr); // error al acceder al registro return(false); } tbTareasidnotificador[cont_tareas]=idtrabajotarea; if(!tbl.Get("idtarea",idtarea)){ // Toma dato tbl.GetErrorErrStr(ErrStr); // error al acceder al registro return(false); } tbTareasidtarea[cont_tareas]=idtarea; if(!tbl.Get("parametros",parametros)){ // Toma dato tbl.GetErrorErrStr(ErrStr); // error al acceder al registro return(false); } if(!tbl.Get("ambitskwrk",ambitskwrk)){ // Toma dato tbl.GetErrorErrStr(ErrStr); // error al acceder al registro return(false); } sprintf(wambitrabajo,"%s;",ambitskwrk); strcat(ambitrabajo,wambitrabajo); sprintf(wparamtrabajo,"%d;",idtrabajotarea); strcat(paramtrabajo,wparamtrabajo); cont_tareas++; tbl.MoveNext(); } lon=strlen(ambitrabajo); ambitrabajo[lon-1]=(char)NULL; // Quita la coma final lon=strlen(paramtrabajo); paramtrabajo[lon-1]=(char)NULL; // Quita la coma final char _fechahorareg[100]; struct tm* st; 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,"INSERT INTO acciones (tipoaccion,idtipoaccion,cateaccion,ambito,idambito,ambitskwrk,fechahorareg,estado,resultado,idcentro,parametros,accionid,idnotificador) VALUES (%d,%d,%d,0,0,'%s','%s','%s','%s',%d,'%s',0,0)",EJECUCION_TRABAJO,idtrabajo,PROCESOS,ambitrabajo,_fechahorareg,ACCION_INICIADA,ACCION_SINERRORES,idcentro,paramtrabajo); if(!db.Execute(sqlstr)){ // Error al insertar db.GetErrorErrStr(ErrStr); return(false); } int accionid=0; // Toma identificador dela accin sprintf(sqlstr,"SELECT LAST_INSERT_ID() as identificador"); if(!db.Execute(sqlstr,tbl)){ // Error al leer db.GetErrorErrStr(ErrStr); return(false); } if(!tbl.ISEOF()){ // Si existe registro if(!tbl.Get("identificador",accionid)){ tbl.GetErrorErrStr(ErrStr); // error al acceder al registro return(false); } } int i; // Insertar acciones:tareas for (i=0;i