diff options
59 files changed, 4340 insertions, 7340 deletions
diff --git a/admin/Database/ogAdmBD-1.1.0-1.1.1.sql b/admin/Database/ogAdmBD-1.1.0-1.1.1.sql deleted file mode 120000 index fd52f3c8..00000000 --- a/admin/Database/ogAdmBD-1.1.0-1.1.1.sql +++ /dev/null @@ -1 +0,0 @@ -ogAdmBD-1.1.0a-1.1.1.sql
\ No newline at end of file diff --git a/admin/Database/ogAdmBD-1.1.0-1.1.1b.sql b/admin/Database/ogAdmBD-1.1.0-1.1.1b.sql new file mode 120000 index 00000000..244cb4e5 --- /dev/null +++ b/admin/Database/ogAdmBD-1.1.0-1.1.1b.sql @@ -0,0 +1 @@ +ogAdmBD-1.1.0a-1.1.1b.sql
\ No newline at end of file diff --git a/admin/Database/ogAdmBD-1.1.0a-1.1.1.sql b/admin/Database/ogAdmBD-1.1.0a-1.1.1b.sql index e5a6bd4e..53e36ca4 100644 --- a/admin/Database/ogAdmBD-1.1.0a-1.1.1.sql +++ b/admin/Database/ogAdmBD-1.1.0a-1.1.1b.sql @@ -1,5 +1,5 @@ ### Fichero de actualización de la base de datos. -# OpenGnsys 1.1.0, 1.1.0a, 1.1.1pre - OpenGnsys 1.1.1 +# OpenGnsys 1.1.0, 1.1.0a, 1.1.1pre - OpenGnsys 1.1.1b #use ogAdmBD # Eliminar procedimiento y disparador para evitar errores de ejecución. diff --git a/admin/Database/ogAdmBD-1.1.1-1.2.0.sql b/admin/Database/ogAdmBD-1.1.1-1.2.0.sql new file mode 120000 index 00000000..decf63ea --- /dev/null +++ b/admin/Database/ogAdmBD-1.1.1-1.2.0.sql @@ -0,0 +1 @@ +ogAdmBD-1.1.1b-1.2.0.sql
\ No newline at end of file diff --git a/admin/Database/ogAdmBD-1.1.1a-1.2.0.sql b/admin/Database/ogAdmBD-1.1.1a-1.2.0.sql new file mode 120000 index 00000000..decf63ea --- /dev/null +++ b/admin/Database/ogAdmBD-1.1.1a-1.2.0.sql @@ -0,0 +1 @@ +ogAdmBD-1.1.1b-1.2.0.sql
\ No newline at end of file diff --git a/admin/Database/ogAdmBD-1.1.1b-1.2.0.sql b/admin/Database/ogAdmBD-1.1.1b-1.2.0.sql new file mode 100644 index 00000000..1a52583b --- /dev/null +++ b/admin/Database/ogAdmBD-1.1.1b-1.2.0.sql @@ -0,0 +1,22 @@ +### Fichero de actualización de la base de datos. +# OpenGnsys 1.1.1, 1.1.1a, 1.1.1b - OpenGnsys 1.2.0 +#use ogAdmBD + +DROP PROCEDURE IF EXISTS addcols; +# Procedimiento para actualización condicional de tablas. +DELIMITER '//' +CREATE PROCEDURE addcols() BEGIN + # Añadir campos fila y columna para localización de ordenador en el aula (ticket #944). + IF NOT EXISTS (SELECT * FROM information_schema.COLUMNS + WHERE COLUMN_NAME='n_row' AND TABLE_NAME='ordenadores' AND TABLE_SCHEMA=DATABASE()) + THEN + ALTER TABLE ordenadores + ADD n_row SMALLINT DEFAULT 0, + ADD n_col SMALLINT DEFAULT 0; + END IF; +END// +# Ejecutar actualización condicional. +DELIMITER ';' +CALL addcols(); +DROP PROCEDURE addcols; + diff --git a/admin/Database/ogAdmBD-1.1.1pre-1.1.1.sql b/admin/Database/ogAdmBD-1.1.1pre-1.1.1.sql deleted file mode 120000 index fd52f3c8..00000000 --- a/admin/Database/ogAdmBD-1.1.1pre-1.1.1.sql +++ /dev/null @@ -1 +0,0 @@ -ogAdmBD-1.1.0a-1.1.1.sql
\ No newline at end of file diff --git a/admin/Database/ogAdmBD-1.1.1pre-1.1.1b.sql b/admin/Database/ogAdmBD-1.1.1pre-1.1.1b.sql new file mode 120000 index 00000000..244cb4e5 --- /dev/null +++ b/admin/Database/ogAdmBD-1.1.1pre-1.1.1b.sql @@ -0,0 +1 @@ +ogAdmBD-1.1.0a-1.1.1b.sql
\ No newline at end of file diff --git a/admin/Database/ogAdmBD.sql b/admin/Database/ogAdmBD.sql index 77e0f0ce..6b961ea1 100644 --- a/admin/Database/ogAdmBD.sql +++ b/admin/Database/ogAdmBD.sql @@ -534,6 +534,8 @@ CREATE TABLE `ordenadores` ( `paginavalidacion` varchar(100), `agentkey` varchar(32), `oglivedir` varchar(50) NOT NULL DEFAULT 'ogLive', + `n_row` smallint NOT NULL DEFAULT 0, + `n_col` smallint NOT NULL DEFAULT 0, PRIMARY KEY (`idordenador`), KEY `idaulaip` (`idaula` ASC, `ip` ASC) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; diff --git a/admin/Interface/CrearImagen b/admin/Interface/CrearImagen index e3b21c7a..2d4acc47 100755 --- a/admin/Interface/CrearImagen +++ b/admin/Interface/CrearImagen @@ -46,10 +46,10 @@ ogEcho log session "$MSG_INTERFACE_START $0 $*" PATH=$PATH:$(dirname $0) PROG=$(basename $0) CALLER=$(ogGetCaller) -if [ "$CALLER" != "ogAdmClient" ]; then - ogRaiseError $OG_ERR_NOTEXEC "$CALLER -> $PROG" - exit $? -fi +#if [ "$CALLER" != "ogAdmClient" ]; then +# ogRaiseError $OG_ERR_NOTEXEC "$CALLER -> $PROG" +# exit $? +#fi # Valor por defecto para el repositorio. REPO=${4:-"REPO"} diff --git a/admin/Sources/Clients/README.es.txt b/admin/Sources/Clients/README.es.txt deleted file mode 100644 index 56900d80..00000000 --- a/admin/Sources/Clients/README.es.txt +++ /dev/null @@ -1,9 +0,0 @@ -OpenGnsys Services for Clients README -======================================= - - -Este directorio contiene el código fuente de los servicios OpenGnsys específicos para clientes. - -- ogAdmClient servicio para cliente ogLive que atiende peticiones de OpenGnsys Server -- ogagent OGAgent: agente modular para sistemas operativos con API REST - diff --git a/admin/Sources/Clients/ogAdmClient/Makefile b/admin/Sources/Clients/ogAdmClient/Makefile deleted file mode 100644 index d3628c9d..00000000 --- a/admin/Sources/Clients/ogAdmClient/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -# makefile - -# Nombre del proyecto -PROYECTO := ogAdmClient - -# Directorios y librerias -DIRS := -LIBS := -static - -# Opciones de compilacion -OPCS := -m32 -O0 -g -Wall # Depuracion -#OPCS := -m32 -O3 -Wall # Optimizacion - -# Ficheros objetos -OBJS := sources/ogAdmClient.o - -all: $(PROYECTO) - -$(PROYECTO): $(OBJS) - gcc $(OPCS) $(DIRS) $(LIBS) $(OBJS) -o $(PROYECTO) -# strip $(PROYECTO) # Optimizacion - -clean: - rm -f $(PROYECTO) $(OBJS) - -sources/%.o: sources/%.c - gcc $(OPCS) -I ../../Includes -c -o"$@" "$<" - - - - diff --git a/admin/Sources/Clients/ogAdmClient/ogAdmClient.cfg b/admin/Sources/Clients/ogAdmClient/ogAdmClient.cfg deleted file mode 100644 index b15e7407..00000000 --- a/admin/Sources/Clients/ogAdmClient/ogAdmClient.cfg +++ /dev/null @@ -1,5 +0,0 @@ -ServidorAdm=SERVERIP -PUERTO=2008 -PATHINTERFACE=/opt/opengnsys/interfaceAdm -UrlMenu=OPENGNSYSURL/varios/menubrowser.php -UrlMsg=http://localhost/cgi-bin/httpd-log.sh
\ No newline at end of file diff --git a/admin/Sources/Clients/ogAdmClient/sources/ogAdmClient.c b/admin/Sources/Clients/ogAdmClient/sources/ogAdmClient.c deleted file mode 100644 index 6f87cc45..00000000 --- a/admin/Sources/Clients/ogAdmClient/sources/ogAdmClient.c +++ /dev/null @@ -1,2331 +0,0 @@ -// ********************************************************************************************************
-// Cliernte: ogAdmClient
-// Autor: Jos Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla
-// Fecha Creacin: Marzo-2010
-// Fecha ltima modificacin: Abril-2010
-// Nombre del fichero: ogAdmClient.c
-// Descripcin :Este fichero implementa el cliente general del sistema
-// ********************************************************************************************************
-
-#include "ogAdmClient.h"
-#include "ogAdmLib.c"
-//________________________________________________________________________________________________________
-// Funcin: tomaConfiguracion
-//
-// Descripcin:
-// Lee el fichero de configuracin del servicio
-// Parmetros:
-// filecfg : Ruta completa al fichero de configuracin
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//________________________________________________________________________________________________________
-BOOLEAN tomaConfiguracion(char* filecfg)
-{
- char modulo[] = "tomaConfiguracion()";
-
- if (filecfg == NULL || strlen(filecfg) == 0) {
- errorLog(modulo, 1, FALSE); // Fichero de configuracin del cliente vaco
- return (FALSE);
- }
- FILE *fcfg;
- int 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 configuracin del cliente
- return (FALSE);
- }
-
- fseek(fcfg, 0, SEEK_END);
- lSize = ftell(fcfg); // Obtiene tamao 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);
- }
- lSize=fread(buffer, 1, lSize, fcfg); // Lee contenido del fichero
- buffer[lSize]=CHARNULL;
- fclose(fcfg);
-
- /* Inicializar variables globales */
- servidoradm[0]=CHARNULL;
- puerto[0] = CHARNULL;
- pathinterface[0]=CHARNULL;
- urlmenu[0]=CHARNULL;
- urlmsg[0]=CHARNULL;
-
- 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]), "PATHINTERFACE");
- if (resul == 0)
- strcpy(pathinterface, dualparametro[1]);
-
- resul = strcmp(StrToUpper(dualparametro[0]), "URLMENU");
- if (resul == 0)
- strcpy(urlmenu, dualparametro[1]);
-
- resul = strcmp(StrToUpper(dualparametro[0]), "URLMSG");
- if (resul == 0)
- strcpy(urlmsg, dualparametro[1]);
- }
-
- if (servidoradm[0] == CHARNULL) {
- liberaMemoria(buffer);
- errorLog(modulo,4, FALSE); // Falta parmetro SERVIDORADM
- return (FALSE);
- }
-
- if (puerto[0] == CHARNULL) {
- liberaMemoria(buffer);
- errorLog(modulo,5, FALSE); // Falta parmetro PUERTO
- return (FALSE);
- }
- if (pathinterface[0] == CHARNULL) {
- liberaMemoria(buffer);
- errorLog(modulo,56, FALSE); // Falta parmetro PATHINTERFACE
- return (FALSE);
- }
-
- if (urlmenu[0] == CHARNULL) {
- liberaMemoria(buffer);
- errorLog(modulo,89, FALSE); // Falta parmetro URLMENU
- return (FALSE);
- }
- if (urlmsg[0] == CHARNULL) {
- liberaMemoria(buffer);
- errorLog(modulo,90, FALSE); // Falta parmetro URLMSG
- return (FALSE);
- }
- liberaMemoria(buffer);
- return (TRUE);
-}
-//______________________________________________________________________________________________________
-// Funcin: FinterfaceAdmin
-//
-// Descripcin:
-// Esta funcin es la puerta de comunicacin entre el mdulo de administracin y el motor de clonacin.
-// La Aplicacin de administracin utiliza una interface para ejecutar funciones del motor de clonacin;
-// esta interface llamar a la API del motor con lo que cambiando el comportamiento de esta interface
-// podremos hacer llamadas a otras API de clonacin y de esta manera probar distintos motores.
-//
-// Parmetros:
-// - script: Nombre del mdulo,funcin o script de la interface
-// - parametros: Parmetros que se le pasarn a la interface
-// - salida: Recoge la salida que genera la llamada a la interface
-
-// Devuelve:
-// Cdigo de error de la ejecucin al mdulo , funcin o script de la interface
-//
-// Especificaciones:
-// El parmetro salida recoge la salida desde un fichero que se genera en la ejecucin del script siempre que
-// sea distinto de NULL, esto es, si al llamar a la funcin este parmetro es NULL no se recoger dicha salida.
-// Este fichero tiene una ubicacin fija: /tmp/_retinterface
-//______________________________________________________________________________________________________
-
-int FinterfaceAdmin( char *script,char* parametros,char* salida)
-{
- FILE *f;
- int lSize,nargs,i,resul;
- char msglog[LONSTD],*argumentos[MAXARGS];
- char modulo[] = "FinterfaceAdmin()";
-
-
- if (ndebug>= DEBUG_MEDIO) {
- sprintf(msglog, "%s:%s", tbMensajes[8], script);
- infoDebug(msglog);
- }
-
- /* Crea matriz de los argumentos */
- nargs=splitCadena(argumentos,parametros,32);
- for(i=nargs;i<MAXARGS;i++){
- argumentos[i]=NULL;
- }
-
- /* Muestra matriz de los argumentos */
- for(i=0;i<nargs;i++){
- if (ndebug>= DEBUG_ALTO) {
- sprintf(msglog, "%s: #%d-%s", tbMensajes[9],i+1,argumentos[i]);
- infoDebug(msglog);
- }
- }
- /* Elimina fichero de retorno */
- if(salida!=(char*)NULL){
- f = fopen("/tmp/_retinterface_","w" );
- if (f==NULL){ // Error de eliminacin
- scriptLog(modulo,10);
- resul=8;
- scriptLog(modulo,resul);
- return(resul);
- }
- fclose(f);
- }
- /* Compone linea de comando */
- if(parametros){
- strcat(script," ");
- strcat(script,parametros);
- }
- /* LLamada funcin interface */
- resul=system(script);
- if(resul){
- scriptLog(modulo,10);
- scriptLog(modulo,resul);
- return(resul);
- }
- /* Lee fichero de retorno */
- if(salida!=(char*)NULL){
- f = fopen("/tmp/_retinterface_","rb" );
- if (f==NULL){ // Error de apertura
- scriptLog(modulo,10);
- resul=9;
- scriptLog(modulo,resul);
- return(resul);
- }
- else{
- fseek (f ,0,SEEK_END); // Obtiene tamao del fichero.
- lSize = ftell (f);
- rewind (f);
- if(lSize>LONGITUD_SCRIPTSALIDA){
- scriptLog(modulo,10);
- resul=11;
- scriptLog(modulo,resul);
- return(resul);
- }
- fread (salida,1,lSize,f); // Lee contenido del fichero
- rTrim(salida);
- fclose(f);
- }
- }
- /* Muestra informacin de retorno */
- if(salida!=(char*)NULL){
- if(ndebug>2){
- sprintf(msglog,"Informacin devuelta %s",salida);
- infoDebug(msglog);
- }
- }
- return(resul);
-}
-//______________________________________________________________________________________________________
-// Funcin: interfaceAdmin
-//
-// Descripcin:
-// Esta funcin es la puerta de comunicacin entre el mdulo de administracin y el motor de clonacin.
-// La Aplicacin de administracin utiliza una interface para ejecutar funciones del motor de clonacin;
-// esta interface llamar a la API del motor con lo que cambiando el comportamiento de esta interface
-// podremos hacer llamadas a otras API de clonacin y de esta manera probar distintos motores.
-//
-// Parmetros:
-// - script: Nombre del mdulo,funcin o script de la interface
-// - parametros: Parmetros que se le pasarn a la interface
-// - salida: Recoge la salida que genera la llamada a la interface
-
-// Devuelve:
-// Cdigo de error de la ejecucin al mdulo , funcin o script de la interface
-//
-// Especificaciones:
-// El parmetro salida recoge la salida desde el procedimiento hijo que se genera en la ejecucin de ste
-// siempre que sea distinto de NULL, esto es, si al llamar a la funcin este parmetro es NULL no se
-// recoger dicha salida.
-//______________________________________________________________________________________________________
-
-int interfaceAdmin( char *script,char* parametros,char* salida)
-{
- int descr[2]; /* Descriptores de E y S de la turbera */
- int bytesleidos; /* Bytes leidos en el mensaje */
- int estado;
- pid_t pid;
- char buffer[LONBLK]; // Buffer de lectura de fichero
- pipe (descr);
- int i,nargs,resul;
- int lon; // Longitud de cadena
- char msglog[LONSUC]; // Mensaje de registro de sucesos
- char *argumentos[MAXARGS];
- char modulo[] = "interfaceAdmin()";
- if (ndebug>= DEBUG_MEDIO) {
- sprintf(msglog, "%s:%s", tbMensajes[8], script);
- infoDebug(msglog);
- }
-
- /* Crea matriz de los argumentos */
- nargs=splitCadena(argumentos,parametros,32);
- for(i=nargs;i<MAXARGS;i++){
- argumentos[i]=NULL;
- }
- /* Muestra matriz de los argumentos */
- for(i=1;i<nargs;i++){
- if (ndebug>= DEBUG_ALTO) {
- // Truncar la cadena si es mayor que el tamao de la lnea de log.
- sprintf(msglog, "%s: #%d-", tbMensajes[9], i+1);
- lon = strlen (msglog);
- if (lon + strlen (argumentos[i]) < LONSUC) {
- strcat (msglog, argumentos[i]);
- }
- else
- {
- strncat (msglog, argumentos[i], LONSUC - lon - 4);
- strcat (msglog, "...");
- }
- infoDebug(msglog);
- }
- }
-
- if((pid=fork())==0)
- {
- //_______________________________________________________________
-
- /* Proceso hijo que ejecuta la funcin de interface */
-
- close (descr[LEER]);
- dup2 (descr[ESCRIBIR], 1);
- close (descr[ESCRIBIR]);
- resul=execv(script,argumentos);
- //resul=execlp (script, script, argumentos[0],argumentos[1],NULL);
- exit(resul);
-
- /* Fin de proceso hijo */
- //_______________________________________________________________
- }
- else
- {
- //_______________________________________________________________
-
- /* Proceso padre que espera la ejecucin del hijo */
-
- if (pid ==-1){ // Error en la creacin del proceso hijo
- scriptLog(modulo,10);
- resul=13;
- scriptLog(modulo,resul);
- return(resul);
- }
- close (descr[ESCRIBIR]);
- bytesleidos = read (descr[LEER], buffer, LONBLK-1);
- while(bytesleidos>0){
- if(salida!=(char*)NULL){ // Si se solicita retorno de informacin...
- buffer[bytesleidos]='\0';
- // Error si se supera el tamao mximo de cadena de salida.
- if(strlen(buffer)+strlen(salida)>LONGITUD_SCRIPTSALIDA){
- scriptLog(modulo,10);
- resul=11;
- scriptLog(modulo,resul);
- return(resul);
- }
- rTrim(buffer);
- strcat(salida,buffer);
- }
- bytesleidos = read (descr[LEER], buffer, LONBLK-1);
- }
- close (descr[LEER]);
- //kill(pid,SIGQUIT);
- waitpid(pid,&estado,0);
- resul=WEXITSTATUS(estado);
- if(resul){
- scriptLog(modulo,10);
- scriptLog(modulo,resul);
- return(resul);
- }
- /* Fin de proceso padre */
- //_______________________________________________________________
- }
-
- /* Muestra informacin de retorno */
- if(salida!=(char*)NULL){
- if(ndebug>2){
- // Truncar la cadena si es mayor que el tamao de la lnea de log.
- strcpy(msglog,"Informacion devuelta ");
- lon = strlen (msglog);
- if (lon + strlen (salida) < LONSUC) {
- strcat (msglog, salida);
- }
- else
- {
- strncat (msglog, salida, LONSUC-lon-4);
- strcat (msglog, "...");
- }
- infoDebug(msglog);
- }
- }
- return(resul);
-}
-//______________________________________________________________________________________________________
-// Funcin: scriptLog
-//
-// Descripcin:
-// Registra los sucesos de errores de scripts en el fichero de log
-// Parametros:
-// - modulo: Mdulo donde se produjo el error
-// - coderr : Cdigo del mensaje de error del script
-//______________________________________________________________________________________________________
-void scriptLog(const char *modulo,int coderr)
-{
- char msglog[LONSUC];
-
- if(coderr<MAXERRORSCRIPT)
- errorInfo(modulo,tbErroresScripts[coderr]); // Se ha producido algn error registrado
- else{
- sprintf(msglog,"%s: %d",tbErroresScripts[MAXERRORSCRIPT],coderr);
- errorInfo(modulo,msglog);
- }
-}
-//______________________________________________________________________________________________________
-// Funcin: TomaIPlocal
-//
-// Descripcin:
-// Recupera la IP local
-// Parmetros:
-// Ninguno
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-// Especificaciones:
-// En caso de no encontrar la IP o generarse algn error la IP local sera 0.0.0.0
-//______________________________________________________________________________________________________
-BOOLEAN tomaIPlocal()
-{
- char modulo[] = "tomaIPlocal()";
-
- // Para debug
- //strcpy(IPlocal,"10.1.15.203");
- //return(TRUE);
-
- sprintf(interface,"%s/getIpAddress",pathinterface);
- herror=interfaceAdmin(interface,NULL,IPlocal);
- if(herror){
- errorLog(modulo,85,FALSE);
- return(FALSE);
- }
- return(TRUE);
-}
-//______________________________________________________________________________________________________
-//
-// Funcin: cuestionCache
-//
-// Descripcin:
-// Procesa la cache en caso de existir.
-// Parmetros:
-// tam : Tamao de la cache
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-BOOLEAN cuestionCache(char* tam)
-{
- return(TRUE);
- //>>>>>>>>>>>>>>>>>>>>>>>>>>
- char msglog[LONSTD];
- char modulo[] = "cuestionCache()";
-
- sprintf(interface,"%s/%s",pathinterface,"procesaCache");
- sprintf(parametros,"%s %s","procesaCache",tam);
-
- herror=interfaceAdmin(interface,parametros,NULL);
- if(herror){
- sprintf(msglog,"%s",tbErrores[88]);
- errorInfo(modulo,msglog);
- return(FALSE);
- }
-
- return(TRUE);
-}
-//______________________________________________________________________________________________________
-// Funcin: cargaPaginaWeb
-//
-// Descripcin:
-// Muestra una pgina web usando el browser
-// Parmetros:
-// urp: Direccin url de la pgina
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-// ________________________________________________________________________________________________________
-int cargaPaginaWeb(char *url)
-{
- pid_t pidbrowser; // Identificador del proceso que se crea para mostrar una pgina web con el browser
- int resul=0;
- char* argumentos[4];
- char modulo[] = "cargaPaginaWeb()";
-
- // Destruye los procesos del Browser y lanza uno nuevo.
- system("pkill -9 browser");
-
- sprintf(interface,"/opt/opengnsys/bin/browser");
- sprintf(parametros,"browser -qws %s",url);
-
- splitCadena(argumentos,parametros,' '); // Crea matriz de los argumentos del scripts
- argumentos[3]=NULL;
- if((pidbrowser=fork())==0){
- /* Proceso hijo que ejecuta el script */
- resul=execv(interface,argumentos);
- exit(resul);
- }
- else {
- if (pidbrowser ==-1){
- scriptLog(modulo,10);
- resul=13;
- scriptLog(modulo,resul);
- return(resul);
- }
- }
- return(resul);
-}
-//________________________________________________________________________________________________________
-// Funcin: muestraMenu
-//
-// Descripcin:
-// Muestra el menu inicial del cliente
-// Parmetros:
-// Ninguno
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//________________________________________________________________________________________________________
-void muestraMenu()
-{
- cargaPaginaWeb(urlmenu);
-}
-//______________________________________________________________________________________________________
-// Funcin: muestraMensaje
-//
-// Descripcin:
-// Muestra un mensaje en pantalla
-// Parmetros:
-// - idx: Indice del mensaje
-// - msg: Descripcin Mensaje
-// ________________________________________________________________________________________________________
-void muestraMensaje(int idx,char*msg)
-{
- char *msgpan,url[250];
-
- if(msg){
- msgpan=URLEncode(msg);
- sprintf(url,"%s?msg=%s",urlmsg,msgpan); // Url de la pgina de mensajes
- liberaMemoria(msgpan);
- }
- else
- sprintf(url,"%s?idx=%d",urlmsg,idx); // Url de la pgina de mensajes
- cargaPaginaWeb(url);
-}
-//______________________________________________________________________________________________________
-// Funcin: InclusionCliente
-// Descripcin:
-// Abre una sesin en el servidor de administracin y registra al cliente en el sistema
-// Parmetros:
-// Ninguno
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-BOOLEAN inclusionCliente(TRAMA* ptrTrama)
-{
- int lon; // Longitud de cadena
- char msglog[LONSUC]; // Mensaje de registro de sucesos
- char *cfg; // Datos de configuracin
- SOCKET socket_c;
- char modulo[] = "inclusionCliente()";
-
- cfg=LeeConfiguracion();
-
- if(!cfg){ // No se puede recuperar la configuracin del cliente
- errorLog(modulo,36,FALSE);
- errorLog(modulo,37,FALSE);
- return(FALSE);
- }
- if (ndebug>= DEBUG_ALTO) {
- // Truncar la cadena si es mayor que el tamao de la lnea de log.
- sprintf(msglog, "%s", tbMensajes[14]);
- lon = strlen (msglog);
- if (lon + strlen (cfg) < LONSUC) {
- strcat (msglog, cfg);
- }
- else
- {
- strncat (msglog, cfg, LONSUC - lon - 4);
- strcat (msglog, "...");
- }
- infoDebug(msglog);
- }
- initParametros(ptrTrama,0);
- lon=sprintf(ptrTrama->parametros,"nfn=InclusionCliente\r"); // Nombre de la funcin a ejecutar en el servidor
- lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuracin de los Sistemas Operativos del cliente
- liberaMemoria(cfg);
-
- if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_PETICION)){
- errorLog(modulo,37,FALSE);
- return(FALSE);
- }
- ptrTrama=recibeMensaje(&socket_c);
- if(!ptrTrama){
- errorLog(modulo,45,FALSE);
- return(FALSE);
- }
-
- close(socket_c);
-
- if(!gestionaTrama(ptrTrama)){ // Anlisis de la trama
- errorLog(modulo,39,FALSE);
- return(FALSE);
- }
-
- return(TRUE);
-}
-//______________________________________________________________________________________________________
-// Funcin: RESPUESTA_InclusionCliente
-//
-// Descripcin:
-// Respuesta del servidor de administracin a la peticin de inicio
-// enviando los datos identificativos del cliente y otras configuraciones
-// Parmetros:
-// - ptrTrama: Trama recibida por el servidor con el contenido y los parmetros
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-BOOLEAN RESPUESTA_InclusionCliente(TRAMA* ptrTrama)
-{
- char* res;
- char modulo[] = "RESPUESTA_InclusionCliente()";
-
- res=copiaParametro("res",ptrTrama); // Resultado del proceso de inclusin
- if(atoi(res)==0){ // Error en el proceso de inclusin
- liberaMemoria(res);
- errorLog(modulo,41,FALSE);
- return (FALSE);
- }
- liberaMemoria(res);
-
- idordenador=copiaParametro("ido",ptrTrama); // Identificador del ordenador
- nombreordenador=copiaParametro("npc",ptrTrama); // Nombre del ordenador
- cache=copiaParametro("che",ptrTrama); // Tamao de la cach reservada al cliente
- idproautoexec=copiaParametro("exe",ptrTrama); // Procedimento de inicio (Autoexec)
- idcentro=copiaParametro("idc",ptrTrama); // Identificador de la Unidad Organizativa
- idaula=copiaParametro("ida",ptrTrama); // Identificador del aula
-
- if(idordenador==NULL || nombreordenador==NULL){
- errorLog(modulo,40,FALSE);
- return (FALSE);
- }
- return(TRUE);
-}
-//______________________________________________________________________________________________________
-//
-// Funcin: LeeConfiguracion
-// Descripcin:
-// Abre una sesin en el servidor de administracin y registra al cliente en el sistema
-// Parmetros:
-// Ninguno
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-
-char* LeeConfiguracion()
-{
- char* parametroscfg;
- char modulo[] = "LeeConfiguracion()";
- int herrorcfg;
-
- // Reservar memoria para los datos de cofiguracin.
- parametroscfg=(char*)reservaMemoria(LONGITUD_SCRIPTSALIDA);
- if(!parametroscfg){
- errorLog(modulo,3,FALSE);
- return(NULL);
- }
- // Ejecutar script y obtener datos.
- sprintf(interface,"%s/%s",pathinterface,"getConfiguration");
- herrorcfg=interfaceAdmin(interface,NULL,parametroscfg);
-
- if(herrorcfg){ // No se puede recuperar la configuracin del cliente
- liberaMemoria(parametroscfg);
- errorLog(modulo,36,FALSE);
- return(NULL);
- }
- return(parametroscfg);
-}
-//________________________________________________________________________________________________________
-// Funcin: autoexecCliente
-//
-// Descripcin:
-// Solicita procedimiento de autoexec para el cliebnte
-// Parmetros:
-// Ninguno
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//________________________________________________________________________________________________________
-BOOLEAN autoexecCliente(TRAMA* ptrTrama)
-{
- SOCKET socket_c;
- char modulo[] = "autoexecCliente()";
-
- initParametros(ptrTrama,0);
- sprintf(ptrTrama->parametros,"nfn=AutoexecCliente\rexe=%s\r",idproautoexec);
-
- if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_PETICION)){
- errorLog(modulo,42,FALSE);
- return(FALSE);
- }
- ptrTrama=recibeMensaje(&socket_c);
- if(!ptrTrama){
- errorLog(modulo,45,FALSE);
- return(FALSE);
- }
-
- close(socket_c);
-
- if(!gestionaTrama(ptrTrama)){ // Anlisis de la trama
- errorLog(modulo,39,FALSE);
- return(FALSE);
- }
-
- return(TRUE);
-}
-//________________________________________________________________________________________________________
-// Funcin: autoexecCliente
-//
-// Descripcin:
-// Ejecuta un script de autoexec personalizado en todos los inicios para el cliente
-// Parmetros:
-// Ninguno
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//________________________________________________________________________________________________________
-BOOLEAN RESPUESTA_AutoexecCliente(TRAMA* ptrTrama)
-{
- SOCKET socket_c;
- char *res,*nfl;
- char modulo[] = "RESPUESTA_AutoexecCliente()";
-
- res=copiaParametro("res",ptrTrama);
- if(atoi(res)==0){ // Error en el proceso de autoexec
- liberaMemoria(res);
- return (FALSE);
- }
- liberaMemoria(res);
-
- nfl=copiaParametro("nfl",ptrTrama);
- initParametros(ptrTrama,0);
- sprintf(ptrTrama->parametros,"nfn=enviaArchivo\rnfl=%s\r",nfl);
- liberaMemoria(nfl);
-
- /* Enva peticin */
- if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_PETICION)){
- errorLog(modulo,42,FALSE);
- return(FALSE);
- }
- /* Nombre del archivo destino (local)*/
- char fileautoexec[LONPRM];
- sprintf(fileautoexec,"/tmp/_autoexec_%s",IPlocal);
-
- /* Recibe archivo */
- if(!recArchivo(&socket_c,fileautoexec)){
- errorLog(modulo,58, FALSE);
- close(socket_c);
- return(FALSE);
- }
-
- close(socket_c);
-
- /* Ejecuta archivo */
- ejecutaArchivo(fileautoexec,ptrTrama);
- return(TRUE);
-}
-//______________________________________________________________________________________________________
-// Funcin: comandosPendientes
-//
-// Descripcin:
-// Bsqueda de acciones pendientes en el servidor de administracin
-// Parmetros:
-// Ninguno
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-BOOLEAN comandosPendientes(TRAMA* ptrTrama)
-{
- SOCKET socket_c;
- char modulo[] = "comandosPendientes()";
-
- CMDPTES=TRUE;
- initParametros(ptrTrama,0);
-
- while(CMDPTES){
- sprintf(ptrTrama->parametros,"nfn=ComandosPendientes\r");
- if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_PETICION)){
- errorLog(modulo,42,FALSE);
- return(FALSE);
- }
- ptrTrama=recibeMensaje(&socket_c);
- if(!ptrTrama){
- errorLog(modulo,45,FALSE);
- return(FALSE);
- }
-
- close(socket_c);
-
- if(!gestionaTrama(ptrTrama)){ // Anlisis de la trama
- errorLog(modulo,39,FALSE);
- return(FALSE);
- }
- }
- return(TRUE);
-}
-//______________________________________________________________________________________________________
-// Funcin: NoComandosPtes
-//
-// Descripcin:
-// Conmuta el switch de los comandos pendientes y lo pone a false
-// Parmetros:
-// - ptrTrama: contenido del mensaje
-// Devuelve:
-// TRUE siempre
-// Especificaciones:
-// Cuando se ejecuta esta funcin se sale del bucle que recupera los comandos pendientes en el
-// servidor y el cliente pasa a a estar disponible para recibir comandos desde el ste.
-//______________________________________________________________________________________________________
-BOOLEAN NoComandosPtes(TRAMA* ptrTrama)
-{
- CMDPTES=FALSE; // Corta el bucle de comandos pendientes
- return(TRUE);
-}
-//______________________________________________________________________________________________________
-// Funcin: ProcesaComandos
-//
-// Descripcin:
-// Espera comando desde el Servidor de Administracin para ejecutarlos
-// Parmetros:
-// Ninguno
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-// ________________________________________________________________________________________________________
-void procesaComandos(TRAMA* ptrTrama)
-{
- int lon;
- SOCKET socket_c;
- char modulo[] = "procesaComandos()";
-
- initParametros(ptrTrama,0);
- while(TRUE){
- lon=sprintf(ptrTrama->parametros,"nfn=DisponibilidadComandos\r");
- lon+=sprintf(ptrTrama->parametros+lon,"tpc=%s\r",CLIENTE_OPENGNSYS); // Activar disponibilidad
- if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_INFORMACION)){
- errorLog(modulo,43,FALSE);
- return;
- }
- infoLog(19); // Disponibilidad de cliente activada
- ptrTrama=recibeMensaje(&socket_c);
- if(!ptrTrama){
- errorLog(modulo,46,FALSE);
- return;
- }
-
- close(socket_c);
-
- if(!gestionaTrama(ptrTrama)){ // Anlisis de la trama
- errorLog(modulo,39,FALSE);
- return;
- }
- if(!comandosPendientes(ptrTrama)){
- errorLog(modulo,42,FALSE);
- }
- }
-}
-//______________________________________________________________________________________________________
-// Funcin: Actualizar
-//
-// Descripcin:
-// Actualiza los datos de un ordenador como si volviera a solicitar la entrada
-// en el sistema al servidor de administracin
-// Parmetros:
-// ptrTrama: contenido del mensajede
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-BOOLEAN Actualizar(TRAMA* ptrTrama)
-{
- char msglog[LONSTD]; // Mensaje de log
- char *cfg; // Cadena de datos de configuracin
- int lon; // Longitud de cadena
- char modulo[] = "Actualizar()";
-
- if (ndebug>=DEBUG_MAXIMO) {
- sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
- infoDebug(msglog);
- }
- muestraMensaje(1,NULL);
- if(!comandosPendientes(ptrTrama)){
- errorLog(modulo,84,FALSE);
- return(FALSE);
- }
-
- cfg=LeeConfiguracion();
- herror=0;
- if(!cfg){ // No se puede recuperar la configuracin del cliente
- errorLog(modulo,36,FALSE);
- herror=3;
- }
- // Envia Configuracion al servidor
- initParametros(ptrTrama,0);
- lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Configurar");
- lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuracin de los Sistemas Operativos del cliente
- respuestaEjecucionComando(ptrTrama,herror,0);
-
- muestraMenu();
-
- return(TRUE);
-}
-//______________________________________________________________________________________________________
-// Funcin: Purgar
-//
-// Descripcin:
-// Detiene la ejecucin del browser
-// Parmetros:
-// ptrTrama: contenido del mensajede
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-int Purgar(TRAMA* ptrTrama)
-{
-
- exit(EXIT_SUCCESS);
-}
-//______________________________________________________________________________________________________
-// Funcin: Sondeo
-//
-// Descripcin:
-// Enva al servidor una confirmacin de que est dentro del sistema
-// Parmetros:
-// ptrTrama: contenido del mensajede
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-BOOLEAN Sondeo(TRAMA* ptrTrama)
-{
- return(TRUE);
-}
-//______________________________________________________________________________________________________
-// Funcin: ConsolaRemota
-//
-// Descripcin:
-// Ejecuta un comando de la Shell y envia el eco al servidor (Consola remota)
-// Parmetros:
-// ptrTrama: contenido del mensaje
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-BOOLEAN ConsolaRemota(TRAMA* ptrTrama)
-{
- SOCKET socket_c;
- char *nfn,*scp,*aux,ecosrc[LONPRM],ecodst[LONPRM],msglog[LONSTD];;
- char modulo[] = "ConsolaRemota()";
-
- /* Nombre del archivo de script */
- char filescript[LONPRM];
- sprintf(filescript,"/tmp/_script_%s",IPlocal);
-
- aux=copiaParametro("scp",ptrTrama);
- scp=URLDecode(aux);
- escribeArchivo(filescript,scp);
- liberaMemoria(aux);
- liberaMemoria(scp);
-
- nfn=copiaParametro("nfn",ptrTrama);
- sprintf(interface,"%s/%s",pathinterface,nfn);
- sprintf(ecosrc,"/tmp/_econsola_%s",IPlocal);
- sprintf(parametros,"%s %s %s",nfn,filescript,ecosrc);
- herror=interfaceAdmin(interface,parametros,NULL);
- if(herror){
- sprintf(msglog,"%s:%s",tbErrores[86],nfn);
- errorInfo(modulo,msglog);
- }
- else{
- /* Enva fichero de inventario al servidor */
- sprintf(ecodst,"/tmp/_Seconsola_%s",IPlocal); // Nombre que tendra el archivo en el Servidor
- initParametros(ptrTrama,0);
- sprintf(ptrTrama->parametros,"nfn=recibeArchivo\rnfl=%s\r",ecodst);
- if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_COMANDO)){
- errorLog(modulo,42,FALSE);
- return(FALSE);
- }
- /* Espera seal para comenzar el envo */
- liberaMemoria(ptrTrama);
- recibeFlag(&socket_c,ptrTrama);
- /* Enva archivo */
- if(!sendArchivo(&socket_c,ecosrc)){
- errorLog(modulo,57, FALSE);
- herror=12; // Error de envo de fichero por la red
- }
- close(socket_c);
- }
- liberaMemoria(nfn);
- return(TRUE);
-}
-//_____________________________________________________________________________________________________
-// Funcin: Comando
-//
-// Descripcin:
-// COmando personalizado enviado desde el servidor
-// Parmetros:
-// ptrTrama: contenido del mensaje
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//_____________________________________________________________________________________________________
-BOOLEAN Comando(TRAMA* ptrTrama)
-{
- char *ids,*nfn,msglog[LONSTD];
- char modulo[] = "Comando()";
-
- if (ndebug>=DEBUG_MAXIMO) {
- sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
- infoDebug(msglog);
- }
- nfn=copiaParametro("nfn",ptrTrama);
- ids=copiaParametro("ids",ptrTrama);
-
- sprintf(interface,"%s/%s",pathinterface,nfn);
- herror=interfaceAdmin(interface,NULL,NULL);
- if(herror){
- sprintf(msglog,"%s:%s",tbErrores[86],nfn);
- errorInfo(modulo,msglog);
- }
- /* Envia respuesta de ejecucucin del comando */
- initParametros(ptrTrama,0);
- sprintf(ptrTrama->parametros,"nfn=RESPUESTA_%s\r",nfn);
- respuestaEjecucionComando(ptrTrama,herror,ids);
- liberaMemoria(nfn);
- liberaMemoria(ids);
- return(TRUE);
-}
-//_____________________________________________________________________________________________________
-// Funcin: Arrancar
-//
-// Descripcin:
-// Responde a un comando de encendido por la red
-// Parmetros:
-// ptrTrama: contenido del mensaje
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//_____________________________________________________________________________________________________
-BOOLEAN Arrancar(TRAMA* ptrTrama)
-{
- int lon;
- char *ids,msglog[LONSTD];
- char modulo[] = "Arrancar()";
-
- if (ndebug>=DEBUG_MAXIMO) {
- sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
- infoDebug(msglog);
- }
-
- ids=copiaParametro("ids",ptrTrama);
-
- /* Envia respuesta de ejecucucin del script */
- initParametros(ptrTrama,0);
- lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Arrancar");
- lon+=sprintf(ptrTrama->parametros+lon,"tpc=%s\r",CLIENTE_OPENGNSYS);
- respuestaEjecucionComando(ptrTrama,0,ids);
- liberaMemoria(ids);
- return(TRUE);
-}
-//_____________________________________________________________________________________________________
-// Funcin: Apagar
-//
-// Descripcin:
-// Apaga el cliente
-// Parmetros:
-// ptrTrama: contenido del mensaje
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//_____________________________________________________________________________________________________
-BOOLEAN Apagar(TRAMA* ptrTrama)
-{
- char *ids,*nfn,msglog[LONSTD];
- char modulo[] = "Apagar()";
-
- if (ndebug>=DEBUG_MAXIMO) {
- sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
- infoDebug(msglog);
- }
- nfn=copiaParametro("nfn",ptrTrama);
- ids=copiaParametro("ids",ptrTrama);
-
- initParametros(ptrTrama,0);
- sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Apagar");
- respuestaEjecucionComando(ptrTrama,0,ids);
-
- sprintf(interface,"%s/%s",pathinterface,nfn);
- herror=interfaceAdmin(interface,NULL,NULL);
- if(herror){
- sprintf(msglog,"%s:%s",tbErrores[86],nfn);
- liberaMemoria(nfn);
- liberaMemoria(ids);
- errorInfo(modulo,msglog);
- return(FALSE);
- }
- liberaMemoria(nfn);
- liberaMemoria(ids);
- return(TRUE);
-}
-//_____________________________________________________________________________________________________
-// Funcin: Reiniciar
-//
-// Descripcin:
-// Apaga el cliente
-// Parmetros:
-// ptrTrama: contenido del mensaje
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//_____________________________________________________________________________________________________
-BOOLEAN Reiniciar(TRAMA* ptrTrama)
-{
- char *nfn,*ids,msglog[LONSTD];
- char modulo[] = "Reiniciar()";
-
- if (ndebug>=DEBUG_MAXIMO) {
- sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
- infoDebug(msglog);
- }
- nfn=copiaParametro("nfn",ptrTrama);
- ids=copiaParametro("ids",ptrTrama);
-
- initParametros(ptrTrama,0);
- sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Reiniciar");
- respuestaEjecucionComando(ptrTrama,0,ids);
-
- sprintf(interface,"%s/%s",pathinterface,nfn);
- herror=interfaceAdmin(interface,NULL,NULL);
- if(herror){
- sprintf(msglog,"%s:%s",tbErrores[86],nfn);
- liberaMemoria(nfn);
- liberaMemoria(ids);
- errorInfo(modulo,msglog);
- return(FALSE);
- }
- liberaMemoria(nfn);
- liberaMemoria(ids);
- return(TRUE);
-}
-//_____________________________________________________________________________________________________
-// Funcin: IniciarSesion
-//
-// Descripcin:
-// Inicia sesin en el Sistema Operativo de una de las particiones
-// Parmetros:
-// ptrTrama: contenido del mensaje
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//_____________________________________________________________________________________________________
-BOOLEAN IniciarSesion(TRAMA* ptrTrama)
-{
- char *nfn,*ids,*disk,*par,msglog[LONSTD];
- char modulo[] = "IniciarSesion()";
-
- if (ndebug>=DEBUG_MAXIMO) {
- sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
- infoDebug(msglog);
- }
- nfn=copiaParametro("nfn",ptrTrama);
- ids=copiaParametro("ids",ptrTrama);
- disk=copiaParametro("dsk",ptrTrama);
- par=copiaParametro("par",ptrTrama);
-
- initParametros(ptrTrama,0);
- sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_IniciarSesion");
- respuestaEjecucionComando(ptrTrama,0,ids);
- liberaMemoria(ids);
-
- sprintf(interface,"%s/%s",pathinterface,nfn);
- sprintf(parametros,"%s %s %s",nfn,disk,par);
- liberaMemoria(par);
-
- herror=interfaceAdmin(interface,parametros,NULL);
-
- if(herror){
- sprintf(msglog,"%s:%s",tbErrores[86],nfn);
- liberaMemoria(nfn);
- errorInfo(modulo,msglog);
- return(FALSE);
- }
- liberaMemoria(nfn);
- return(TRUE);
-}
-//______________________________________________________________________________________________________
-// Funcin: CrearImagen
-//
-// Descripcin:
-// Crea una imagen de una particin
-// Parmetros:
-// ptrTrama: contenido del mensaje
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-BOOLEAN CrearImagen(TRAMA* ptrTrama)
-{
- int lon;
- char *nfn,*dsk,*par,*cpt,*idi,*ipr,*nci,*ids,msglog[LONSTD];
- char modulo[] = "CrearImagen()";
-
- if (ndebug>=DEBUG_MAXIMO) {
- sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
- infoDebug(msglog);
- }
-
- dsk=copiaParametro("dsk",ptrTrama); // Disco
- par=copiaParametro("par",ptrTrama); // Nmero de particin
- cpt=copiaParametro("cpt",ptrTrama); // Cdigo de la particin
- idi=copiaParametro("idi",ptrTrama); // Identificador de la imagen
- nci=copiaParametro("nci",ptrTrama); // Nombre cannico de la imagen
- ipr=copiaParametro("ipr",ptrTrama); // Ip del repositorio
-
- nfn=copiaParametro("nfn",ptrTrama);
- ids=copiaParametro("ids",ptrTrama);
- muestraMensaje(7,NULL);
-
- if(InventariandoSoftware(ptrTrama,FALSE,"InventarioSoftware")){ // Crea inventario Software previamente
- muestraMensaje(2,NULL);
- sprintf(interface,"%s/%s",pathinterface,nfn);
- sprintf(parametros,"%s %s %s %s %s",nfn,dsk,par,nci,ipr);
- herror=interfaceAdmin(interface,parametros,NULL);
- if(herror){
- sprintf(msglog,"%s:%s",tbErrores[86],nfn);
- errorInfo(modulo,msglog);
- muestraMensaje(10,NULL);
- }
- else
- muestraMensaje(9,NULL);
- }
- else{
- sprintf(msglog,"%s:%s",tbErrores[86],nfn);
- errorInfo(modulo,msglog);
- }
-
- /* Envia respuesta de ejecucin de la funcin de interface */
- initParametros(ptrTrama,0);
- lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_CrearImagen");
- lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen
- lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Nmero de disco
- lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Nmero de particin de donde se cre
- lon+=sprintf(ptrTrama->parametros+lon,"cpt=%s\r",cpt); // Tipo o cdigo de particin
- lon+=sprintf(ptrTrama->parametros+lon,"ipr=%s\r",ipr); // Ip del repositorio donde se aloj
- respuestaEjecucionComando(ptrTrama,herror,ids);
-
- liberaMemoria(dsk);
- liberaMemoria(par);
- liberaMemoria(cpt);
- liberaMemoria(idi);
- liberaMemoria(nci);
- liberaMemoria(ipr);
- liberaMemoria(nfn);
- liberaMemoria(ids);
-
- muestraMenu();
-
- return(TRUE);
-}
-//______________________________________________________________________________________________________
-// Funcin: CrearImagenBasica
-//
-// Descripcin:
-// Crea una imagen bsica a travers dela sincronizacin
-// Parmetros:
-// ptrTrama: contenido del mensaje
-//
-// FDevuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-BOOLEAN CrearImagenBasica(TRAMA* ptrTrama)
-{
- int lon;
- char *nfn,*dsk,*par,*cpt,*idi,*nci,*rti,*ipr,*msy,*whl,*eli,*cmp,*bpi,*cpc,*bpc,*nba,*ids,msglog[LONSTD];
- char modulo[] = "CrearImagenBasica()";
-
- if (ndebug>=DEBUG_MAXIMO) {
- sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
- infoDebug(msglog);
- }
- nfn=copiaParametro("nfn",ptrTrama);
- dsk=copiaParametro("dsk",ptrTrama); // Disco
- par=copiaParametro("par",ptrTrama); // Nmero de particin
- cpt=copiaParametro("cpt",ptrTrama); // Tipo de particin
- idi=copiaParametro("idi",ptrTrama); // Identificador de la imagen
- nci=copiaParametro("nci",ptrTrama); // Nombre cannico de la imagen
- rti=copiaParametro("rti",ptrTrama); // Ruta de origen de la imagen
- ipr=copiaParametro("ipr",ptrTrama); // Ip del repositorio
-
- msy=copiaParametro("msy",ptrTrama); // Mtodo de sincronizacin
-
- whl=copiaParametro("whl",ptrTrama); // Envo del fichero completo si hay diferencias
- eli=copiaParametro("eli",ptrTrama); // Elimiar archivos en destino que no estn en origen
- cmp=copiaParametro("cmp",ptrTrama); // Comprimir antes de enviar
-
- bpi=copiaParametro("bpi",ptrTrama); // Borrar la imagen antes de crearla
- cpc=copiaParametro("cpc",ptrTrama); // Copiar tambin imagen a la cache
- bpc=copiaParametro("bpc",ptrTrama); // Borrarla de la cache antes de copiarla en ella
- nba=copiaParametro("nba",ptrTrama); // No borrar archivos en destino
-
- muestraMensaje(7,NULL); // Creando Inventario Software
- if(InventariandoSoftware(ptrTrama,FALSE,"InventarioSoftware")){ // Crea inventario Software previamente
- muestraMensaje(30,NULL);// Creando Imagen Bsica, por favor espere...
- sprintf(interface,"%s/%s",pathinterface,nfn);
- sprintf(parametros,"%s %s %s %s %s %s%s%s %s%s%s%s %s %s",nfn,dsk,par,nci,ipr,whl,eli,cmp,bpi,cpc,bpc,nba,msy,rti);
- herror=interfaceAdmin(interface,parametros,NULL);
- if(herror){
- sprintf(msglog,"%s:%s",tbErrores[86],nfn);
- errorInfo(modulo,msglog);
- muestraMensaje(29,NULL);// Ha habido algn error en el proceso de creacin de imagen bsica
- }
- else
- muestraMensaje(28,NULL);// El proceso de creacin de imagen bsica ha terminado correctamente
- }
- else{
- sprintf(msglog,"%s:%s",tbErrores[86],nfn);
- errorInfo(modulo,msglog);
- }
-
- ids=copiaParametro("ids",ptrTrama); // Identificador de la sesin
-
- /* Envia respuesta de ejecucin de la funcin de interface */
- initParametros(ptrTrama,0);
- lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_CrearImagenBasica");
- lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen
- lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Nmero de disco
- lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Nmero de particin de donde se cre
- lon+=sprintf(ptrTrama->parametros+lon,"cpt=%s\r",cpt); // Tipo o cdigo de particin
- lon+=sprintf(ptrTrama->parametros+lon,"ipr=%s\r",ipr); // Ip del repositorio donde se aloj
- respuestaEjecucionComando(ptrTrama,herror,ids);
-
- liberaMemoria(nfn);
- liberaMemoria(dsk);
- liberaMemoria(par);
- liberaMemoria(cpt);
- liberaMemoria(idi);
- liberaMemoria(nci);
- liberaMemoria(rti);
- liberaMemoria(ipr);
-
- liberaMemoria(msy);
-
- liberaMemoria(whl);
- liberaMemoria(eli);
- liberaMemoria(cmp);
-
- liberaMemoria(bpi);
- liberaMemoria(cpc);
- liberaMemoria(bpc);
- liberaMemoria(nba);
- liberaMemoria(ids);
-
- muestraMenu();
-
- return(TRUE);
-}
-//______________________________________________________________________________________________________
-// Funcin: CrearSoftIncremental
-//
-// Descripcin:
-// Crea una software incremental comparando una particin con una imagen bsica
-// Parmetros:
-// ptrTrama: contenido del mensaje
-//
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-BOOLEAN CrearSoftIncremental(TRAMA* ptrTrama)
-{
- int lon;
- char *nfn,*dsk,*par,*idi,*idf,*ipr,*nci,*rti,*ncf,*msy,*whl,*eli,*cmp,*bpi,*cpc,*bpc,*nba,*ids,msglog[LONSTD];
- char modulo[] = "CrearSoftIncremental()";
-
- if (ndebug>=DEBUG_MAXIMO) {
- sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
- infoDebug(msglog);
- }
- nfn=copiaParametro("nfn",ptrTrama);
-
- dsk=copiaParametro("dsk",ptrTrama); // Disco
- par=copiaParametro("par",ptrTrama); // Nmero de particin
- idi=copiaParametro("idi",ptrTrama); // Identificador de la imagen
- nci=copiaParametro("nci",ptrTrama); // Nombre cannico de la imagen
- rti=copiaParametro("rti",ptrTrama); // Ruta de origen de la imagen
- ipr=copiaParametro("ipr",ptrTrama); // Ip del repositorio
- idf=copiaParametro("idf",ptrTrama); // Identificador de la imagen diferencial
- ncf=copiaParametro("ncf",ptrTrama); // Nombre cannico de la imagen diferencial
-
- msy=copiaParametro("msy",ptrTrama); // Mtodo de sincronizacin
-
- whl=copiaParametro("whl",ptrTrama); // Envo del fichero completo si hay diferencias
- eli=copiaParametro("eli",ptrTrama); // Elimiar archivos en destino que no estn en origen
- cmp=copiaParametro("cmp",ptrTrama); // Comprimir antes de enviar
-
- bpi=copiaParametro("bpi",ptrTrama); // Borrar la imagen antes de crearla
- cpc=copiaParametro("cpc",ptrTrama); // Copiar tambin imagen a la cache
- bpc=copiaParametro("bpc",ptrTrama); // Borrarla de la cache antes de copiarla en ella
- nba=copiaParametro("nba",ptrTrama); // No borrar archivos en destino
-
- muestraMensaje(7,NULL); // Creando Inventario Software
- if(InventariandoSoftware(ptrTrama,FALSE,"InventarioSoftware")){ // Crea inventario Software previamente
- muestraMensaje(25,NULL);// Creando Imagen Incremental, por favor espere...
- sprintf(interface,"%s/%s",pathinterface,nfn);
- sprintf(parametros,"%s %s %s %s %s %s %s%s%s %s%s%s%s %s %s",nfn,dsk,par,nci,ipr,ncf,whl,eli,cmp,bpi,cpc,bpc,nba,msy,rti);
-
- herror=interfaceAdmin(interface,parametros,NULL);
- if(herror){
- sprintf(msglog,"%s:%s",tbErrores[86],nfn);
- errorInfo(modulo,msglog);
- muestraMensaje(27,NULL);// Ha habido algn error en el proceso de creacin de imagen bsica
- }
- else
- muestraMensaje(26,NULL);// El proceso de creacin de imagen incremental ha terminado correctamente
- }
- else{
- sprintf(msglog,"%s:%s",tbErrores[86],nfn);
- errorInfo(modulo,msglog);
- }
-
- ids=copiaParametro("ids",ptrTrama); // Identificador de la sesin
-
- /* Envia respuesta de ejecucin de la funcin de interface */
- initParametros(ptrTrama,0);
- lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_CrearSoftIncremental");
- lon+=sprintf(ptrTrama->parametros+lon,"idf=%s\r",idf); // Identificador de la imagen incremental
- lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Nmero de disco
- lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Nmero de particin
- respuestaEjecucionComando(ptrTrama,herror,ids);
-
- liberaMemoria(nfn);
- liberaMemoria(dsk);
- liberaMemoria(par);
- liberaMemoria(idi);
- liberaMemoria(nci);
- liberaMemoria(rti);
- liberaMemoria(ipr);
- liberaMemoria(idf);
- liberaMemoria(ncf);
- liberaMemoria(msy);
- liberaMemoria(whl);
- liberaMemoria(eli);
- liberaMemoria(cmp);
- liberaMemoria(bpi);
- liberaMemoria(cpc);
- liberaMemoria(bpc);
- liberaMemoria(nba);
- liberaMemoria(ids);
-
- muestraMenu();
-
- return(TRUE);
-}
-//______________________________________________________________________________________________________
-// Funcin: RestaurarImagen
-//
-// Descripcin:
-// Restaura una imagen en una particin
-// Parmetros:
-// ptrTrama: contenido del mensaje
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En bpccaso de ocurrir algn error
-//______________________________________________________________________________________________________
-BOOLEAN RestaurarImagen(TRAMA* ptrTrama)
-{
- int lon;
- char *nfn,*dsk,*par,*idi,*ipr,*ifs,*cfg,*nci,*ids,*ptc,msglog[LONSTD];
- char modulo[] = "RestaurarImagen()";
-
- if (ndebug>=DEBUG_MAXIMO) {
- sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
- infoDebug(msglog);
- }
-
- dsk=copiaParametro("dsk",ptrTrama);
- par=copiaParametro("par",ptrTrama);
- idi=copiaParametro("idi",ptrTrama);
- ipr=copiaParametro("ipr",ptrTrama);
- nci=copiaParametro("nci",ptrTrama);
- ifs=copiaParametro("ifs",ptrTrama);
- ptc=copiaParametro("ptc",ptrTrama);
-
- nfn=copiaParametro("nfn",ptrTrama);
- ids=copiaParametro("ids",ptrTrama);
- muestraMensaje(3,NULL);
- sprintf(interface,"%s/%s",pathinterface,nfn);
- sprintf(parametros,"%s %s %s %s %s %s",nfn,dsk,par,nci,ipr,ptc);
- herror=interfaceAdmin(interface,parametros,NULL);
- if(herror){
- sprintf(msglog,"%s:%s",tbErrores[86],nfn);
- errorInfo(modulo,msglog);
- muestraMensaje(12,NULL);
- }
- else
- muestraMensaje(11,NULL);
-
- /* Obtener nueva configuracin */
- cfg=LeeConfiguracion();
- if(!cfg){ // No se puede recuperar la configuracin del cliente
- errorLog(modulo,36,FALSE);
- }
-
- /* Envia respuesta de ejecucin de la funcin de interface */
- initParametros(ptrTrama,0);
- lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_RestaurarImagen");
- lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen
- lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Nmero de disco
- lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Nmero de particin
- lon+=sprintf(ptrTrama->parametros+lon,"ifs=%s\r",ifs); // Identificador del perfil software
- lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuracin de discos
- respuestaEjecucionComando(ptrTrama,herror,ids);
-
- liberaMemoria(nfn);
- liberaMemoria(dsk);
- liberaMemoria(par);
- liberaMemoria(idi);
- liberaMemoria(nci);
- liberaMemoria(ipr);
- liberaMemoria(ifs);
- liberaMemoria(cfg);
- liberaMemoria(ptc);
- liberaMemoria(ids);
-
- muestraMenu();
-
- return(TRUE);
-}
-//______________________________________________________________________________________________________
-// Funcin: RestaurarImagenBasica
-//
-// Descripcin:
-// Restaura una imagen bsica en una particin
-// Parmetros:
-// ptrTrama: contenido del mensaje
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-BOOLEAN RestaurarImagenBasica(TRAMA* ptrTrama)
-{
- int lon;
- char *nfn,*dsk,*par,*idi,*ipr,*met,*nci,*rti,*ifs,*cfg,*msy,*whl,*eli,*cmp,*tpt,*bpi,*cpc,*bpc,*nba,*ids,msglog[LONSTD];
- char modulo[] = "RestaurarImagenBasica()";
-
- if (ndebug>=DEBUG_MAXIMO) {
- sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
- infoDebug(msglog);
- }
- dsk=copiaParametro("dsk",ptrTrama);
- par=copiaParametro("par",ptrTrama);
- idi=copiaParametro("idi",ptrTrama);
- ipr=copiaParametro("ipr",ptrTrama);
- met=copiaParametro("met",ptrTrama); // Mtodo de clonacin 0= desde cach 1= desde repositorio
- nci=copiaParametro("nci",ptrTrama);
- rti=copiaParametro("rti",ptrTrama); // Ruta de origen de la imagen
- ifs=copiaParametro("ifs",ptrTrama);
-
- tpt=copiaParametro("tpt",ptrTrama); // Tipo de trasnmisin unicast o multicast
- msy=copiaParametro("msy",ptrTrama); // Metodo de sincronizacion
-
- whl=copiaParametro("whl",ptrTrama); // Envo del fichero completo si hay diferencias
- eli=copiaParametro("eli",ptrTrama); // Elimiar archivos en destino que no estn en origen
- cmp=copiaParametro("cmp",ptrTrama); // Comprimir antes de enviar
-
- bpi=copiaParametro("bpi",ptrTrama); // Borrar la imagen antes de crearla
- cpc=copiaParametro("cpc",ptrTrama); // Copiar tambin imagen a la cache
- bpc=copiaParametro("bpc",ptrTrama); // Borrarla de la cache antes de copiarla en ella
- nba=copiaParametro("nba",ptrTrama); // No borrar archivos en destino
-
- nfn=copiaParametro("nfn",ptrTrama);
- ids=copiaParametro("ids",ptrTrama);
- muestraMensaje(31,NULL);
- sprintf(interface,"%s/%s",pathinterface,nfn);
- sprintf(parametros,"%s %s %s %s %s %s %s%s%s %s%s%s%s %s %s %s",nfn,dsk,par,nci,ipr,tpt,whl,eli,cmp,bpi,cpc,bpc,nba,met,msy,rti);
- herror=interfaceAdmin(interface,parametros,NULL);
- if(herror){
- sprintf(msglog,"%s:%s",tbErrores[86],nfn);
- errorInfo(modulo,msglog);
- muestraMensaje(33,NULL);
- }
- else
- muestraMensaje(32,NULL);
-
- /* Obtener nueva configuracin */
- cfg=LeeConfiguracion();
- if(!cfg){ // No se puede recuperar la configuracin del cliente
- errorLog(modulo,36,FALSE);
- }
-
- /* Envia respuesta de ejecucin de la funcin de interface */
- initParametros(ptrTrama,0);
- lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_RestaurarImagenBasica");
- lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen
- lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Nmero de disco
- lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Nmero de particin
- lon+=sprintf(ptrTrama->parametros+lon,"ifs=%s\r",ifs); // Identificador del perfil software
- lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuracin de discos
- respuestaEjecucionComando(ptrTrama,herror,ids);
-
- liberaMemoria(nfn);
- liberaMemoria(dsk);
- liberaMemoria(par);
- liberaMemoria(idi);
- liberaMemoria(nci);
- liberaMemoria(rti);
- liberaMemoria(ifs);
- liberaMemoria(cfg);
- liberaMemoria(ipr);
- liberaMemoria(met);
-
- liberaMemoria(tpt);
- liberaMemoria(msy);
-
- liberaMemoria(whl);
- liberaMemoria(eli);
- liberaMemoria(cmp);
-
- liberaMemoria(bpi);
- liberaMemoria(cpc);
- liberaMemoria(bpc);
- liberaMemoria(nba);
- liberaMemoria(ids);
-
- muestraMenu();
-
- return(TRUE);
-}
-//______________________________________________________________________________________________________
-// Funcin: RestaurarSoftIncremental
-//
-// Descripcin:
-// Restaura software incremental en una particin
-// Parmetros:
-// ptrTrama: contenido del mensaje
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-BOOLEAN RestaurarSoftIncremental(TRAMA* ptrTrama)
-{
- int lon;
- char *nfn,*dsk,*par,*idi,*ipr,*met,*ifs,*nci,*rti,*idf,*ncf,*msy,*whl,*eli,*cmp,*tpt,*bpi,*cpc,*bpc,*nba,*ids,msglog[LONSTD];
- char modulo[] = "RestaurarSoftIncremental()";
-
- if (ndebug>=DEBUG_MAXIMO) {
- sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
- infoDebug(msglog);
- }
- dsk=copiaParametro("dsk",ptrTrama);
- par=copiaParametro("par",ptrTrama);
- idi=copiaParametro("idi",ptrTrama);
- idf=copiaParametro("idf",ptrTrama);
- ipr=copiaParametro("ipr",ptrTrama);
- met=copiaParametro("met",ptrTrama); // Mtodo de clonacin 0= desde cach 1= desde repositorio
- ifs=copiaParametro("ifs",ptrTrama);
- nci=copiaParametro("nci",ptrTrama);
- rti=copiaParametro("rti",ptrTrama); // Ruta de origen de la imagen
- ncf=copiaParametro("ncf",ptrTrama);
-
- tpt=copiaParametro("tpt",ptrTrama); // Tipo de trasnmisin unicast o multicast
- msy=copiaParametro("msy",ptrTrama); // Metodo de sincronizacion
-
- whl=copiaParametro("whl",ptrTrama); // Envo del fichero completo si hay diferencias
- eli=copiaParametro("eli",ptrTrama); // Elimiar archivos en destino que no estn en origen
- cmp=copiaParametro("cmp",ptrTrama); // Comprimir antes de enviar
-
- bpi=copiaParametro("bpi",ptrTrama); // Borrar la imagen antes de crearla
- cpc=copiaParametro("cpc",ptrTrama); // Copiar tambin imagen a la cache
- bpc=copiaParametro("bpc",ptrTrama); // Borrarla de la cache antes de copiarla en ella
- nba=copiaParametro("nba",ptrTrama); // No borrar archivos en destino
-
- nfn=copiaParametro("nfn",ptrTrama);
- ids=copiaParametro("ids",ptrTrama);
- muestraMensaje(31,NULL);
- sprintf(interface,"%s/%s",pathinterface,nfn);
- sprintf(parametros,"%s %s %s %s %s %s %s %s%s%s %s%s%s%s %s %s %s",nfn,dsk,par,nci,ipr,ncf,tpt,whl,eli,cmp,bpi,cpc,bpc,nba,met,msy,rti);
- herror=interfaceAdmin(interface,parametros,NULL);
- if(herror){
- sprintf(msglog,"%s:%s",tbErrores[86],nfn);
- errorInfo(modulo,msglog);
- muestraMensaje(35,NULL);
- }
- else
- muestraMensaje(34,NULL);
-
- /* Envia respuesta de ejecucin de la funcin de interface */
- initParametros(ptrTrama,0);
- lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_RestaurarSoftIncremental");
- lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idf); // Identificador de la imagen incremental (Forzada a idi)
- lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Nmero de disco
- lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Nmero de particin
- lon+=sprintf(ptrTrama->parametros+lon,"ifs=%s\r",ifs); // Identificador del perfil software
-
- respuestaEjecucionComando(ptrTrama,herror,ids);
-
- liberaMemoria(nfn);
- liberaMemoria(dsk);
- liberaMemoria(par);
- liberaMemoria(idi);
- liberaMemoria(idf);
- liberaMemoria(nci);
- liberaMemoria(rti);
- liberaMemoria(ncf);
- liberaMemoria(ifs);
- liberaMemoria(ipr);
- liberaMemoria(met);
-
- liberaMemoria(tpt);
- liberaMemoria(msy);
-
- liberaMemoria(whl);
- liberaMemoria(eli);
- liberaMemoria(cmp);
-
- liberaMemoria(bpi);
- liberaMemoria(cpc);
- liberaMemoria(bpc);
- liberaMemoria(nba);
- liberaMemoria(ids);
-
- muestraMenu();
-
- return(TRUE);
-}
-//______________________________________________________________________________________________________
-// Funcin: Configurar
-//
-// Descripcin:
-// Configura la tabla de particiones y formatea
-// Parmetros:
-// ptrTrama: contenido del mensaje
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-BOOLEAN Configurar(TRAMA* ptrTrama)
-{
- int lon;
- char *nfn,*dsk,*cfg,*ids,msglog[LONSTD];
- char modulo[] = "Configurar()";
-
- if (ndebug>=DEBUG_MAXIMO) {
- sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
- infoDebug(msglog);
- }
-
- dsk=copiaParametro("dsk",ptrTrama);
- cfg=copiaParametro("cfg",ptrTrama);
- /* Sustituir caracteres */
- sustituir(cfg,'\n','$');
- sustituir(cfg,'\t','#');
-
- nfn=copiaParametro("nfn",ptrTrama);
- ids=copiaParametro("ids",ptrTrama);
- muestraMensaje(4,NULL);
- sprintf(interface,"%s/%s",pathinterface,nfn);
- sprintf(parametros,"%s %s %s",nfn,dsk,cfg);
-
- herror=interfaceAdmin(interface,parametros,NULL);
- if(herror){
- sprintf(msglog,"%s:%s",tbErrores[86],nfn);
- errorInfo(modulo,msglog);
- muestraMensaje(13,NULL);
- }
- else
- muestraMensaje(14,NULL);
-
- cfg=LeeConfiguracion();
- if(!cfg){ // No se puede recuperar la configuracin del cliente
- errorLog(modulo,36,FALSE);
- return(FALSE);
- }
-
- /* Envia respuesta de ejecucin del comando*/
- initParametros(ptrTrama,0);
- lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Configurar");
- lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuracin de los Sistemas Operativos del cliente
- respuestaEjecucionComando(ptrTrama,herror,ids);
-
- liberaMemoria(dsk);
- liberaMemoria(cfg);
- liberaMemoria(nfn);
- liberaMemoria(ids);
-
- muestraMenu();
-
- return(TRUE);
-}
-// ________________________________________________________________________________________________________
-// Funcin: InventarioHardware
-//
-// Descripcin:
-// Envia al servidor el nombre del archivo de inventario de su hardware para posteriormente
-// esperar que ste lo solicite y enviarlo por la red.
-// Parmetros:
-// ptrTrama: contenido del mensaje
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-BOOLEAN InventarioHardware(TRAMA* ptrTrama)
-{
- int lon;
- SOCKET socket_c;
- char *nfn,*ids,msglog[LONSTD],hrdsrc[LONPRM],hrddst[LONPRM];
- char modulo[] = "InventarioHardware()";
-
- if (ndebug>=DEBUG_MAXIMO) {
- sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
- infoDebug(msglog);
- }
-
- nfn=copiaParametro("nfn",ptrTrama);
- ids=copiaParametro("ids",ptrTrama);
- muestraMensaje(6,NULL);
-
- sprintf(interface,"%s/%s",pathinterface,nfn);
- sprintf(hrdsrc,"/tmp/Chrd-%s",IPlocal); // Nombre que tendra el archivo de inventario
- sprintf(parametros,"%s %s",nfn,hrdsrc);
- herror=interfaceAdmin(interface,parametros,NULL);
- if(herror){
- sprintf(msglog,"%s:%s",tbErrores[86],nfn);
- errorInfo(modulo,msglog);
- muestraMensaje(18,NULL);
- }
- else{
- /* Enva fichero de inventario al servidor */
- sprintf(hrddst,"/tmp/Shrd-%s",IPlocal); // Nombre que tendra el archivo en el Servidor
- initParametros(ptrTrama,0);
- sprintf(ptrTrama->parametros,"nfn=recibeArchivo\rnfl=%s\r",hrddst);
- if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_COMANDO)){
- liberaMemoria(nfn);
- liberaMemoria(ids);
- errorLog(modulo,42,FALSE);
- return(FALSE);
- }
- /* Espera seal para comenzar el envo */
- liberaMemoria(ptrTrama);
- recibeFlag(&socket_c,ptrTrama);
- /* Enva archivo */
- if(!sendArchivo(&socket_c,hrdsrc)){
- errorLog(modulo,57, FALSE);
- herror=12; // Error de envo de fichero por la red
- }
- close(socket_c);
- muestraMensaje(17,NULL);
- }
-
- /* Envia respuesta de ejecucin de la funcin de interface */
- initParametros(ptrTrama,0);
- lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_InventarioHardware");
- lon+=sprintf(ptrTrama->parametros+lon,"hrd=%s\r",hrddst);
- respuestaEjecucionComando(ptrTrama,herror,ids);
- liberaMemoria(nfn);
- liberaMemoria(ids);
-
- muestraMenu();
-
- return(TRUE);
-}
-// ________________________________________________________________________________________________________
-// Funcin: InventarioSoftware
-//
-// Descripcin:
-// Crea el inventario software de un sistema operativo instalado en una particin.
-// Parmetros:
-// ptrTrama: contenido del mensaje
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-BOOLEAN InventarioSoftware(TRAMA* ptrTrama)
-{
- char *nfn,*ids,msglog[LONSTD];
- char modulo[] = "InventarioSoftware()";
-
- if (ndebug>=DEBUG_MAXIMO) {
- sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
- infoDebug(msglog);
- }
- nfn=copiaParametro("nfn",ptrTrama);
- ids=copiaParametro("ids",ptrTrama);
- muestraMensaje(7,NULL);
- InventariandoSoftware(ptrTrama,TRUE,nfn);
- respuestaEjecucionComando(ptrTrama,herror,ids);
- liberaMemoria(nfn);
- liberaMemoria(ids);
- muestraMenu();
- return(TRUE);
-}
-// ________________________________________________________________________________________________________
-//
-// Funcin: InventariandoSoftware
-//
-// Descripcin:
-// Envia al servidor el nombre del archivo de inventario de su software para posteriormente
-// esperar que ste lo solicite y enviarlo por la red.
-// Parmetros:
-// ptrTrama: contenido del mensaje
-// sw: switch que indica si la funcin es llamada por el comando InventarioSoftware(true) o CrearImagen(false)
-// nfn: Nombre de la funcin del Interface que implementa el comando
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-BOOLEAN InventariandoSoftware(TRAMA* ptrTrama,BOOLEAN sw,char *nfn)
-{
- int lon;
- SOCKET socket_c;
- char *dsk,*par,msglog[LONSTD],sftsrc[LONPRM],sftdst[LONPRM];
- char modulo[] = "InventariandoSoftware()";
-
- dsk=copiaParametro("dsk",ptrTrama); // Disco
- par=copiaParametro("par",ptrTrama);
-
- sprintf(interface,"%s/%s",pathinterface,nfn);
- sprintf(sftsrc,"/tmp/CSft-%s-%s",IPlocal,par); // Nombre que tendra el archivo de inventario
- sprintf(parametros,"%s %s %s %s",nfn,dsk,par,sftsrc);
-
- herror=interfaceAdmin(interface,parametros,NULL);
- herror=0;
- if(herror){
- sprintf(msglog,"%s:%s",tbErrores[86],nfn);
- errorInfo(modulo,msglog);
- muestraMensaje(20,NULL);
- }
- else{
- /* Enva fichero de inventario al servidor */
- sprintf(sftdst,"/tmp/Ssft-%s-%s",IPlocal,par); // Nombre que tendra el archivo en el Servidor
- initParametros(ptrTrama,0);
-
- sprintf(ptrTrama->parametros,"nfn=recibeArchivo\rnfl=%s\r",sftdst);
- if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_COMANDO)){
- errorLog(modulo,42,FALSE);
- liberaMemoria(dsk);
- liberaMemoria(par);
- return(FALSE);
- }
- /* Espera seal para comenzar el envo */
- liberaMemoria(ptrTrama);
- if(!recibeFlag(&socket_c,ptrTrama)){
- errorLog(modulo,17,FALSE);
- }
- /* Enva archivo */
- if(!sendArchivo(&socket_c,sftsrc)){
- errorLog(modulo,57, FALSE);
- herror=12; // Error de envo de fichero por la red
- }
- close(socket_c);
- muestraMensaje(19,NULL);
- }
- initParametros(ptrTrama,0);
- lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_InventarioSoftware");
- lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par);
- lon+=sprintf(ptrTrama->parametros+lon,"sft=%s\r",sftdst);
- if(!sw)
- respuestaEjecucionComando(ptrTrama,herror,"0");
-
- liberaMemoria(dsk);
- liberaMemoria(par);
- return(TRUE);
-}
-// ________________________________________________________________________________________________________
-// Funcin: EjecutarScript
-//
-// Descripcin:
-// Ejecuta cdigo de script
-// Parmetros:
-// ptrTrama: contenido del mensaje
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//______________________________________________________________________________________________________
-BOOLEAN EjecutarScript(TRAMA* ptrTrama)
-{
- int lon;
- char *nfn,*aux,*ids,*scp,*cfg,msglog[LONSTD];
- char modulo[] = "EjecutarScript()";
-
- if (ndebug>=DEBUG_MAXIMO) {
- sprintf(msglog, "%s:%s",tbMensajes[21],modulo);
- infoDebug(msglog);
- }
- aux=copiaParametro("scp",ptrTrama);
- scp=URLDecode(aux);
-
-
- muestraMensaje(8,NULL);
- /* Nombre del archivo de script */
- char filescript[LONPRM];
- sprintf(filescript,"/tmp/_script_%s",IPlocal);
- escribeArchivo(filescript,scp);
- nfn=copiaParametro("nfn",ptrTrama);
- sprintf(interface,"%s/%s",pathinterface,nfn);
- sprintf(parametros,"%s %s",nfn,filescript);
- herror=interfaceAdmin(interface,parametros,NULL);
- if(herror){
- sprintf(msglog,"%s:%s",tbErrores[86],nfn);
- errorInfo(modulo,msglog);
- muestraMensaje(21,NULL);
- }
- else
- muestraMensaje(22,NULL);
-
- // Toma configuracin de particiones
- cfg=LeeConfiguracion();
- if(!cfg){ // No se puede recuperar la configuracin del cliente
- errorLog(modulo,36,FALSE);
- herror=36;
- }
-
- ids=copiaParametro("ids",ptrTrama);
-
- //herror=ejecutarCodigoBash(scp);
- initParametros(ptrTrama,0);
- lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_EjecutarScript");
- lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuracin de los Sistemas Operativos del cliente
- respuestaEjecucionComando(ptrTrama,herror,ids);
-
- liberaMemoria(nfn);
- liberaMemoria(ids);
- liberaMemoria(aux);
- liberaMemoria(scp);
- liberaMemoria(cfg);
-
- muestraMenu();
-
- return(TRUE);
-}
-//______________________________________________________________________________________________________
-// Funcin: respuestaEjecucionComando
-//
-// Descripcin:
-// Envia una respuesta a una ejecucion de comando al servidor de Administracin
-// Parmetros:
-// - ptrTrama: contenido del mensaje
-// - res: Resultado de la ejecucin (Cdigo de error devuelto por el script ejecutado)
-// - ids: Identificador de la sesion (En caso de no haber seguimiento es NULO)
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-// ________________________________________________________________________________________________________
-BOOLEAN respuestaEjecucionComando(TRAMA* ptrTrama,int res,char *ids)
-{
- int lon;
- SOCKET socket_c;
- char modulo[] = "respuestaEjecucionComando()";
-
- lon=strlen(ptrTrama->parametros);
- if(ids){ // Existe seguimiento
- lon+=sprintf(ptrTrama->parametros+lon,"ids=%s\r",ids); // Aade identificador de la sesin
- }
- if (res==0){ // Resultado satisfactorio
- lon+=sprintf(ptrTrama->parametros+lon,"res=%s\r","1");
- lon+=sprintf(ptrTrama->parametros+lon,"der=%s\r","");
- }
- else{ // Algn error
- lon+=sprintf(ptrTrama->parametros+lon,"res=%s\r","2");
- if(res>MAXERRORSCRIPT)
- lon+=sprintf(ptrTrama->parametros+lon,"der=%s (Error de script:%d)\r",tbErroresScripts[0],res);// Descripcin del error
- else
- lon+=sprintf(ptrTrama->parametros+lon,"der=%s\r",tbErroresScripts[res]);// Descripcin del error
- }
- if(!(enviaMensajeServidor(&socket_c,ptrTrama,MSG_NOTIFICACION))){
- errorLog(modulo,44,FALSE);
- return(FALSE);
- }
-
- close(socket_c);
- return(TRUE);
-}
-// ________________________________________________________________________________________________________
-// Funcin: gestionaTrama
-//
-// Descripcin:
-// Procesa las tramas recibidas.
-// Parametros:
-// ptrTrama: contenido del mensaje
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-// ________________________________________________________________________________________________________
-BOOLEAN gestionaTrama(TRAMA *ptrTrama)
-{
- int i, res;
- char *nfn;
- char modulo[] = "gestionaTrama()";
-
- INTROaFINCAD(ptrTrama);
- nfn = copiaParametro("nfn", ptrTrama); // Toma nombre de funcin
- for (i = 0; i < MAXIMAS_FUNCIONES; i++) { // Recorre funciones que procesan las tramas
- res = strcmp(tbfuncionesClient[i].nf, nfn);
- if (res == 0) { // Encontrada la funcin que procesa el mensaje
- liberaMemoria(nfn);
- return(tbfuncionesClient[i].fptr(ptrTrama)); // Invoca la funcin
- }
- }
-
- liberaMemoria(nfn);
-
- /* Slo puede ser un comando personalizado
- if (ptrTrama->tipo==MSG_COMANDO)
- return(Comando(ptrTrama));
- */
- errorLog(modulo, 18, FALSE);
- return (FALSE);
-}
-//________________________________________________________________________________________________________
-// Funcin: ejecutaArchivo
-//
-// Descripcin:
-// Ejecuta los comando contenido en un archivo (cada comando y sus parametros separados por un
-// salto de linea.
-// Parmetros:
-// filecmd: Nombre del archivo de comandos
-// ptrTrama: Puntero a una estructura TRAMA usada en las comunicaciones por red (No debe ser NULL)
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-//________________________________________________________________________________________________________
-BOOLEAN ejecutaArchivo(char* filecmd,TRAMA *ptrTrama)
-{
- char* buffer,*lineas[MAXIMAS_LINEAS];
- int i,numlin;
- char modulo[] = "ejecutaArchivo()";
-
- buffer=leeArchivo(filecmd);
- if(buffer){
- numlin = splitCadena(lineas, buffer, '@');
- initParametros(ptrTrama,0);
- for (i = 0; i < numlin; i++) {
- if(strlen(lineas[i])>0){
- strcpy(ptrTrama->parametros,lineas[i]);
- //strcat(ptrTrama->parametros,"\rMCDJ@"); // Fin de trama
- if(!gestionaTrama(ptrTrama)){ // Anlisis de la trama
- errorLog(modulo,39,FALSE);
- //return(FALSE);
- }
- }
- }
- }
- liberaMemoria(buffer);
- return(TRUE);
-}
-
-BOOLEAN EjecutaComandosPendientes(TRAMA* ptrTrama)
-{
- return(TRUE);
-}
-
-//______________________________________________________________________________________________________
-// Funcin: enviaMensajeServidor
-//
-// Descripcin:
-// Envia un mensaje al servidor de Administracin
-// Parmetros:
-// - socket_c: (Salida) Socket utilizado para el envo
-// - ptrTrama: contenido del mensaje
-// - tipo: Tipo de mensaje
-// C=Comando, N=Respuesta a un comando, P=Peticion,R=Respuesta a una peticin, I=Informacion
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algn error
-// ________________________________________________________________________________________________________
-BOOLEAN enviaMensajeServidor(SOCKET *socket_c,TRAMA *ptrTrama,char tipo)
-{
- int lon;
- char modulo[] = "enviaMensajeServidor()";
-
- *socket_c=abreConexion();
- if(*socket_c==INVALID_SOCKET){
- errorLog(modulo,38,FALSE); // Error de conexin con el servidor
- return(FALSE);
- }
- ptrTrama->arroba='@'; // Cabecera de la trama
- strncpy(ptrTrama->identificador,"JMMLCAMDJ_MCDJ",14); // identificador de la trama
- ptrTrama->tipo=tipo; // Tipo de mensaje
- lon=strlen(ptrTrama->parametros); // Compone la trama
- lon+=sprintf(ptrTrama->parametros+lon,"iph=%s\r",IPlocal); // Ip del ordenador
- lon+=sprintf(ptrTrama->parametros+lon,"ido=%s\r",idordenador); // Identificador del ordenador
- lon+=sprintf(ptrTrama->parametros+lon,"npc=%s\r",nombreordenador); // Nombre del ordenador
- lon+=sprintf(ptrTrama->parametros+lon,"idc=%s\r",idcentro); // Identificador del centro
- lon+=sprintf(ptrTrama->parametros+lon,"ida=%s\r",idaula); // Identificador del aula
-
- if (!mandaTrama(socket_c,ptrTrama)) {
- errorLog(modulo,26,FALSE);
- return (FALSE);
- }
- return(TRUE);
-}
-// ********************************************************************************************************
-// PROGRAMA PRINCIPAL (CLIENTE)
-// ********************************************************************************************************
-int main(int argc, char *argv[])
-{
- TRAMA *ptrTrama;
- char modulo[] = "main()";
-
- ptrTrama=(TRAMA *)reservaMemoria(sizeof(TRAMA));
- if (ptrTrama == NULL) { // No hay memoria suficiente para el bufer de las tramas
- errorLog(modulo, 3, FALSE);
- exit(EXIT_FAILURE);
- }
- /*--------------------------------------------------------------------------------------------------------
- Validacin de parmetros de ejecucin y fichero de configuracin
- ---------------------------------------------------------------------------------------------------------*/
- if (!validacionParametros(argc, argv,3)) // Valida parmetros de ejecucin
- exit(EXIT_FAILURE);
-
- if (!tomaConfiguracion(szPathFileCfg)) // Toma parametros de configuracin
- exit(EXIT_FAILURE);
- /*--------------------------------------------------------------------------------------------------------
- Carga catlogo de funciones que procesan las tramas
- ---------------------------------------------------------------------------------------------------------*/
- int cf = 0;
-
- strcpy(tbfuncionesClient[cf].nf, "RESPUESTA_AutoexecCliente");
- tbfuncionesClient[cf++].fptr = &RESPUESTA_AutoexecCliente;
-
- strcpy(tbfuncionesClient[cf].nf, "RESPUESTA_InclusionCliente");
- tbfuncionesClient[cf++].fptr = &RESPUESTA_InclusionCliente;
-
- strcpy(tbfuncionesClient[cf].nf, "NoComandosPtes");
- tbfuncionesClient[cf++].fptr = &NoComandosPtes;
-
- strcpy(tbfuncionesClient[cf].nf, "Actualizar");
- tbfuncionesClient[cf++].fptr = &Actualizar;
-
- strcpy(tbfuncionesClient[cf].nf, "Purgar");
- tbfuncionesClient[cf++].fptr = &Purgar;
-
- strcpy(tbfuncionesClient[cf].nf, "ConsolaRemota");
- tbfuncionesClient[cf++].fptr = &ConsolaRemota;
-
- strcpy(tbfuncionesClient[cf].nf, "Sondeo");
- tbfuncionesClient[cf++].fptr = &Sondeo;
-
- strcpy(tbfuncionesClient[cf].nf, "Arrancar");
- tbfuncionesClient[cf++].fptr = &Arrancar;
-
- strcpy(tbfuncionesClient[cf].nf, "Apagar");
- tbfuncionesClient[cf++].fptr = &Apagar;
-
- strcpy(tbfuncionesClient[cf].nf, "Reiniciar");
- tbfuncionesClient[cf++].fptr = &Reiniciar;
-
- strcpy(tbfuncionesClient[cf].nf, "IniciarSesion");
- tbfuncionesClient[cf++].fptr = &IniciarSesion;
-
- strcpy(tbfuncionesClient[cf].nf, "CrearImagen");
- tbfuncionesClient[cf++].fptr = &CrearImagen;
-
- strcpy(tbfuncionesClient[cf].nf, "CrearImagenBasica");
- tbfuncionesClient[cf++].fptr = &CrearImagenBasica;
-
- strcpy(tbfuncionesClient[cf].nf, "CrearSoftIncremental");
- tbfuncionesClient[cf++].fptr = &CrearSoftIncremental;
-
- strcpy(tbfuncionesClient[cf].nf, "RestaurarImagen");
- tbfuncionesClient[cf++].fptr = &RestaurarImagen;
-
- strcpy(tbfuncionesClient[cf].nf, "RestaurarImagenBasica");
- tbfuncionesClient[cf++].fptr = &RestaurarImagenBasica;
-
- strcpy(tbfuncionesClient[cf].nf, "RestaurarSoftIncremental");
- tbfuncionesClient[cf++].fptr = &RestaurarSoftIncremental;
-
-
- strcpy(tbfuncionesClient[cf].nf, "Configurar");
- tbfuncionesClient[cf++].fptr = &Configurar;
-
- strcpy(tbfuncionesClient[cf].nf, "EjecutarScript");
- tbfuncionesClient[cf++].fptr = &EjecutarScript;
-
- strcpy(tbfuncionesClient[cf].nf, "InventarioHardware");
- tbfuncionesClient[cf++].fptr = &InventarioHardware;
-
- strcpy(tbfuncionesClient[cf].nf, "InventarioSoftware");
- tbfuncionesClient[cf++].fptr = &InventarioSoftware;
-
- strcpy(tbfuncionesClient[cf].nf, "EjecutaComandosPendientes");
- tbfuncionesClient[cf++].fptr = &EjecutaComandosPendientes;
-
- /*--------------------------------------------------------------------------------------------------------
- Toma direccin IP del cliente
- ---------------------------------------------------------------------------------------------------------*/
- if(!tomaIPlocal()){ // Error al recuperar la IP local
- errorLog(modulo,0,FALSE);
- exit(EXIT_FAILURE);
- }
- /*--------------------------------------------------------------------------------------------------------
- Inicio de sesin
- ---------------------------------------------------------------------------------------------------------*/
- infoLog(1); // Inicio de sesin
- infoLog(3); // Abriendo sesin en el servidor de Administracin;
- /*--------------------------------------------------------------------------------------------------------
- Inclusin del cliente en el sistema
- ---------------------------------------------------------------------------------------------------------*/
- if(!inclusionCliente(ptrTrama)){ // Ha habido algn problema al abrir sesin
- errorLog(modulo,0,FALSE);
- exit(EXIT_FAILURE);
- }
- infoLog(4); // Cliente iniciado
-
- /*--------------------------------------------------------------------------------------------------------
- Procesamiento de la cache
- ---------------------------------------------------------------------------------------------------------*/
- infoLog(23); // Abriendo sesin en el servidor de Administracin;
- if(!cuestionCache(cache)){
- errorLog(modulo,0,FALSE);
- exit(EXIT_FAILURE);
- }
- /*--------------------------------------------------------------------------------------------------------
- Ejecucin del autoexec
- ---------------------------------------------------------------------------------------------------------*/
- if(atoi(idproautoexec)>0){ // Ejecucin de procedimiento Autoexec
- infoLog(5);
- if(!autoexecCliente(ptrTrama)){ // Ejecucin fichero autoexec
- errorLog(modulo,0,FALSE);
- exit(EXIT_FAILURE);
- }
- }
- /*--------------------------------------------------------------------------------------------------------
- Comandos pendientes
- ---------------------------------------------------------------------------------------------------------*/
- infoLog(6); // Procesa comandos pendientes
- if(!comandosPendientes(ptrTrama)){ // Ejecucin de acciones pendientes
- errorLog(modulo,0,FALSE);
- exit(EXIT_FAILURE);
- }
- infoLog(7); // Acciones pendientes procesadas
- /*--------------------------------------------------------------------------------------------------------
- Bucle de recepcin de comandos
- ---------------------------------------------------------------------------------------------------------*/
- muestraMenu();
- procesaComandos(ptrTrama); // Bucle para procesar comandos interactivos
- /*--------------------------------------------------------------------------------------------------------
- Fin de la sesin
- ---------------------------------------------------------------------------------------------------------*/
- exit(EXIT_SUCCESS);
-}
diff --git a/admin/Sources/Clients/ogAdmClient/sources/ogAdmClient.h b/admin/Sources/Clients/ogAdmClient/sources/ogAdmClient.h deleted file mode 100644 index da0a5c34..00000000 --- a/admin/Sources/Clients/ogAdmClient/sources/ogAdmClient.h +++ /dev/null @@ -1,183 +0,0 @@ -// ******************************************************************************************************** -// Cliernte: ogAdmClient -// 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: ogAdmClient.h -// Descripción :Este fichero implementa el cliente general del sistema -// ******************************************************************************************************** -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <errno.h> -#include <unistd.h> -#include <time.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <sys/wait.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <signal.h> -#include "ogAdmLib.h" -// ________________________________________________________________________________________________________ -// Variables globales -// ________________________________________________________________________________________________________ -char *idordenador; // Identificador del ordenador -char *nombreordenador; // Nombre del ordenador -char *cache; // Tamaño de la caché -char *idproautoexec; // Identificador del procedimiento de autoexec -char *idcentro; // Identificador de la Unidad Organizativa -char *idaula; // Identificador del aula -char IPlocal[LONIP]; // Ip local - -char servidoradm[LONPRM]; // Dirección IP del servidor de administración -char puerto[LONPRM]; // Puerto de comunicación -char pathinterface[LONPRM]; // Path donde está la interface entre la administración y el módulo de clonación - -char interface[LONFUN]; // Nombre del módulo,función o script de la interface con el módulo de administración -char parametros[LONSTD]; // Parámetros para la llamada -int herror; - -BOOLEAN CMDPTES; // Para bucle de comandos pendientes - - -char urlmenu[MAXLONURL]; // Url de la pagina de menu para el browser -char urlmsg[MAXLONURL]; // Url de la página de mensajed para el browser - - -typedef struct{ // Estructura usada para referenciar las funciones que procesan las tramas - char nf[LONFUN]; // Nombre de la función - BOOLEAN (*fptr)(TRAMA*); // Puntero a la función que procesa la trama -}MSGFUN; -MSGFUN tbfuncionesClient[MAXIMAS_FUNCIONES]; -// ________________________________________________________________________________________________________ -// Tabla de errores de la ejecución de los scripts -// ________________________________________________________________________________________________________ -char* tbErroresScripts[]={"Se han generado errores desconocidos. No se puede continuar la ejecución de este módulo",\ - "001-Formato de ejecución incorrecto.",\ - "002-Fichero o dispositivo no encontrado",\ - "003-Error en partición de disco",\ - "004-Partición o fichero bloqueado",\ - "005-Error al crear o restaurar una imagen",\ - "006-Sin sistema operativo",\ - "007-Programa o función BOOLEAN no ejecutable",\ - "008-Error en la creación del archivo de eco para consola remota",\ - "009-Error en la lectura del archivo temporal de intercambio",\ - "010-Error al ejecutar la llamada a la interface de administración",\ - "011-La información retornada por la interface de administración excede de la longitud permitida",\ - "012-Error en el envío de fichero por la red",\ - "013-Error en la creación del proceso hijo",\ - "014-Error de escritura en destino",\ - "015-Sin Cache en el Cliente",\ - "016-No hay espacio en la cache para almacenar fichero-imagen",\ - "017-Error al Reducir el Sistema Archivos",\ - "018-Error al Expandir el Sistema Archivos",\ - "019-Valor fuera de rango o no válido.",\ - "020-Sistema de archivos desconocido o no se puede montar",\ - "021-Error en partición de caché local",\ - "022-El disco indicado no contiene una particion GPT",\ - "023-Error no definido",\ - "024-Error no definido",\ - "025-Error no definido",\ - "026-Error no definido",\ - "027-Error no definido",\ - "028-Error no definido",\ - "029-Error no definido",\ - "030-Error al restaurar imagen - Imagen mas grande que particion",\ - "031-Error al realizar el comando updateCache",\ - "032-Error al formatear",\ - "033-Archivo de imagen corrupto o de otra versión de partclone",\ - "034-Error no definido",\ - "035-Error no definido",\ - "036-Error no definido",\ - "037-Error no definido",\ - "038-Error no definido",\ - "039-Error no definido",\ - "040-Error imprevisto no definido",\ - "041-Error no definido",\ - "042-Error no definido",\ - "043-Error no definido",\ - "044-Error no definido",\ - "045-Error no definido",\ - "046-Error no definido",\ - "047-Error no definido",\ - "048-Error no definido",\ - "049-Error no definido",\ - "050-Error en la generación de sintaxis de transferenica unicast",\ - "051-Error en envio UNICAST de una particion",\ - "052-Error en envio UNICAST de un fichero",\ - "053-Error en la recepcion UNICAST de una particion",\ - "054-Error en la recepcion UNICAST de un fichero",\ - "055-Error en la generacion de sintaxis de transferenica Multicast",\ - "056-Error en envio MULTICAST de un fichero",\ - "057-Error en la recepcion MULTICAST de un fichero",\ - "058-Error en envio MULTICAST de una particion",\ - "059-Error en la recepcion MULTICAST de una particion",\ - "060-Error en la conexion de una sesion UNICAST|MULTICAST con el MASTER",\ - "061-Error no definido",\ - "062-Error no definido",\ - "063-Error no definido",\ - "064-Error no definido",\ - "065-Error no definido",\ - "066-Error no definido",\ - "067-Error no definido",\ - "068-Error no definido",\ - "069-Error no definido",\ - "070-Error al montar una imagen sincronizada.",\ - "071-Imagen no sincronizable (es monolitica).",\ - "072-Error al desmontar la imagen.",\ - "073-No se detectan diferencias entre la imagen basica y la particion.",\ - "074-Error al sincronizar, puede afectar la creacion/restauracion de la imagen.",\ - "Error desconocido " - }; - #define MAXERRORSCRIPT 74 // Error máximo cometido -// ________________________________________________________________________________________________________ -// Prototipo de funciones -// ________________________________________________________________________________________________________ -BOOLEAN autoexecCliente(TRAMA*); -BOOLEAN RESPUESTA_AutoexecCliente(TRAMA*); -void procesaComandos(TRAMA*); - -BOOLEAN tomaConfiguracion(char*); -BOOLEAN tomaIPlocal(void); -void scriptLog(const char *,int ); - -BOOLEAN gestionaTrama(TRAMA *); -BOOLEAN inclusionCliente(); -char* LeeConfiguracion(); -BOOLEAN RESPUESTA_InclusionCliente(TRAMA *); - -BOOLEAN comandosPendientes(TRAMA*); -BOOLEAN NoComandosPtes(TRAMA *); - -BOOLEAN respuestaEjecucionComando(TRAMA *,int,char*); -BOOLEAN Sondeo(TRAMA *); -BOOLEAN Actualizar(TRAMA *); -int Purgar(TRAMA* ); - -BOOLEAN ConsolaRemota(TRAMA*); - -BOOLEAN Arrancar(TRAMA *); -BOOLEAN Apagar(TRAMA *); -BOOLEAN Reiniciar(TRAMA *); -BOOLEAN IniciarSesion(TRAMA *); -BOOLEAN CrearImagen(TRAMA *); -BOOLEAN CrearImagenBasica(TRAMA *); -BOOLEAN CrearSoftIncremental(TRAMA*); - -BOOLEAN InventarioHardware(TRAMA *); -BOOLEAN InventariandoSoftware(TRAMA *,BOOLEAN,char*); -BOOLEAN EjecutarScript(TRAMA *); -BOOLEAN ejecutaArchivo(char*,TRAMA*); - -BOOLEAN cuestionCache(char*); -int cargaPaginaWeb(char *); -void muestraMenu(void); -void muestraMensaje(int idx,char*); - -BOOLEAN enviaMensajeServidor(SOCKET *,TRAMA *,char); - - - - diff --git a/admin/Sources/Includes/Database.cpp b/admin/Sources/Includes/Database.cpp deleted file mode 100644 index 84add9ce..00000000 --- a/admin/Sources/Includes/Database.cpp +++ /dev/null @@ -1,203 +0,0 @@ -// ******************************************************************************************************** -// Nombre del fichero: Database.cpp -// Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla -// Fecha Creación: Marzo-2010 -// Fecha Última modificación: Marzo-2010 -// Descripción: -// Fichero de implementación de la clase Database para funciones de manipulación -// de bases de datos sobre un Servidor Mysql -// ******************************************************************************************************** -#include "Database.h" -// __________________________________________________________________________ -void ErrorHandler(Herror hr, char* ErrStr) -{ - sprintf(ErrStr,"Error:\n"); - sprintf(ErrStr,"%sCode = %d\n",ErrStr ,hr.nError); - sprintf(ErrStr,"%sDescription = %s",ErrStr, (char*) hr.dError); -} -// __________________________________________________________________________ -Database::Database() -{ - m_Cnn=NULL; - sprintf(m_ErrStr,"NULL POINTER"); -} -// __________________________________________________________________________ -void Database::GetErrorErrStr(char* ErrStr) -{ - sprintf(ErrStr,"%s",m_ErrStr); -} -// __________________________________________________________________________ -void Table::GetErrorErrStr(char* ErrStr) -{ - sprintf(ErrStr,"%s",m_ErrStr); -} -// __________________________________________________________________________ -bool Database::Open(char* UserName, char* Pwd,char* server,char*Bd) -{ - Herror hr; - m_Cnn=mysql_init(NULL); - if(m_Cnn==NULL){ - hr.nError=0; - strcpy(hr.dError,"Error en la Creación del objeto MYSQL"); - ErrorHandler(hr,m_ErrStr); - return(false); // Fallo de inicializaci� - } - - if(!mysql_real_connect(m_Cnn, server,UserName,Pwd,Bd, MYSQL_PORT,NULL,0)){ - mysql_error(m_Cnn); - hr.nError=mysql_errno(m_Cnn); - strcpy(hr.dError,mysql_error(m_Cnn)); - ErrorHandler(hr,m_ErrStr); - return(false); // Fallo de conexi� - } - hr.nError=0; - strcpy(hr.dError,"Success"); - ErrorHandler(hr,m_ErrStr); - return (true); -} -// __________________________________________________________________________ -bool Database::Close() -{ - mysql_close(m_Cnn); - return(true); -} -// __________________________________________________________________________ -bool Database::Execute(char* CmdStr) -{ - Herror hr; - if (mysql_query(m_Cnn,CmdStr)){ // Ejecuta la consulta - mysql_error(m_Cnn); - hr.nError=mysql_errno(m_Cnn); - strcpy(hr.dError,mysql_error(m_Cnn)); - ErrorHandler(hr,m_ErrStr); - mysql_close(m_Cnn); - return(false); // Fallo de conexión - } - hr.nError=0; - strcpy(hr.dError,"Success"); - ErrorHandler(hr,m_ErrStr); - return (true); -} -// __________________________________________________________________________ -bool Database::Execute(char* CmdStr, Table& Tbl) -{ - Herror hr; - if (mysql_query(m_Cnn,CmdStr)) { // Ejecuta la consulta - mysql_error(m_Cnn); - hr.nError=mysql_errno(m_Cnn); - strcpy(hr.dError,mysql_error(m_Cnn)); - ErrorHandler(hr,m_ErrStr); - mysql_close(m_Cnn); - return(false); // Fallo de conexi� - } - - hr.nError=0; - strcpy(hr.dError,"Success"); - ErrorHandler(hr,m_ErrStr); - - Tbl.m_Rec = mysql_store_result(m_Cnn) ; // Toma el recordset - if(Tbl.m_Rec){ - Tbl.row=mysql_fetch_row(Tbl.m_Rec); - Tbl.fields = mysql_fetch_fields(Tbl.m_Rec); - Tbl.num_fields = mysql_num_fields(Tbl.m_Rec); - Tbl.numreg=mysql_num_rows(Tbl.m_Rec); - Tbl.eof=Tbl.numreg==0; // Consulta vacia - } - return (true); -} -// __________________________________________________________________________ -void Database::liberaResult (Table& Tbl) { - //Free resources after mysql_store_result - mysql_free_result(Tbl.m_Rec); -} -// __________________________________________________________________________ -Table::Table() -{ - m_Rec=NULL; -} -// __________________________________________________________________________ -bool Table::ISEOF() -{ - return(eof); -} -// __________________________________________________________________________ -bool Table::Get(const char* FieldName, char *FieldValue) -{ - char * aux; - aux=tomadato(FieldName); - if(aux) - strcpy(FieldValue,aux); - else - strcpy(FieldValue,""); - return(true); -} -// __________________________________________________________________________ -bool Table::Get(const char* FieldName,int &FieldValue) -{ - char *aux; - aux=tomadato(FieldName); - if(aux) - FieldValue=atoi(aux); - else - FieldValue=0; - return(true); -} -// __________________________________________________________________________ -bool Table::Get(const char* FieldName,char &FieldValue) -{ - char *aux; - aux=tomadato(FieldName); - FieldValue=aux[0]; - return(true); -} -// __________________________________________________________________________ -char* Table::tomadato(const char* FieldName) -{ - Herror hr; - unsigned int i; - - for(i = 0; i < num_fields; i++){ - if(strcmp((char*)fields[i].name,FieldName)==0){ - sprintf(m_ErrStr,"Success"); - return((char*)row[i]); - } - } - hr.nError=-1; - strcpy(hr.dError,"El nombre del campo no existe"); - ErrorHandler(hr,m_ErrStr); - return(NULL); // No existe el nombre del campo en la tabla -} -// __________________________________________________________________________ - -bool Table::MoveNext() -{ - eof=false; - row=mysql_fetch_row(m_Rec); - if(row==NULL){ - if(!mysql_eof(m_Rec)) - return(false); // Fallo de lectura - else - eof=true; // Fin de fichero - } - return (true); -} -// __________________________________________________________________________ -bool Table::MoveFirst() -{ - my_ulonglong auxnumreg; - - auxnumreg=0; - mysql_data_seek(m_Rec,auxnumreg); - return (MoveNext()); -} -// __________________________________________________________________________ -bool Table::MoveLast() -{ - my_ulonglong auxnumreg; - auxnumreg=numreg; - auxnumreg--; - if(auxnumreg<0) auxnumreg=0; // Principio de fichero - mysql_data_seek(m_Rec,auxnumreg); - return (MoveNext()); - return (true); -} diff --git a/admin/Sources/Includes/Database.h b/admin/Sources/Includes/Database.h deleted file mode 100644 index ae318bdb..00000000 --- a/admin/Sources/Includes/Database.h +++ /dev/null @@ -1,61 +0,0 @@ -// ****************************************************************************************************** -// Aplicación HIDRA -// Copyright 2004 Jos�Manuel Alonso. Todos los derechos reservados. -// Fichero: Database.h -// Descripción: -// Fichero de cabecera de la clase Database para implementar funciones de manipulaci� -// de bases de datos sobre un Servidor Mysql -// ****************************************************************************************************** -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include </usr/include/mysql/mysql.h> -// __________________________________________________________________________ -class Database; -class Table; -// __________________________________________________________________________ -class Database -{ -public: - MYSQL *m_Cnn; - char m_ErrStr[500]; - Database(); - bool Open(char* UserName, char* Pwd,char* server,char*Database); - bool OpenTbl(int Mode, char* CmdStr, Table& Tbl); - bool Close(void); - bool Execute(char* CmdStr); - bool Execute(char* CmdStr, Table& Tbl); - void liberaResult(Table& Tbl); - void GetErrorErrStr(char* ErrStr); -}; -// __________________________________________________________________________ -class Table{ - char* tomadato(const char* FieldName); -public: - bool eof,bof; - MYSQL_RES * m_Rec ; - MYSQL_FIELD *fields; - unsigned int num_fields; - MYSQL_ROW row ; - MYSQL_ROW_OFFSET ptr; - my_ulonglong numreg; - char m_ErrStr[500]; - Table(); - void GetErrorErrStr(char* ErrStr); - bool ISEOF(); - bool MoveNext(); - bool MovePrevious(); - bool MoveFirst(); - bool MoveLast(); - - bool Get(const char* FieldName, char* FieldValue); - bool Get(const char* FieldName,int &FieldValue); - bool Get(const char* FieldName,char &FieldValue); -}; -// __________________________________________________________________________ -class Herror -{ -public: - int nError; // C�igo del error - char dError[500]; // Descripción del error -}; diff --git a/admin/Sources/Includes/ogAdmLib.c b/admin/Sources/Includes/ogAdmLib.c deleted file mode 100644 index 2f0a714d..00000000 --- a/admin/Sources/Includes/ogAdmLib.c +++ /dev/null @@ -1,1074 +0,0 @@ -// ************************************************************************************************************************************************** -// Libreria: ogAdmLib -// 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: ogAdmLib.c -// Descripción: Este fichero implementa una libreria de funciones para uso común de los servicios -// ************************************************************************************************************************************************** -// ________________________________________________________________________________________________________ -// Función: tomaHora -// -// Descripción: -// Devuelve la hora del sistema -// Parametros: -// Ninguno -// ________________________________________________________________________________________________________ -struct tm * tomaHora() -{ - time_t rawtime; - time ( &rawtime ); - return(localtime(&rawtime)); -} -// ________________________________________________________________________________________________________ -// Función: registraLog -// -// Descripción: -// Registra los eventos en un fichero log ya sean errores o información -// Parametros: -// - fileLog : Ruta completa del archivo de log -// - msg : Descripción del error -// - swe: Switch que indica si se debe recuperar además el literal de error del propio sistema operativo -// ________________________________________________________________________________________________________ -void registraLog(const char* filelog,const char *msg,int swe) -{ - FILE *flog; - struct tm * t; - - t = tomaHora(); - flog=fopen(filelog,"at"); - if(swe) - fprintf (flog,"%02d/%02d/%d %02d:%02d %s: %s\n",t->tm_mday,t->tm_mon+1,t->tm_year+1900,t->tm_hour,t->tm_min,msg,strerror(errno)); - else - fprintf (flog,"%02d/%02d/%d %02d:%02d %s\n",t->tm_mday,t->tm_mon+1,t->tm_year+1900,t->tm_hour,t->tm_min,msg); - fclose(flog); -} -// ________________________________________________________________________________________________________ -// Función: errorLog -// -// Descripción: -// Registra los sucesos de errores preestablecidos en el fichero de log -// Parametros: -// - coderr : Código del mensaje de error -// - swe: Switch que indica si se debe recuperar además el literal de error del propio sistema operativo -// ________________________________________________________________________________________________________ -void errorLog(const char *modulo, int coderr, int swe) { - char msglog[LONSUC]; - - sprintf(msglog, "*** Error: %s. Módulo %s", tbErrores[coderr], modulo); - registraLog(szPathFileLog, msglog, swe); -} -// ________________________________________________________________________________________________________ -// Función: errorInfo -// -// Descripción: -// Registra los sucesos de errores dinámicos en el fichero de log -// Parametros: -// - msgerr : Descripción del error -// - swe: Switch que indica si se debe recuperar además el literal de error del propio sistema operativo -// ________________________________________________________________________________________________________ -void errorInfo(const char *modulo, char *msgerr) { - char msglog[LONSUC]; - - sprintf(msglog, "*** Error: %s. Módulo %s", msgerr, modulo); - registraLog(szPathFileLog, msglog, FALSE); -} -// ________________________________________________________________________________________________________ -// Función: infoLog -// -// Descripción: -// Registra los sucesos de información en el fichero de log -// Parametros: -// - coderr : Código del mensaje de información -// ________________________________________________________________________________________________________ -void infoLog(int codinf) { - char msglog[LONSUC]; - - sprintf(msglog, "*** Info: %s", tbMensajes[codinf]); - registraLog(szPathFileLog, msglog, FALSE); -} -// ________________________________________________________________________________________________________ -// Función: infoDebug -// -// Descripción: -// Registra los mensajes de debugs en el fichero de log -// Parametros: -// - msgdeb : Descripción del mensaje de información -// ________________________________________________________________________________________________________ -void infoDebug(char* msgdeb) { - char msglog[LONSUC+15]; // Cadena de registro (reserva caracteres para el prefijo). - - sprintf(msglog, "*** Debug: %d-%s", ndebug, msgdeb); - registraLog(szPathFileLog, msglog, FALSE); -} -//______________________________________________________________________________________________________ -// Función: ValidacionParametros -// -// Descripción: -// Valida que los parametros de ejecución del programa sean correctos -// Parámetros: -// - argc: Número de argumentos -// - argv: Puntero a cada argumento -// - eje: Tipo de ejecutable (1=Servicio,2=Repositorio o 3=Cliente) -// Devuelve: -// - TRUE si los argumentos pasados son correctos -// - FALSE en caso contrario -// Especificaciones: -// La sintaxis de los argumentos es la siguiente -// -f Archivo de configuración del servicio -// -l Archivo de logs -// -d Nivel de debuger (mensages que se escribirán en el archivo de logs) -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN validacionParametros(int argc, char*argv[],int eje) { - int i; - char modulo[] = "validacionParametros()"; - - switch(eje){ - case 1: // Administrador - strcpy(szPathFileCfg, "ogAdmServer.cfg"); // Valores por defecto de archivos - strcpy(szPathFileLog, "ogAdmServer.log"); // de configuración y de logs - break; - case 2: // Repositorio - strcpy(szPathFileCfg, "ogAdmRepo.cfg"); // Valores por defecto de archivos - strcpy(szPathFileLog, "ogAdmRepo.log"); // de configuración y de logs - break; - case 3: // Cliente OpenGnsys - strcpy(szPathFileCfg, "ogAdmClient.cfg"); // Valores por defecto de archivos - strcpy(szPathFileLog, "ogAdmClient.log"); // de configuración y de logs - break; - case 4: // Servicios DHCP,BOOTP Y TFTP - strcpy(szPathFileCfg, "ogAdmBoot.cfg"); // Valores por defecto de archivos - strcpy(szPathFileLog, "ogAdmBoot.log"); // de configuración y de logs - break; - case 5: // Agente - strcpy(szPathFileCfg, "ogAdmAgent.cfg"); // Valores por defecto de archivos - strcpy(szPathFileLog, "ogAdmAgent.log"); // de configuración y de logs - break; - case 6: // Agente - strcpy(szPathFileCfg, "ogAdmWinClient.cfg"); // Valores por defecto de archivos - strcpy(szPathFileLog, "ogAdmWinClient.log"); // de configuración y de logs - break; - case 7: // Agente - strcpy(szPathFileCfg, "ogAdmnxClient.cfg"); // Valores por defecto de archivos - strcpy(szPathFileLog, "ogAdmLnxClient.log"); // de configuración y de logs - break; - } - - ndebug = 1; // Nivel de debuger por defecto - - for (i = 1; (i + 1) < argc; i += 2) { - if (argv[i][0] == '-') { - switch (tolower(argv[i][1])) { - case 'f': - if (argv[i + 1] != NULL) - strcpy(szPathFileCfg, argv[i + 1]); - else { - errorLog(modulo, 10, FALSE); - return (FALSE); - } - break; - case 'l': - if (argv[i + 1] != NULL) - strcpy(szPathFileLog, argv[i + 1]); - else { - errorLog(modulo, 11, FALSE); - return (FALSE); - } - break; - case 'd': - if (argv[i + 1] != NULL) { - ndebug = atoi(argv[i + 1]); - if (ndebug < 1) - ndebug = 1; // Por defecto el nivel de debug es 1 - } else - ndebug = 1; // Por defecto el nivel de debug es 1 - break; - default: - errorLog(modulo, 12, FALSE); - exit(EXIT_FAILURE); - break; - } - } - } - return (TRUE); -} -//______________________________________________________________________________________________________ -// Función: reservaMemoria -// -// Descripción: -// Reserva memoria para una variable -// Parámetros: -// - lon: Longitud en bytes de la reserva -// Devuelve: -// Un puntero a la zona de memoria reservada que ha sido previamente rellena con zeros o nulos -//______________________________________________________________________________________________________ -char* reservaMemoria(int lon) -{ - char *mem; - - mem=(char*)malloc(lon); - if(mem!=NULL) - memset(mem,0,lon); - return(mem); -} -//______________________________________________________________________________________________________ -// Función: ampliaMemoria -// -// Descripción: -// Amplia memoria para una variable -// Parámetros: -// - ptr: Puntero al buffer de memoria que se quiere ampliar -// - lon: Longitud en bytes de la amplicación -// Devuelve: -// Un puntero a la zona de memoria reservada que ha sido previamente rellena con zeros o nulos -//______________________________________________________________________________________________________ -char* ampliaMemoria(char* ptr,int lon) -{ - char *mem; - - mem=(char*)realloc(ptr,lon*sizeof(char*)); - if(mem!=NULL) - return(mem); - return(NULL); -} -//______________________________________________________________________________________________________ -// Función: liberaMemoria -// -// Descripción: -// Libera memoria para una variable -// Parámetros: -// - ptr: Puntero al buffer de memoria que se quiere liberar -// Devuelve: -// Nada -//______________________________________________________________________________________________________ -void liberaMemoria(void* ptr) -{ - if(ptr){ - free (ptr); - } -} -// ________________________________________________________________________________________________________ -// Función: splitCadena -// -// Descripción: -// Trocea una cadena según un carácter delimitador -// Parámetros: -// - trozos: Array de punteros a cadenas -// - cadena: Cadena a trocear -// - chd: Carácter delimitador -// Devuelve: -// Número de trozos en que se divide la cadena -// ________________________________________________________________________________________________________ -int splitCadena(char **trozos,char *cadena, char chd) -{ - int w=0; - if(cadena==NULL) return(w); - - trozos[w++]=cadena; - while(*cadena!='\0'){ - if(*cadena==chd){ - *cadena='\0'; - if(*(cadena+1)!='\0') - trozos[w++]=cadena+1; - } - cadena++; - } - return(w); // Devuelve el número de trozos -} -// ________________________________________________________________________________________________________ -// Función: sustituir -// -// Descripción: -// Sustituye las apariciones de un caracter por otro en una cadena -// Parámetros: -// - cadena: Cadena a convertir -// - cho: Caracter a sustituir -// - chs: Caracter sustituto -// ________________________________________________________________________________________________________ -void sustituir(char *cadena,char cho,char chs) -{ - int x=0; - - while(cadena[x]!=0) { - if (cadena[x]==cho) - cadena[x]=chs; - x++; - } -} -// ________________________________________________________________________________________________________ -// Función: escaparCadena -// -// Descripción: -// Sustituye las apariciones de un caracter comila simple ' por \' -// Parámetros: -// - cadena: Cadena a escapar -// Devuelve: -// La cadena con las comillas simples sustituidas por \' -// ________________________________________________________________________________________________________ -char* escaparCadena(char *cadena) -{ - int b,c; - char *buffer; - - buffer = (char*) reservaMemoria(strlen(cadena)*2); // Toma memoria para el buffer de conversión - if (buffer == NULL) { // No hay memoria suficiente para el buffer - return (FALSE); - } - - c=b=0; - while(cadena[c]!=0) { - if (cadena[c]=='\''){ - buffer[b++]='\\'; - buffer[b++]='\''; - } - else{ - buffer[b++]=cadena[c]; - } - c++; - } - return(buffer); -} -// ________________________________________________________________________________________________________ -// Función: StrToUpper -// -// Descripción: -// Convierta una cadena en mayúsculas -// Parámetros: -// - cadena: Cadena a convertir -// ________________________________________________________________________________________________________ -char* StrToUpper(char *cadena) -{ - int x=0; - - while(cadena[x]!=0) { - if (cadena[x] >= 'a' && cadena[x] <= 'z') { - cadena[x] -= 32; - } - x++; - } - return(cadena); -} -// ________________________________________________________________________________________________________ -// Función: StrToUpper -// -// Descripción: -// Convierta una cadena en mayúsculas -// Parámetros: -// - cadena: Cadena a convertir -// ________________________________________________________________________________________________________ -char* StrToLower(char *cadena) -{ - int x=0; - - while(cadena[x]!=0) { - if (cadena[x] >= 'A' && cadena[x] <= 'Z') { - cadena[x] += 32; - } - x++; - } - return(cadena); -} -// ________________________________________________________________________________________________________ -// Función: INTROaFINCAD -// -// Descripción: -// Cambia caracteres INTROS por fin de cadena ('\0') en una trama -// Parametros: -// - parametros: Puntero a los parametros de la trama -// - lon: Longitud de la cadena de parametros -// ________________________________________________________________________________________________________ -void INTROaFINCAD(TRAMA* ptrTrama) -{ - char *i,*a,*b; - - a=ptrTrama->parametros; - b=a+ptrTrama->lonprm; - for(i=a;i<b;i++){ // Cambia los NULOS por INTROS - if(*i=='\r') *i='\0'; - } -} -// ________________________________________________________________________________________________________ -// Función: FINCADaINTRO -// -// Descripción: -// Cambia caracteres fin de cadena ('\0') por INTROS en una trama -// Parametros: -// - parametros: Puntero a los parametros de la trama -// - lon: Longitud de la cadena de parametros -// ________________________________________________________________________________________________________ -void FINCADaINTRO(TRAMA* ptrTrama) -{ - char *i,*a,*b; - - a=ptrTrama->parametros; - b=a+ptrTrama->lonprm; - for(i=a;i<b;i++){ // Cambia los NULOS por INTROS - if(*i=='\0') *i='\r'; - } -} -// ________________________________________________________________________________________________________ -// Función: cuentaIPES -// -// Descripción: -// Cuenta los caracteres "." de las IPES dentro del parámetros iph de una trama -// con lo cual dividiendo por 3 se puede saber la cantdad de direcciones IPES en la cadena -// Parametros: -// - ipes: Cadena con las IPES separadas por ";" -// ________________________________________________________________________________________________________ -int cuentaIPES(char* ipes) -{ - int i,a,b,c=0; - - a=0; - b=strlen(ipes); - for(i=a;i<b;i++){ // Cambia los NULOS por INTROS - if(ipes[i]=='.') c++; - } - return(c/3); -} -// ________________________________________________________________________________________________________ -// Función: tomaParametro -// -// Descripción: -// Devuelve el valor de un parametro incluido en una cadena con formatos: "nombre=valor" -// Parámetros: -// - nombre: Nombre del parámetro a recuperar -// - paramestros: Cadena que contiene todos los parámetros -// ________________________________________________________________________________________________________ -char* tomaParametro(const char* nombre,TRAMA* ptrTrama) -{ - char *a,*b,*pos; - - a=ptrTrama->parametros; - b=a+ptrTrama->lonprm; - for(pos=a;pos<b;pos++){ // Busca valor del parámetro - if(pos[0]==nombre[0]){ - if(pos[1]==nombre[1]){ - if(pos[2]==nombre[2]){ - if(pos[3]=='='){ - pos+=4; - return(pos); - } - } - } - } - } - return(NULL); -} -//______________________________________________________________________________________________________ -// Función: copiaParametro -// -// Descripción: -// Devuelve una copia del valor de un parámetro -// Parámetros: -// - ptrTrama: contenido del mensaje -// - parametro: Nombre del parámetro -// - lon: Nombre del parámetro -// Devuelve: -// Un puntero a la cadena que contiene el valor del parámetro -// ________________________________________________________________________________________________________ -char* copiaParametro(const char*nombre,TRAMA* ptrTrama) -{ - char *prm,*buffer; - char modulo[] = "copiaParametro()"; - - - prm=tomaParametro(nombre,ptrTrama); // Toma identificador de acción - if(!prm) - return(NULL); - buffer = (char*) reservaMemoria(strlen(prm)+1); // Toma memoria para el buffer de lectura. - if (buffer == NULL) { // No hay memoria suficiente para el buffer - errorLog(modulo, 3, FALSE); - return (FALSE); - } - strcpy(buffer,prm); - return(buffer); -} -// ________________________________________________________________________________________________________ -// Función: igualIP -// -// Descripción: -// Comprueba si una cadena con una dirección IP está incluida en otra que contienen varias direcciones ipes -// separadas por punto y coma -// Parámetros: -// - cadenaiph: Cadena de direcciones IPES -// - ipcliente: Cadena de la IP a buscar -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -BOOLEAN contieneIP(char *cadenaiph,char *ipcliente) -{ - char *posa,*posb; - int lon, i; - - posa=strstr(cadenaiph,ipcliente); - if(posa==NULL) return(FALSE); // No existe la IP en la cadena - posb=posa; // Iguala direcciones - for (i = 0; i < LONIP; i++) { - if(*posb==';') break; - if(*posb=='\0') break; - if(*posb=='\r') break; - posb++; - } - lon=strlen(ipcliente); - if((posb-posa)==lon) return(TRUE); // IP encontrada - return(FALSE); -} -// ________________________________________________________________________________________________________ -// Función: rTrim -// -// Descripción: -// Elimina caracteres de espacios y de asci menor al espacio al final de la cadena -// Parámetros: -// - cadena: Cadena a procesar -// ________________________________________________________________________________________________________ -char* rTrim(char *cadena) -{ - int i,lon; - - lon=strlen(cadena); - for (i=lon-1;i>=0;i--){ - if(cadena[i]<32) - cadena[i]='\0'; - else - return(cadena); - } - return(cadena); -} -// ________________________________________________________________________________________________________ -// Función: mandaTrama -// -// Descripción: -// Envía una trama por la red -// Parametros: -// - sock : El socket del host al que se dirige la trama -// - trama: El contenido de la trama -// - lon: Longitud de la parte de parametros de la trama que se va a mandar -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -BOOLEAN mandaTrama(SOCKET *sock, TRAMA* ptrTrama) -{ - int lonprm; - char *buffer,hlonprm[LONHEXPRM+1]; - BOOLEAN res; - - lonprm=strlen(ptrTrama->parametros); - sprintf(hlonprm,"%05X",LONGITUD_CABECERATRAMA+LONHEXPRM+lonprm); // Convierte en hexadecimal la longitud - - buffer=reservaMemoria(LONGITUD_CABECERATRAMA+LONHEXPRM+lonprm); // Longitud total de la trama - if(buffer==NULL) - return(FALSE); - memcpy(buffer,ptrTrama,LONGITUD_CABECERATRAMA); // Copia cabecera de trama - memcpy(&buffer[LONGITUD_CABECERATRAMA],hlonprm,LONHEXPRM); // Copia longitud de la trama - memcpy(&buffer[LONGITUD_CABECERATRAMA+LONHEXPRM],ptrTrama->parametros,lonprm); - res=sendData(sock,buffer,LONGITUD_CABECERATRAMA+LONHEXPRM+lonprm); - liberaMemoria(buffer); - return (res); -} -// ________________________________________________________________________________________________________ -// Función: sendData -// -// Descripción: -// Envía datos por la red a través de un socket -// Parametros: -// - sock : El socket por donde se envía -// - datos: El contenido a enviar -// - lon: Cantidad de bites a enviar -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -BOOLEAN sendData(SOCKET *sock, char* datos,int lon) -{ - int idx,ret; - idx = 0; - while (lon > 0) { - ret = send(*sock,&datos[idx],lon, 0); - if (ret == 0) { // Conexión cerrada por parte del cliente (Graceful close) - break; - } - else{ - if (ret == SOCKET_ERROR) - return (FALSE); - } - lon -= ret; - idx += ret; - } - return (TRUE); -} -// ________________________________________________________________________________________________________ -// Función: recibeTrama -// -// Descripción: -// Recibe una trama por la red -// Parametros: -// - sock : El socket del cliente -// - trama: El buffer para recibir la trama -// Devuelve: -// Un puntero a una estrucutra TRAMA o NULL si ha habido algún error -// FALSE: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -TRAMA* recibeTrama(SOCKET *sock) -{ - int ret,lon,lSize; - char *buffer,*bufferd,bloque[LONBLK],*hlonprm; - TRAMA * ptrTrama; - - lon=lSize=0; - do{ - if(!recData(sock,bloque,LONBLK,&ret)) // Lee bloque - return(NULL); - - if (lon==0 && lSize==0 && ret==0) // Comprueba trama válida - return(NULL); - - if(lSize==0){ // Comprueba tipo de trama y longitud total de los parámetros - if (strncmp(bloque, "@JMMLCAMDJ_MCDJ",15)!=0) - return(NULL); // No se reconoce la trama - hlonprm=reservaMemoria(LONHEXPRM+1); - if(!hlonprm) return(NULL); - memcpy(hlonprm,&bloque[LONGITUD_CABECERATRAMA],LONHEXPRM); - lSize=strtol(hlonprm,NULL,16); // Longitud total de la trama con los parametros encriptados - liberaMemoria(hlonprm); - buffer=(char*)reservaMemoria(lSize); // Toma memoria para la trama completa - if(!buffer) - return(NULL); - } - - if(ret>0){ // Datos recibidos - memcpy(&buffer[lon],bloque,ret); // Añade bloque - lon+=ret; - } - }while(lon<lSize); - - ptrTrama=(TRAMA *)reservaMemoria(sizeof(TRAMA)); - if (!ptrTrama) return(NULL); - memcpy(ptrTrama,buffer,LONGITUD_CABECERATRAMA); // Copia cabecera de trama - lon=lSize-(LONGITUD_CABECERATRAMA+LONHEXPRM); // Longitud de los parametros aún encriptados - bufferd = &buffer[LONGITUD_CABECERATRAMA+LONHEXPRM]; - initParametros(ptrTrama,lon); // Desencripta la trama - memcpy(ptrTrama->parametros,bufferd,lon); - liberaMemoria((char*)buffer); - ptrTrama->lonprm=lon; // Almacena longitud de los parámetros ya desencriptados - return(ptrTrama); -} -// ________________________________________________________________________________________________________ -// Función: recData -// -// Descripción: -// Recibe datos por la red a través de un socket -// Parametros: -// - sock : El socket por el que se reciben los datos -// - datos: El buffer donde se almacenan -// - lon: Cantidad máxima de bites a recibir -// - ret: Cantidad de bites recibidos (Parámetro de salida) -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -BOOLEAN recData(SOCKET *sock, char* buffer,int lon,int* ret) -{ - *ret = 0; - - while (TRUE) { // Bucle para recibir datos del cliente - *ret = recv(*sock,buffer, lon, 0); - if (*ret == 0) // Conexión cerrada por parte del cliente (Graceful close) - break; - else { - if (*ret == SOCKET_ERROR) { - return (FALSE); - } else - // Datos recibidos - break; - } - } - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: enviaFlag -// -// Descripción: -// Envia una señal de sincronización -// Parámetros: -// - socket_c: (Salida) Socket utilizado para el envío (operativo) -// - ptrTrama: contenido del mensaje -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -BOOLEAN enviaFlag(SOCKET *socket_c,TRAMA *ptrTrama) -{ - char modulo[] = "enviaFlag()"; - if (!mandaTrama(socket_c,ptrTrama)) { - errorLog(modulo,26,FALSE); - return (FALSE); - } - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: recibeFlag -// -// Descripción: -// Recibe una señal de sincronización -// Parámetros: -// - socket_c: Socket utilizadopara la recepción (operativo) -// - ptrTrama: (Salida) Contenido del mensaje -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -BOOLEAN recibeFlag(SOCKET *socket_c,TRAMA *ptrTrama) -{ - ptrTrama=recibeTrama(socket_c); - if(!ptrTrama){ - return(FALSE); - } - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: URLEncode -// -// Descripción: -// Codifica una cadena en UrlEncode -// Parámetros: -// - src: La cadena a decodificar -// Devuelve: -// La cadena decodificada -// ________________________________________________________________________________________________________ -char* URLEncode(char *src) -{ - char *dest; - int i,j=0,lon; - - lon=strlen(src); - dest=(char*)reservaMemoria(lon*2); // Reserva buffer para la cadena - for(i=0;i<lon;i++){ - if(src[i]==0x20){ // Espacio - dest[j++] = '%'; - dest[j++] = '2'; - dest[j++] = '0'; - } - else - dest[j++] = src[i]; - } - return(dest); -} -//______________________________________________________________________________________________________ -// Función: URLDecode -// -// Descripción: -// Decodifica una cadena codificada con UrlEncode -// Parámetros: -// - src: La cadena a decodificar -// Devuelve: -// La cadena decodificada -// ________________________________________________________________________________________________________ -char* URLDecode(char *src) -{ - const char *p = src; - char code[3] = {0}; - unsigned long ascii = 0; - char *end = NULL; - char *dest,*cad; - - dest=(char*)reservaMemoria(strlen(src)); // Reserva buffer para la cadena - cad=dest; - while(*p){ - if(*p == '%'){ - memcpy(code, ++p, 2); - ascii = strtoul(code, &end, 16); - *dest++ = (char)ascii; - p += 2; - } - else - *dest++ = *p++; - } - return(cad); -} -// ________________________________________________________________________________________________________ -// Función: leeArchivo -// -// Descripción: -// Lee un archivo -// Parámetros: -// fil: Nombre completo del archivo -// Devuelve: -// Un puntero al buffer con el contenido leido - -//______________________________________________________________________________________________________ -char * leeArchivo(char *fil) -{ - FILE *f; - long lSize; - char* buffer; - - f=fopen(fil,"rb"); - if (!f) - return(NULL); - fseek (f,0,SEEK_END); // Obtiene tamaño del fichero. - lSize = ftell (f); - rewind (f); - buffer = (char*) reservaMemoria(lSize+1); // Toma memoria para el buffer de lectura. - if (!buffer) // No hay memoria suficiente para el buffer - return (NULL); - lSize=fread (buffer,1,lSize,f); // Lee contenido del fichero - fclose(f); - return (buffer); -} -// ________________________________________________________________________________________________________ -// Función: leeArchivo -// -// Descripción: -// Calcula la longitud de un archivo -// Parámetros: -// fil: Nombre completo del archivo -// Devuelve: -// Un puntero al buffer con el contenido leido - -//______________________________________________________________________________________________________ -int lonArchivo(char *fil) -{ - FILE *f; - long lSize; - - f=fopen(fil,"rb"); - if (!f) - return(0); - fseek (f,0,SEEK_END); // Obtiene tamaño del fichero. - lSize = ftell (f); - fclose(f); - return (lSize); -} -// ________________________________________________________________________________________________________ -// Función: escribeArchivo -// -// Descripción: -// Escribe un archivo -// Parámetros: -// fil: Nombre completo del archivo -// buffer: Un puntero al buffer con el contenido a escribir -// Devuelve: -//______________________________________________________________________________________________________ -BOOLEAN escribeArchivo(char *fil,char*buffer) -{ - FILE *f; - long lSize; - - f=fopen(fil,"wb"); - if (!f){ - return(FALSE); - } - lSize=strlen(buffer); - fwrite(buffer,1,lSize,f); // Escribe el contenido en el fichero - fclose(f); - return (TRUE); -} -// ________________________________________________________________________________________________________ -// Función: sendArchivo -// -// Descripción: -// Envía un archivo por la red -// Parámetros: -// sock: Socket para el envío -// fil: Nombre local completo del archivo -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN sendArchivo(SOCKET *sock,char *fil) -{ - long lSize; - FILE *f; - char buffer[LONBLK]; - - f = fopen(fil,"rb"); - if(!f) // El fichero no existe - return(FALSE); - - while(!feof(f)){ - lSize=fread (buffer,1,LONBLK,f); // Lee el contenido del fichero - if(!sendData(sock,buffer,lSize)) - return (FALSE); - } - fclose(f); - return(TRUE); -} -// ________________________________________________________________________________________________________ -// Función: recArchivo -// -// Descripción: -// Recibe un archivo por la red -// Parámetros: -// sock: Socket para la recepción -// fil: Nombre local completo del archivo que se creará -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN recArchivo(SOCKET *sock,char *fil) -{ - int lon; - FILE *f; - char buffer[LONBLK]; - - f = fopen(fil,"wb"); - if(!f) // No se ha podido crear el archivo - return(FALSE); - do{ - if(!recData(sock,buffer,LONBLK,&lon)) - return(FALSE); - // Datos recibidos - if(lon>0) - fwrite(buffer,1,lon,f); // Lee el contenido del fichero - }while(lon>0); // Bucle para recibir datos del cliente - fclose(f); - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: initParammetros -// -// Descripción: -// Libera memoria del buffer de los parametros de la trama y vuelve a reservar espacio -// Parámetros: -// - parametros : Puntero a la zona donde están los parametros de una trama -// - lon : Tamaño de la nueva reserva de espacio para los parametros -// Devuelve: -// Un puntero a la nueva zona de memoria o NULL si ha habido algún error -// Especificaciones: -// En caso de que el parámetro lon valga cero el tamaño a reservar será el estandar -//______________________________________________________________________________________________________ -BOOLEAN initParametros(TRAMA* ptrTrama,int lon) -{ - if(lon==0) lon=LONGITUD_PARAMETROS; - ptrTrama->parametros=(char*)ampliaMemoria(ptrTrama->parametros,lon); - if(!ptrTrama->parametros) - return(FALSE); - else - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: TCPConnect -// -// Descripción: -// Crea un socket y lo conecta a un servidor -// Parámetros: -// - ips : La Dirección IP del servidor -// - port : Puerto para la comunicación -// Devuelve: -// Un socket para comunicaciones por protocolo TCP -//______________________________________________________________________________________________________ -SOCKET TCPConnect(char *ips,char* port) -{ - SOCKET s; - struct sockaddr_in server; - char modulo[] = "TCPConnect()"; - - s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (s == INVALID_SOCKET){ - return (INVALID_SOCKET); - } - server.sin_family = AF_INET; - server.sin_port = htons((short)atoi(port)); - server.sin_addr.s_addr = inet_addr(ips); - - if (connect(s, (struct sockaddr *)&server, sizeof(server)) == INVALID_SOCKET){ - errorLog(modulo,38,TRUE); - return (INVALID_SOCKET); - } - - return(s); -} -//______________________________________________________________________________________________________ -// Función: AbreConexion -// -// Descripción: -// Abre la conexión entre el cliente y el servidor de administración -// Parámetros: -// - Ninguno -// Devuelve: -// Un socket de cliente para comunicaciones -//______________________________________________________________________________________________________ -SOCKET abreConexion(void) -{ - int swloop=0; - SOCKET s; - - while(swloop<MAXCNX){ - s=TCPConnect(servidoradm,puerto); - if(s!= INVALID_SOCKET){ - return(s); - } - swloop++; - #ifdef __WINDOWS__ - Sleep(5*1000); - #else - sleep(5); // Espera cinco segundos antes de intentar una nueva conexión - #endif - } - return(INVALID_SOCKET); -} -//______________________________________________________________________________________________________ -// Función: enviaMensaje -// -// Descripción: -// Envia un mensaje al servidor de Administración -// Parámetros: -// - socket_c: (Salida) Socket utilizado para el envío -// - ptrTrama: contenido del mensaje -// - tipo: Tipo de mensaje -// C=Comando, N=Respuesta a un comando, P=Peticion,R=Respuesta a una petición, I=Informacion -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -BOOLEAN enviaMensaje(SOCKET *socket_c,TRAMA *ptrTrama,char tipo) -{ - char modulo[] = "enviaMensaje()"; - - *socket_c=abreConexion(); - if(*socket_c==INVALID_SOCKET){ - errorLog(modulo,38,FALSE); // Error de conexión con el servidor - return(FALSE); - } - ptrTrama->arroba='@'; // Cabecera de la trama - strncpy(ptrTrama->identificador,"JMMLCAMDJ_MCDJ",14); // identificador de la trama - ptrTrama->tipo=tipo; // Tipo de mensaje - - if (!mandaTrama(socket_c,ptrTrama)) { - errorLog(modulo,26,FALSE); - return (FALSE); - } - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: recibeMensaje -// -// Descripción: -// Recibe un mensaje del servidor de Administración -// Parámetros: -// - socket_c: Socket utilizadopara la recepción -// - ptrTrama: (Salida) Contenido del mensaje -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -TRAMA* recibeMensaje(SOCKET *socket_c) -{ - TRAMA* ptrTrama; - char modulo[] = "recibeMensaje()"; - - ptrTrama=recibeTrama(socket_c); - if(!ptrTrama){ - errorLog(modulo,17,FALSE); - return(NULL); - } - return(ptrTrama); -} - -// ________________________________________________________________________________________________________ diff --git a/admin/Sources/Includes/ogAdmLib.h b/admin/Sources/Includes/ogAdmLib.h deleted file mode 100644 index 42279a3e..00000000 --- a/admin/Sources/Includes/ogAdmLib.h +++ /dev/null @@ -1,319 +0,0 @@ -// ************************************************************************************************************************************************** -// Libreria: ogAdmLib -// 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: ogAdmLib.h -// Descripción: Este fichero implementa el archivo de cabecera de la libreria ogAdmLib -// ************************************************************************************************************************************************** -// ________________________________________________________________________________________________________ -// Valores definidos -// ________________________________________________________________________________________________________ -#define LONSTD 1024 // Longitud de memoria estandar -#define LONINT 16 // Longitud de memoria estandar para un número entero -#define LONFIL 1024 // Longitud de memoria estandar para nombres de archivo completos (incluido path) -#define LONIP 16 // Longitud de memoria estandar para cadenas que contiene una dirección IP -#define LONMAC 16 // Longitud de memoria estandar para cadenas que contiene una dirección MAC -#define LONSQL 8192 // Longitud de memoria estandar para una sentencia SQL -#define LONPRM 4098 // Longitud estandar de los parámetros del fichero de configuración del servicio -#define LONSCP 4098 // Longitud estandar de los parámetros de las tramas -#define LONFUN 512 // Longitud estandar de los nombres de las funciones que procesan las tramas -#define LONSUC 4098 // Longitud de los mensajes de sucesos -#define LONBLK 8192 // Longitud de los paquetes de tramas leidos cada vez -#define MAXPRM 20 // Máximo número de parámeros del fichero de configuración del servicio -#define MAXPAR 128 // Maximo numero de particiones manejadas por el sistema, ahora con GPT es 128 -#define MAXLONURL 1024 // Longitud máxima de una dirección url con parámetros - -#define LONHEXPRM 5 // Longitud del campo que contiene el tamaño de la cadena de parámetros -#define LONGITUD_CABECERATRAMA 16 // Longitud de la cabecera de las tramas -#define LONGITUD_PARAMETROS 8192 // Longitud estandar de la información de la trama (parámetros) -#define MAXCMD_PARAMETROS 200 // Máximo número de parámetros de una trama - -#define MAXIMOS_CLIENTES 4000 // Máximo número de conexiones con ordenadores clientes -#define MAXIMAS_FUNCIONES LONSTD // Máximo número de funciones que procesan los mensajes entre servicio y clientes -#define MAXIMAS_LINEAS 3000 // Longitud máxima de lineas en un archivo de comandos - -#define AUTOINCORPORACION_OFF 0x0000 // Los ordenadores no se pueden dar de alta automáticamente -#define AUTOINCORPORACION_ONA 0x0001 // Los ordenadores se pueden dar de alta automáticamente si existe el aula -#define AUTOINCORPORACION_ONX 0x0002 // Los ordenadores se pueden dar de alta automáticamentee y si no existe el aula la crea - -#define DEBUG_BAJO 1 // Nivel de debug bajo -#define DEBUG_MEDIO 2 // Nivel de debug medio -#define DEBUG_ALTO 3 // Nivel de debug alto -#define DEBUG_MAXIMO 4 // Nivel de debug máximo - -#define CLIENTE_OCUPADO "BSY" // Cliente ocupado -#define CLIENTE_APAGADO "OFF" // Cliente apagado -#define CLIENTE_INICIANDO "INI" // Cliente iniciando - -#define CLIENTE_OPENGNSYS "OPG" // Cliente Opengnsys - -#define CLIENTE_WIN "WIN" // Cliente Windows genérico -#define CLIENTE_WNT "WNT" // Windows NT -#define CLIENTE_W2K "W2K" // Windows 2000 -#define CLIENTE_WS2 "WS2" // Windows Server 2003 -#define CLIENTE_WXP "WXP" // Cliente Windows XP -#define CLIENTE_W95 "W95" // Windows 95 -#define CLIENTE_W98 "W98" // Windows 98 -#define CLIENTE_WML "WML" // Windows Milenium -#define CLIENTE_MS2 "MS2" // MsDos -#define CLIENTE_WVI "WVI" // Cliente Windows Vista -#define CLIENTE_WI7 "WI7" // Cliente Windows 7 - -#define CLIENTE_LNX "LNX" // Cliente Linux - -#define ACCION_SINRESULTADO 0 // Sin resultado -#define ACCION_EXITOSA 1 // Finalizada con éxito -#define ACCION_FALLIDA 2 // Finalizada con errores - -#define ACCION_INICIADA 1 // Acción activa -#define ACCION_DETENIDA 2 // Acción momentanemente parada -#define ACCION_FINALIZADA 3 // Accion finalizada - -#define EJECUCION_COMANDO 1 -#define EJECUCION_PROCEDIMIENTO 2 -#define EJECUCION_TAREA 3 -#define EJECUCION_RESERVA 4 - -#define AMBITO_CENTROS 0x01 -#define AMBITO_GRUPOSAULAS 0x02 -#define AMBITO_AULAS 0x04 -#define AMBITO_GRUPOSORDENADORES 0x08 -#define AMBITO_ORDENADORES 0x10 - -// Código de los tipos de mensajes -#define MSG_COMANDO '1' // Mensaje del tipo comando -#define MSG_NOTIFICACION '2' // Respuesta a la ejecución un comando -#define MSG_PETICION '3' // Petición de cualquier actuación -#define MSG_RESPUESTA '4' // Respuesta a una petición -#define MSG_INFORMACION '5' // Envío de cualquier información sin espera de confirmación o respuesta - -#define ANNOREF 2009 // Año de referencia base - -#define LONGITUD_SCRIPTSALIDA 131072 // Longitud máxima de la información devuelta por una función de interface -#define MAXARGS 16 // Número máximo de argumentos enviados a un scripts -#define MAXCNX 5 // Máximos intentos de conexión al servidor de Administración - -#define PUERTO_WAKEUP 9 // Puerto wake up - -#define MAXHARDWARE 128 // Máximos elementos hardware a detectar -#define MAXSOFTWARE 8096 // Máximos elementos software a detectar -// ________________________________________________________________________________________________________ -// Tipos definidos -// ________________________________________________________________________________________________________ -typedef unsigned long DWORD; -typedef unsigned short WORD; -typedef int BOOLEAN; -typedef char BYTE; -typedef int SOCKET; -typedef void* LPVOID; - -#define TRUE 1 -#define FALSE 0 - -#define SOCKET_ERROR (-1) -#define INVALID_SOCKET (SOCKET)(~0) - -#define LEER 0 -#define ESCRIBIR 1 - -#define CHARNULL '\0' - -// ________________________________________________________________________________________________________ -// Variables globales -// ________________________________________________________________________________________________________ -char szPathFileCfg[LONSTD],szPathFileLog[LONSTD]; -int ndebug; // Nivel de debuger - -typedef struct{ // Estructura de las tramas - char arroba; // Caracter arroba siempre - char identificador[14]; // Identificador de la trama, siempre JMMLCAMDJ_MCDJ - char tipo; // Tipo de mensaje - long lonprm; // Longitud en hexadecimal de los parámetros - char *parametros; // Parámetros de la trama -}TRAMA; -// ________________________________________________________________________________________________________ -// Tabla de errores -// ________________________________________________________________________________________________________ -const char* tbErrores[]={"Se han generado errores. No se puede continuar la ejecución de este módulo",\ - "001-El nombre del fichero de configuración del programa está vacío",\ - "002-No existe fichero de configuración del programa",\ - "003-No hay memoria suficiente para el buffer",\ - "004-Error en el fichero de configuración del programa. No se ha definido el parámetro SERVIDORADM",\ - "005-Error en el fichero de configuración del programa. No se ha definido el parámetro PUERTO",\ - "006-Error en el fichero de configuración del programa. No se ha definido el parámetro USUARIO",\ - "007-Error en el fichero de configuración del programa. No se ha definido el parámetro PASSWORD",\ - "008-Error en el fichero de configuración del programa. No se ha definido el parámetro DATASOURCE",\ - "009-Error en el fichero de configuración del programa. No se ha definido el parámetro CATALOG",\ - "010-Error en los parámetros de ejecución del programa. Debe especificar el fichero de configuración",\ - "011-Error en los parámetros de ejecución del programa. Debe especificar el fichero de log",\ - "012-Error de sintaxis en los parámetros de ejecución del programa: Debe especificar -f nombre_del_fichero_de_configuración_del_programa -l nombre_del_fichero_de_log_del_programa -d nivel de debug",\ - "013-Error al crear socket ***socket() fallo",\ - "014-Error al enlazar socket al interface ***bind() fallo",\ - "015-Error al acceptar conexión de clientes ***accept() fallo",\ - "016-Error al crear hebra de cliente en módulo main()",\ - "017-Error al recibir trama ***recv() fallo",\ - "018-No se reconoce el mensaje enviado",\ - "019-Trama recibida NO válida",\ - "020-No se puede establecer conexión con la base de datos",\ - "021-No se han podido recuperar los datos de la consulta o bien insertar, modificar o eliminar datos",\ - "022-El cliente no se ha sido dado de alta en la base de datos del sistema. Se rechaza su petición de inclusión",\ - "023-Ha habido algún problema en la incorporación automática del cliente",\ - "024-Ha habido algún problema en la actualización de la configuración del cliente",\ - "025-La tabla de clientes está llena, no pueden registrarse más clientes en el sistema",\ - "026-Error al enviar trama ***send() fallo",\ - "027-No se encuentra Repositorio del cliente",\ - "028-Ha ocurrido algún error al tomar las particiones",\ - "029-Ha ocurrido algún problema en el proceso de inclusión del cliente. Se rechaza su petición",\ - "030-Ha ocurrido algún problema en el proceso de respuesta al comando",\ - "031-No se ha encontrado la acción a notificar es posible que se haya eliminado el registro",\ - "032-Ha ocurrido algún problema en el envío del comando",\ - "033-Error en el fichero de configuración del programa. No se ha definido el parámetro PATHSCRIPTS",\ - "034-Error en el fichero de configuración del programa. No se ha definido el parámetro URLMENU",\ - "035-Error en el fichero de configuración del programa. No se ha definido el parámetro URLMSG",\ - "036-No se ha podido recuperar la configuración de las particiones del disco",\ - "037-Ha ocurrido algún problema en el proceso de inclusión del cliente",\ - "038-No se ha podido establecer conexión con el Servidor de Administración",\ - "039-Ha ocurrido algún problema al procesar la trama recibida",\ - "040-Se han recibido parámetros con valores no válidos",\ - "041-Ha ocurrido algún problema en el proceso de inclusión del cliente",\ - "042-Ha ocurrido algún problema al enviar una petición de comandos o tareas pendientes al Servidor de Administración",\ - "043-Ha ocurrido algún problema al enviar una petición de comandos interactivos al Servidor de Administración",\ - "044-Ha ocurrido algún problema al enviar una respuesta de comandos al servidor",\ - "045-Ha ocurrido algún problema al recibir una petición de comandos o tareas pendientes desde el Servidor de Administración",\ - "046-Ha ocurrido algún problema al recibir un comando interactivo desde el Servidor de Administración",\ - "047-El cliente no está registrado en la tabla de sockest del sistema",\ - "048-Error al configurar opción BROADCAST para socket: setsockopt(SO_BROADCAST)",\ - "049-Error al enviar trama magic packet",\ - "050-Ha ocurrido algún problema al enviar un fichero por la red",\ - "051-Error en el fichero de configuración del programa. No se ha definido el parámetro PATHLOGFIL",\ - "052-No se puede crear archivo temporal para ejecución de Comandos",\ - "053-Ha ocurrido algún problema al procesar el Inventario Hardware del cliente",\ - "054-Existe un tipo de hardware que no está registrado",\ - "055-Ha ocurrido algún problema al actualizar el hardware del cliente",\ - "056-Error en el fichero de configuración del programa. No se ha definido el parámetro PATHINTERFACE",\ - "057-Ha ocurrido algún problema al enviar un archivo por la red",\ - "058-Ha ocurrido algún problema al recibir un archivo por la red",\ - "059-Error al crear la hebra DHCP o BOOTP",\ - "060-Error al crear la hebra TFTP",\ - "061-Error al crear socket para servicio DHCP",\ - "062-Error al enlazar socket con interface para servicio DHCP",\ - "063-No hay puertos libres para la hebra del servicio",\ - "064-Error al crear estructura de control para protocolo DHCP",\ - "065-Error al recibir mensaje DHCP. Se para el servicio",\ - "066-Error al crear la hebra cliente DHCP",\ - "067-Error al crear socket para servicio BOOTP",\ - "068-Error al enlazar socket con interface para servicio BOOTP",\ - "069-Error al crear estructura de control para protocolo BOOTP",\ - "070-Error al recibir mensaje BOOTP. Se para el servicio",\ - "071-Error al crear la hebra cliente BOOTP",\ - "072-Error al crear socket para servicio TFTP",\ - "073-Error al enlazar socket con interface para servicio TFTP",\ - "074-Error al crear estructura de control para protocolo TFTP",\ - "075-Error al recibir mensaje TFTP. Se para el servicio",\ - "076-Error al crear la hebra cliente TFTP",\ - "077-No se encontró opción DHCP",\ - "078-ERROR TFTP",\ - "079-Error al recibir mensaje TFTP en hebra cliente",\ - "080-Error al recibir mensaje DHCP",\ - "081-Error al crear socket de usuario para hebra",\ - "082-Ha ocurrido algún problema al procesar el Inventario software del cliente",\ - "083-Ha ocurrido algún problema al actualizar el software del cliente",\ - "084-Ha ocurrido algún problema al reiniciar la sesión del cliente",\ - "085-No se ha podido recuperar la dirección IP del cliente",\ - "086-Error al ejecutar el comando",\ - "087-Error al leer o escribir el contenido del archivo de eco de consola remota",\ - "088-Ha habido algún problerma al procesar la caché",\ - "089-Error en el fichero de configuración del programa. No se ha definido el parámetro URLMENU",\ - "090-Error en el fichero de configuración del programa. No se ha definido el parámetro URLMSG",\ - "091-Ha habido algún problema al enviar un mensaje de tipo petición al Servidor",\ - "092-Error en el fichero de configuración del programa. No se ha definido el parámetro IPLOCAL",\ - "093-No se puede cargar la librería Windows para trabajar con sockets",\ - "094-Ha habido algún problerma al procesar la actualización después de crear una imagen",\ - "095-Ha habido algún problerma al procesar la actualización después de restaurar una imagen",\ - "096-Ha habido algún problerma al procesar la actualización después de crear un software incremental",\ - "097-Este fichero de log está obsoleto, este proceso usa ahora syslog para gestionar los mensajes de log",\ -}; -// ________________________________________________________________________________________________________ -// Tabla de mensajes -// ________________________________________________________________________________________________________ -const char* tbMensajes[]={"",\ - "001-Inicio de sesion",\ - "002-Petición de inclusión de cliente",\ - "003-Abriendo sesión en el servidor de Administración",\ - "004-Cliente iniciado",\ - "005-Ejecución de archivo Autoexec",\ - "006-Procesa comandos pendientes",\ - "007-Acciones pendientes procesadas",\ - "008-Ejecución del script",\ - "009-Parámetro del script",\ - "010-Ha ocurrido algún error en la creación del proceso hijo",\ - "011-Aviso: La información de salida del script excede de la longitud permitida. Puede haberse truncado",\ - "012-Información devuelta por el script",\ - "013-Estatus de finalización del script",\ - "014-Configuración de particiones",\ - "015-Enviando petición de inclusión en el sistema al Servidor de Administración",\ - "016-Recibiendo respuesta de inclusión desde el Servidor de Administración",\ - "017-Enviando petición de comandos o tareas pendientes al Servidor de Administración",\ - "018-Recibiendo respuesta de comandos o tareas pendientes desde el Servidor de Administración",\ - "019-Disponibilidad de comandos activada",\ - "020-Disponibilidad de comandos desactivada",\ - "021-Ejecución de comando",\ - "022-Sin eco",\ - "023-Procesando caché",\ - "024-Repositorio iniciado",\ - -}; -// ________________________________________________________________________________________________________ -// Prototipo de funciones -// ________________________________________________________________________________________________________ -struct tm * tomaHora(); -void registraLog(const char *,const char *,int ); -void errorLog(const char *,int ,int); -#define og_log(err, swe) errorLog(__FUNCTION__, err, swe) -void errorInfo(const char *,char *); -#define og_info(err) errorInfo(__FUNCTION__, err) -void infoLog(int); -void infoDebug(char*); -BOOLEAN validacionParametros(int,char**,int); -char* reservaMemoria(int); -char* ampliaMemoria(char*,int); -void liberaMemoria(void*); -BOOLEAN initParametros(TRAMA*,int); -int splitCadena(char **,char *, char); -void sustituir(char *,char ,char ); -char* StrToUpper(char *); -char* StrToLower(char *); -void INTROaFINCAD(TRAMA*); -void FINCADaINTRO(TRAMA*); -int cuentaIPES(char*); -char *tomaParametro(const char*,TRAMA*); -char *copiaParametro(const char*,TRAMA *); -BOOLEAN contieneIP(char *,char *); -char* rTrim(char *); -SOCKET TCPConnect(char *,char *); -SOCKET abreConexion(void); -BOOLEAN enviaMensaje(SOCKET *,TRAMA *,char); -TRAMA* recibeMensaje(SOCKET *); -BOOLEAN mandaTrama(SOCKET*,TRAMA*); -BOOLEAN sendData(SOCKET *, char* ,int ); -BOOLEAN enviaTrama(SOCKET *,TRAMA *); -TRAMA* recibeTrama(SOCKET*); -BOOLEAN recData(SOCKET *,char*,int,int*); -BOOLEAN sendFlag(SOCKET *, char* ,int ); -BOOLEAN recibeFlag(SOCKET*,TRAMA*); -char* URLEncode(char *); -char* URLDecode(char *); -char* leeArchivo(char*); -int lonArchivo(char *); -BOOLEAN escribeArchivo(char *,char*); -BOOLEAN sendArchivo(SOCKET *,char *); -BOOLEAN recArchivo(SOCKET *,char *); -SOCKET TCPConnect(char *,char*); - -#include <stddef.h> /* for offsetof. */ - -#define container_of(ptr, type, member) ({ \ - typeof( ((type *)0)->member ) *__mptr = (ptr); \ - (type *)( (char *)__mptr - offsetof(type,member) );}) - diff --git a/admin/Sources/Services/ogAdmAgent/Makefile b/admin/Sources/Services/ogAdmAgent/Makefile deleted file mode 100644 index b9d39b9b..00000000 --- a/admin/Sources/Services/ogAdmAgent/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -# makefile - -# Nombre del proyecto -PROYECTO := ogAdmAgent - -# Directorio de instalación -INSTALL_DIR := /opt/opengnsys - -# Opciones de compilacion -CFLAGS := $(shell mysql_config --cflags) -CFLAGS += -g -Wall -I../../Includes -CPPFLAGS := $(CFLAGS) - -# Opciones de linkado -LDFLAGS := -Wl,--no-as-needed $(shell mysql_config --libs) -lpthread - -# Ficheros objetos -OBJS := ../../Includes/Database.o sources/ogAdmAgent.o - - -all: $(PROYECTO) - -$(PROYECTO): $(OBJS) - g++ $(LDFLAGS) $(OBJS) -o $(PROYECTO) - -install: $(PROYECTO) - cp $(PROYECTO) $(INSTALL_DIR)/sbin - cp $(PROYECTO).cfg $(INSTALL_DIR)/etc - -clean: - rm -f $(PROYECTO) $(OBJS) - -uninstall: clean - rm -f /usr/local/sbin/$(PROYECTO) /usr/local/etc/$(PROYECTO).cfg - -sources/%.o: sources/%.cpp - g++ $(CPPFLAGS) -c -o"$@" "$<" - -sources/%.o: sources/%.c - gcc $(CFLAGS) -c -o"$@" "$<" - - diff --git a/admin/Sources/Services/ogAdmAgent/ogAdmAgent.cfg b/admin/Sources/Services/ogAdmAgent/ogAdmAgent.cfg deleted file mode 100644 index 20126d35..00000000 --- a/admin/Sources/Services/ogAdmAgent/ogAdmAgent.cfg +++ /dev/null @@ -1,7 +0,0 @@ -ServidorAdm=SERVERIP -PUERTO=2008 -USUARIO=DBUSER -PASSWORD=DBPASSWORD -datasource=localhost -CATALOG=DATABASE - diff --git a/admin/Sources/Services/ogAdmAgent/sources/ogAdmAgent.cpp b/admin/Sources/Services/ogAdmAgent/sources/ogAdmAgent.cpp deleted file mode 100644 index 6bf23512..00000000 --- a/admin/Sources/Services/ogAdmAgent/sources/ogAdmAgent.cpp +++ /dev/null @@ -1,914 +0,0 @@ -// ******************************************************************************************************** -// 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;i<anno;i++){ - if (bisiesto(i)) dias_anuales=366; else dias_anuales=365; - cont+=dias_anuales; - } - for (i=1;i<mes;i++){ - if (i!=2) - cont+=dias_meses[i]; - else{ - if (bisiesto(anno)) - cont+=29; - else - cont+=28; - } - } - cont+=dia+desplazamiento_dias; - orddiasem=(cont%7); - if(orddiasem==0) orddiasem=7; - return(orddiasem); -} -// ________________________________________________________________________________________________________ -// -// Función: bisiesto -// -// Descripción: -// Calcula si un año es bisiesto o no lo es -// Parámetros: -// - anno: Un año -// Devuelve: -// TRUE si el año es bisiesto -// FALSE si no es bisiesto -// ________________________________________________________________________________________________________ - -BOOLEAN bisiesto(WORD anno){ - return(anno%4==0); -} -// ________________________________________________________________________________________________________ -// -// Función: semanadelMes -// -// Descripción: -// Calcula el número de semana perteneciente a un día del mes -// Parámetros: -// - ordiasem_1: Orden semanal (1,2...) del primer dia del mes que se pasa como parámetro -// - diames: El mes concreto -// Devuelve: -// El número del día de la semana: 1=Lunes, 2=martes ... 6=sábado 7=domingo , de ese mes -// ________________________________________________________________________________________________________ - -int semanadelMes(int ordiasem_1,int diames) -{ - int nwdia,resto,cociente; - - nwdia=diames+ordiasem_1-1; - cociente=nwdia/7; - resto=nwdia%7; - if(resto>0) 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); - } - if(!tbl.Get("idcomando",idcomando)){ - tbl.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - - if(!insertaComando(db,idcomando,parametros,idprocedimiento,ambito,idambito,restrambito)) { - - liberaMemoria(parametros); - return(false); - } - liberaMemoria(parametros); - } - 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;i<concli;i++){ - sprintf(sqlstr,"INSERT INTO acciones (idordenador,tipoaccion,idtipoaccion,descriaccion,ip,"\ - "sesion,idcomando,parametros,fechahorareg,estado,resultado,ambito,idambito,"\ - "restrambito,idprocedimiento,idcentro,idprogramacion)"\ - " VALUES (%s,%d,%d,'%s','%s',%d,%d,'%s','%s',%d,%d,%d,%d,'%s',%d,%d,%d)",\ - auxID[i],tipoaccion,idtipoaccion,descriaccion,auxIP[i],sesion,idcomando,parametros,fechahorareg,\ - ACCION_INICIADA,ACCION_SINRESULTADO,ambito,idambito,restrambito,idprocedimiento,idcentro,idprogramacion); - if (!db.Execute(sqlstr)) { // Error al recuperar los datos - errorLog(modulo, 21, FALSE); - db.GetErrorErrStr(msglog); - errorInfo(modulo, msglog); - return (FALSE); - } - } - return(TRUE); -} -// _____________________________________________________________________________________________________________ -// Función: EjecutarReserva -// -// Descripción: -// Registra una acción (Tarea) y la envía para su ejecución -// Parámetros: -// - idreserva : Identificador de la reserva -// - db: una conexion ADO operativa -// - parametros: Parámetros de la acción -// _____________________________________________________________________________________________________________ -BOOLEAN EjecutarReserva(int idreserva,Database db ) -{ - - - return(true); -} -// _____________________________________________________________________________________________________________ -// Función: enviaPeticion -// -// Descripción: -// Hace una petición al servidor para que actualice los ordenadores implicados en la programación -// Parámetros: -// - idprogramacion: Identificador de la programación -// _____________________________________________________________________________________________________________ -BOOLEAN enviaPeticion(int idprogramacion) -{ - int lon; - TRAMA *ptrTrama; - SOCKET socket_c; - char modulo[] = "enviaPeticion()"; - - /* Envio de comandos a clientes */ - ptrTrama=(TRAMA *)reservaMemoria(sizeof(TRAMA)); - if (ptrTrama == NULL) { // No hay memoria suficiente para el bufer de las tramas - errorLog(modulo, 3, FALSE); - return(FALSE); - } - initParametros(ptrTrama,0); - lon=sprintf(ptrTrama->parametros,"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 ip,mac,idordenador FROM ordenadores INNER JOIN aulas WHERE ordenadores.idaula=aulas.idaula AND idcentro=%d ORDER BY ordenadores.idaula, ordenadores.ip;",idambito); - RecorreOrdenadores(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 ip,mac,idordenador FROM ordenadores WHERE idaula=%d ORDER BY ip;",idambito); - RecorreOrdenadores(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/admin/Sources/Services/ogAdmAgent/sources/ogAdmAgent.h b/admin/Sources/Services/ogAdmAgent/sources/ogAdmAgent.h deleted file mode 100644 index b1c429bb..00000000 --- a/admin/Sources/Services/ogAdmAgent/sources/ogAdmAgent.h +++ /dev/null @@ -1,81 +0,0 @@ -// ********************************************************************************************************
-// 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.h
-// 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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#include <unistd.h>
-#include <time.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include </usr/include/mysql/mysql.h>
-#include "Database.h"
-#include "ogAdmLib.h"
-
-// ________________________________________________________________________________________________________
-//
-// Valores hexadecimales para consultas
-// ________________________________________________________________________________________________________
-
-WORD HEX_annos[]={0,0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000};
-WORD HEX_meses[]={0,0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800};
-int HEX_dias[]={0,0x00000001,0x00000002,0x00000004,0x00000008,0x00000010,0x00000020,0x00000040,0x00000080,0x00000100,0x00000200,
- 0x00000400,0x00000800,0x00001000,0x00002000,0x00004000,0x00008000,0x00010000,0x00020000,0x00040000,0x00080000,
- 0x00100000,0x00200000,0x00400000,0x00800000,0x01000000,0x02000000,0x04000000,0x08000000,0x10000000,0x20000000,0x40000000};
-WORD HEX_horas[]={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800 };
-BYTE HEX_diasemana[]={0,0x01,0x02,0x04,0x08,0x10,0x20,0x40};
-BYTE HEX_semanas[]={0,0x01,0x02,0x04,0x08,0x10,0x20};
-WORD dias_meses[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
-
-// ________________________________________________________________________________________________________
-//
-// Variables globales
-// ________________________________________________________________________________________________________
-
-char servidoradm[LONPRM]; // Dirección IP del servidor de administración
-char puerto[LONPRM]; // Puerto de comunicación
-char usuario[LONPRM]; // Usuario de acceso a la base de datos
-char pasguor[LONPRM]; // Password del usuario
-char datasource[LONPRM]; // Dirección IP del gestor de base de datos
-char catalog[LONPRM]; // Nombre de la base de datos
-
-int idprogramacion;
-int tipoaccion,idtipoaccion;
-char descriaccion[250];
-char *cadenaid;
-char *cadenaip;
-char *cadenamac;
-int concli;
-int sesion;
-int idcentro;
-
-// ________________________________________________________________________________________________________
-// Prototipo de funciones
-// ________________________________________________________________________________________________________
-BOOLEAN tomaConfiguracion(char*);
-int diadelaSemana(WORD,WORD,WORD);
-BOOLEAN bisiesto(WORD);
-BOOLEAN buscaAccion(Database,WORD,WORD,WORD,WORD,WORD,WORD);
-BOOLEAN ejecutarComando(Database,int,int );
-BOOLEAN ejecutarProcedimiento(Database,int,int,int,char*);
-BOOLEAN ejecutarTarea(Database,int, int);
-BOOLEAN insertaComando(Database,int,char*,int,int,int,char*);
-BOOLEAN EjecutarReserva(int,Database);
-BOOLEAN enviaPeticion(int);
-BOOLEAN RecopilaIpesMacs(Database,int,int,char *);
-BOOLEAN RecorreCentro(Database, char*);
-BOOLEAN RecorreGruposAulas(Database, char*);
-BOOLEAN RecorreAulas(Database, char*);
-BOOLEAN RecorreGruposOrdenadores(Database, char*);
-BOOLEAN RecorreOrdenadores(Database, char*);
-
diff --git a/admin/Sources/Services/ogAdmServer/Makefile b/admin/Sources/Services/ogAdmServer/Makefile deleted file mode 100644 index 0c3360e6..00000000 --- a/admin/Sources/Services/ogAdmServer/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -# makefile - -# Nombre del proyecto -PROYECTO := ogAdmServer - -# Directorio de instalación -INSTALL_DIR := /opt/opengnsys - -# Opciones de compilacion -CFLAGS := $(shell mysql_config --cflags) -CFLAGS += -g -Wall -I../../Includes - -# Opciones de linkado -LDFLAGS := -Wl,--no-as-needed $(shell mysql_config --libs) -lev -ljansson -ldbi - -# Ficheros objetos -OBJS := sources/ogAdmServer.o sources/dbi.o - - -all: $(PROYECTO) - -$(PROYECTO): $(OBJS) - gcc $(LDFLAGS) $(CFLAGS) $(OBJS) -o $(PROYECTO) - -install: $(PROYECTO) - cp $(PROYECTO) $(INSTALL_DIR)/sbin - cp $(PROYECTO).cfg $(INSTALL_DIR)/etc - -clean: - rm -f $(PROYECTO) $(OBJS) - -uninstall: clean - rm -f /usr/local/sbin/$(PROYECTO) /usr/local/etc/$(PROYECTO).cfg - -sources/%.o: sources/%.c - gcc $(CFLAGS) -c -o"$@" "$<" - - diff --git a/admin/Sources/Services/ogAdmServer/Makefile.am b/admin/Sources/Services/ogAdmServer/Makefile.am new file mode 100644 index 00000000..962d320f --- /dev/null +++ b/admin/Sources/Services/ogAdmServer/Makefile.am @@ -0,0 +1,9 @@ +sbin_PROGRAMS = ogAdmServer + +AM_CFLAGS = ${LIBDBI_CFLAGS} ${LIBJANSSON_CFLAGS} ${LIBEVENT_CFLAGS} -g -Wall + +ogAdmServer_SOURCES= sources/ogAdmServer.c \ + sources/dbi.c \ + sources/schedule.c \ + sources/utils.c \ + sources/ogAdmLib.c diff --git a/admin/Sources/Services/ogAdmServer/configure.ac b/admin/Sources/Services/ogAdmServer/configure.ac new file mode 100644 index 00000000..e7014b53 --- /dev/null +++ b/admin/Sources/Services/ogAdmServer/configure.ac @@ -0,0 +1,25 @@ +AC_INIT(ogAdmServer, 1.1.1, opengnsys-devel@listas.unizar.es) +AC_CONFIG_AUX_DIR([build-aux]) +AC_PREFIX_DEFAULT(/opt/opengnsys) + +AC_CANONICAL_HOST +AC_CONFIG_MACRO_DIR([m4]) +AM_INIT_AUTOMAKE([-Wall foreign subdir-objects tar-pax no-dist-gzip dist-bzip2 1.6]) + +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +AC_PROG_CC +AC_PROG_INSTALL +AC_PROG_LN_S + +case "$host" in +*-*-linux*) ;; +*) AC_MSG_ERROR([Linux only, sorry!]);; +esac + +AC_CHECK_LIB([jansson], [json_object], , AC_MSG_ERROR([libjansson not found])) +AC_CHECK_LIB([dbi], [dbi_initialize], , AC_MSG_ERROR([libdbi not found])) +AC_CHECK_LIB([ev], [ev_loop_new], , AC_MSG_ERROR([libev not found])) + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/admin/Sources/Services/ogAdmServer/sources/list.h b/admin/Sources/Services/ogAdmServer/sources/list.h new file mode 100644 index 00000000..8dfd476f --- /dev/null +++ b/admin/Sources/Services/ogAdmServer/sources/list.h @@ -0,0 +1,162 @@ +#ifndef _LINUX_LIST_H +#define _LINUX_LIST_H + +#include <stddef.h> + +#define container_of(ptr, type, member) ({ \ + typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + +/* + * These are non-NULL pointers that will result in page faults + * under normal circumstances, used to verify that nobody uses + * non-initialized list entries. + */ +#define LIST_POISON1 ((void *) 0x00100100) +#define LIST_POISON2 ((void *) 0x00200200) + +/* + * Simple doubly linked list implementation. + * + * Some of the internal functions ("__xxx") are useful when + * manipulating whole lists rather than single entries, as + * sometimes we already know the next/prev entries and we can + * generate better code by using them directly rather than + * using the generic single-entry routines. + */ + +struct list_head { + struct list_head *next, *prev; +}; + +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +#define INIT_LIST_HEAD(ptr) do { \ + (ptr)->next = (ptr); (ptr)->prev = (ptr); \ +} while (0) + +/* + * Insert a new entry between two known consecutive entries. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_add(struct list_head *new, + struct list_head *prev, + struct list_head *next) +{ + next->prev = new; + new->next = next; + new->prev = prev; + prev->next = new; +} + +/** + * list_add - add a new entry + * @new: new entry to be added + * @head: list head to add it after + * + * Insert a new entry after the specified head. + * This is good for implementing stacks. + */ +static inline void list_add(struct list_head *new, struct list_head *head) +{ + __list_add(new, head, head->next); +} + +/** + * list_add_tail - add a new entry + * @new: new entry to be added + * @head: list head to add it before + * + * Insert a new entry before the specified head. + * This is useful for implementing queues. + */ +static inline void list_add_tail(struct list_head *new, struct list_head *head) +{ + __list_add(new, head->prev, head); +} + +/* + * Delete a list entry by making the prev/next entries + * point to each other. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_del(struct list_head * prev, struct list_head * next) +{ + next->prev = prev; + prev->next = next; +} + +/** + * list_del - deletes entry from list. + * @entry: the element to delete from the list. + * Note: list_empty on entry does not return true after this, the entry is + * in an undefined state. + */ +static inline void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + entry->next = LIST_POISON1; + entry->prev = LIST_POISON2; +} + +/** + * list_empty - tests whether a list is empty + * @head: the list to test. + */ +static inline int list_empty(const struct list_head *head) +{ + return head->next == head; +} + +/** + * list_entry - get the struct for this entry + * @ptr: the &struct list_head pointer. + * @type: the type of the struct this is embedded in. + * @member: the name of the list_struct within the struct. + */ +#define list_entry(ptr, type, member) \ + container_of(ptr, type, member) + +/** + * list_first_entry - get the first element from a list + * @ptr: the list head to take the element from. + * @type: the type of the struct this is embedded in. + * @member: the name of the list_head within the struct. + * + * Note, that list is expected to be not empty. + */ +#define list_first_entry(ptr, type, member) \ + list_entry((ptr)->next, type, member) + +/** + * list_for_each_entry - iterate over list of given type + * @pos: the type * to use as a loop counter. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry(pos, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = list_entry(pos->member.next, typeof(*pos), member)) + +/** + * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry + * @pos: the type * to use as a loop counter. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry_safe(pos, n, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member), \ + n = list_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, typeof(*n), member)) + +#endif diff --git a/admin/Sources/Services/ogAdmServer/sources/ogAdmLib.c b/admin/Sources/Services/ogAdmServer/sources/ogAdmLib.c new file mode 100644 index 00000000..5ad39961 --- /dev/null +++ b/admin/Sources/Services/ogAdmServer/sources/ogAdmLib.c @@ -0,0 +1,362 @@ +// ************************************************************************************************************************************************** +// Libreria: ogAdmLib +// 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: ogAdmLib.c +// Descripción: Este fichero implementa una libreria de funciones para uso común de los servicios +// ************************************************************************************************************************************************** + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <ctype.h> +#include <sys/types.h> +#include <sys/socket.h> +#include "ogAdmLib.h" + +//______________________________________________________________________________________________________ +// Función: ValidacionParametros +// +// Descripción: +// Valida que los parametros de ejecución del programa sean correctos +// Parámetros: +// - argc: Número de argumentos +// - argv: Puntero a cada argumento +// - eje: Tipo de ejecutable (1=Servicio,2=Repositorio o 3=Cliente) +// Devuelve: +// - TRUE si los argumentos pasados son correctos +// - FALSE en caso contrario +// Especificaciones: +// La sintaxis de los argumentos es la siguiente +// -f Archivo de configuración del servicio +// -l Archivo de logs +// -d Nivel de debuger (mensages que se escribirán en el archivo de logs) +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algún error +//______________________________________________________________________________________________________ +BOOLEAN validacionParametros(int argc, char*argv[],int eje) { + int i; + + switch(eje){ + case 1: // Administrador + strcpy(szPathFileCfg, "ogAdmServer.cfg"); // Valores por defecto de archivos + strcpy(szPathFileLog, "ogAdmServer.log"); // de configuración y de logs + break; + case 2: // Repositorio + strcpy(szPathFileCfg, "ogAdmRepo.cfg"); // Valores por defecto de archivos + strcpy(szPathFileLog, "ogAdmRepo.log"); // de configuración y de logs + break; + case 3: // Cliente OpenGnsys + strcpy(szPathFileCfg, "ogAdmClient.cfg"); // Valores por defecto de archivos + strcpy(szPathFileLog, "ogAdmClient.log"); // de configuración y de logs + break; + case 4: // Servicios DHCP,BOOTP Y TFTP + strcpy(szPathFileCfg, "ogAdmBoot.cfg"); // Valores por defecto de archivos + strcpy(szPathFileLog, "ogAdmBoot.log"); // de configuración y de logs + break; + case 5: // Agente + strcpy(szPathFileCfg, "ogAdmAgent.cfg"); // Valores por defecto de archivos + strcpy(szPathFileLog, "ogAdmAgent.log"); // de configuración y de logs + break; + case 6: // Agente + strcpy(szPathFileCfg, "ogAdmWinClient.cfg"); // Valores por defecto de archivos + strcpy(szPathFileLog, "ogAdmWinClient.log"); // de configuración y de logs + break; + case 7: // Agente + strcpy(szPathFileCfg, "ogAdmnxClient.cfg"); // Valores por defecto de archivos + strcpy(szPathFileLog, "ogAdmLnxClient.log"); // de configuración y de logs + break; + } + + ndebug = 1; // Nivel de debuger por defecto + + for (i = 1; (i + 1) < argc; i += 2) { + if (argv[i][0] == '-') { + switch (tolower(argv[i][1])) { + case 'f': + if (argv[i + 1] != NULL) + strcpy(szPathFileCfg, argv[i + 1]); + else { + return (FALSE); + } + break; + case 'l': + if (argv[i + 1] != NULL) + strcpy(szPathFileLog, argv[i + 1]); + else { + return (FALSE); + } + break; + case 'd': + if (argv[i + 1] != NULL) { + ndebug = atoi(argv[i + 1]); + if (ndebug < 1) + ndebug = 1; // Por defecto el nivel de debug es 1 + } else + ndebug = 1; // Por defecto el nivel de debug es 1 + break; + default: + exit(EXIT_FAILURE); + break; + } + } + } + return (TRUE); +} +// ________________________________________________________________________________________________________ +// Función: splitCadena +// +// Descripción: +// Trocea una cadena según un carácter delimitador +// Parámetros: +// - trozos: Array de punteros a cadenas +// - cadena: Cadena a trocear +// - chd: Carácter delimitador +// Devuelve: +// Número de trozos en que se divide la cadena +// ________________________________________________________________________________________________________ +int splitCadena(char **trozos,char *cadena, char chd) +{ + int w=0; + if(cadena==NULL) return(w); + + trozos[w++]=cadena; + while(*cadena!='\0'){ + if(*cadena==chd){ + *cadena='\0'; + if(*(cadena+1)!='\0') + trozos[w++]=cadena+1; + } + cadena++; + } + return(w); // Devuelve el número de trozos +} +// ________________________________________________________________________________________________________ +// Función: escaparCadena +// +// Descripción: +// Sustituye las apariciones de un caracter comila simple ' por \' +// Parámetros: +// - cadena: Cadena a escapar +// Devuelve: +// La cadena con las comillas simples sustituidas por \' +// ________________________________________________________________________________________________________ +char* escaparCadena(char *cadena) +{ + int b,c; + char *buffer; + + buffer = (char*) reservaMemoria(strlen(cadena)*2); // Toma memoria para el buffer de conversión + if (buffer == NULL) { // No hay memoria suficiente para el buffer + return (FALSE); + } + + c=b=0; + while(cadena[c]!=0) { + if (cadena[c]=='\''){ + buffer[b++]='\\'; + buffer[b++]='\''; + } + else{ + buffer[b++]=cadena[c]; + } + c++; + } + return(buffer); +} + +// ________________________________________________________________________________________________________ +// Función: igualIP +// +// Descripción: +// Comprueba si una cadena con una dirección IP está incluida en otra que contienen varias direcciones ipes +// separadas por punto y coma +// Parámetros: +// - cadenaiph: Cadena de direcciones IPES +// - ipcliente: Cadena de la IP a buscar +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algún error +// ________________________________________________________________________________________________________ +BOOLEAN contieneIP(char *cadenaiph,char *ipcliente) +{ + char *posa,*posb; + int lon, i; + + posa=strstr(cadenaiph,ipcliente); + if(posa==NULL) return(FALSE); // No existe la IP en la cadena + posb=posa; // Iguala direcciones + for (i = 0; i < LONIP; i++) { + if(*posb==';') break; + if(*posb=='\0') break; + if(*posb=='\r') break; + posb++; + } + lon=strlen(ipcliente); + if((posb-posa)==lon) return(TRUE); // IP encontrada + return(FALSE); +} +// ________________________________________________________________________________________________________ +// Función: rTrim +// +// Descripción: +// Elimina caracteres de espacios y de asci menor al espacio al final de la cadena +// Parámetros: +// - cadena: Cadena a procesar +// ________________________________________________________________________________________________________ +char* rTrim(char *cadena) +{ + int i,lon; + + lon=strlen(cadena); + for (i=lon-1;i>=0;i--){ + if(cadena[i]<32) + cadena[i]='\0'; + else + return(cadena); + } + return(cadena); +} +//______________________________________________________________________________________________________ +// Función: reservaMemoria +// +// Descripción: +// Reserva memoria para una variable +// Parámetros: +// - lon: Longitud en bytes de la reserva +// Devuelve: +// Un puntero a la zona de memoria reservada que ha sido previamente rellena con zeros o nulos +//______________________________________________________________________________________________________ +char* reservaMemoria(int lon) +{ + char *mem; + + mem=(char*)malloc(lon); + if(mem!=NULL) + memset(mem,0,lon); + return(mem); +} +//______________________________________________________________________________________________________ +// Función: ampliaMemoria +// +// Descripción: +// Amplia memoria para una variable +// Parámetros: +// - ptr: Puntero al buffer de memoria que se quiere ampliar +// - lon: Longitud en bytes de la amplicación +// Devuelve: +// Un puntero a la zona de memoria reservada que ha sido previamente rellena con zeros o nulos +//______________________________________________________________________________________________________ +char* ampliaMemoria(char* ptr,int lon) +{ + char *mem; + + mem=(char*)realloc(ptr,lon*sizeof(char*)); + if(mem!=NULL) + return(mem); + return(NULL); +} +//______________________________________________________________________________________________________ +// Función: liberaMemoria +// +// Descripción: +// Libera memoria para una variable +// Parámetros: +// - ptr: Puntero al buffer de memoria que se quiere liberar +// Devuelve: +// Nada +//______________________________________________________________________________________________________ +void liberaMemoria(void* ptr) +{ + if(ptr){ + free (ptr); + } +} +// ________________________________________________________________________________________________________ +// Función: sendData +// +// Descripción: +// Envía datos por la red a través de un socket +// Parametros: +// - sock : El socket por donde se envía +// - datos: El contenido a enviar +// - lon: Cantidad de bites a enviar +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algún error +// ________________________________________________________________________________________________________ +BOOLEAN sendData(SOCKET *sock, char* datos,int lon) +{ + int idx,ret; + idx = 0; + while (lon > 0) { + ret = send(*sock,&datos[idx],lon, 0); + if (ret == 0) { // Conexión cerrada por parte del cliente (Graceful close) + break; + } + else{ + if (ret == -1) + return (FALSE); + } + lon -= ret; + idx += ret; + } + return (TRUE); +} +// ________________________________________________________________________________________________________ +// Función: mandaTrama +// +// Descripción: +// Envía una trama por la red +// Parametros: +// - sock : El socket del host al que se dirige la trama +// - trama: El contenido de la trama +// - lon: Longitud de la parte de parametros de la trama que se va a mandar +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algún error +// ________________________________________________________________________________________________________ +BOOLEAN mandaTrama(SOCKET *sock, TRAMA* ptrTrama) +{ + int lonprm; + char *buffer,hlonprm[LONHEXPRM+1]; + BOOLEAN res; + + lonprm=strlen(ptrTrama->parametros); + sprintf(hlonprm,"%05X",LONGITUD_CABECERATRAMA+LONHEXPRM+lonprm); // Convierte en hexadecimal la longitud + + buffer=reservaMemoria(LONGITUD_CABECERATRAMA+LONHEXPRM+lonprm); // Longitud total de la trama + if(buffer==NULL) + return(FALSE); + memcpy(buffer,ptrTrama,LONGITUD_CABECERATRAMA); // Copia cabecera de trama + memcpy(&buffer[LONGITUD_CABECERATRAMA],hlonprm,LONHEXPRM); // Copia longitud de la trama + memcpy(&buffer[LONGITUD_CABECERATRAMA+LONHEXPRM],ptrTrama->parametros,lonprm); + res=sendData(sock,buffer,LONGITUD_CABECERATRAMA+LONHEXPRM+lonprm); + liberaMemoria(buffer); + return (res); +} + +//______________________________________________________________________________________________________ +// Función: initParammetros +// +// Descripción: +// Libera memoria del buffer de los parametros de la trama y vuelve a reservar espacio +// Parámetros: +// - parametros : Puntero a la zona donde están los parametros de una trama +// - lon : Tamaño de la nueva reserva de espacio para los parametros +// Devuelve: +// Un puntero a la nueva zona de memoria o NULL si ha habido algún error +// Especificaciones: +// En caso de que el parámetro lon valga cero el tamaño a reservar será el estandar +//______________________________________________________________________________________________________ +BOOLEAN initParametros(TRAMA* ptrTrama,int lon) +{ + if(lon==0) lon=LONGITUD_PARAMETROS; + ptrTrama->parametros=(char*)ampliaMemoria(ptrTrama->parametros,lon); + if(!ptrTrama->parametros) + return(FALSE); + else + return(TRUE); +} diff --git a/admin/Sources/Services/ogAdmServer/sources/ogAdmLib.h b/admin/Sources/Services/ogAdmServer/sources/ogAdmLib.h new file mode 100644 index 00000000..e5bd09e7 --- /dev/null +++ b/admin/Sources/Services/ogAdmServer/sources/ogAdmLib.h @@ -0,0 +1,117 @@ +// ************************************************************************************************************************************************** +// Libreria: ogAdmLib +// 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: ogAdmLib.h +// Descripción: Este fichero implementa el archivo de cabecera de la libreria ogAdmLib +// ************************************************************************************************************************************************** +// ________________________________________________________________________________________________________ +// Valores definidos +// ________________________________________________________________________________________________________ +#define LONSTD 1024 // Longitud de memoria estandar +#define LONINT 16 // Longitud de memoria estandar para un número entero +#define LONFIL 1024 // Longitud de memoria estandar para nombres de archivo completos (incluido path) +#define LONIP 16 // Longitud de memoria estandar para cadenas que contiene una dirección IP +#define LONMAC 16 // Longitud de memoria estandar para cadenas que contiene una dirección MAC +#define LONSQL 8192 // Longitud de memoria estandar para una sentencia SQL +#define LONPRM 4098 // Longitud estandar de los parámetros del fichero de configuración del servicio +#define LONSCP 4098 // Longitud estandar de los parámetros de las tramas +#define LONFUN 512 // Longitud estandar de los nombres de las funciones que procesan las tramas +#define LONSUC 4098 // Longitud de los mensajes de sucesos +#define LONBLK 8192 // Longitud de los paquetes de tramas leidos cada vez +#define MAXPRM 20 // Máximo número de parámeros del fichero de configuración del servicio +#define MAXPAR 128 // Maximo numero de particiones manejadas por el sistema, ahora con GPT es 128 +#define MAXLONURL 1024 // Longitud máxima de una dirección url con parámetros + +#define LONHEXPRM 5 // Longitud del campo que contiene el tamaño de la cadena de parámetros +#define LONGITUD_CABECERATRAMA 16 // Longitud de la cabecera de las tramas +#define LONGITUD_PARAMETROS 8192 // Longitud estandar de la información de la trama (parámetros) +#define MAXCMD_PARAMETROS 200 // Máximo número de parámetros de una trama + +#define MAXIMOS_CLIENTES 4000 // Máximo número de conexiones con ordenadores clientes +#define MAXIMAS_FUNCIONES LONSTD // Máximo número de funciones que procesan los mensajes entre servicio y clientes + +#define CLIENTE_OCUPADO "BSY" // Cliente ocupado +#define CLIENTE_APAGADO "OFF" // Cliente apagado +#define CLIENTE_INICIANDO "INI" // Cliente iniciando + +#define ACCION_SINRESULTADO 0 // Sin resultado +#define ACCION_EXITOSA 1 // Finalizada con éxito +#define ACCION_FALLIDA 2 // Finalizada con errores + +#define ACCION_INICIADA 1 // Acción activa +#define ACCION_DETENIDA 2 // Acción momentanemente parada +#define ACCION_FINALIZADA 3 // Accion finalizada + +#define EJECUCION_COMANDO 1 +#define EJECUCION_PROCEDIMIENTO 2 +#define EJECUCION_TAREA 3 +#define EJECUCION_RESERVA 4 + +#define AMBITO_CENTROS 0x01 +#define AMBITO_GRUPOSAULAS 0x02 +#define AMBITO_AULAS 0x04 +#define AMBITO_GRUPOSORDENADORES 0x08 +#define AMBITO_ORDENADORES 0x10 + +#define ANNOREF 2009 // Año de referencia base + +#define PUERTO_WAKEUP 9 // Puerto wake up + +#define MAXHARDWARE 128 // Máximos elementos hardware a detectar +#define MAXSOFTWARE 8096 // Máximos elementos software a detectar +// ________________________________________________________________________________________________________ +// Tipos definidos +// ________________________________________________________________________________________________________ +typedef unsigned long DWORD; +typedef unsigned short WORD; +typedef int BOOLEAN; +typedef char BYTE; +typedef int SOCKET; +typedef void* LPVOID; + +#define TRUE 1 +#define FALSE 0 + +// ________________________________________________________________________________________________________ +// Variables globales +// ________________________________________________________________________________________________________ +char szPathFileCfg[LONSTD],szPathFileLog[LONSTD]; +int ndebug; // Nivel de debuger + +typedef struct{ // Estructura de las tramas + char arroba; // Caracter arroba siempre + char identificador[14]; // Identificador de la trama, siempre JMMLCAMDJ_MCDJ + char tipo; // Tipo de mensaje + long lonprm; // Longitud en hexadecimal de los parámetros + char *parametros; // Parámetros de la trama +}TRAMA; +// ________________________________________________________________________________________________________ +// Prototipo de funciones +// ________________________________________________________________________________________________________ +BOOLEAN validacionParametros(int,char**,int); +char* reservaMemoria(int); +char* ampliaMemoria(char*,int); +void liberaMemoria(void*); +BOOLEAN initParametros(TRAMA*,int); +int splitCadena(char **,char *, char); +char* StrToUpper(char *); +void FINCADaINTRO(TRAMA*); +char *tomaParametro(const char*,TRAMA*); +char *copiaParametro(const char*,TRAMA *); +BOOLEAN contieneIP(char *,char *); +char* rTrim(char *); +BOOLEAN enviaMensaje(SOCKET *,TRAMA *,char); +BOOLEAN mandaTrama(SOCKET*,TRAMA*); +BOOLEAN sendData(SOCKET *, char* ,int ); +BOOLEAN enviaTrama(SOCKET *,TRAMA *); +TRAMA* recibeTrama(SOCKET*); +char* escaparCadena(char *cadena); + +#include <stddef.h> /* for offsetof. */ + +#define container_of(ptr, type, member) ({ \ + typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + diff --git a/admin/Sources/Services/ogAdmServer/sources/ogAdmServer.c b/admin/Sources/Services/ogAdmServer/sources/ogAdmServer.c index c465ffec..0e1b7906 100644 --- a/admin/Sources/Services/ogAdmServer/sources/ogAdmServer.c +++ b/admin/Sources/Services/ogAdmServer/sources/ogAdmServer.c @@ -7,8 +7,10 @@ // Descripción :Este fichero implementa el servicio de administración general del sistema // ******************************************************************************************************* #include "ogAdmServer.h" -#include "ogAdmLib.c" #include "dbi.h" +#include "utils.h" +#include "list.h" +#include "schedule.h" #include <ev.h> #include <syslog.h> #include <sys/ioctl.h> @@ -17,6 +19,7 @@ #include <sys/stat.h> #include <fcntl.h> #include <jansson.h> +#include <time.h> static char usuario[LONPRM]; // Usuario de acceso a la base de datos static char pasguor[LONPRM]; // Password del usuario @@ -72,21 +75,21 @@ static bool tomaConfiguracion(const char *filecfg) key = strtok(line, delim); value = strtok(NULL, delim); - if (!strcmp(StrToUpper(key), "SERVIDORADM")) + if (!strcmp(str_toupper(key), "SERVIDORADM")) snprintf(servidoradm, sizeof(servidoradm), "%s", value); - else if (!strcmp(StrToUpper(key), "PUERTO")) + else if (!strcmp(str_toupper(key), "PUERTO")) snprintf(puerto, sizeof(puerto), "%s", value); - else if (!strcmp(StrToUpper(key), "USUARIO")) + else if (!strcmp(str_toupper(key), "USUARIO")) snprintf(usuario, sizeof(usuario), "%s", value); - else if (!strcmp(StrToUpper(key), "PASSWORD")) + else if (!strcmp(str_toupper(key), "PASSWORD")) snprintf(pasguor, sizeof(pasguor), "%s", value); - else if (!strcmp(StrToUpper(key), "DATASOURCE")) + else if (!strcmp(str_toupper(key), "DATASOURCE")) snprintf(datasource, sizeof(datasource), "%s", value); - else if (!strcmp(StrToUpper(key), "CATALOG")) + else if (!strcmp(str_toupper(key), "CATALOG")) snprintf(catalog, sizeof(catalog), "%s", value); - else if (!strcmp(StrToUpper(key), "INTERFACE")) + else if (!strcmp(str_toupper(key), "INTERFACE")) snprintf(interface, sizeof(interface), "%s", value); - else if (!strcmp(StrToUpper(key), "APITOKEN")) + else if (!strcmp(str_toupper(key), "APITOKEN")) snprintf(auth_token, sizeof(auth_token), "%s", value); line = fgets(buf, sizeof(buf), fcfg); @@ -130,12 +133,43 @@ enum og_client_state { OG_CLIENT_PROCESSING_REQUEST, }; -#define OG_MSG_REQUEST_MAXLEN 16384 +#define OG_MSG_REQUEST_MAXLEN 65536 +#define OG_CMD_MAXLEN 64 /* Shut down connection if there is no complete message after 10 seconds. */ #define OG_CLIENT_TIMEOUT 10 +/* Agent client operation might take longer, shut down after 30 seconds. */ +#define OG_AGENT_CLIENT_TIMEOUT 30 + +enum og_cmd_type { + OG_CMD_UNSPEC, + OG_CMD_WOL, + OG_CMD_PROBE, + OG_CMD_SHELL_RUN, + OG_CMD_SESSION, + OG_CMD_POWEROFF, + OG_CMD_REFRESH, + OG_CMD_REBOOT, + OG_CMD_STOP, + OG_CMD_HARDWARE, + OG_CMD_SOFTWARE, + OG_CMD_IMAGE_CREATE, + OG_CMD_IMAGE_RESTORE, + OG_CMD_SETUP, + OG_CMD_RUN_SCHEDULE, + OG_CMD_MAX +}; + +static LIST_HEAD(client_list); + +enum og_client_status { + OG_CLIENT_STATUS_OGLIVE, + OG_CLIENT_STATUS_BUSY, +}; + struct og_client { + struct list_head list; struct ev_io io; struct ev_timer timer; struct sockaddr_in addr; @@ -145,8 +179,13 @@ struct og_client { unsigned int msg_len; int keepalive_idx; bool rest; + bool agent; int content_length; char auth_token[64]; + enum og_client_status status; + enum og_cmd_type last_cmd; + unsigned int last_cmd_id; + bool autorun; }; static inline int og_client_socket(const struct og_client *cli) @@ -154,6 +193,21 @@ static inline int og_client_socket(const struct og_client *cli) return cli->io.fd; } +static inline const char *og_client_status(const struct og_client *cli) +{ + if (cli->last_cmd != OG_CMD_UNSPEC) + return "BSY"; + + switch (cli->status) { + case OG_CLIENT_STATUS_BUSY: + return "BSY"; + case OG_CLIENT_STATUS_OGLIVE: + return "OPG"; + default: + return "OFF"; + } +} + // ________________________________________________________________________________________________________ // Función: clienteDisponible // @@ -211,278 +265,6 @@ bool clienteExistente(char *ip, int* idx) return false; } // ________________________________________________________________________________________________________ -// Función: hayHueco -// -// Descripción: -// Esta función 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 -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static bool hayHueco(int *idx) -{ - int i; - - for (i = 0; i < MAXIMOS_CLIENTES; i++) { - if (strncmp(tbsockets[i].ip, "\0", 1) == 0) { // Hay un hueco - *idx = i; - return true; - } - } - return false; -} -// ________________________________________________________________________________________________________ -// Función: InclusionClienteWin -// -// Descripción: -// Esta función incorpora el socket de un nuevo cliente Windows o Linux a la tabla de clientes -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static bool InclusionClienteWinLnx(TRAMA *ptrTrama, struct og_client *cli) -{ - int socket_c = og_client_socket(cli); - int res,idordenador,lon; - char nombreordenador[LONFIL]; - - res = procesoInclusionClienteWinLnx(socket_c, ptrTrama, &idordenador, - nombreordenador); - - // Prepara la trama de respuesta - - initParametros(ptrTrama,0); - ptrTrama->tipo=MSG_RESPUESTA; - lon = sprintf(ptrTrama->parametros, "nfn=RESPUESTA_InclusionClienteWinLnx\r"); - lon += sprintf(ptrTrama->parametros + lon, "ido=%d\r", idordenador); - lon += sprintf(ptrTrama->parametros + lon, "npc=%s\r", nombreordenador); - lon += sprintf(ptrTrama->parametros + lon, "res=%d\r", res); - - if (!mandaTrama(&socket_c, ptrTrama)) { - syslog(LOG_ERR, "failed to send response to %s:%hu reason=%s\n", - inet_ntoa(cli->addr.sin_addr), ntohs(cli->addr.sin_port), - strerror(errno)); - return false; - } - return true; -} -// ________________________________________________________________________________________________________ -// Función: procesoInclusionClienteWinLnx -// -// Descripción: -// Implementa el proceso de inclusión en el sistema del Cliente Windows o Linux -// Parámetros de entrada: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Parámetros de salida: -// - ido: Identificador del ordenador -// - nombreordenador: Nombre del ordenador -// Devuelve: -// Código del error producido en caso de ocurrir algún error, 0 si el proceso es correcto -// ________________________________________________________________________________________________________ -bool procesoInclusionClienteWinLnx(int socket_c, TRAMA *ptrTrama, int *idordenador, char *nombreordenador) - { - struct og_dbi *dbi; - const char *msglog; - dbi_result result; - char *iph; - - // Toma parámetros - iph = copiaParametro("iph",ptrTrama); // Toma ip - - dbi = og_dbi_open(&dbi_config); - if (!dbi) { - syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", - __func__, __LINE__); - goto err_dbi_open; - } - - result = dbi_conn_queryf(dbi->conn, - "SELECT idordenador,nombreordenador FROM ordenadores " - " WHERE ordenadores.ip = '%s'", iph); - if (!result) { - dbi_conn_error(dbi->conn, &msglog); - syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", - __func__, __LINE__, msglog); - goto err_query_fail; - } - - if (!dbi_result_next_row(result)) { - syslog(LOG_ERR, "client does not exist in database (%s:%d)\n", - __func__, __LINE__); - dbi_result_free(result); - goto err_query_fail; - } - - syslog(LOG_DEBUG, "Client %s requesting inclusion\n", iph); - - *idordenador = dbi_result_get_uint(result, "idordenador"); - nombreordenador = (char *)dbi_result_get_string(result, "nombreordenador"); - - dbi_result_free(result); - og_dbi_close(dbi); - - if (!registraCliente(iph)) { // Incluyendo al cliente en la tabla de sokets - liberaMemoria(iph); - syslog(LOG_ERR, "client table is full\n"); - return false; - } - liberaMemoria(iph); - return true; - -err_query_fail: - og_dbi_close(dbi); -err_dbi_open: - liberaMemoria(iph); - return false; -} -// ________________________________________________________________________________________________________ -// Función: InclusionCliente -// -// Descripción: -// Esta función incorpora el socket de un nuevo cliente a la tabla de clientes y le devuelve alguna de sus propiedades: -// nombre, identificador, tamaño de la caché , etc ... -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static bool InclusionCliente(TRAMA *ptrTrama, struct og_client *cli) -{ - int socket_c = og_client_socket(cli); - - if (!procesoInclusionCliente(cli, ptrTrama)) { - initParametros(ptrTrama,0); - strcpy(ptrTrama->parametros, "nfn=RESPUESTA_InclusionCliente\rres=0\r"); - if (!mandaTrama(&socket_c, ptrTrama)) { - syslog(LOG_ERR, "failed to send response to %s:%hu reason=%s\n", - inet_ntoa(cli->addr.sin_addr), ntohs(cli->addr.sin_port), - strerror(errno)); - return false; - } - } - return true; -} -// ________________________________________________________________________________________________________ -// Función: procesoInclusionCliente -// -// Descripción: -// Implementa el proceso de inclusión en el sistema del Cliente -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -bool procesoInclusionCliente(struct og_client *cli, TRAMA *ptrTrama) -{ - int socket_c = og_client_socket(cli); - const char *msglog, *str; - struct og_dbi *dbi; - dbi_result result; - - char *iph, *cfg; - char nombreordenador[LONFIL]; - int lon, resul, idordenador, cache, idproautoexec, idaula, idcentro; - - // Toma parámetros - iph = copiaParametro("iph",ptrTrama); // Toma ip - cfg = copiaParametro("cfg",ptrTrama); // Toma configuracion - - dbi = og_dbi_open(&dbi_config); - if (!dbi) { - syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", - __func__, __LINE__); - goto err_dbi_open; - } - - // Recupera los datos del cliente - result = dbi_conn_queryf(dbi->conn, - "SELECT ordenadores.*,aulas.idaula,centros.idcentro FROM ordenadores " - " INNER JOIN aulas ON aulas.idaula=ordenadores.idaula" - " INNER JOIN centros ON centros.idcentro=aulas.idcentro" - " WHERE ordenadores.ip = '%s'", iph); - - if (!result) { - dbi_conn_error(dbi->conn, &msglog); - syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", - __func__, __LINE__, msglog); - goto err_query_fail; - } - - if (!dbi_result_next_row(result)) { - syslog(LOG_ERR, "client does not exist in database (%s:%d)\n", - __func__, __LINE__); - dbi_result_free(result); - goto err_query_fail; - } - - syslog(LOG_DEBUG, "Client %s requesting inclusion\n", iph); - - idordenador = dbi_result_get_uint(result, "idordenador"); - str = (char *)dbi_result_get_string(result, "nombreordenador"); - sprintf(nombreordenador, "%s", str); - cache = dbi_result_get_uint(result, "cache"); - idproautoexec = dbi_result_get_uint(result, "idproautoexec"); - idaula = dbi_result_get_uint(result, "idaula"); - idcentro = dbi_result_get_uint(result, "idcentro"); - dbi_result_free(result); - - resul = actualizaConfiguracion(dbi, cfg, idordenador); // Actualiza la configuración del ordenador - liberaMemoria(cfg); - og_dbi_close(dbi); - - if (!resul) { - liberaMemoria(iph); - syslog(LOG_ERR, "Cannot add client to database\n"); - return false; - } - - if (!registraCliente(iph)) { // Incluyendo al cliente en la tabla de sokets - liberaMemoria(iph); - syslog(LOG_ERR, "client table is full\n"); - return false; - } - - /*------------------------------------------------------------------------------------------------------------------------------ - Prepara la trama de respuesta - -------------------------------------------------------------------------------------------------------------------------------*/ - initParametros(ptrTrama,0); - ptrTrama->tipo=MSG_RESPUESTA; - lon = sprintf(ptrTrama->parametros, "nfn=RESPUESTA_InclusionCliente\r"); - lon += sprintf(ptrTrama->parametros + lon, "ido=%d\r", idordenador); - lon += sprintf(ptrTrama->parametros + lon, "npc=%s\r", nombreordenador); - lon += sprintf(ptrTrama->parametros + lon, "che=%d\r", cache); - lon += sprintf(ptrTrama->parametros + lon, "exe=%d\r", idproautoexec); - lon += sprintf(ptrTrama->parametros + lon, "ida=%d\r", idaula); - lon += sprintf(ptrTrama->parametros + lon, "idc=%d\r", idcentro); - lon += sprintf(ptrTrama->parametros + lon, "res=%d\r", 1); // Confirmación proceso correcto - - if (!mandaTrama(&socket_c, ptrTrama)) { - syslog(LOG_ERR, "failed to send response to %s:%hu reason=%s\n", - inet_ntoa(cli->addr.sin_addr), ntohs(cli->addr.sin_port), - strerror(errno)); - return false; - } - liberaMemoria(iph); - return true; - -err_query_fail: - og_dbi_close(dbi); -err_dbi_open: - liberaMemoria(iph); - liberaMemoria(cfg); - return false; -} -// ________________________________________________________________________________________________________ // Función: actualizaConfiguracion // // Descripción: @@ -710,7 +492,8 @@ int checkDato(struct og_dbi *dbi, char *dato, const char *tabla, "INSERT INTO %s (%s) VALUES('%s')", tabla, nomdato, dato); if (!result) { dbi_conn_error(dbi->conn, &msglog); - og_info((char *)msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); return (0); } // Recupera el identificador del software @@ -722,380 +505,21 @@ int checkDato(struct og_dbi *dbi, char *dato, const char *tabla, return (identificador); } -// ________________________________________________________________________________________________________ -// Función: registraCliente -// -// Descripción: -// Incluye al cliente en la tabla de sokets -// Parámetros: -// - iph: Dirección ip del cliente -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -bool registraCliente(char *iph) -{ - int idx; - - if (!clienteExistente(iph, &idx)) { // Si no existe la IP ... - if (!hayHueco(&idx)) { // Busca hueco para el nuevo cliente - return false; // No hay huecos - } - } - strcpy(tbsockets[idx].ip, iph); // Copia IP - strcpy(tbsockets[idx].estado, CLIENTE_INICIANDO); // Actualiza el estado del cliente - return true; -} -// ________________________________________________________________________________________________________ -// Función: AutoexecCliente -// -// Descripción: -// Envía archivo de autoexec al cliente -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static bool AutoexecCliente(TRAMA *ptrTrama, struct og_client *cli) -{ - int socket_c = og_client_socket(cli); - int lon; - char *iph, *exe; - FILE *fileexe; - char fileautoexec[LONPRM]; - char parametros[LONGITUD_PARAMETROS]; - struct og_dbi *dbi; - - iph = copiaParametro("iph",ptrTrama); // Toma dirección IP del cliente - exe = copiaParametro("exe",ptrTrama); // Toma identificador del procedimiento inicial - - sprintf(fileautoexec, "/tmp/Sautoexec-%s", iph); - liberaMemoria(iph); - fileexe = fopen(fileautoexec, "wb"); // Abre fichero de script - if (fileexe == NULL) { - syslog(LOG_ERR, "cannot create temporary file\n"); - return false; - } - - dbi = og_dbi_open(&dbi_config); - if (!dbi) { - syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", - __func__, __LINE__); - return false; - } - initParametros(ptrTrama,0); - if (recorreProcedimientos(dbi, parametros, fileexe, exe)) { - lon = sprintf(ptrTrama->parametros, "nfn=RESPUESTA_AutoexecCliente\r"); - lon += sprintf(ptrTrama->parametros + lon, "nfl=%s\r", fileautoexec); - lon += sprintf(ptrTrama->parametros + lon, "res=1\r"); - } else { - lon = sprintf(ptrTrama->parametros, "nfn=RESPUESTA_AutoexecCliente\r"); - lon += sprintf(ptrTrama->parametros + lon, "res=0\r"); - } - - og_dbi_close(dbi); - fclose(fileexe); - - if (!mandaTrama(&socket_c, ptrTrama)) { - liberaMemoria(exe); - syslog(LOG_ERR, "failed to send response to %s:%hu reason=%s\n", - inet_ntoa(cli->addr.sin_addr), ntohs(cli->addr.sin_port), - strerror(errno)); - return false; - } - liberaMemoria(exe); - return true; -} -// ________________________________________________________________________________________________________ -// Función: recorreProcedimientos -// -// Descripción: -// Crea un archivo con el código de un procedimiento separando cada comando por un salto de linea -// Parámetros: -// Database db,char* parametros,FILE* fileexe,char* idp -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -bool recorreProcedimientos(struct og_dbi *dbi, char *parametros, FILE *fileexe, char *idp) -{ - char idprocedimiento[LONPRM]; - int procedimientoid, lsize; - const char *msglog, *param; - dbi_result result; - result = dbi_conn_queryf(dbi->conn, - "SELECT procedimientoid,parametros FROM procedimientos_acciones" - " WHERE idprocedimiento=%s ORDER BY orden", idp); - if (!result) { - dbi_conn_error(dbi->conn, &msglog); - syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", - __func__, __LINE__, msglog); - return false; - } - while (dbi_result_next_row(result)) { - procedimientoid = dbi_result_get_uint(result, "procedimientoid"); - if (procedimientoid > 0) { // Procedimiento recursivo - sprintf(idprocedimiento, "%d", procedimientoid); - if (!recorreProcedimientos(dbi, parametros, fileexe, idprocedimiento)) { - return false; - } - } else { - param = dbi_result_get_string(result, "parametros"); - sprintf(parametros, "%s@", param); - lsize = strlen(parametros); - fwrite(parametros, 1, lsize, fileexe); // Escribe el código a ejecutar - } - } - dbi_result_free(result); - - return true; -} -// ________________________________________________________________________________________________________ -// Función: ComandosPendientes -// -// Descripción: -// Esta función busca en la base de datos,comandos pendientes de ejecutar por un ordenador concreto -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static bool ComandosPendientes(TRAMA *ptrTrama, struct og_client *cli) -{ - int socket_c = og_client_socket(cli); - char *ido,*iph,pids[LONPRM]; - int ids, idx; - - iph = copiaParametro("iph",ptrTrama); // Toma dirección IP - ido = copiaParametro("ido",ptrTrama); // Toma identificador del ordenador - - if (!clienteExistente(iph, &idx)) { // Busca índice del cliente - liberaMemoria(iph); - liberaMemoria(ido); - syslog(LOG_ERR, "client does not exist\n"); - return false; - } - if (buscaComandos(ido, ptrTrama, &ids)) { // Existen comandos pendientes - ptrTrama->tipo = MSG_COMANDO; - sprintf(pids, "\rids=%d\r", ids); - strcat(ptrTrama->parametros, pids); - strcpy(tbsockets[idx].estado, CLIENTE_OCUPADO); - } else { - initParametros(ptrTrama,0); - strcpy(ptrTrama->parametros, "nfn=NoComandosPtes\r"); - } - if (!mandaTrama(&socket_c, ptrTrama)) { - liberaMemoria(iph); - liberaMemoria(ido); - syslog(LOG_ERR, "failed to send response to %s:%hu reason=%s\n", - inet_ntoa(cli->addr.sin_addr), ntohs(cli->addr.sin_port), - strerror(errno)); - return false; - } - liberaMemoria(iph); - liberaMemoria(ido); - return true; -} -// ________________________________________________________________________________________________________ -// Función: buscaComandos -// -// Descripción: -// Busca en la base de datos,comandos pendientes de ejecutar por el cliente -// Parámetros: -// - ido: Identificador del ordenador -// - cmd: Parámetros del comando (Salida) -// - ids: Identificador de la sesion(Salida) -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -bool buscaComandos(char *ido, TRAMA *ptrTrama, int *ids) -{ - const char *param, *msglog; - struct og_dbi *dbi; - dbi_result result; - unsigned int lonprm; - - dbi = og_dbi_open(&dbi_config); - if (!dbi) { - syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", - __func__, __LINE__); - goto err_dbi_open; - } - result = dbi_conn_queryf(dbi->conn, - "SELECT sesion, parametros"\ - " FROM acciones WHERE idordenador=%s AND estado='%d'"\ - " ORDER BY idaccion", ido, ACCION_INICIADA); - if (!result) { - dbi_conn_error(dbi->conn, &msglog); - syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", - __func__, __LINE__, msglog); - goto err_query_fail; - } - if (!dbi_result_next_row(result)) { - dbi_result_free(result); - og_dbi_close(dbi); - return false; // No hay comandos pendientes - } - - *ids = dbi_result_get_uint(result, "sesion"); - param = dbi_result_get_string(result, "parametros"); - lonprm = strlen(param); - - if(!initParametros(ptrTrama,lonprm + LONGITUD_PARAMETROS)){ - syslog(LOG_ERR, "%s:%d OOM\n", __FILE__, __LINE__); - goto err_init_params; - } - sprintf(ptrTrama->parametros, "%s", param); - - dbi_result_free(result); - og_dbi_close(dbi); - - return true; // Hay comandos pendientes, se toma el primero de la cola - -err_init_params: - dbi_result_free(result); -err_query_fail: - og_dbi_close(dbi); -err_dbi_open: - return false; -} -// ________________________________________________________________________________________________________ -// Función: DisponibilidadComandos -// -// Descripción: -// Esta función habilita a un cliente para recibir comandos desde la consola -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -// -static bool DisponibilidadComandos(TRAMA *ptrTrama, struct og_client *cli) -{ - char *iph, *tpc; - int idx; - - iph = copiaParametro("iph",ptrTrama); // Toma ip - if (!clienteExistente(iph, &idx)) { // Busca índice del cliente - liberaMemoria(iph); - syslog(LOG_ERR, "client does not exist\n"); - return false; - } - tpc = copiaParametro("tpc",ptrTrama); // Tipo de cliente (Plataforma y S.O.) - strcpy(tbsockets[idx].estado, tpc); - cli->keepalive_idx = idx; - liberaMemoria(iph); - liberaMemoria(tpc); - return true; -} -// ________________________________________________________________________________________________________ -// Función: respuestaEstandar -// -// Descripción: -// Esta función actualiza la base de datos con el resultado de la ejecución de un comando con seguimiento -// Parámetros: -// - res: resultado de la ejecución del comando -// - der: Descripción del error si hubiese habido -// - iph: Dirección IP -// - ids: identificador de la sesión -// - ido: Identificador del ordenador que notifica -// - db: Objeto base de datos (operativo) -// - tbl: Objeto tabla -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static bool respuestaEstandar(TRAMA *ptrTrama, char *iph, char *ido, - struct og_dbi *dbi) -{ - char *res, *ids, *der; - char fechafin[LONPRM]; - const char *msglog; - dbi_result result; - struct tm* st; - int idaccion; - - ids = copiaParametro("ids",ptrTrama); - res = copiaParametro("res",ptrTrama); - - if (ids == NULL) { - if (atoi(res) == ACCION_FALLIDA) { - liberaMemoria(res); - return false; - } - liberaMemoria(res); - return true; - } - - if (atoi(ids) == 0) { - liberaMemoria(ids); - if (atoi(res) == ACCION_FALLIDA) { - liberaMemoria(res); - return false; - } - liberaMemoria(res); - return true; - } - - result = dbi_conn_queryf(dbi->conn, - "SELECT * FROM acciones WHERE idordenador=%s" - " AND sesion=%s ORDER BY idaccion", ido,ids); - - liberaMemoria(ids); - - if (!result) { - dbi_conn_error(dbi->conn, &msglog); - syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", - __func__, __LINE__, msglog); - return false; - } - if (!dbi_result_next_row(result)) { - syslog(LOG_ERR, "no actions available\n"); - dbi_result_free(result); - return true; - } - - idaccion = dbi_result_get_uint(result, "idaccion"); - dbi_result_free(result); - - st = tomaHora(); - sprintf(fechafin, "%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); - - der = copiaParametro("der",ptrTrama); // Toma descripción del error (si hubiera habido) - - result = dbi_conn_queryf(dbi->conn, - "UPDATE acciones"\ - " SET resultado='%s',estado='%d',fechahorafin='%s',descrinotificacion='%s'"\ - " WHERE idordenador=%s AND idaccion=%d", - res, ACCION_FINALIZADA, fechafin, der, ido, idaccion); - if (!result) { - dbi_conn_error(dbi->conn, &msglog); - liberaMemoria(res); - liberaMemoria(der); - og_info((char *)msglog); - return false; - } - dbi_result_free(result); - - liberaMemoria(der); - - if (atoi(res) == ACCION_FALLIDA) { - liberaMemoria(res); - return false; - } +struct og_task { + uint32_t task_id; + uint32_t procedure_id; + uint32_t command_id; + uint32_t center_id; + uint32_t schedule_id; + uint32_t type_scope; + uint32_t scope; + const char *filtered_scope; + const char *params; +}; - liberaMemoria(res); - return true; -} +static TRAMA *og_msg_alloc(char *data, unsigned int len); +static void og_msg_free(TRAMA *ptrTrama); static bool og_send_cmd(char *ips_array[], int ips_array_len, const char *state, TRAMA *ptrTrama) @@ -1117,66 +541,6 @@ static bool og_send_cmd(char *ips_array[], int ips_array_len, } // ________________________________________________________________________________________________________ -// Función: enviaComando -// -// Descripción: -// Envía un comando a los clientes -// Parámetros: -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// - estado: Estado en el se deja al cliente mientras se ejecuta el comando -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -bool enviaComando(TRAMA* ptrTrama, const char *estado) -{ - char *iph, *Ipes, *ptrIpes[MAXIMOS_CLIENTES]; - int lon; - - iph = copiaParametro("iph",ptrTrama); // Toma dirección/es IP - lon = strlen(iph); // Calcula longitud de la cadena de direccion/es IPE/S - Ipes = (char*) reservaMemoria(lon + 1); - if (Ipes == NULL) { - syslog(LOG_ERR, "%s:%d OOM\n", __FILE__, __LINE__); - return false; - } - - strcpy(Ipes, iph); // Copia cadena de IPES - liberaMemoria(iph); - - lon = splitCadena(ptrIpes, Ipes, ';'); - FINCADaINTRO(ptrTrama); - - if (!og_send_cmd(ptrIpes, lon, estado, ptrTrama)) - return false; - - liberaMemoria(Ipes); - return true; -} -//______________________________________________________________________________________________________ -// Función: respuestaConsola -// -// Descripción: -// Envia una respuesta a la consola sobre el resultado de la ejecución de un comando -// Parámetros: -// - socket_c: (Salida) Socket utilizado para el envío -// - res: Resultado del envío del comando -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -bool respuestaConsola(int socket_c, TRAMA *ptrTrama, int res) -{ - initParametros(ptrTrama,0); - sprintf(ptrTrama->parametros, "res=%d\r", res); - if (!mandaTrama(&socket_c, ptrTrama)) { - syslog(LOG_ERR, "%s:%d failed to send response: %s\n", - __func__, __LINE__, strerror(errno)); - return false; - } - return true; -} -// ________________________________________________________________________________________________________ // Función: Levanta // // Descripción: @@ -1355,156 +719,7 @@ bool WakeUp(int s, char* iph, char *mac, char *mar) } return ret; } -// ________________________________________________________________________________________________________ -// Función: RESPUESTA_Arrancar -// -// Descripción: -// Respuesta del cliente al comando Arrancar -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static bool RESPUESTA_Arrancar(TRAMA* ptrTrama, struct og_client *cli) -{ - struct og_dbi *dbi; - char *iph, *ido; - char *tpc; - int i; - - dbi = og_dbi_open(&dbi_config); - if (!dbi) { - syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", - __func__, __LINE__); - return false; - } - - iph = copiaParametro("iph",ptrTrama); // Toma dirección ip - ido = copiaParametro("ido",ptrTrama); // Toma identificador del ordenador - - if (!respuestaEstandar(ptrTrama, iph, ido, dbi)) { - liberaMemoria(iph); - liberaMemoria(ido); - syslog(LOG_ERR, "failed to register notification\n"); - og_dbi_close(dbi); - return false; - } - - tpc = copiaParametro("tpc",ptrTrama); // Tipo de cliente (Plataforma y S.O.) - if (clienteExistente(iph, &i)) // Actualiza estado - strcpy(tbsockets[i].estado, tpc); - - liberaMemoria(iph); - liberaMemoria(ido); - liberaMemoria(tpc); - og_dbi_close(dbi); - - return true; -} -// ________________________________________________________________________________________________________ -// Función: RESPUESTA_Apagar -// -// Descripción: -// Respuesta del cliente al comando Apagar -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static bool RESPUESTA_Apagar(TRAMA* ptrTrama, struct og_client *cli) -{ - struct og_dbi *dbi; - char *iph, *ido; - int i; - - dbi = og_dbi_open(&dbi_config); - if (!dbi) { - syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", - __func__, __LINE__); - return false; - } - - iph = copiaParametro("iph",ptrTrama); // Toma dirección ip - ido = copiaParametro("ido",ptrTrama); // Toma identificador del ordenador - - if (!respuestaEstandar(ptrTrama, iph, ido, dbi)) { - liberaMemoria(iph); - liberaMemoria(ido); - syslog(LOG_ERR, "failed to register notification\n"); - og_dbi_close(dbi); - return false; // Error al registrar notificacion - } - - if (clienteExistente(iph, &i)) // Actualiza estado - strcpy(tbsockets[i].estado, CLIENTE_APAGADO); - - liberaMemoria(iph); - liberaMemoria(ido); - og_dbi_close(dbi); - - return true; -} -// ________________________________________________________________________________________________________ -// Función: RESPUESTA_CrearImagen -// -// Descripción: -// Respuesta del cliente al comando CrearImagen -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static bool RESPUESTA_CrearImagen(TRAMA* ptrTrama, struct og_client *cli) -{ - char *iph, *dsk, *par, *cpt, *ipr, *ido; - struct og_dbi *dbi; - char *idi; - bool res; - - dbi = og_dbi_open(&dbi_config); - if (!dbi) { - syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", - __func__, __LINE__); - return false; - } - iph = copiaParametro("iph",ptrTrama); // Toma dirección ip - ido = copiaParametro("ido",ptrTrama); // Toma identificador del ordenador - - if (!respuestaEstandar(ptrTrama, iph, ido, dbi)) { - liberaMemoria(iph); - liberaMemoria(ido); - syslog(LOG_ERR, "failed to register notification\n"); - og_dbi_close(dbi); - return false; // Error al registrar notificacion - } - - // Acciones posteriores - idi = copiaParametro("idi",ptrTrama); - dsk = copiaParametro("dsk",ptrTrama); - par = copiaParametro("par",ptrTrama); - cpt = copiaParametro("cpt",ptrTrama); - ipr = copiaParametro("ipr",ptrTrama); - - res=actualizaCreacionImagen(dbi, idi, dsk, par, cpt, ipr, ido); - - liberaMemoria(idi); - liberaMemoria(par); - liberaMemoria(cpt); - liberaMemoria(ipr); - og_dbi_close(dbi); - - if (!res) - syslog(LOG_ERR, "Problem processing update\n"); - - return res; -} // ________________________________________________________________________________________________________ // Función: actualizaCreacionImagen // @@ -1608,204 +823,7 @@ bool actualizaCreacionImagen(struct og_dbi *dbi, char *idi, char *dsk, return true; } -// ________________________________________________________________________________________________________ -// Función: RESPUESTA_CrearImagenBasica -// -// Descripción: -// Respuesta del cliente al comando CrearImagenBasica -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static bool RESPUESTA_CrearImagenBasica(TRAMA* ptrTrama, struct og_client *cli) -{ - // La misma respuesta que la creación de imagen monolítica - return RESPUESTA_CrearImagen(ptrTrama, cli); -} -// ________________________________________________________________________________________________________ -// Función: RESPUESTA_CrearSoftIncremental -// -// Descripción: -// Respuesta del cliente al comando crearImagenDiferencial -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static bool RESPUESTA_CrearSoftIncremental(TRAMA* ptrTrama, struct og_client *cli) -{ - char *iph,*par,*ido,*idf; - int ifs; - const char *msglog; - struct og_dbi *dbi; - dbi_result result; - dbi = og_dbi_open(&dbi_config); - if (!dbi) { - syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", - __func__, __LINE__); - return false; - } - - iph = copiaParametro("iph",ptrTrama); // Toma dirección ip - ido = copiaParametro("ido",ptrTrama); // Toma identificador del ordenador - - if (!respuestaEstandar(ptrTrama, iph, ido, dbi)) { - og_dbi_close(dbi); - liberaMemoria(iph); - liberaMemoria(ido); - syslog(LOG_ERR, "failed to register notification\n"); - return false; - } - - par = copiaParametro("par",ptrTrama); - - /* Toma identificador del perfilsoftware creado por el inventario de software */ - result = dbi_conn_queryf(dbi->conn, - "SELECT idperfilsoft FROM ordenadores_particiones WHERE idordenador=%s AND numpar=%s", - ido, par); - liberaMemoria(iph); - liberaMemoria(ido); - liberaMemoria(par); - - if (!result) { - dbi_conn_error(dbi->conn, &msglog); - syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", - __func__, __LINE__, msglog); - og_dbi_close(dbi); - return false; - } - if (!dbi_result_next_row(result)) { - syslog(LOG_ERR, - "software profile does not exist in database (%s:%d)\n", - __func__, __LINE__); - dbi_result_free(result); - og_dbi_close(dbi); - return false; - } - ifs = dbi_result_get_uint(result, "idperfilsoft"); - dbi_result_free(result); - - /* Actualizar los datos de la imagen */ - idf = copiaParametro("idf", ptrTrama); - result = dbi_conn_queryf(dbi->conn, - "UPDATE imagenes SET idperfilsoft=%d WHERE idimagen=%s", - ifs, idf); - liberaMemoria(idf); - - if (!result) { - dbi_conn_error(dbi->conn, &msglog); - syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", - __func__, __LINE__, msglog); - og_dbi_close(dbi); - return false; - } - dbi_result_free(result); - - og_dbi_close(dbi); - - return true; -} -// ________________________________________________________________________________________________________ -// Función: RESPUESTA_RestaurarImagen -// -// Descripción: -// Respuesta del cliente al comando RestaurarImagen -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -// -static bool RESPUESTA_RestaurarImagen(TRAMA* ptrTrama, struct og_client *cli) -{ - bool res; - char *iph, *ido, *idi, *dsk, *par, *ifs, *cfg; - struct og_dbi *dbi; - - dbi = og_dbi_open(&dbi_config); - if (!dbi) { - syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", - __func__, __LINE__); - return false; - } - - iph = copiaParametro("iph",ptrTrama); // Toma dirección ip - ido = copiaParametro("ido",ptrTrama); // Toma identificador del ordenador - - if (!respuestaEstandar(ptrTrama, iph, ido, dbi)) { - og_dbi_close(dbi); - liberaMemoria(iph); - liberaMemoria(ido); - syslog(LOG_ERR, "failed to register notification\n"); - return false; - } - - // Acciones posteriores - idi = copiaParametro("idi",ptrTrama); // Toma identificador de la imagen - dsk = copiaParametro("dsk",ptrTrama); // Número de disco - par = copiaParametro("par",ptrTrama); // Número de partición - ifs = copiaParametro("ifs",ptrTrama); // Identificador del perfil software contenido - cfg = copiaParametro("cfg",ptrTrama); // Configuración de discos - if(cfg){ - actualizaConfiguracion(dbi, cfg, atoi(ido)); // Actualiza la configuración del ordenador - liberaMemoria(cfg); - } - res=actualizaRestauracionImagen(dbi, idi, dsk, par, ido, ifs); - - liberaMemoria(iph); - liberaMemoria(ido); - liberaMemoria(idi); - liberaMemoria(par); - liberaMemoria(ifs); - og_dbi_close(dbi); - - if(!res) - syslog(LOG_ERR, "Problem after restoring image\n"); - - return res; -} -// ________________________________________________________________________________________________________ -// -// Función: RESPUESTA_RestaurarImagenBasica -// -// Descripción: -// Respuesta del cliente al comando RestaurarImagen -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -// -static bool RESPUESTA_RestaurarImagenBasica(TRAMA* ptrTrama, struct og_client *cli) -{ - return RESPUESTA_RestaurarImagen(ptrTrama, cli); -} -// ________________________________________________________________________________________________________ -// Función: RESPUESTA_RestaurarSoftIncremental -// -// Descripción: -// Respuesta del cliente al comando RestaurarSoftIncremental -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static bool RESPUESTA_RestaurarSoftIncremental(TRAMA* ptrTrama, struct og_client *cli) -{ - return RESPUESTA_RestaurarImagen(ptrTrama, cli); -} // ________________________________________________________________________________________________________ // Función: actualizaRestauracionImagen // @@ -1848,116 +866,6 @@ bool actualizaRestauracionImagen(struct og_dbi *dbi, char *idi, return true; } // ________________________________________________________________________________________________________ -// Función: RESPUESTA_EjecutarScript -// -// Descripción: -// Respuesta del cliente al comando EjecutarScript -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static bool RESPUESTA_EjecutarScript(TRAMA* ptrTrama, struct og_client *cli) -{ - char *iph, *ido,*cfg; - struct og_dbi *dbi; - bool res = true; - - dbi = og_dbi_open(&dbi_config); - if (!dbi) { - syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", - __func__, __LINE__); - return false; - } - - iph = copiaParametro("iph",ptrTrama); // Toma dirección ip - ido = copiaParametro("ido",ptrTrama); // Toma identificador del ordenador - - if (!respuestaEstandar(ptrTrama, iph, ido, dbi)) { - og_dbi_close(dbi); - liberaMemoria(iph); - liberaMemoria(ido); - syslog(LOG_ERR, "failed to register notification\n"); - return false; - } - - cfg = copiaParametro("cfg",ptrTrama); // Toma configuración de particiones - if(cfg){ - res = actualizaConfiguracion(dbi, cfg, atoi(ido)); // Actualiza la configuración del ordenador - liberaMemoria(cfg); - } - - liberaMemoria(iph); - liberaMemoria(ido); - og_dbi_close(dbi); - - if (!res) - syslog(LOG_ERR, "Problem updating client configuration\n"); - - return res; -} -// ________________________________________________________________________________________________________ -// Función: RESPUESTA_InventarioHardware -// -// Descripción: -// Respuesta del cliente al comando InventarioHardware -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static bool RESPUESTA_InventarioHardware(TRAMA* ptrTrama, struct og_client *cli) -{ - bool res; - char *iph, *ido, *idc, *npc, *hrd, *buffer; - struct og_dbi *dbi; - - dbi = og_dbi_open(&dbi_config); - if (!dbi) { - syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", - __func__, __LINE__); - return false; - } - - iph = copiaParametro("iph",ptrTrama); // Toma dirección ip del cliente - ido = copiaParametro("ido",ptrTrama); // Toma identificador del cliente - - if (!respuestaEstandar(ptrTrama, iph, ido, dbi)) { - og_dbi_close(dbi); - liberaMemoria(iph); - liberaMemoria(ido); - syslog(LOG_ERR, "failed to register notification\n"); - return false; - } - // Lee archivo de inventario enviado anteriormente - hrd = copiaParametro("hrd",ptrTrama); - buffer = rTrim(leeArchivo(hrd)); - - npc = copiaParametro("npc",ptrTrama); - idc = copiaParametro("idc",ptrTrama); // Toma identificador del Centro - - if (buffer) - res=actualizaHardware(dbi, buffer, ido, npc, idc); - else - res = false; - - liberaMemoria(iph); - liberaMemoria(ido); - liberaMemoria(npc); - liberaMemoria(idc); - liberaMemoria(buffer); - og_dbi_close(dbi); - - if (!res) - syslog(LOG_ERR, "Problem updating client configuration\n"); - - return res; -} -// ________________________________________________________________________________________________________ // Función: actualizaHardware // // Descripción: @@ -2083,7 +991,7 @@ bool actualizaHardware(struct og_dbi *dbi, char *hrd, char *ido, char *npc, /* Crea cadena de identificadores de componentes hardware separados por coma */ sprintf(strInt, "%d", tbidhardware[lon - 1]); // Pasa a cadena el último identificador que es de mayor longitud aux = strlen(strInt); // Calcula longitud de cadena para reservar espacio a todos los perfiles - idhardwares = reservaMemoria(sizeof(aux) * lon + lon); + idhardwares = calloc(1, sizeof(aux) * lon + lon); if (idhardwares == NULL) { syslog(LOG_ERR, "%s:%d OOM\n", __FILE__, __LINE__); return false; @@ -2096,12 +1004,12 @@ bool actualizaHardware(struct og_dbi *dbi, char *hrd, char *ido, char *npc, npc, tbidhardware, lon)) { syslog(LOG_ERR, "Problem updating client hardware\n"); retval=false; - } - else { + } else { retval=true; } - liberaMemoria(whard); - liberaMemoria(idhardwares); + free(whard); + free(idhardwares); + return (retval); } // ________________________________________________________________________________________________________ @@ -2230,66 +1138,6 @@ bool cuestionPerfilHardware(struct og_dbi *dbi, char *idc, char *ido, return true; } // ________________________________________________________________________________________________________ -// Función: RESPUESTA_InventarioSoftware -// -// Descripción: -// Respuesta del cliente al comando InventarioSoftware -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static bool RESPUESTA_InventarioSoftware(TRAMA* ptrTrama, struct og_client *cli) -{ - bool res; - char *iph, *ido, *npc, *idc, *par, *sft, *buffer; - struct og_dbi *dbi; - - dbi = og_dbi_open(&dbi_config); - if (!dbi) { - syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", - __func__, __LINE__); - return false; - } - - iph = copiaParametro("iph",ptrTrama); // Toma dirección ip - ido = copiaParametro("ido",ptrTrama); // Toma identificador del ordenador - - if (!respuestaEstandar(ptrTrama, iph, ido, dbi)) { - og_dbi_close(dbi); - liberaMemoria(iph); - liberaMemoria(ido); - syslog(LOG_ERR, "failed to register notification\n"); - return false; - } - - npc = copiaParametro("npc",ptrTrama); - idc = copiaParametro("idc",ptrTrama); // Toma identificador del Centro - par = copiaParametro("par",ptrTrama); - sft = copiaParametro("sft",ptrTrama); - - buffer = rTrim(leeArchivo(sft)); - if (buffer) - res=actualizaSoftware(dbi, buffer, par, ido, npc, idc); - else - res = false; - - liberaMemoria(iph); - liberaMemoria(ido); - liberaMemoria(npc); - liberaMemoria(idc); - liberaMemoria(par); - liberaMemoria(sft); - og_dbi_close(dbi); - - if (!res) - syslog(LOG_ERR, "cannot update software\n"); - - return res; -} -// ________________________________________________________________________________________________________ // Función: actualizaSoftware // // Descripción: @@ -2403,7 +1251,7 @@ bool actualizaSoftware(struct og_dbi *dbi, char *sft, char *par,char *ido, /* Crea cadena de identificadores de componentes software separados por coma */ sprintf(strInt, "%d", tbidsoftware[lon - 1]); // Pasa a cadena el último identificador que es de mayor longitud aux = strlen(strInt); // Calcula longitud de cadena para reservar espacio a todos los perfiles - idsoftwares = reservaMemoria((sizeof(aux)+1) * lon + lon); + idsoftwares = calloc(1, (sizeof(aux)+1) * lon + lon); if (idsoftwares == NULL) { syslog(LOG_ERR, "%s:%d OOM\n", __FILE__, __LINE__); return false; @@ -2415,16 +1263,16 @@ bool actualizaSoftware(struct og_dbi *dbi, char *sft, char *par,char *ido, // Comprueba existencia de perfil software y actualización de éste para el ordenador if (!cuestionPerfilSoftware(dbi, idc, ido, idperfilsoft, idnombreso, idsoftwares, npc, par, tbidsoftware, lon)) { - syslog(LOG_ERR, "cannot update software\n"); - og_info((char *)msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); retval=false; - } - else { + } else { retval=true; } - liberaMemoria(wsft); - liberaMemoria(idsoftwares); - return (retval); + free(wsft); + free(idsoftwares); + + return retval; } // ________________________________________________________________________________________________________ // Función: CuestionPerfilSoftware @@ -2478,7 +1326,8 @@ bool cuestionPerfilSoftware(struct og_dbi *dbi, char *idc, char *ido, " VALUES('Perfil Software (%s, Part:%s) ',%s,0,%i)", npc, par, idc,idnombreso); if (!result) { dbi_conn_error(dbi->conn, &msglog); - og_info((char *)msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); return false; } @@ -2493,7 +1342,8 @@ bool cuestionPerfilSoftware(struct og_dbi *dbi, char *idc, char *ido, " VALUES(%d,%d)", nwidperfilsoft, tbidsoftware[i]); if (!result) { dbi_conn_error(dbi->conn, &msglog); - og_info((char *)msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); return false; } dbi_result_free(result); @@ -2510,7 +1360,8 @@ bool cuestionPerfilSoftware(struct og_dbi *dbi, char *idc, char *ido, " WHERE idordenador=%s AND numpar=%s", nwidperfilsoft, ido, par); if (!result) { // Error al insertar dbi_conn_error(dbi->conn, &msglog); - og_info((char *)msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); return false; } dbi_result_free(result); @@ -2526,7 +1377,8 @@ bool cuestionPerfilSoftware(struct og_dbi *dbi, char *idc, char *ido, " (SELECT DISTINCT idperfilsoft from imagenes))"); if (!result) { dbi_conn_error(dbi->conn, &msglog); - og_info((char *)msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); return false; } dbi_result_free(result), @@ -2538,7 +1390,8 @@ bool cuestionPerfilSoftware(struct og_dbi *dbi, char *idc, char *ido, " (SELECT DISTINCT idperfilsoft from imagenes)"); if (!result) { dbi_conn_error(dbi->conn, &msglog); - og_info((char *)msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); return false; } dbi_result_free(result), @@ -2549,236 +1402,13 @@ bool cuestionPerfilSoftware(struct og_dbi *dbi, char *idc, char *ido, " (SELECT idperfilsoft from perfilessoft)"); if (!result) { dbi_conn_error(dbi->conn, &msglog); - og_info((char *)msglog); - return false; - } - dbi_result_free(result); - - return true; -} -// ________________________________________________________________________________________________________ -// Función: enviaArchivo -// -// Descripción: -// Envia un archivo por la red, por bloques -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static bool enviaArchivo(TRAMA *ptrTrama, struct og_client *cli) -{ - int socket_c = og_client_socket(cli); - char *nfl; - - // Toma parámetros - nfl = copiaParametro("nfl",ptrTrama); // Toma nombre completo del archivo - if (!sendArchivo(&socket_c, nfl)) { - liberaMemoria(nfl); - syslog(LOG_ERR, "Problem sending file\n"); - return false; - } - liberaMemoria(nfl); - return true; -} -// ________________________________________________________________________________________________________ -// Función: enviaArchivo -// -// Descripción: -// Envia un archivo por la red, por bloques -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static bool recibeArchivo(TRAMA *ptrTrama, struct og_client *cli) -{ - int socket_c = og_client_socket(cli); - char *nfl; - - // Toma parámetros - nfl = copiaParametro("nfl",ptrTrama); // Toma nombre completo del archivo - ptrTrama->tipo = MSG_NOTIFICACION; - enviaFlag(&socket_c, ptrTrama); - if (!recArchivo(&socket_c, nfl)) { - liberaMemoria(nfl); - syslog(LOG_ERR, "Problem receiving file\n"); - return false; - } - liberaMemoria(nfl); - return true; -} -// ________________________________________________________________________________________________________ -// Función: envioProgramacion -// -// Descripción: -// Envia un comando de actualización a todos los ordenadores que han sido programados con -// alguna acción para que entren en el bucle de comandos pendientes y las ejecuten -// Parámetros: -// - socket_c: Socket del cliente que envió el mensaje -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static bool envioProgramacion(TRAMA *ptrTrama, struct og_client *cli) -{ - char *ptrIP[MAXIMOS_CLIENTES],*ptrMacs[MAXIMOS_CLIENTES]; - char *idp, *iph, *mac; - int idx,idcomando,lon; - const char *msglog; - struct og_dbi *dbi; - dbi_result result; - - dbi = og_dbi_open(&dbi_config); - if (!dbi) { - syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", - __func__, __LINE__); - return false; - } - - idp = copiaParametro("idp",ptrTrama); // Toma identificador de la programación de la tabla acciones - - result = dbi_conn_queryf(dbi->conn, - "SELECT ordenadores.ip,ordenadores.mac,acciones.idcomando FROM acciones "\ - " INNER JOIN ordenadores ON ordenadores.ip=acciones.ip"\ - " WHERE acciones.idprogramacion=%s",idp); - - liberaMemoria(idp); - - if (!result) { - dbi_conn_error(dbi->conn, &msglog); syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", __func__, __LINE__, msglog); - og_dbi_close(dbi); return false; } - - /* Prepara la trama de actualizacion */ - - initParametros(ptrTrama,0); - ptrTrama->tipo=MSG_COMANDO; - sprintf(ptrTrama->parametros, "nfn=Actualizar\r"); - - while (dbi_result_next_row(result)) { - iph = (char *)dbi_result_get_string(result, "ip"); - idcomando = dbi_result_get_uint(result, "idcomando"); - - if (idcomando == 1){ // Arrancar - mac = (char *)dbi_result_get_string(result, "mac"); - lon = splitCadena(ptrIP, iph, ';'); - lon = splitCadena(ptrMacs, mac, ';'); - - // Se manda por broadcast y por unicast - if (!Levanta(ptrIP, ptrMacs, lon, (char*)"1")) { - dbi_result_free(result); - og_dbi_close(dbi); - return false; - } - - if (!Levanta(ptrIP, ptrMacs, lon, (char*)"2")) { - dbi_result_free(result); - og_dbi_close(dbi); - return false; - } - - } - if (clienteDisponible(iph, &idx)) { // Si el cliente puede recibir comandos - int sock = tbsockets[idx].cli ? tbsockets[idx].cli->io.fd : -1; - - strcpy(tbsockets[idx].estado, CLIENTE_OCUPADO); // Actualiza el estado del cliente - if (sock >= 0 && !mandaTrama(&sock, ptrTrama)) { - syslog(LOG_ERR, "failed to send response: %s\n", - strerror(errno)); - } - //close(tbsockets[idx].sock); // Cierra el socket del cliente hasta nueva disponibilidad - } - } dbi_result_free(result); - og_dbi_close(dbi); - - return true; // No existen registros -} - -// This object stores function handler for messages -static struct { - const char *nf; // Nombre de la función - bool (*fcn)(TRAMA *, struct og_client *cli); -} tbfuncionesServer[] = { - { "InclusionCliente", InclusionCliente, }, - { "InclusionClienteWinLnx", InclusionClienteWinLnx, }, - { "AutoexecCliente", AutoexecCliente, }, - { "ComandosPendientes", ComandosPendientes, }, - { "DisponibilidadComandos", DisponibilidadComandos, }, - { "RESPUESTA_Arrancar", RESPUESTA_Arrancar, }, - { "RESPUESTA_Apagar", RESPUESTA_Apagar, }, - { "RESPUESTA_Reiniciar", RESPUESTA_Apagar, }, - { "RESPUESTA_IniciarSesion", RESPUESTA_Apagar, }, - { "RESPUESTA_CrearImagen", RESPUESTA_CrearImagen, }, - { "RESPUESTA_CrearImagenBasica", RESPUESTA_CrearImagenBasica, }, - { "RESPUESTA_CrearSoftIncremental", RESPUESTA_CrearSoftIncremental, }, - { "RESPUESTA_RestaurarImagen", RESPUESTA_RestaurarImagen }, - { "RESPUESTA_RestaurarImagenBasica", RESPUESTA_RestaurarImagenBasica, }, - { "RESPUESTA_RestaurarSoftIncremental", RESPUESTA_RestaurarSoftIncremental, }, - { "RESPUESTA_Configurar", RESPUESTA_EjecutarScript, }, - { "RESPUESTA_EjecutarScript", RESPUESTA_EjecutarScript, }, - { "RESPUESTA_InventarioHardware", RESPUESTA_InventarioHardware, }, - { "RESPUESTA_InventarioSoftware", RESPUESTA_InventarioSoftware, }, - { "enviaArchivo", enviaArchivo, }, - { "recibeArchivo", recibeArchivo, }, - { "envioProgramacion", envioProgramacion, }, - { NULL, NULL, }, -}; -// ________________________________________________________________________________________________________ -// Función: gestionaTrama -// -// Descripción: -// Procesa las tramas recibidas . -// Parametros: -// - s : Socket usado para comunicaciones -// Devuelve: -// true: Si el proceso es correcto -// false: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -static void gestionaTrama(TRAMA *ptrTrama, struct og_client *cli) -{ - int i, res; - char *nfn; - - if (ptrTrama){ - INTROaFINCAD(ptrTrama); - nfn = copiaParametro("nfn",ptrTrama); // Toma nombre de la función - - for (i = 0; tbfuncionesServer[i].fcn; i++) { - if (!strncmp(tbfuncionesServer[i].nf, nfn, - strlen(tbfuncionesServer[i].nf))) { - res = tbfuncionesServer[i].fcn(ptrTrama, cli); - if (!res) { - syslog(LOG_ERR, "Failed handling of %s for client %s:%hu\n", - tbfuncionesServer[i].nf, - inet_ntoa(cli->addr.sin_addr), - ntohs(cli->addr.sin_port)); - } else { - syslog(LOG_DEBUG, "Successful handling of %s for client %s:%hu\n", - tbfuncionesServer[i].nf, - inet_ntoa(cli->addr.sin_addr), - ntohs(cli->addr.sin_port)); - } - break; - } - } - if (!tbfuncionesServer[i].fcn) - syslog(LOG_ERR, "unknown request %s from client %s:%hu\n", - nfn, inet_ntoa(cli->addr.sin_addr), - ntohs(cli->addr.sin_port)); - - liberaMemoria(nfn); - } + return true; } static void og_client_release(struct ev_loop *loop, struct og_client *cli) @@ -2790,6 +1420,7 @@ static void og_client_release(struct ev_loop *loop, struct og_client *cli) tbsockets[cli->keepalive_idx].cli = NULL; } + list_del(&cli->list); ev_io_stop(loop, &cli->io); close(cli->io.fd); free(cli); @@ -2816,42 +1447,11 @@ static void og_client_reset_state(struct og_client *cli) cli->buf_len = 0; } -static int og_client_state_recv_hdr(struct og_client *cli) -{ - char hdrlen[LONHEXPRM]; - - /* Still too short to validate protocol fingerprint and message - * length. - */ - if (cli->buf_len < 15 + LONHEXPRM) - return 0; - - if (strncmp(cli->buf, "@JMMLCAMDJ_MCDJ", 15)) { - syslog(LOG_ERR, "bad fingerprint from client %s:%hu, closing\n", - inet_ntoa(cli->addr.sin_addr), - ntohs(cli->addr.sin_port)); - return -1; - } - - memcpy(hdrlen, &cli->buf[LONGITUD_CABECERATRAMA], LONHEXPRM); - cli->msg_len = strtol(hdrlen, NULL, 16); - - /* Header announces more that we can fit into buffer. */ - if (cli->msg_len >= sizeof(cli->buf)) { - syslog(LOG_ERR, "too large message %u bytes from %s:%hu\n", - cli->msg_len, inet_ntoa(cli->addr.sin_addr), - ntohs(cli->addr.sin_port)); - return -1; - } - - return 1; -} - static TRAMA *og_msg_alloc(char *data, unsigned int len) { TRAMA *ptrTrama; - ptrTrama = (TRAMA *)reservaMemoria(sizeof(TRAMA)); + ptrTrama = calloc(1, sizeof(TRAMA)); if (!ptrTrama) { syslog(LOG_ERR, "OOM\n"); return NULL; @@ -2867,39 +1467,22 @@ static TRAMA *og_msg_alloc(char *data, unsigned int len) static void og_msg_free(TRAMA *ptrTrama) { - liberaMemoria(ptrTrama->parametros); - liberaMemoria(ptrTrama); -} - -static int og_client_state_process_payload(struct og_client *cli) -{ - TRAMA *ptrTrama; - char *data; - int len; - - len = cli->msg_len - (LONGITUD_CABECERATRAMA + LONHEXPRM); - data = &cli->buf[LONGITUD_CABECERATRAMA + LONHEXPRM]; - - ptrTrama = og_msg_alloc(data, len); - if (!ptrTrama) - return -1; - - gestionaTrama(ptrTrama, cli); - - og_msg_free(ptrTrama); - - return 1; + free(ptrTrama->parametros); + free(ptrTrama); } #define OG_CLIENTS_MAX 4096 #define OG_PARTITION_MAX 4 struct og_partition { + const char *disk; const char *number; const char *code; const char *size; const char *filesystem; const char *format; + const char *os; + const char *used_size; }; struct og_sync_params { @@ -2936,9 +1519,21 @@ struct og_msg_params { bool echo; struct og_partition partition_setup[OG_PARTITION_MAX]; struct og_sync_params sync_setup; + struct og_schedule_time time; + const char *task_id; uint64_t flags; }; +#define OG_COMPUTER_NAME_MAXLEN 100 + +struct og_computer { + unsigned int id; + unsigned int center; + unsigned int room; + char name[OG_COMPUTER_NAME_MAXLEN + 1]; + unsigned int procedure_id; +}; + #define OG_REST_PARAM_ADDR (1UL << 0) #define OG_REST_PARAM_MAC (1UL << 1) #define OG_REST_PARAM_WOL_TYPE (1UL << 2) @@ -2970,6 +1565,42 @@ struct og_msg_params { #define OG_REST_PARAM_SYNC_PATH (1UL << 28) #define OG_REST_PARAM_SYNC_METHOD (1UL << 29) #define OG_REST_PARAM_ECHO (1UL << 30) +#define OG_REST_PARAM_TASK (1UL << 31) +#define OG_REST_PARAM_TIME_YEARS (1UL << 32) +#define OG_REST_PARAM_TIME_MONTHS (1UL << 33) +#define OG_REST_PARAM_TIME_WEEKS (1UL << 34) +#define OG_REST_PARAM_TIME_WEEK_DAYS (1UL << 35) +#define OG_REST_PARAM_TIME_DAYS (1UL << 36) +#define OG_REST_PARAM_TIME_HOURS (1UL << 37) +#define OG_REST_PARAM_TIME_AM_PM (1UL << 38) +#define OG_REST_PARAM_TIME_MINUTES (1UL << 39) + +enum og_rest_method { + OG_METHOD_GET = 0, + OG_METHOD_POST, + OG_METHOD_NO_HTTP +}; + +static struct og_client *og_client_find(const char *ip) +{ + struct og_client *client; + struct in_addr addr; + int res; + + res = inet_aton(ip, &addr); + if (!res) { + syslog(LOG_ERR, "Invalid IP string: %s\n", ip); + return NULL; + } + + list_for_each_entry(client, &client_list, list) { + if (client->addr.sin_addr.s_addr == addr.s_addr && client->agent) { + return client; + } + } + + return NULL; +} static bool og_msg_params_validate(const struct og_msg_params *params, const uint64_t flags) @@ -3008,6 +1639,15 @@ static int og_json_parse_string(json_t *element, const char **str) return 0; } +static int og_json_parse_uint(json_t *element, uint32_t *integer) +{ + if (json_typeof(element) != JSON_INTEGER) + return -1; + + *integer = json_integer_value(element); + return 0; +} + static int og_json_parse_bool(json_t *element, bool *value) { if (json_typeof(element) == JSON_TRUE) @@ -3077,12 +1717,14 @@ static int og_json_parse_sync_params(json_t *element, #define OG_PARAM_PART_FILESYSTEM (1UL << 2) #define OG_PARAM_PART_SIZE (1UL << 3) #define OG_PARAM_PART_FORMAT (1UL << 4) +#define OG_PARAM_PART_DISK (1UL << 5) +#define OG_PARAM_PART_OS (1UL << 6) +#define OG_PARAM_PART_USED_SIZE (1UL << 7) static int og_json_parse_partition(json_t *element, - struct og_msg_params *params, - unsigned int i) + struct og_partition *part, + uint64_t required_flags) { - struct og_partition *part = ¶ms->partition_setup[i]; uint64_t flags = 0UL; const char *key; json_t *value; @@ -3104,21 +1746,24 @@ static int og_json_parse_partition(json_t *element, } else if (!strcmp(key, "format")) { err = og_json_parse_string(value, &part->format); flags |= OG_PARAM_PART_FORMAT; + } else if (!strcmp(key, "disk")) { + err = og_json_parse_string(value, &part->disk); + flags |= OG_PARAM_PART_DISK; + } else if (!strcmp(key, "os")) { + err = og_json_parse_string(value, &part->os); + flags |= OG_PARAM_PART_OS; + } else if (!strcmp(key, "used_size")) { + err = og_json_parse_string(value, &part->used_size); + flags |= OG_PARAM_PART_USED_SIZE; } if (err < 0) return err; } - if (flags != (OG_PARAM_PART_NUMBER | - OG_PARAM_PART_CODE | - OG_PARAM_PART_FILESYSTEM | - OG_PARAM_PART_SIZE | - OG_PARAM_PART_FORMAT)) + if (flags != required_flags) return -1; - params->flags |= (OG_REST_PARAM_PART_0 << i); - return err; } @@ -3137,32 +1782,148 @@ static int og_json_parse_partition_setup(json_t *element, if (json_typeof(k) != JSON_OBJECT) return -1; - if (og_json_parse_partition(k, params, i) != 0) + if (og_json_parse_partition(k, ¶ms->partition_setup[i], + OG_PARAM_PART_NUMBER | + OG_PARAM_PART_CODE | + OG_PARAM_PART_FILESYSTEM | + OG_PARAM_PART_SIZE | + OG_PARAM_PART_FORMAT) < 0) return -1; + + params->flags |= (OG_REST_PARAM_PART_0 << i); } return 0; } -static int og_cmd_legacy_send(struct og_msg_params *params, const char *cmd, - const char *state) +static int og_json_parse_time_params(json_t *element, + struct og_msg_params *params) { - char buf[4096] = {}; - int len, err = 0; - TRAMA *msg; + const char *key; + json_t *value; + int err = 0; - len = snprintf(buf, sizeof(buf), "nfn=%s\r", cmd); + json_object_foreach(element, key, value) { + if (!strcmp(key, "years")) { + err = og_json_parse_uint(value, ¶ms->time.years); + params->flags |= OG_REST_PARAM_TIME_YEARS; + } else if (!strcmp(key, "months")) { + err = og_json_parse_uint(value, ¶ms->time.months); + params->flags |= OG_REST_PARAM_TIME_MONTHS; + } else if (!strcmp(key, "weeks")) { + err = og_json_parse_uint(value, ¶ms->time.weeks); + params->flags |= OG_REST_PARAM_TIME_WEEKS; + } else if (!strcmp(key, "week_days")) { + err = og_json_parse_uint(value, ¶ms->time.week_days); + params->flags |= OG_REST_PARAM_TIME_WEEK_DAYS; + } else if (!strcmp(key, "days")) { + err = og_json_parse_uint(value, ¶ms->time.days); + params->flags |= OG_REST_PARAM_TIME_DAYS; + } else if (!strcmp(key, "hours")) { + err = og_json_parse_uint(value, ¶ms->time.hours); + params->flags |= OG_REST_PARAM_TIME_HOURS; + } else if (!strcmp(key, "am_pm")) { + err = og_json_parse_uint(value, ¶ms->time.am_pm); + params->flags |= OG_REST_PARAM_TIME_AM_PM; + } else if (!strcmp(key, "minutes")) { + err = og_json_parse_uint(value, ¶ms->time.minutes); + params->flags |= OG_REST_PARAM_TIME_MINUTES; + } + if (err != 0) + return err; + } - msg = og_msg_alloc(buf, len); - if (!msg) + return err; +} + +static const char *og_cmd_to_uri[OG_CMD_MAX] = { + [OG_CMD_WOL] = "wol", + [OG_CMD_PROBE] = "probe", + [OG_CMD_SHELL_RUN] = "shell/run", + [OG_CMD_SESSION] = "session", + [OG_CMD_POWEROFF] = "poweroff", + [OG_CMD_REFRESH] = "refresh", + [OG_CMD_REBOOT] = "reboot", + [OG_CMD_STOP] = "stop", + [OG_CMD_HARDWARE] = "hardware", + [OG_CMD_SOFTWARE] = "software", + [OG_CMD_IMAGE_CREATE] = "image/create", + [OG_CMD_IMAGE_RESTORE] = "image/restore", + [OG_CMD_SETUP] = "setup", + [OG_CMD_RUN_SCHEDULE] = "run/schedule", +}; + +static bool og_client_is_busy(const struct og_client *cli, + enum og_cmd_type type) +{ + switch (type) { + case OG_CMD_REBOOT: + case OG_CMD_POWEROFF: + case OG_CMD_STOP: + break; + default: + if (cli->last_cmd != OG_CMD_UNSPEC) + return true; + break; + } + + return false; +} + +static int og_send_request(enum og_rest_method method, enum og_cmd_type type, + const struct og_msg_params *params, + const json_t *data) +{ + const char *content_type = "Content-Type: application/json"; + char content [OG_MSG_REQUEST_MAXLEN - 700] = {}; + char buf[OG_MSG_REQUEST_MAXLEN] = {}; + unsigned int content_length; + char method_str[5] = {}; + struct og_client *cli; + const char *uri; + unsigned int i; + int client_sd; + + if (method == OG_METHOD_GET) + snprintf(method_str, 5, "GET"); + else if (method == OG_METHOD_POST) + snprintf(method_str, 5, "POST"); + else return -1; - if (!og_send_cmd((char **)params->ips_array, params->ips_array_len, - state, msg)) - err = -1; + if (!data) + content_length = 0; + else + content_length = json_dumpb(data, content, + OG_MSG_REQUEST_MAXLEN - 700, + JSON_COMPACT); - og_msg_free(msg); + uri = og_cmd_to_uri[type]; + snprintf(buf, OG_MSG_REQUEST_MAXLEN, + "%s /%s HTTP/1.1\r\nContent-Length: %d\r\n%s\r\n\r\n%s", + method_str, uri, content_length, content_type, content); - return err; + for (i = 0; i < params->ips_array_len; i++) { + cli = og_client_find(params->ips_array[i]); + if (!cli) + continue; + + if (og_client_is_busy(cli, type)) + continue; + + client_sd = cli->io.fd; + if (client_sd < 0) { + syslog(LOG_INFO, "Client %s not conected\n", + params->ips_array[i]); + continue; + } + + if (send(client_sd, buf, strlen(buf), 0) < 0) + continue; + + cli->last_cmd = type; + } + + return 0; } static int og_cmd_post_clients(json_t *element, struct og_msg_params *params) @@ -3185,7 +1946,7 @@ static int og_cmd_post_clients(json_t *element, struct og_msg_params *params) if (!og_msg_params_validate(params, OG_REST_PARAM_ADDR)) return -1; - return og_cmd_legacy_send(params, "Sondeo", CLIENTE_APAGADO); + return og_send_request(OG_METHOD_POST, OG_CMD_PROBE, params, NULL); } struct og_buffer { @@ -3207,17 +1968,17 @@ static int og_cmd_get_clients(json_t *element, struct og_msg_params *params, char *buffer_reply) { json_t *root, *array, *addr, *state, *object; + struct og_client *client; struct og_buffer og_buffer = { .data = buffer_reply, }; - int i; array = json_array(); if (!array) return -1; - for (i = 0; i < MAXIMOS_CLIENTES; i++) { - if (tbsockets[i].ip[0] == '\0') + list_for_each_entry(client, &client_list, list) { + if (!client->agent) continue; object = json_object(); @@ -3225,22 +1986,20 @@ static int og_cmd_get_clients(json_t *element, struct og_msg_params *params, json_decref(array); return -1; } - addr = json_string(tbsockets[i].ip); + addr = json_string(inet_ntoa(client->addr.sin_addr)); if (!addr) { json_decref(object); json_decref(array); return -1; } json_object_set_new(object, "addr", addr); - - state = json_string(tbsockets[i].estado); + state = json_string(og_client_status(client)); if (!state) { json_decref(object); json_decref(array); return -1; } json_object_set_new(object, "state", state); - json_array_append_new(array, object); } root = json_pack("{s:o}", "clients", array); @@ -3378,12 +2137,10 @@ static int og_json_parse_run(json_t *element, struct og_msg_params *params) static int og_cmd_run_post(json_t *element, struct og_msg_params *params) { - char buf[4096] = {}, iph[4096] = {}; - int err = 0, len; + json_t *value, *clients; const char *key; unsigned int i; - json_t *value; - TRAMA *msg; + int err = 0; if (json_typeof(element) != JSON_OBJECT) return -1; @@ -3407,31 +2164,10 @@ static int og_cmd_run_post(json_t *element, struct og_msg_params *params) OG_REST_PARAM_ECHO)) return -1; - for (i = 0; i < params->ips_array_len; i++) { - len = snprintf(iph + strlen(iph), sizeof(iph), "%s;", - params->ips_array[i]); - } - - if (params->echo) { - len = snprintf(buf, sizeof(buf), - "nfn=ConsolaRemota\riph=%s\rscp=%s\r", - iph, params->run_cmd); - } else { - len = snprintf(buf, sizeof(buf), - "nfn=EjecutarScript\riph=%s\rscp=%s\r", - iph, params->run_cmd); - } - - msg = og_msg_alloc(buf, len); - if (!msg) - return -1; - - if (!og_send_cmd((char **)params->ips_array, params->ips_array_len, - CLIENTE_OCUPADO, msg)) - err = -1; - - og_msg_free(msg); + clients = json_copy(element); + json_object_del(clients, "clients"); + err = og_send_request(OG_METHOD_POST, OG_CMD_SHELL_RUN, params, clients); if (err < 0) return err; @@ -3532,12 +2268,9 @@ static int og_cmd_run_get(json_t *element, struct og_msg_params *params, static int og_cmd_session(json_t *element, struct og_msg_params *params) { - char buf[4096], iph[4096]; - int err = 0, len; + json_t *clients, *value; const char *key; - unsigned int i; - json_t *value; - TRAMA *msg; + int err = 0; if (json_typeof(element) != JSON_OBJECT) return -1; @@ -3562,25 +2295,10 @@ static int og_cmd_session(json_t *element, struct og_msg_params *params) OG_REST_PARAM_PARTITION)) return -1; - for (i = 0; i < params->ips_array_len; i++) { - snprintf(iph + strlen(iph), sizeof(iph), "%s;", - params->ips_array[i]); - } - len = snprintf(buf, sizeof(buf), - "nfn=IniciarSesion\riph=%s\rdsk=%s\rpar=%s\r", - iph, params->disk, params->partition); - - msg = og_msg_alloc(buf, len); - if (!msg) - return -1; - - if (!og_send_cmd((char **)params->ips_array, params->ips_array_len, - CLIENTE_APAGADO, msg)) - err = -1; - - og_msg_free(msg); + clients = json_copy(element); + json_object_del(clients, "clients"); - return 0; + return og_send_request(OG_METHOD_POST, OG_CMD_SESSION, params, clients); } static int og_cmd_poweroff(json_t *element, struct og_msg_params *params) @@ -3603,7 +2321,7 @@ static int og_cmd_poweroff(json_t *element, struct og_msg_params *params) if (!og_msg_params_validate(params, OG_REST_PARAM_ADDR)) return -1; - return og_cmd_legacy_send(params, "Apagar", CLIENTE_OCUPADO); + return og_send_request(OG_METHOD_POST, OG_CMD_POWEROFF, params, NULL); } static int og_cmd_refresh(json_t *element, struct og_msg_params *params) @@ -3626,7 +2344,7 @@ static int og_cmd_refresh(json_t *element, struct og_msg_params *params) if (!og_msg_params_validate(params, OG_REST_PARAM_ADDR)) return -1; - return og_cmd_legacy_send(params, "Actualizar", CLIENTE_APAGADO); + return og_send_request(OG_METHOD_GET, OG_CMD_REFRESH, params, NULL); } static int og_cmd_reboot(json_t *element, struct og_msg_params *params) @@ -3649,7 +2367,7 @@ static int og_cmd_reboot(json_t *element, struct og_msg_params *params) if (!og_msg_params_validate(params, OG_REST_PARAM_ADDR)) return -1; - return og_cmd_legacy_send(params, "Reiniciar", CLIENTE_OCUPADO); + return og_send_request(OG_METHOD_POST, OG_CMD_REBOOT, params, NULL); } static int og_cmd_stop(json_t *element, struct og_msg_params *params) @@ -3672,7 +2390,7 @@ static int og_cmd_stop(json_t *element, struct og_msg_params *params) if (!og_msg_params_validate(params, OG_REST_PARAM_ADDR)) return -1; - return og_cmd_legacy_send(params, "Purgar", CLIENTE_APAGADO); + return og_send_request(OG_METHOD_POST, OG_CMD_STOP, params, NULL); } static int og_cmd_hardware(json_t *element, struct og_msg_params *params) @@ -3695,17 +2413,14 @@ static int og_cmd_hardware(json_t *element, struct og_msg_params *params) if (!og_msg_params_validate(params, OG_REST_PARAM_ADDR)) return -1; - return og_cmd_legacy_send(params, "InventarioHardware", - CLIENTE_OCUPADO); + return og_send_request(OG_METHOD_GET, OG_CMD_HARDWARE, params, NULL); } static int og_cmd_software(json_t *element, struct og_msg_params *params) { - char buf[4096] = {}; - int err = 0, len; + json_t *clients, *value; const char *key; - json_t *value; - TRAMA *msg; + int err = 0; if (json_typeof(element) != JSON_OBJECT) return -1; @@ -3731,29 +2446,17 @@ static int og_cmd_software(json_t *element, struct og_msg_params *params) OG_REST_PARAM_PARTITION)) return -1; - len = snprintf(buf, sizeof(buf), - "nfn=InventarioSoftware\rdsk=%s\rpar=%s\r", - params->disk, params->partition); + clients = json_copy(element); + json_object_del(clients, "clients"); - msg = og_msg_alloc(buf, len); - if (!msg) - return -1; - - og_send_cmd((char **)params->ips_array, params->ips_array_len, - CLIENTE_OCUPADO, msg); - - og_msg_free(msg); - - return 0; + return og_send_request(OG_METHOD_POST, OG_CMD_SOFTWARE, params, clients); } static int og_cmd_create_image(json_t *element, struct og_msg_params *params) { - char buf[4096] = {}; - int err = 0, len; + json_t *value, *clients; const char *key; - json_t *value; - TRAMA *msg; + int err = 0; if (json_typeof(element) != JSON_OBJECT) return -1; @@ -3794,30 +2497,18 @@ static int og_cmd_create_image(json_t *element, struct og_msg_params *params) OG_REST_PARAM_REPO)) return -1; - len = snprintf(buf, sizeof(buf), - "nfn=CrearImagen\rdsk=%s\rpar=%s\rcpt=%s\ridi=%s\rnci=%s\ripr=%s\r", - params->disk, params->partition, params->code, - params->id, params->name, params->repository); + clients = json_copy(element); + json_object_del(clients, "clients"); - msg = og_msg_alloc(buf, len); - if (!msg) - return -1; - - og_send_cmd((char **)params->ips_array, params->ips_array_len, - CLIENTE_OCUPADO, msg); - - og_msg_free(msg); - - return 0; + return og_send_request(OG_METHOD_POST, OG_CMD_IMAGE_CREATE, params, + clients); } static int og_cmd_restore_image(json_t *element, struct og_msg_params *params) { - char buf[4096] = {}; - int err = 0, len; + json_t *clients, *value; const char *key; - json_t *value; - TRAMA *msg; + int err = 0; if (json_typeof(element) != JSON_OBJECT) return -1; @@ -3862,32 +2553,18 @@ static int og_cmd_restore_image(json_t *element, struct og_msg_params *params) OG_REST_PARAM_ID)) return -1; - len = snprintf(buf, sizeof(buf), - "nfn=RestaurarImagen\ridi=%s\rdsk=%s\rpar=%s\rifs=%s\r" - "nci=%s\ripr=%s\rptc=%s\r", - params->id, params->disk, params->partition, - params->profile, params->name, - params->repository, params->type); - - msg = og_msg_alloc(buf, len); - if (!msg) - return -1; - - og_send_cmd((char **)params->ips_array, params->ips_array_len, - CLIENTE_OCUPADO, msg); - - og_msg_free(msg); + clients = json_copy(element); + json_object_del(clients, "clients"); - return 0; + return og_send_request(OG_METHOD_POST, OG_CMD_IMAGE_RESTORE, params, + clients); } static int og_cmd_setup(json_t *element, struct og_msg_params *params) { - char buf[4096] = {}; - int err = 0, len; + json_t *value, *clients; const char *key; - json_t *value; - TRAMA *msg; + int err = 0; if (json_typeof(element) != JSON_OBJECT) return -1; @@ -3922,28 +2599,10 @@ static int og_cmd_setup(json_t *element, struct og_msg_params *params) OG_REST_PARAM_PART_3)) return -1; - len = snprintf(buf, sizeof(buf), - "nfn=Configurar\rdsk=%s\rcfg=dis=%s*che=%s*tch=%s!", - params->disk, params->disk, params->cache, params->cache_size); - - for (unsigned int i = 0; i < OG_PARTITION_MAX; ++i) { - const struct og_partition *part = ¶ms->partition_setup[i]; - - len += snprintf(buf + strlen(buf), sizeof(buf), - "par=%s*cpt=%s*sfi=%s*tam=%s*ope=%s%%", - part->number, part->code, part->filesystem, part->size, part->format); - } - - msg = og_msg_alloc(buf, len + 1); - if (!msg) - return -1; + clients = json_copy(element); + json_object_del(clients, "clients"); - og_send_cmd((char **)params->ips_array, params->ips_array_len, - CLIENTE_OCUPADO, msg); - - og_msg_free(msg); - - return 0; + return og_send_request(OG_METHOD_POST, OG_CMD_SETUP, params, clients); } static int og_cmd_run_schedule(json_t *element, struct og_msg_params *params) @@ -3963,9 +2622,8 @@ static int og_cmd_run_schedule(json_t *element, struct og_msg_params *params) if (!og_msg_params_validate(params, OG_REST_PARAM_ADDR)) return -1; - og_cmd_legacy_send(params, "EjecutaComandosPendientes", CLIENTE_OCUPADO); - - return 0; + return og_send_request(OG_METHOD_GET, OG_CMD_RUN_SCHEDULE, params, + NULL); } static int og_cmd_create_basic_image(json_t *element, struct og_msg_params *params) @@ -4306,6 +2964,1357 @@ static int og_cmd_restore_incremental_image(json_t *element, struct og_msg_param return 0; } +struct og_cmd { + uint32_t id; + struct list_head list; + uint32_t client_id; + const char *ip; + const char *mac; + enum og_cmd_type type; + enum og_rest_method method; + struct og_msg_params params; + json_t *json; +}; + +static LIST_HEAD(cmd_list); + +static const struct og_cmd *og_cmd_find(const char *client_ip) +{ + struct og_cmd *cmd, *next; + + list_for_each_entry_safe(cmd, next, &cmd_list, list) { + if (strcmp(cmd->ip, client_ip)) + continue; + + list_del(&cmd->list); + return cmd; + } + + return NULL; +} + +static void og_cmd_free(const struct og_cmd *cmd) +{ + struct og_msg_params *params = (struct og_msg_params *)&cmd->params; + int i; + + for (i = 0; i < params->ips_array_len; i++) { + free((void *)params->ips_array[i]); + free((void *)params->mac_array[i]); + } + free((void *)params->wol_type); + + if (cmd->json) + json_decref(cmd->json); + + free((void *)cmd->ip); + free((void *)cmd->mac); + free((void *)cmd); +} + +static void og_cmd_init(struct og_cmd *cmd, enum og_rest_method method, + enum og_cmd_type type, json_t *root) +{ + cmd->type = type; + cmd->method = method; + cmd->params.ips_array[0] = strdup(cmd->ip); + cmd->params.ips_array_len = 1; + cmd->json = root; +} + +static int og_cmd_legacy_wol(const char *input, struct og_cmd *cmd) +{ + char wol_type[2] = {}; + + if (sscanf(input, "mar=%s", wol_type) != 1) { + syslog(LOG_ERR, "malformed database legacy input\n"); + return -1; + } + + og_cmd_init(cmd, OG_METHOD_NO_HTTP, OG_CMD_WOL, NULL); + cmd->params.mac_array[0] = strdup(cmd->mac); + cmd->params.wol_type = strdup(wol_type); + + return 0; +} + +static int og_cmd_legacy_shell_run(const char *input, struct og_cmd *cmd) +{ + json_t *root, *script, *echo; + + script = json_string(input + 4); + echo = json_boolean(false); + + root = json_object(); + if (!root) + return -1; + json_object_set_new(root, "run", script); + json_object_set_new(root, "echo", echo); + + og_cmd_init(cmd, OG_METHOD_POST, OG_CMD_SHELL_RUN, root); + + return 0; +} + +#define OG_DB_SMALLINT_MAXLEN 6 + +static int og_cmd_legacy_session(const char *input, struct og_cmd *cmd) +{ + char part_str[OG_DB_SMALLINT_MAXLEN + 1]; + char disk_str[OG_DB_SMALLINT_MAXLEN + 1]; + json_t *root, *disk, *partition; + + if (sscanf(input, "dsk=%s\rpar=%s\r", disk_str, part_str) != 2) + return -1; + partition = json_string(part_str); + disk = json_string(disk_str); + + root = json_object(); + if (!root) + return -1; + json_object_set_new(root, "partition", partition); + json_object_set_new(root, "disk", disk); + + og_cmd_init(cmd, OG_METHOD_POST, OG_CMD_SESSION, root); + + return 0; +} + +static int og_cmd_legacy_poweroff(const char *input, struct og_cmd *cmd) +{ + og_cmd_init(cmd, OG_METHOD_POST, OG_CMD_POWEROFF, NULL); + + return 0; +} + +static int og_cmd_legacy_refresh(const char *input, struct og_cmd *cmd) +{ + og_cmd_init(cmd, OG_METHOD_GET, OG_CMD_REFRESH, NULL); + + return 0; +} + +static int og_cmd_legacy_reboot(const char *input, struct og_cmd *cmd) +{ + og_cmd_init(cmd, OG_METHOD_POST, OG_CMD_REBOOT, NULL); + + return 0; +} + +static int og_cmd_legacy_stop(const char *input, struct og_cmd *cmd) +{ + og_cmd_init(cmd, OG_METHOD_POST, OG_CMD_STOP, NULL); + + return 0; +} + +static int og_cmd_legacy_hardware(const char *input, struct og_cmd *cmd) +{ + og_cmd_init(cmd, OG_METHOD_GET, OG_CMD_HARDWARE, NULL); + + return 0; +} + +static int og_cmd_legacy_software(const char *input, struct og_cmd *cmd) +{ + og_cmd_init(cmd, OG_METHOD_GET, OG_CMD_SOFTWARE, NULL); + + return 0; +} + +#define OG_DB_IMAGE_NAME_MAXLEN 50 +#define OG_DB_FILESYSTEM_MAXLEN 16 +#define OG_DB_INT8_MAXLEN 8 +#define OG_DB_INT_MAXLEN 11 +#define OG_DB_IP_MAXLEN 15 + +struct og_image_legacy { + char software_id[OG_DB_INT_MAXLEN + 1]; + char image_id[OG_DB_INT_MAXLEN + 1]; + char name[OG_DB_IMAGE_NAME_MAXLEN + 1]; + char repo[OG_DB_IP_MAXLEN + 1]; + char part[OG_DB_SMALLINT_MAXLEN + 1]; + char disk[OG_DB_SMALLINT_MAXLEN + 1]; + char code[OG_DB_INT8_MAXLEN + 1]; +}; + +struct og_legacy_partition { + char partition[OG_DB_SMALLINT_MAXLEN + 1]; + char code[OG_DB_INT8_MAXLEN + 1]; + char size[OG_DB_INT_MAXLEN + 1]; + char filesystem[OG_DB_FILESYSTEM_MAXLEN + 1]; + char format[2]; /* Format is a boolean 0 or 1 => length is 2 */ +}; + +static int og_cmd_legacy_image_create(const char *input, struct og_cmd *cmd) +{ + json_t *root, *disk, *partition, *code, *image_id, *name, *repo; + struct og_image_legacy img = {}; + + if (sscanf(input, "dsk=%s\rpar=%s\rcpt=%s\ridi=%s\rnci=%s\ripr=%s\r", + img.disk, img.part, img.code, img.image_id, img.name, + img.repo) != 6) + return -1; + image_id = json_string(img.image_id); + partition = json_string(img.part); + code = json_string(img.code); + name = json_string(img.name); + repo = json_string(img.repo); + disk = json_string(img.disk); + + root = json_object(); + if (!root) + return -1; + json_object_set_new(root, "partition", partition); + json_object_set_new(root, "repository", repo); + json_object_set_new(root, "id", image_id); + json_object_set_new(root, "code", code); + json_object_set_new(root, "name", name); + json_object_set_new(root, "disk", disk); + + og_cmd_init(cmd, OG_METHOD_POST, OG_CMD_IMAGE_CREATE, root); + + return 0; +} + +#define OG_DB_RESTORE_TYPE_MAXLEN 64 + +static int og_cmd_legacy_image_restore(const char *input, struct og_cmd *cmd) +{ + json_t *root, *disk, *partition, *image_id, *name, *repo; + char restore_type_str[OG_DB_RESTORE_TYPE_MAXLEN + 1] = {}; + char software_id_str[OG_DB_INT_MAXLEN + 1] = {}; + json_t *software_id, *restore_type; + struct og_image_legacy img = {}; + + if (sscanf(input, + "dsk=%s\rpar=%s\ridi=%s\rnci=%s\ripr=%s\rifs=%s\rptc=%s\r", + img.disk, img.part, img.image_id, img.name, img.repo, + software_id_str, restore_type_str) != 7) + return -1; + + restore_type = json_string(restore_type_str); + software_id = json_string(software_id_str); + image_id = json_string(img.image_id); + partition = json_string(img.part); + name = json_string(img.name); + repo = json_string(img.repo); + disk = json_string(img.disk); + + root = json_object(); + if (!root) + return -1; + json_object_set_new(root, "profile", software_id); + json_object_set_new(root, "partition", partition); + json_object_set_new(root, "type", restore_type); + json_object_set_new(root, "repository", repo); + json_object_set_new(root, "id", image_id); + json_object_set_new(root, "name", name); + json_object_set_new(root, "disk", disk); + + og_cmd_init(cmd, OG_METHOD_POST, OG_CMD_IMAGE_RESTORE, root); + + return 0; +} + +static int og_cmd_legacy_setup(const char *input, struct og_cmd *cmd) +{ + json_t *root, *disk, *cache, *cache_size, *partition_setup, *object; + struct og_legacy_partition part_cfg[OG_PARTITION_MAX] = {}; + char cache_size_str [OG_DB_INT_MAXLEN + 1]; + char disk_str [OG_DB_SMALLINT_MAXLEN + 1]; + json_t *part, *code, *fs, *size, *format; + unsigned int partition_len = 0; + const char *in_ptr; + char cache_str[2]; + + if (sscanf(input, "dsk=%s\rcfg=dis=%*[^*]*che=%[^*]*tch=%[^!]!", + disk_str, cache_str, cache_size_str) != 3) + return -1; + + in_ptr = strstr(input, "!") + 1; + while (strlen(in_ptr) > 0) { + if(sscanf(in_ptr, + "par=%[^*]*cpt=%[^*]*sfi=%[^*]*tam=%[^*]*ope=%[^%%]%%", + part_cfg[partition_len].partition, + part_cfg[partition_len].code, + part_cfg[partition_len].filesystem, + part_cfg[partition_len].size, + part_cfg[partition_len].format) != 5) + return -1; + in_ptr = strstr(in_ptr, "%") + 1; + partition_len++; + } + + root = json_object(); + if (!root) + return -1; + + cache_size = json_string(cache_size_str); + cache = json_string(cache_str); + partition_setup = json_array(); + disk = json_string(disk_str); + + for (unsigned int i = 0; i < partition_len; ++i) { + object = json_object(); + if (!object) { + json_decref(root); + return -1; + } + + part = json_string(part_cfg[i].partition); + fs = json_string(part_cfg[i].filesystem); + format = json_string(part_cfg[i].format); + code = json_string(part_cfg[i].code); + size = json_string(part_cfg[i].size); + + json_object_set_new(object, "partition", part); + json_object_set_new(object, "filesystem", fs); + json_object_set_new(object, "format", format); + json_object_set_new(object, "code", code); + json_object_set_new(object, "size", size); + + json_array_append_new(partition_setup, object); + } + + json_object_set_new(root, "partition_setup", partition_setup); + json_object_set_new(root, "cache_size", cache_size); + json_object_set_new(root, "cache", cache); + json_object_set_new(root, "disk", disk); + + og_cmd_init(cmd, OG_METHOD_POST, OG_CMD_SETUP, root); + + return 0; +} + +static int og_cmd_legacy_run_schedule(const char *input, struct og_cmd *cmd) +{ + og_cmd_init(cmd, OG_METHOD_GET, OG_CMD_RUN_SCHEDULE, NULL); + + return 0; +} + +static int og_cmd_legacy(const char *input, struct og_cmd *cmd) +{ + char legacy_cmd[32] = {}; + int err = -1; + + if (sscanf(input, "nfn=%31s\r", legacy_cmd) != 1) { + syslog(LOG_ERR, "malformed database legacy input\n"); + return -1; + } + input = strchr(input, '\r') + 1; + + if (!strcmp(legacy_cmd, "Arrancar")) { + err = og_cmd_legacy_wol(input, cmd); + } else if (!strcmp(legacy_cmd, "EjecutarScript")) { + err = og_cmd_legacy_shell_run(input, cmd); + } else if (!strcmp(legacy_cmd, "IniciarSesion")) { + err = og_cmd_legacy_session(input, cmd); + } else if (!strcmp(legacy_cmd, "Apagar")) { + err = og_cmd_legacy_poweroff(input, cmd); + } else if (!strcmp(legacy_cmd, "Actualizar")) { + err = og_cmd_legacy_refresh(input, cmd); + } else if (!strcmp(legacy_cmd, "Reiniciar")) { + err = og_cmd_legacy_reboot(input, cmd); + } else if (!strcmp(legacy_cmd, "Purgar")) { + err = og_cmd_legacy_stop(input, cmd); + } else if (!strcmp(legacy_cmd, "InventarioHardware")) { + err = og_cmd_legacy_hardware(input, cmd); + } else if (!strcmp(legacy_cmd, "InventarioSoftware")) { + err = og_cmd_legacy_software(input, cmd); + } else if (!strcmp(legacy_cmd, "CrearImagen")) { + err = og_cmd_legacy_image_create(input, cmd); + } else if (!strcmp(legacy_cmd, "RestaurarImagen")) { + err = og_cmd_legacy_image_restore(input, cmd); + } else if (!strcmp(legacy_cmd, "Configurar")) { + err = og_cmd_legacy_setup(input, cmd); + } else if (!strcmp(legacy_cmd, "EjecutaComandosPendientes") || + !strcmp(legacy_cmd, "Actualizar")) { + err = og_cmd_legacy_run_schedule(input, cmd); + } + + return err; +} + +static int og_dbi_add_action(const struct og_dbi *dbi, const struct og_task *task, + struct og_cmd *cmd) +{ + char start_date_string[24]; + struct tm *start_date; + const char *msglog; + dbi_result result; + time_t now; + + time(&now); + start_date = localtime(&now); + + sprintf(start_date_string, "%hu/%hhu/%hhu %hhu:%hhu:%hhu", + start_date->tm_year + 1900, start_date->tm_mon + 1, + start_date->tm_mday, start_date->tm_hour, start_date->tm_min, + start_date->tm_sec); + result = dbi_conn_queryf(dbi->conn, + "INSERT INTO acciones (idordenador, " + "tipoaccion, idtipoaccion, descriaccion, ip, " + "sesion, idcomando, parametros, fechahorareg, " + "estado, resultado, ambito, idambito, " + "restrambito, idprocedimiento, idcentro, " + "idprogramacion) " + "VALUES (%d, %d, %d, '%s', '%s', %d, %d, '%s', " + "'%s', %d, %d, %d, %d, '%s', %d, %d, %d)", + cmd->client_id, EJECUCION_TAREA, task->task_id, + "", cmd->ip, 0, task->command_id, + task->params, start_date_string, + ACCION_INICIADA, ACCION_SINRESULTADO, + task->type_scope, task->scope, "", + task->procedure_id, task->center_id, + task->schedule_id); + if (!result) { + dbi_conn_error(dbi->conn, &msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); + return -1; + } + cmd->id = dbi_conn_sequence_last(dbi->conn, NULL); + dbi_result_free(result); + + return 0; +} + +static int og_queue_task_command(struct og_dbi *dbi, const struct og_task *task, + char *query) +{ + struct og_cmd *cmd; + const char *msglog; + dbi_result result; + + result = dbi_conn_queryf(dbi->conn, query); + if (!result) { + dbi_conn_error(dbi->conn, &msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); + return -1; + } + + while (dbi_result_next_row(result)) { + cmd = (struct og_cmd *)calloc(1, sizeof(struct og_cmd)); + if (!cmd) { + dbi_result_free(result); + return -1; + } + + cmd->client_id = dbi_result_get_uint(result, "idordenador"); + cmd->ip = strdup(dbi_result_get_string(result, "ip")); + cmd->mac = strdup(dbi_result_get_string(result, "mac")); + + og_cmd_legacy(task->params, cmd); + + if (task->procedure_id) { + if (og_dbi_add_action(dbi, task, cmd)) { + dbi_result_free(result); + return -1; + } + } else { + cmd->id = task->task_id; + } + + list_add_tail(&cmd->list, &cmd_list); + } + + dbi_result_free(result); + + return 0; +} + +static int og_queue_task_group_clients(struct og_dbi *dbi, struct og_task *task, + char *query) +{ + + const char *msglog; + dbi_result result; + + result = dbi_conn_queryf(dbi->conn, query); + if (!result) { + dbi_conn_error(dbi->conn, &msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); + return -1; + } + + while (dbi_result_next_row(result)) { + uint32_t group_id = dbi_result_get_uint(result, "idgrupo"); + + sprintf(query, "SELECT idgrupo FROM gruposordenadores " + "WHERE grupoid=%d", group_id); + if (og_queue_task_group_clients(dbi, task, query)) { + dbi_result_free(result); + return -1; + } + + sprintf(query,"SELECT ip, mac, idordenador FROM ordenadores " + "WHERE grupoid=%d", group_id); + if (og_queue_task_command(dbi, task, query)) { + dbi_result_free(result); + return -1; + } + + } + + dbi_result_free(result); + + return 0; +} + +static int og_queue_task_group_classrooms(struct og_dbi *dbi, + struct og_task *task, char *query) +{ + + const char *msglog; + dbi_result result; + + result = dbi_conn_queryf(dbi->conn, query); + if (!result) { + dbi_conn_error(dbi->conn, &msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); + return -1; + } + + while (dbi_result_next_row(result)) { + uint32_t group_id = dbi_result_get_uint(result, "idgrupo"); + + sprintf(query, "SELECT idgrupo FROM grupos " + "WHERE grupoid=%d AND tipo=%d", group_id, AMBITO_GRUPOSAULAS); + if (og_queue_task_group_classrooms(dbi, task, query)) { + dbi_result_free(result); + return -1; + } + + sprintf(query, + "SELECT ip,mac,idordenador " + "FROM ordenadores INNER JOIN aulas " + "WHERE ordenadores.idaula=aulas.idaula " + "AND aulas.grupoid=%d", + group_id); + if (og_queue_task_command(dbi, task, query)) { + dbi_result_free(result); + return -1; + } + + } + + dbi_result_free(result); + + return 0; +} + +static int og_queue_task_clients(struct og_dbi *dbi, struct og_task *task) +{ + char query[4096]; + + switch (task->type_scope) { + case AMBITO_CENTROS: + sprintf(query, + "SELECT ip,mac,idordenador " + "FROM ordenadores INNER JOIN aulas " + "WHERE ordenadores.idaula=aulas.idaula " + "AND idcentro=%d", + task->scope); + return og_queue_task_command(dbi, task, query); + case AMBITO_GRUPOSAULAS: + sprintf(query, + "SELECT idgrupo FROM grupos " + "WHERE idgrupo=%i AND tipo=%d", + task->scope, AMBITO_GRUPOSAULAS); + return og_queue_task_group_classrooms(dbi, task, query); + case AMBITO_AULAS: + sprintf(query, + "SELECT ip,mac,idordenador FROM ordenadores " + "WHERE idaula=%d", + task->scope); + return og_queue_task_command(dbi, task, query); + case AMBITO_GRUPOSORDENADORES: + sprintf(query, + "SELECT idgrupo FROM gruposordenadores " + "WHERE idgrupo = %d", + task->scope); + return og_queue_task_group_clients(dbi, task, query); + case AMBITO_ORDENADORES: + sprintf(query, + "SELECT ip, mac, idordenador FROM ordenadores " + "WHERE idordenador = %d", + task->scope); + return og_queue_task_command(dbi, task, query); + } + return 0; +} + +static int og_dbi_queue_procedure(struct og_dbi *dbi, struct og_task *task) +{ + uint32_t procedure_id; + const char *msglog; + dbi_result result; + + result = dbi_conn_queryf(dbi->conn, + "SELECT parametros, procedimientoid, idcomando " + "FROM procedimientos_acciones " + "WHERE idprocedimiento=%d ORDER BY orden", task->procedure_id); + if (!result) { + dbi_conn_error(dbi->conn, &msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); + return -1; + } + + while (dbi_result_next_row(result)) { + procedure_id = dbi_result_get_uint(result, "procedimientoid"); + if (procedure_id > 0) { + task->procedure_id = procedure_id; + if (og_dbi_queue_procedure(dbi, task)) + return -1; + continue; + } + + task->params = strdup(dbi_result_get_string(result, "parametros")); + task->command_id = dbi_result_get_uint(result, "idcomando"); + if (og_queue_task_clients(dbi, task)) + return -1; + } + + dbi_result_free(result); + + return 0; +} + +static int og_dbi_queue_task(struct og_dbi *dbi, uint32_t task_id, + uint32_t schedule_id) +{ + struct og_task task = {}; + uint32_t task_id_next; + const char *msglog; + dbi_result result; + + task.schedule_id = schedule_id; + + result = dbi_conn_queryf(dbi->conn, + "SELECT tareas_acciones.orden, " + "tareas_acciones.idprocedimiento, " + "tareas_acciones.tareaid, " + "tareas.idtarea, " + "tareas.idcentro, " + "tareas.ambito, " + "tareas.idambito, " + "tareas.restrambito " + " FROM tareas" + " INNER JOIN tareas_acciones ON tareas_acciones.idtarea=tareas.idtarea" + " WHERE tareas_acciones.idtarea=%u ORDER BY tareas_acciones.orden ASC", task_id); + if (!result) { + dbi_conn_error(dbi->conn, &msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); + return -1; + } + + while (dbi_result_next_row(result)) { + task_id_next = dbi_result_get_uint(result, "tareaid"); + + if (task_id_next > 0) { + if (og_dbi_queue_task(dbi, task_id_next, schedule_id)) + return -1; + + continue; + } + task.task_id = dbi_result_get_uint(result, "idtarea"); + task.center_id = dbi_result_get_uint(result, "idcentro"); + task.procedure_id = dbi_result_get_uint(result, "idprocedimiento"); + task.type_scope = dbi_result_get_uint(result, "ambito"); + task.scope = dbi_result_get_uint(result, "idambito"); + task.filtered_scope = dbi_result_get_string(result, "restrambito"); + + og_dbi_queue_procedure(dbi, &task); + } + + dbi_result_free(result); + + return 0; +} + +static int og_dbi_queue_command(struct og_dbi *dbi, uint32_t task_id, + uint32_t schedule_id) +{ + struct og_task task = {}; + const char *msglog; + dbi_result result; + char query[4096]; + + result = dbi_conn_queryf(dbi->conn, + "SELECT idaccion, idcentro, idordenador, parametros " + "FROM acciones " + "WHERE sesion = %u", task_id); + if (!result) { + dbi_conn_error(dbi->conn, &msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); + return -1; + } + + while (dbi_result_next_row(result)) { + task.task_id = dbi_result_get_uint(result, "idaccion"); + task.center_id = dbi_result_get_uint(result, "idcentro"); + task.scope = dbi_result_get_uint(result, "idordenador"); + task.params = strdup(dbi_result_get_string(result, "parametros")); + + sprintf(query, + "SELECT ip, mac, idordenador FROM ordenadores " + "WHERE idordenador = %d", + task.scope); + if (og_queue_task_command(dbi, &task, query)) { + dbi_result_free(result); + return -1; + } + } + + dbi_result_free(result); + + return 0; +} + +static int og_dbi_update_action(uint32_t id, bool success) +{ + char end_date_string[24]; + struct tm *end_date; + const char *msglog; + struct og_dbi *dbi; + uint8_t status = 2; + dbi_result result; + time_t now; + + if (!id) + return 0; + + dbi = og_dbi_open(&dbi_config); + if (!dbi) { + syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", + __func__, __LINE__); + return -1; + } + + time(&now); + end_date = localtime(&now); + + sprintf(end_date_string, "%hu/%hhu/%hhu %hhu:%hhu:%hhu", + end_date->tm_year + 1900, end_date->tm_mon + 1, + end_date->tm_mday, end_date->tm_hour, end_date->tm_min, + end_date->tm_sec); + result = dbi_conn_queryf(dbi->conn, + "UPDATE acciones SET fechahorafin='%s', " + "estado=%d, resultado=%d WHERE idaccion=%d", + end_date_string, ACCION_FINALIZADA, + status - success, id); + + if (!result) { + dbi_conn_error(dbi->conn, &msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); + og_dbi_close(dbi); + return -1; + } + dbi_result_free(result); + og_dbi_close(dbi); + + return 0; +} + +void og_schedule_run(unsigned int task_id, unsigned int schedule_id, + enum og_schedule_type type) +{ + struct og_msg_params params = {}; + bool duplicated = false; + struct og_cmd *cmd, *next; + struct og_dbi *dbi; + unsigned int i; + + dbi = og_dbi_open(&dbi_config); + if (!dbi) { + syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", + __func__, __LINE__); + return; + } + + switch (type) { + case OG_SCHEDULE_TASK: + og_dbi_queue_task(dbi, task_id, schedule_id); + break; + case OG_SCHEDULE_PROCEDURE: + case OG_SCHEDULE_COMMAND: + og_dbi_queue_command(dbi, task_id, schedule_id); + break; + } + og_dbi_close(dbi); + + list_for_each_entry(cmd, &cmd_list, list) { + for (i = 0; i < params.ips_array_len; i++) { + if (!strncmp(cmd->ip, params.ips_array[i], + OG_DB_IP_MAXLEN)) { + duplicated = true; + break; + } + } + + if (!duplicated) + params.ips_array[params.ips_array_len++] = cmd->ip; + else + duplicated = false; + } + + list_for_each_entry_safe(cmd, next, &cmd_list, list) { + if (cmd->type != OG_CMD_WOL) + continue; + + if (Levanta((char **)cmd->params.ips_array, + (char **)cmd->params.mac_array, + cmd->params.ips_array_len, + (char *)cmd->params.wol_type)) + og_dbi_update_action(cmd->id, true); + + list_del(&cmd->list); + og_cmd_free(cmd); + } + + og_send_request(OG_METHOD_GET, OG_CMD_RUN_SCHEDULE, ¶ms, NULL); +} + +static int og_cmd_task_post(json_t *element, struct og_msg_params *params) +{ + struct og_cmd *cmd; + struct og_dbi *dbi; + const char *key; + json_t *value; + int err; + + if (json_typeof(element) != JSON_OBJECT) + return -1; + + json_object_foreach(element, key, value) { + if (!strcmp(key, "task")) { + err = og_json_parse_string(value, ¶ms->task_id); + params->flags |= OG_REST_PARAM_TASK; + } + + if (err < 0) + break; + } + + if (!og_msg_params_validate(params, OG_REST_PARAM_TASK)) + return -1; + + dbi = og_dbi_open(&dbi_config); + if (!dbi) { + syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", + __func__, __LINE__); + return -1; + } + + og_schedule_run(atoi(params->task_id), 0, OG_SCHEDULE_TASK); + og_dbi_close(dbi); + + list_for_each_entry(cmd, &cmd_list, list) + params->ips_array[params->ips_array_len++] = cmd->ip; + + return og_send_request(OG_METHOD_GET, OG_CMD_RUN_SCHEDULE, params, + NULL); +} + +static int og_dbi_schedule_get(void) +{ + uint32_t schedule_id, task_id; + struct og_schedule_time time; + struct og_dbi *dbi; + const char *msglog; + dbi_result result; + + dbi = og_dbi_open(&dbi_config); + if (!dbi) { + syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", + __func__, __LINE__); + return -1; + } + + result = dbi_conn_queryf(dbi->conn, + "SELECT idprogramacion, tipoaccion, identificador, " + "sesion, annos, meses, diario, dias, semanas, horas, " + "ampm, minutos FROM programaciones " + "WHERE suspendida = 0"); + if (!result) { + dbi_conn_error(dbi->conn, &msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); + og_dbi_close(dbi); + return -1; + } + + while (dbi_result_next_row(result)) { + memset(&time, 0, sizeof(time)); + schedule_id = dbi_result_get_uint(result, "idprogramacion"); + task_id = dbi_result_get_uint(result, "identificador"); + time.years = dbi_result_get_uint(result, "annos"); + time.months = dbi_result_get_uint(result, "meses"); + time.weeks = dbi_result_get_uint(result, "semanas"); + time.week_days = dbi_result_get_uint(result, "dias"); + time.days = dbi_result_get_uint(result, "diario"); + time.hours = dbi_result_get_uint(result, "horas"); + time.am_pm = dbi_result_get_uint(result, "ampm"); + time.minutes = dbi_result_get_uint(result, "minutos"); + time.on_start = true; + + og_schedule_create(schedule_id, task_id, OG_SCHEDULE_TASK, + &time); + } + + dbi_result_free(result); + og_dbi_close(dbi); + + return 0; +} + +static int og_dbi_schedule_create(struct og_dbi *dbi, + struct og_msg_params *params, + uint32_t *schedule_id, + enum og_schedule_type schedule_type) +{ + uint8_t suspended = 0; + uint32_t session = 0; + const char *msglog; + dbi_result result; + uint8_t type; + + switch (schedule_type) { + case OG_SCHEDULE_TASK: + type = 3; + break; + case OG_SCHEDULE_PROCEDURE: + type = 2; + break; + case OG_SCHEDULE_COMMAND: + session = atoi(params->task_id); + type = 1; + break; + } + + result = dbi_conn_queryf(dbi->conn, + "INSERT INTO programaciones (tipoaccion," + " identificador, nombrebloque, annos, meses," + " semanas, dias, diario, horas, ampm, minutos," + " suspendida, sesion) VALUES (%d, %s, '%s'," + " %d, %d, %d, %d, %d, %d, %d, %d, %d, %d)", + type, params->task_id, params->name, + params->time.years, params->time.months, + params->time.weeks, params->time.week_days, + params->time.days, params->time.hours, + params->time.am_pm, params->time.minutes, + suspended, session); + if (!result) { + dbi_conn_error(dbi->conn, &msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); + return -1; + } + dbi_result_free(result); + + *schedule_id = dbi_conn_sequence_last(dbi->conn, NULL); + + return 0; +} + +static int og_dbi_schedule_update(struct og_dbi *dbi, + struct og_msg_params *params) +{ + const char *msglog; + dbi_result result; + uint8_t type = 3; + + result = dbi_conn_queryf(dbi->conn, + "UPDATE programaciones SET tipoaccion=%d, " + "identificador='%s', nombrebloque='%s', " + "annos=%d, meses=%d, " + "diario=%d, horas=%d, ampm=%d, minutos=%d " + "WHERE idprogramacion='%s'", + type, params->task_id, params->name, + params->time.years, params->time.months, + params->time.days, params->time.hours, + params->time.am_pm, params->time.minutes, + params->id); + + if (!result) { + dbi_conn_error(dbi->conn, &msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); + return -1; + } + dbi_result_free(result); + + return 0; +} + +static int og_dbi_schedule_delete(struct og_dbi *dbi, uint32_t id) +{ + const char *msglog; + dbi_result result; + + result = dbi_conn_queryf(dbi->conn, + "DELETE FROM programaciones WHERE idprogramacion=%d", + id); + if (!result) { + dbi_conn_error(dbi->conn, &msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); + return -1; + } + dbi_result_free(result); + + return 0; +} + +struct og_db_schedule { + uint32_t id; + uint32_t task_id; + const char *name; + struct og_schedule_time time; + uint32_t week_days; + uint32_t weeks; + uint32_t suspended; + uint32_t session; +}; + +static int og_dbi_schedule_get_json(struct og_dbi *dbi, json_t *root, + const char *task_id, const char *schedule_id) +{ + struct og_db_schedule schedule; + json_t *obj, *array; + const char *msglog; + dbi_result result; + int err = 0; + + if (task_id) { + result = dbi_conn_queryf(dbi->conn, + "SELECT idprogramacion," + " identificador, nombrebloque," + " annos, meses, diario, dias," + " semanas, horas, ampm," + " minutos,suspendida, sesion " + "FROM programaciones " + "WHERE identificador=%d", + atoi(task_id)); + } else if (schedule_id) { + result = dbi_conn_queryf(dbi->conn, + "SELECT idprogramacion," + " identificador, nombrebloque," + " annos, meses, diario, dias," + " semanas, horas, ampm," + " minutos,suspendida, sesion " + "FROM programaciones " + "WHERE idprogramacion=%d", + atoi(schedule_id)); + } else { + result = dbi_conn_queryf(dbi->conn, + "SELECT idprogramacion," + " identificador, nombrebloque," + " annos, meses, diario, dias," + " semanas, horas, ampm," + " minutos,suspendida, sesion " + "FROM programaciones"); + } + + if (!result) { + dbi_conn_error(dbi->conn, &msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); + return -1; + } + + array = json_array(); + if (!array) + return -1; + + while (dbi_result_next_row(result)) { + schedule.id = dbi_result_get_uint(result, "idprogramacion"); + schedule.task_id = dbi_result_get_uint(result, "identificador"); + schedule.name = dbi_result_get_string(result, "nombrebloque"); + schedule.time.years = dbi_result_get_uint(result, "annos"); + schedule.time.months = dbi_result_get_uint(result, "meses"); + schedule.time.days = dbi_result_get_uint(result, "diario"); + schedule.time.hours = dbi_result_get_uint(result, "horas"); + schedule.time.am_pm = dbi_result_get_uint(result, "ampm"); + schedule.time.minutes = dbi_result_get_uint(result, "minutos"); + schedule.week_days = dbi_result_get_uint(result, "dias"); + schedule.weeks = dbi_result_get_uint(result, "semanas"); + schedule.suspended = dbi_result_get_uint(result, "suspendida"); + schedule.session = dbi_result_get_uint(result, "sesion"); + + obj = json_object(); + if (!obj) { + err = -1; + break; + } + json_object_set_new(obj, "id", json_integer(schedule.id)); + json_object_set_new(obj, "task", json_integer(schedule.task_id)); + json_object_set_new(obj, "name", json_string(schedule.name)); + json_object_set_new(obj, "years", json_integer(schedule.time.years)); + json_object_set_new(obj, "months", json_integer(schedule.time.months)); + json_object_set_new(obj, "days", json_integer(schedule.time.days)); + json_object_set_new(obj, "hours", json_integer(schedule.time.hours)); + json_object_set_new(obj, "am_pm", json_integer(schedule.time.am_pm)); + json_object_set_new(obj, "minutes", json_integer(schedule.time.minutes)); + json_object_set_new(obj, "week_days", json_integer(schedule.week_days)); + json_object_set_new(obj, "weeks", json_integer(schedule.weeks)); + json_object_set_new(obj, "suspended", json_integer(schedule.suspended)); + json_object_set_new(obj, "session", json_integer(schedule.session)); + + json_array_append_new(array, obj); + } + + json_object_set_new(root, "schedule", array); + + dbi_result_free(result); + + return err; +} + +static struct ev_loop *og_loop; + +static int og_task_schedule_create(struct og_msg_params *params) +{ + enum og_schedule_type type; + uint32_t schedule_id; + struct og_dbi *dbi; + int err; + + if (!strcmp(params->type, "task")) + type = OG_SCHEDULE_TASK; + else if (!strcmp(params->type, "procedure")) + type = OG_SCHEDULE_PROCEDURE; + else if (!strcmp(params->type, "command")) + type = OG_SCHEDULE_COMMAND; + else + return -1; + + dbi = og_dbi_open(&dbi_config); + if (!dbi) { + syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", + __func__, __LINE__); + return -1; + } + + err = og_dbi_schedule_create(dbi, params, &schedule_id, type); + if (err < 0) { + og_dbi_close(dbi); + return -1; + } + og_schedule_create(schedule_id, atoi(params->task_id), type, + ¶ms->time); + og_schedule_refresh(og_loop); + og_dbi_close(dbi); + + return 0; +} + +static int og_cmd_schedule_create(json_t *element, struct og_msg_params *params) +{ + const char *key; + json_t *value; + int err; + + if (json_typeof(element) != JSON_OBJECT) + return -1; + + json_object_foreach(element, key, value) { + if (!strcmp(key, "task")) { + err = og_json_parse_string(value, ¶ms->task_id); + params->flags |= OG_REST_PARAM_TASK; + } else if (!strcmp(key, "name")) { + err = og_json_parse_string(value, ¶ms->name); + params->flags |= OG_REST_PARAM_NAME; + } else if (!strcmp(key, "when")) { + err = og_json_parse_time_params(value, params); + } else if (!strcmp(key, "type")) { + err = og_json_parse_string(value, ¶ms->type); + params->flags |= OG_REST_PARAM_TYPE; + } + + if (err < 0) + break; + } + + if (!og_msg_params_validate(params, OG_REST_PARAM_TASK | + OG_REST_PARAM_NAME | + OG_REST_PARAM_TIME_YEARS | + OG_REST_PARAM_TIME_MONTHS | + OG_REST_PARAM_TIME_WEEKS | + OG_REST_PARAM_TIME_WEEK_DAYS | + OG_REST_PARAM_TIME_DAYS | + OG_REST_PARAM_TIME_HOURS | + OG_REST_PARAM_TIME_MINUTES | + OG_REST_PARAM_TIME_AM_PM | + OG_REST_PARAM_TYPE)) + return -1; + + return og_task_schedule_create(params); +} + +static int og_cmd_schedule_update(json_t *element, struct og_msg_params *params) +{ + struct og_dbi *dbi; + const char *key; + json_t *value; + int err; + + if (json_typeof(element) != JSON_OBJECT) + return -1; + + json_object_foreach(element, key, value) { + if (!strcmp(key, "id")) { + err = og_json_parse_string(value, ¶ms->id); + params->flags |= OG_REST_PARAM_ID; + } else if (!strcmp(key, "task")) { + err = og_json_parse_string(value, ¶ms->task_id); + params->flags |= OG_REST_PARAM_TASK; + } else if (!strcmp(key, "name")) { + err = og_json_parse_string(value, ¶ms->name); + params->flags |= OG_REST_PARAM_NAME; + } else if (!strcmp(key, "when")) + err = og_json_parse_time_params(value, params); + + if (err < 0) + break; + } + + if (!og_msg_params_validate(params, OG_REST_PARAM_ID | + OG_REST_PARAM_TASK | + OG_REST_PARAM_NAME | + OG_REST_PARAM_TIME_YEARS | + OG_REST_PARAM_TIME_MONTHS | + OG_REST_PARAM_TIME_DAYS | + OG_REST_PARAM_TIME_HOURS | + OG_REST_PARAM_TIME_MINUTES | + OG_REST_PARAM_TIME_AM_PM)) + return -1; + + dbi = og_dbi_open(&dbi_config); + if (!dbi) { + syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", + __func__, __LINE__); + return -1; + } + + err = og_dbi_schedule_update(dbi, params); + og_dbi_close(dbi); + + if (err < 0) + return err; + + og_schedule_update(og_loop, atoi(params->id), atoi(params->task_id), + ¶ms->time); + og_schedule_refresh(og_loop); + + return err; +} + +static int og_cmd_schedule_delete(json_t *element, struct og_msg_params *params) +{ + struct og_dbi *dbi; + const char *key; + json_t *value; + int err; + + if (json_typeof(element) != JSON_OBJECT) + return -1; + + json_object_foreach(element, key, value) { + if (!strcmp(key, "id")) { + err = og_json_parse_string(value, ¶ms->id); + params->flags |= OG_REST_PARAM_ID; + } else { + return -1; + } + + if (err < 0) + break; + } + + if (!og_msg_params_validate(params, OG_REST_PARAM_ID)) + return -1; + + dbi = og_dbi_open(&dbi_config); + if (!dbi) { + syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", + __func__, __LINE__); + return -1; + } + + err = og_dbi_schedule_delete(dbi, atoi(params->id)); + og_dbi_close(dbi); + + og_schedule_delete(og_loop, atoi(params->id)); + + return err; +} + +static int og_cmd_schedule_get(json_t *element, struct og_msg_params *params, + char *buffer_reply) +{ + struct og_buffer og_buffer = { + .data = buffer_reply, + }; + json_t *schedule_root; + struct og_dbi *dbi; + const char *key; + json_t *value; + int err; + + if (element) { + if (json_typeof(element) != JSON_OBJECT) + return -1; + + json_object_foreach(element, key, value) { + if (!strcmp(key, "task")) { + err = og_json_parse_string(value, + ¶ms->task_id); + } else if (!strcmp(key, "id")) { + err = og_json_parse_string(value, ¶ms->id); + } else { + return -1; + } + + if (err < 0) + break; + } + } + + dbi = og_dbi_open(&dbi_config); + if (!dbi) { + syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", + __func__, __LINE__); + return -1; + } + + schedule_root = json_object(); + if (!schedule_root) { + og_dbi_close(dbi); + return -1; + } + + err = og_dbi_schedule_get_json(dbi, schedule_root, + params->task_id, params->id); + og_dbi_close(dbi); + + if (err >= 0) + json_dump_callback(schedule_root, og_json_dump_clients, &og_buffer, 0); + + json_decref(schedule_root); + + return err; +} + static int og_client_method_not_found(struct og_client *cli) { /* To meet RFC 7231, this function MUST generate an Allow header field @@ -4386,11 +4395,6 @@ static int og_client_ok(struct og_client *cli, char *buf_reply) return err; } -enum og_rest_method { - OG_METHOD_GET = 0, - OG_METHOD_POST, -}; - static int og_client_state_process_payload_rest(struct og_client *cli) { char buf_reply[OG_MSG_RESPONSE_MAXLEN] = {}; @@ -4446,6 +4450,8 @@ static int og_client_state_process_payload_rest(struct og_client *cli) case OG_METHOD_GET: err = og_cmd_get_clients(root, ¶ms, buf_reply); break; + default: + return og_client_bad_request(cli); } } else if (!strncmp(cmd, "wol", strlen("wol"))) { if (method != OG_METHOD_POST) @@ -4615,6 +4621,51 @@ static int og_client_state_process_payload_rest(struct og_client *cli) } err = og_cmd_run_schedule(root, ¶ms); + } else if (!strncmp(cmd, "task/run", strlen("task/run"))) { + if (method != OG_METHOD_POST) + return og_client_method_not_found(cli); + + if (!root) { + syslog(LOG_ERR, "command task with no payload\n"); + return og_client_bad_request(cli); + } + err = og_cmd_task_post(root, ¶ms); + } else if (!strncmp(cmd, "schedule/create", + strlen("schedule/create"))) { + if (method != OG_METHOD_POST) + return og_client_method_not_found(cli); + + if (!root) { + syslog(LOG_ERR, "command task with no payload\n"); + return og_client_bad_request(cli); + } + err = og_cmd_schedule_create(root, ¶ms); + } else if (!strncmp(cmd, "schedule/delete", + strlen("schedule/delete"))) { + if (method != OG_METHOD_POST) + return og_client_method_not_found(cli); + + if (!root) { + syslog(LOG_ERR, "command task with no payload\n"); + return og_client_bad_request(cli); + } + err = og_cmd_schedule_delete(root, ¶ms); + } else if (!strncmp(cmd, "schedule/update", + strlen("schedule/update"))) { + if (method != OG_METHOD_POST) + return og_client_method_not_found(cli); + + if (!root) { + syslog(LOG_ERR, "command task with no payload\n"); + return og_client_bad_request(cli); + } + err = og_cmd_schedule_update(root, ¶ms); + } else if (!strncmp(cmd, "schedule/get", + strlen("schedule/get"))) { + if (method != OG_METHOD_POST) + return og_client_method_not_found(cli); + + err = og_cmd_schedule_get(root, ¶ms, buf_reply); } else { syslog(LOG_ERR, "unknown command: %.32s ...\n", cmd); err = og_client_not_found(cli); @@ -4661,18 +4712,16 @@ static int og_client_state_recv_hdr_rest(struct og_client *cli) return 1; } -static void og_client_read_cb(struct ev_loop *loop, struct ev_io *io, int events) +static int og_client_recv(struct og_client *cli, int events) { - struct og_client *cli; + struct ev_io *io = &cli->io; int ret; - cli = container_of(io, struct og_client, io); - if (events & EV_ERROR) { syslog(LOG_ERR, "unexpected error event from client %s:%hu\n", inet_ntoa(cli->addr.sin_addr), ntohs(cli->addr.sin_port)); - goto close; + return 0; } ret = recv(io->fd, cli->buf + cli->buf_len, @@ -4686,9 +4735,23 @@ static void og_client_read_cb(struct ev_loop *loop, struct ev_io *io, int events syslog(LOG_DEBUG, "closed connection by %s:%hu\n", inet_ntoa(cli->addr.sin_addr), ntohs(cli->addr.sin_port)); } - goto close; + return ret; } + return ret; +} + +static void og_client_read_cb(struct ev_loop *loop, struct ev_io *io, int events) +{ + struct og_client *cli; + int ret; + + cli = container_of(io, struct og_client, io); + + ret = og_client_recv(cli, events); + if (ret <= 0) + goto close; + if (cli->keepalive_idx >= 0) return; @@ -4704,11 +4767,7 @@ static void og_client_read_cb(struct ev_loop *loop, struct ev_io *io, int events switch (cli->state) { case OG_CLIENT_RECEIVING_HEADER: - if (cli->rest) - ret = og_client_state_recv_hdr_rest(cli); - else - ret = og_client_state_recv_hdr(cli); - + ret = og_client_state_recv_hdr_rest(cli); if (ret < 0) goto close; if (!ret) @@ -4724,15 +4783,11 @@ static void og_client_read_cb(struct ev_loop *loop, struct ev_io *io, int events cli->state = OG_CLIENT_PROCESSING_REQUEST; /* fall through. */ case OG_CLIENT_PROCESSING_REQUEST: - if (cli->rest) { - ret = og_client_state_process_payload_rest(cli); - if (ret < 0) { - syslog(LOG_ERR, "Failed to process HTTP request from %s:%hu\n", - inet_ntoa(cli->addr.sin_addr), - ntohs(cli->addr.sin_port)); - } - } else { - ret = og_client_state_process_payload(cli); + ret = og_client_state_process_payload_rest(cli); + if (ret < 0) { + syslog(LOG_ERR, "Failed to process HTTP request from %s:%hu\n", + inet_ntoa(cli->addr.sin_addr), + ntohs(cli->addr.sin_port)); } if (ret < 0) goto close; @@ -4759,6 +4814,774 @@ close: og_client_release(loop, cli); } +enum og_agent_state { + OG_AGENT_RECEIVING_HEADER = 0, + OG_AGENT_RECEIVING_PAYLOAD, + OG_AGENT_PROCESSING_RESPONSE, +}; + +static int og_agent_state_recv_hdr_rest(struct og_client *cli) +{ + char *ptr; + + ptr = strstr(cli->buf, "\r\n\r\n"); + if (!ptr) + return 0; + + cli->msg_len = ptr - cli->buf + 4; + + ptr = strstr(cli->buf, "Content-Length: "); + if (ptr) { + sscanf(ptr, "Content-Length: %i[^\r\n]", &cli->content_length); + if (cli->content_length < 0) + return -1; + cli->msg_len += cli->content_length; + } + + return 1; +} + +static void og_agent_reset_state(struct og_client *cli) +{ + cli->state = OG_AGENT_RECEIVING_HEADER; + cli->buf_len = 0; + cli->content_length = 0; + memset(cli->buf, 0, sizeof(cli->buf)); +} + +static int og_dbi_get_computer_info(struct og_computer *computer, + struct in_addr addr) +{ + const char *msglog; + struct og_dbi *dbi; + dbi_result result; + + dbi = og_dbi_open(&dbi_config); + if (!dbi) { + syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", + __func__, __LINE__); + return -1; + } + result = dbi_conn_queryf(dbi->conn, + "SELECT ordenadores.idordenador," + " ordenadores.nombreordenador," + " ordenadores.idaula," + " ordenadores.idproautoexec," + " centros.idcentro FROM ordenadores " + "INNER JOIN aulas ON aulas.idaula=ordenadores.idaula " + "INNER JOIN centros ON centros.idcentro=aulas.idcentro " + "WHERE ordenadores.ip='%s'", inet_ntoa(addr)); + if (!result) { + dbi_conn_error(dbi->conn, &msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); + og_dbi_close(dbi); + return -1; + } + if (!dbi_result_next_row(result)) { + syslog(LOG_ERR, "client does not exist in database (%s:%d)\n", + __func__, __LINE__); + dbi_result_free(result); + og_dbi_close(dbi); + return -1; + } + + computer->id = dbi_result_get_uint(result, "idordenador"); + computer->center = dbi_result_get_uint(result, "idcentro"); + computer->room = dbi_result_get_uint(result, "idaula"); + computer->procedure_id = dbi_result_get_uint(result, "idproautoexec"); + strncpy(computer->name, + dbi_result_get_string(result, "nombreordenador"), + OG_COMPUTER_NAME_MAXLEN); + + dbi_result_free(result); + og_dbi_close(dbi); + + return 0; +} + +static int og_resp_probe(struct og_client *cli, json_t *data) +{ + const char *status = NULL; + const char *key; + json_t *value; + int err = 0; + + if (json_typeof(data) != JSON_OBJECT) + return -1; + + json_object_foreach(data, key, value) { + if (!strcmp(key, "status")) { + err = og_json_parse_string(value, &status); + if (err < 0) + return err; + } else { + return -1; + } + } + + if (!strcmp(status, "BSY")) + cli->status = OG_CLIENT_STATUS_BUSY; + else if (!strcmp(status, "OPG")) + cli->status = OG_CLIENT_STATUS_OGLIVE; + + return status ? 0 : -1; +} + +static int og_resp_shell_run(struct og_client *cli, json_t *data) +{ + const char *output = NULL; + char filename[4096]; + const char *key; + json_t *value; + int err = -1; + FILE *file; + + if (json_typeof(data) != JSON_OBJECT) + return -1; + + json_object_foreach(data, key, value) { + if (!strcmp(key, "out")) { + err = og_json_parse_string(value, &output); + if (err < 0) + return err; + } else { + return -1; + } + } + + if (!output) { + syslog(LOG_ERR, "%s:%d: malformed json response\n", + __FILE__, __LINE__); + return -1; + } + + sprintf(filename, "/tmp/_Seconsola_%s", inet_ntoa(cli->addr.sin_addr)); + file = fopen(filename, "wt"); + if (!file) { + syslog(LOG_ERR, "cannot open file %s: %s\n", + filename, strerror(errno)); + return -1; + } + + fprintf(file, "%s", output); + fclose(file); + + return 0; +} + +struct og_computer_legacy { + char center[OG_DB_INT_MAXLEN + 1]; + char id[OG_DB_INT_MAXLEN + 1]; + char hardware[8192]; +}; + +static int og_resp_hardware(json_t *data, struct og_client *cli) +{ + struct og_computer_legacy legacy = {}; + const char *hardware = NULL; + struct og_computer computer; + struct og_dbi *dbi; + const char *key; + json_t *value; + int err = 0; + bool res; + + if (json_typeof(data) != JSON_OBJECT) + return -1; + + json_object_foreach(data, key, value) { + if (!strcmp(key, "hardware")) { + err = og_json_parse_string(value, &hardware); + if (err < 0) + return -1; + } else { + return -1; + } + } + + if (!hardware) { + syslog(LOG_ERR, "malformed response json\n"); + return -1; + } + + err = og_dbi_get_computer_info(&computer, cli->addr.sin_addr); + if (err < 0) + return -1; + + snprintf(legacy.center, sizeof(legacy.center), "%d", computer.center); + snprintf(legacy.id, sizeof(legacy.id), "%d", computer.id); + snprintf(legacy.hardware, sizeof(legacy.hardware), "%s", hardware); + + dbi = og_dbi_open(&dbi_config); + if (!dbi) { + syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", + __func__, __LINE__); + return -1; + } + + res = actualizaHardware(dbi, legacy.hardware, legacy.id, computer.name, + legacy.center); + og_dbi_close(dbi); + + if (!res) { + syslog(LOG_ERR, "Problem updating client configuration\n"); + return -1; + } + + return 0; +} + +struct og_software_legacy { + char software[8192]; + char center[OG_DB_INT_MAXLEN + 1]; + char part[OG_DB_SMALLINT_MAXLEN + 1]; + char id[OG_DB_INT_MAXLEN + 1]; +}; + +static int og_resp_software(json_t *data, struct og_client *cli) +{ + struct og_software_legacy legacy = {}; + const char *partition = NULL; + const char *software = NULL; + struct og_computer computer; + struct og_dbi *dbi; + const char *key; + json_t *value; + int err = 0; + bool res; + + if (json_typeof(data) != JSON_OBJECT) + return -1; + + json_object_foreach(data, key, value) { + if (!strcmp(key, "software")) + err = og_json_parse_string(value, &software); + else if (!strcmp(key, "partition")) + err = og_json_parse_string(value, &partition); + else + return -1; + + if (err < 0) + return -1; + } + + if (!software || !partition) { + syslog(LOG_ERR, "malformed response json\n"); + return -1; + } + + err = og_dbi_get_computer_info(&computer, cli->addr.sin_addr); + if (err < 0) + return -1; + + snprintf(legacy.software, sizeof(legacy.software), "%s", software); + snprintf(legacy.part, sizeof(legacy.part), "%s", partition); + snprintf(legacy.id, sizeof(legacy.id), "%d", computer.id); + snprintf(legacy.center, sizeof(legacy.center), "%d", computer.center); + + dbi = og_dbi_open(&dbi_config); + if (!dbi) { + syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", + __func__, __LINE__); + return -1; + } + + res = actualizaSoftware(dbi, legacy.software, legacy.part, legacy.id, + computer.name, legacy.center); + og_dbi_close(dbi); + + if (!res) { + syslog(LOG_ERR, "Problem updating client configuration\n"); + return -1; + } + + return 0; +} + +#define OG_PARAMS_RESP_REFRESH (OG_PARAM_PART_DISK | \ + OG_PARAM_PART_NUMBER | \ + OG_PARAM_PART_CODE | \ + OG_PARAM_PART_FILESYSTEM | \ + OG_PARAM_PART_OS | \ + OG_PARAM_PART_SIZE | \ + OG_PARAM_PART_USED_SIZE) + +static int og_json_parse_partition_array(json_t *value, + struct og_partition *partitions) +{ + json_t *element; + int i, err; + + if (json_typeof(value) != JSON_ARRAY) + return -1; + + for (i = 0; i < json_array_size(value) && i < OG_PARTITION_MAX; i++) { + element = json_array_get(value, i); + + err = og_json_parse_partition(element, &partitions[i], + OG_PARAMS_RESP_REFRESH); + if (err < 0) + return err; + } + + return 0; +} + +static int og_dbi_queue_autorun(uint32_t computer_id, uint32_t proc_id) +{ + struct og_task dummy_task = { + .scope = computer_id, + .type_scope = AMBITO_ORDENADORES, + .procedure_id = proc_id, + }; + struct og_dbi *dbi; + + dbi = og_dbi_open(&dbi_config); + if (!dbi) { + syslog(LOG_ERR, "cannot open connection database " + "(%s:%d)\n", __func__, __LINE__); + return -1; + } + if (og_dbi_queue_procedure(dbi, &dummy_task)) { + og_dbi_close(dbi); + return -1; + } + og_dbi_close(dbi); + + return 0; +} + +static int og_resp_refresh(json_t *data, struct og_client *cli) +{ + struct og_partition partitions[OG_PARTITION_MAX] = {}; + const char *serial_number = NULL; + struct og_computer computer = {}; + struct og_partition disk_setup; + char cfg[1024] = {}; + struct og_dbi *dbi; + const char *key; + unsigned int i; + json_t *value; + int err = 0; + bool res; + + if (json_typeof(data) != JSON_OBJECT) + return -1; + + json_object_foreach(data, key, value) { + if (!strcmp(key, "disk_setup")) { + err = og_json_parse_partition(value, + &disk_setup, + OG_PARAMS_RESP_REFRESH); + } else if (!strcmp(key, "partition_setup")) { + err = og_json_parse_partition_array(value, partitions); + } else if (!strcmp(key, "serial_number")) { + err = og_json_parse_string(value, &serial_number); + } else { + return -1; + } + + if (err < 0) + return err; + } + + err = og_dbi_get_computer_info(&computer, cli->addr.sin_addr); + if (err < 0) + return -1; + + if (strlen(serial_number) > 0) + snprintf(cfg, sizeof(cfg), "ser=%s\n", serial_number); + + if (!disk_setup.disk || !disk_setup.number || !disk_setup.code || + !disk_setup.filesystem || !disk_setup.os || !disk_setup.size || + !disk_setup.used_size) + return -1; + + snprintf(cfg + strlen(cfg), sizeof(cfg) - strlen(cfg), + "disk=%s\tpar=%s\tcpt=%s\tfsi=%s\tsoi=%s\ttam=%s\tuso=%s\n", + disk_setup.disk, disk_setup.number, disk_setup.code, + disk_setup.filesystem, disk_setup.os, disk_setup.size, + disk_setup.used_size); + + for (i = 0; i < OG_PARTITION_MAX; i++) { + if (!partitions[i].disk || !partitions[i].number || + !partitions[i].code || !partitions[i].filesystem || + !partitions[i].os || !partitions[i].size || + !partitions[i].used_size) + continue; + + snprintf(cfg + strlen(cfg), sizeof(cfg) - strlen(cfg), + "disk=%s\tpar=%s\tcpt=%s\tfsi=%s\tsoi=%s\ttam=%s\tuso=%s\n", + partitions[i].disk, partitions[i].number, + partitions[i].code, partitions[i].filesystem, + partitions[i].os, partitions[i].size, + partitions[i].used_size); + } + + dbi = og_dbi_open(&dbi_config); + if (!dbi) { + syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", + __func__, __LINE__); + return -1; + } + res = actualizaConfiguracion(dbi, cfg, computer.id); + og_dbi_close(dbi); + + if (!res) { + syslog(LOG_ERR, "Problem updating client configuration\n"); + return -1; + } + + if (!cli->autorun && computer.procedure_id) { + cli->autorun = true; + + if (og_dbi_queue_autorun(computer.id, computer.procedure_id)) + return -1; + } + + return 0; +} + +static int og_resp_image_create(json_t *data, struct og_client *cli) +{ + struct og_software_legacy soft_legacy; + struct og_image_legacy img_legacy; + const char *partition = NULL; + const char *software = NULL; + const char *image_id = NULL; + struct og_computer computer; + const char *disk = NULL; + const char *code = NULL; + const char *name = NULL; + const char *repo = NULL; + struct og_dbi *dbi; + const char *key; + json_t *value; + int err = 0; + bool res; + + if (json_typeof(data) != JSON_OBJECT) + return -1; + + json_object_foreach(data, key, value) { + if (!strcmp(key, "software")) + err = og_json_parse_string(value, &software); + else if (!strcmp(key, "partition")) + err = og_json_parse_string(value, &partition); + else if (!strcmp(key, "disk")) + err = og_json_parse_string(value, &disk); + else if (!strcmp(key, "code")) + err = og_json_parse_string(value, &code); + else if (!strcmp(key, "id")) + err = og_json_parse_string(value, &image_id); + else if (!strcmp(key, "name")) + err = og_json_parse_string(value, &name); + else if (!strcmp(key, "repository")) + err = og_json_parse_string(value, &repo); + else + return -1; + + if (err < 0) + return err; + } + + if (!software || !partition || !disk || !code || !image_id || !name || + !repo) { + syslog(LOG_ERR, "malformed response json\n"); + return -1; + } + + err = og_dbi_get_computer_info(&computer, cli->addr.sin_addr); + if (err < 0) + return -1; + + snprintf(soft_legacy.center, sizeof(soft_legacy.center), "%d", + computer.center); + snprintf(soft_legacy.software, sizeof(soft_legacy.software), "%s", + software); + snprintf(img_legacy.image_id, sizeof(img_legacy.image_id), "%s", + image_id); + snprintf(soft_legacy.id, sizeof(soft_legacy.id), "%d", computer.id); + snprintf(img_legacy.part, sizeof(img_legacy.part), "%s", partition); + snprintf(img_legacy.disk, sizeof(img_legacy.disk), "%s", disk); + snprintf(img_legacy.code, sizeof(img_legacy.code), "%s", code); + snprintf(img_legacy.name, sizeof(img_legacy.name), "%s", name); + snprintf(img_legacy.repo, sizeof(img_legacy.repo), "%s", repo); + + dbi = og_dbi_open(&dbi_config); + if (!dbi) { + syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", + __func__, __LINE__); + return -1; + } + + res = actualizaSoftware(dbi, + soft_legacy.software, + img_legacy.part, + soft_legacy.id, + computer.name, + soft_legacy.center); + if (!res) { + og_dbi_close(dbi); + syslog(LOG_ERR, "Problem updating client configuration\n"); + return -1; + } + + res = actualizaCreacionImagen(dbi, + img_legacy.image_id, + img_legacy.disk, + img_legacy.part, + img_legacy.code, + img_legacy.repo, + soft_legacy.id); + og_dbi_close(dbi); + + if (!res) { + syslog(LOG_ERR, "Problem updating client configuration\n"); + return -1; + } + + return 0; +} + +static int og_resp_image_restore(json_t *data, struct og_client *cli) +{ + struct og_software_legacy soft_legacy; + struct og_image_legacy img_legacy; + const char *partition = NULL; + const char *image_id = NULL; + struct og_computer computer; + const char *disk = NULL; + dbi_result query_result; + struct og_dbi *dbi; + const char *key; + json_t *value; + int err = 0; + bool res; + + if (json_typeof(data) != JSON_OBJECT) + return -1; + + json_object_foreach(data, key, value) { + if (!strcmp(key, "partition")) + err = og_json_parse_string(value, &partition); + else if (!strcmp(key, "disk")) + err = og_json_parse_string(value, &disk); + else if (!strcmp(key, "image_id")) + err = og_json_parse_string(value, &image_id); + else + return -1; + + if (err < 0) + return err; + } + + if (!partition || !disk || !image_id) { + syslog(LOG_ERR, "malformed response json\n"); + return -1; + } + + err = og_dbi_get_computer_info(&computer, cli->addr.sin_addr); + if (err < 0) + return -1; + + snprintf(img_legacy.image_id, sizeof(img_legacy.image_id), "%s", + image_id); + snprintf(img_legacy.part, sizeof(img_legacy.part), "%s", partition); + snprintf(img_legacy.disk, sizeof(img_legacy.disk), "%s", disk); + snprintf(soft_legacy.id, sizeof(soft_legacy.id), "%d", computer.id); + + dbi = og_dbi_open(&dbi_config); + if (!dbi) { + syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", + __func__, __LINE__); + return -1; + } + + query_result = dbi_conn_queryf(dbi->conn, + "SELECT idperfilsoft FROM imagenes " + " WHERE idimagen='%s'", + image_id); + if (!query_result) { + og_dbi_close(dbi); + syslog(LOG_ERR, "failed to query database\n"); + return -1; + } + if (!dbi_result_next_row(query_result)) { + dbi_result_free(query_result); + og_dbi_close(dbi); + syslog(LOG_ERR, "software profile does not exist in database\n"); + return -1; + } + snprintf(img_legacy.software_id, sizeof(img_legacy.software_id), + "%d", dbi_result_get_uint(query_result, "idperfilsoft")); + dbi_result_free(query_result); + + res = actualizaRestauracionImagen(dbi, + img_legacy.image_id, + img_legacy.disk, + img_legacy.part, + soft_legacy.id, + img_legacy.software_id); + og_dbi_close(dbi); + + if (!res) { + syslog(LOG_ERR, "Problem updating client configuration\n"); + return -1; + } + + return 0; +} + +static int og_agent_state_process_response(struct og_client *cli) +{ + json_error_t json_err; + json_t *root; + int err = -1; + char *body; + + if (!strncmp(cli->buf, "HTTP/1.0 202 Accepted", + strlen("HTTP/1.0 202 Accepted"))) { + og_dbi_update_action(cli->last_cmd_id, true); + cli->last_cmd_id = 0; + return 1; + } + + if (strncmp(cli->buf, "HTTP/1.0 200 OK", strlen("HTTP/1.0 200 OK"))) { + og_dbi_update_action(cli->last_cmd_id, false); + cli->last_cmd_id = 0; + return -1; + } + og_dbi_update_action(cli->last_cmd_id, true); + cli->last_cmd_id = 0; + + if (!cli->content_length) { + cli->last_cmd = OG_CMD_UNSPEC; + return 0; + } + + body = strstr(cli->buf, "\r\n\r\n") + 4; + + root = json_loads(body, 0, &json_err); + if (!root) { + syslog(LOG_ERR, "%s:%d: malformed json line %d: %s\n", + __FILE__, __LINE__, json_err.line, json_err.text); + return -1; + } + + switch (cli->last_cmd) { + case OG_CMD_PROBE: + err = og_resp_probe(cli, root); + break; + case OG_CMD_SHELL_RUN: + err = og_resp_shell_run(cli, root); + break; + case OG_CMD_HARDWARE: + err = og_resp_hardware(root, cli); + break; + case OG_CMD_SOFTWARE: + err = og_resp_software(root, cli); + break; + case OG_CMD_REFRESH: + err = og_resp_refresh(root, cli); + break; + case OG_CMD_SETUP: + err = og_resp_refresh(root, cli); + break; + case OG_CMD_IMAGE_CREATE: + err = og_resp_image_create(root, cli); + break; + case OG_CMD_IMAGE_RESTORE: + err = og_resp_image_restore(root, cli); + break; + default: + err = -1; + break; + } + + cli->last_cmd = OG_CMD_UNSPEC; + + return err; +} + +static void og_agent_deliver_pending_cmd(struct og_client *cli) +{ + const struct og_cmd *cmd; + + cmd = og_cmd_find(inet_ntoa(cli->addr.sin_addr)); + if (!cmd) + return; + + og_send_request(cmd->method, cmd->type, &cmd->params, cmd->json); + cli->last_cmd_id = cmd->id; + + og_cmd_free(cmd); +} + +static void og_agent_read_cb(struct ev_loop *loop, struct ev_io *io, int events) +{ + struct og_client *cli; + int ret; + + cli = container_of(io, struct og_client, io); + + ret = og_client_recv(cli, events); + if (ret <= 0) + goto close; + + ev_timer_again(loop, &cli->timer); + + cli->buf_len += ret; + if (cli->buf_len >= sizeof(cli->buf)) { + syslog(LOG_ERR, "client request from %s:%hu is too long\n", + inet_ntoa(cli->addr.sin_addr), ntohs(cli->addr.sin_port)); + goto close; + } + + switch (cli->state) { + case OG_AGENT_RECEIVING_HEADER: + ret = og_agent_state_recv_hdr_rest(cli); + if (ret < 0) + goto close; + if (!ret) + return; + + cli->state = OG_AGENT_RECEIVING_PAYLOAD; + /* Fall through. */ + case OG_AGENT_RECEIVING_PAYLOAD: + /* Still not enough data to process request. */ + if (cli->buf_len < cli->msg_len) + return; + + cli->state = OG_AGENT_PROCESSING_RESPONSE; + /* fall through. */ + case OG_AGENT_PROCESSING_RESPONSE: + ret = og_agent_state_process_response(cli); + if (ret < 0) { + syslog(LOG_ERR, "Failed to process HTTP request from %s:%hu\n", + inet_ntoa(cli->addr.sin_addr), + ntohs(cli->addr.sin_port)); + goto close; + } else if (ret == 0) { + og_agent_deliver_pending_cmd(cli); + } + + syslog(LOG_DEBUG, "leaving client %s:%hu in keepalive mode\n", + inet_ntoa(cli->addr.sin_addr), + ntohs(cli->addr.sin_port)); + og_agent_reset_state(cli); + break; + default: + syslog(LOG_ERR, "unknown state, critical internal error\n"); + goto close; + } + return; +close: + ev_timer_stop(loop, &cli->timer); + og_client_release(loop, cli); +} + static void og_client_timer_cb(struct ev_loop *loop, ev_timer *timer, int events) { struct og_client *cli; @@ -4774,7 +5597,25 @@ static void og_client_timer_cb(struct ev_loop *loop, ev_timer *timer, int events og_client_release(loop, cli); } -static int socket_s, socket_rest; +static void og_agent_send_refresh(struct og_client *cli) +{ + struct og_msg_params params; + int err; + + params.ips_array[0] = inet_ntoa(cli->addr.sin_addr); + params.ips_array_len = 1; + + err = og_send_request(OG_METHOD_GET, OG_CMD_REFRESH, ¶ms, NULL); + if (err < 0) { + syslog(LOG_ERR, "Can't send refresh to: %s\n", + params.ips_array[0]); + } else { + syslog(LOG_INFO, "Sent refresh to: %s\n", + params.ips_array[0]); + } +} + +static int socket_rest, socket_agent_rest; static void og_server_accept_cb(struct ev_loop *loop, struct ev_io *io, int events) @@ -4799,18 +5640,38 @@ static void og_server_accept_cb(struct ev_loop *loop, struct ev_io *io, return; } memcpy(&cli->addr, &client_addr, sizeof(client_addr)); - cli->keepalive_idx = -1; + if (io->fd == socket_agent_rest) + cli->keepalive_idx = 0; + else + cli->keepalive_idx = -1; if (io->fd == socket_rest) cli->rest = true; + else if (io->fd == socket_agent_rest) + cli->agent = true; syslog(LOG_DEBUG, "connection from client %s:%hu\n", inet_ntoa(cli->addr.sin_addr), ntohs(cli->addr.sin_port)); - ev_io_init(&cli->io, og_client_read_cb, client_sd, EV_READ); + if (io->fd == socket_agent_rest) + ev_io_init(&cli->io, og_agent_read_cb, client_sd, EV_READ); + else + ev_io_init(&cli->io, og_client_read_cb, client_sd, EV_READ); + ev_io_start(loop, &cli->io); - ev_timer_init(&cli->timer, og_client_timer_cb, OG_CLIENT_TIMEOUT, 0.); + if (io->fd == socket_agent_rest) { + ev_timer_init(&cli->timer, og_client_timer_cb, + OG_AGENT_CLIENT_TIMEOUT, 0.); + } else { + ev_timer_init(&cli->timer, og_client_timer_cb, + OG_CLIENT_TIMEOUT, 0.); + } ev_timer_start(loop, &cli->timer); + list_add(&cli->list, &client_list); + + if (io->fd == socket_agent_rest) { + og_agent_send_refresh(cli); + } } static int og_socket_server_init(const char *port) @@ -4842,10 +5703,11 @@ static int og_socket_server_init(const char *port) int main(int argc, char *argv[]) { - struct ev_io ev_io_server, ev_io_server_rest; - struct ev_loop *loop = ev_default_loop(0); + struct ev_io ev_io_server_rest, ev_io_agent_rest; int i; + og_loop = ev_default_loop(0); + if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) exit(EXIT_FAILURE); @@ -4871,29 +5733,30 @@ int main(int argc, char *argv[]) /*-------------------------------------------------------------------------------------------------------- Creación y configuración del socket del servicio ---------------------------------------------------------------------------------------------------------*/ - socket_s = og_socket_server_init(puerto); - if (socket_s < 0) - exit(EXIT_FAILURE); - - ev_io_init(&ev_io_server, og_server_accept_cb, socket_s, EV_READ); - ev_io_start(loop, &ev_io_server); socket_rest = og_socket_server_init("8888"); if (socket_rest < 0) exit(EXIT_FAILURE); ev_io_init(&ev_io_server_rest, og_server_accept_cb, socket_rest, EV_READ); - ev_io_start(loop, &ev_io_server_rest); + ev_io_start(og_loop, &ev_io_server_rest); - infoLog(1); // Inicio de sesión + socket_agent_rest = og_socket_server_init("8889"); + if (socket_agent_rest < 0) + exit(EXIT_FAILURE); + + ev_io_init(&ev_io_agent_rest, og_server_accept_cb, socket_agent_rest, EV_READ); + ev_io_start(og_loop, &ev_io_agent_rest); + + if (og_dbi_schedule_get() < 0) + exit(EXIT_FAILURE); - /* old log file has been deprecated. */ - og_log(97, false); + og_schedule_next(og_loop); syslog(LOG_INFO, "Waiting for connections\n"); while (1) - ev_loop(loop, 0); + ev_loop(og_loop, 0); exit(EXIT_SUCCESS); } diff --git a/admin/Sources/Services/ogAdmServer/sources/ogAdmServer.h b/admin/Sources/Services/ogAdmServer/sources/ogAdmServer.h index 0bfa61e5..d5061cd3 100644 --- a/admin/Sources/Services/ogAdmServer/sources/ogAdmServer.h +++ b/admin/Sources/Services/ogAdmServer/sources/ogAdmServer.h @@ -18,7 +18,6 @@ #include <netinet/in.h> #include <arpa/inet.h> #include <stdbool.h> -#include </usr/include/mysql/mysql.h> #include "ogAdmLib.h" // ________________________________________________________________________________________________________ // Variables globales @@ -37,19 +36,11 @@ SOCKETCL tbsockets[MAXIMOS_CLIENTES]; struct og_dbi; -bool registraCliente(char *); -bool procesoInclusionClienteWinLnx(int socket, TRAMA*,int*,char*); -bool procesoInclusionCliente(struct og_client *, TRAMA*); bool clienteExistente(char *,int *); bool clienteDisponible(char *,int *); bool actualizaConfiguracion(struct og_dbi *,char* ,int); -bool recorreProcedimientos(struct og_dbi *,char* ,FILE*,char*); -bool buscaComandos(char *,TRAMA *,int *); -bool respuestaConsola(int socket, TRAMA *,int); -bool enviaComando(TRAMA *ptrTrama,const char*); bool Levanta(char**, char**, int, char*); bool WakeUp(int,char*,char*,char*); -void PasaHexBin(char *,char *); bool actualizaCreacionImagen(struct og_dbi *,char*,char*,char*,char*,char*,char*); bool actualizaRestauracionImagen(struct og_dbi *,char*,char*,char*,char*,char*); bool actualizaHardware(struct og_dbi *dbi, char* ,char*,char*,char*); diff --git a/admin/Sources/Services/ogAdmServer/sources/schedule.c b/admin/Sources/Services/ogAdmServer/sources/schedule.c new file mode 100644 index 00000000..64d10d9a --- /dev/null +++ b/admin/Sources/Services/ogAdmServer/sources/schedule.c @@ -0,0 +1,470 @@ +#include "schedule.h" +#include "list.h" +#include <sys/types.h> +#include <stdbool.h> +#include <stdint.h> +#include <stdlib.h> +#include <syslog.h> +#include <time.h> +#include <ev.h> + +struct og_schedule *current_schedule = NULL; +static LIST_HEAD(schedule_list); + +static void og_schedule_add(struct og_schedule *new) +{ + struct og_schedule *schedule, *next; + + list_for_each_entry_safe(schedule, next, &schedule_list, list) { + if (new->seconds < schedule->seconds) { + list_add_tail(&new->list, &schedule->list); + return; + } + } + list_add_tail(&new->list, &schedule_list); +} + +/* Returns the days in a month from the weekday. */ +static void get_days_from_weekday(struct tm *tm, int wday, int *days, int *j) +{ + int i, mday = 0; + + tm->tm_mday = 1; + + //Shift week to start on Sunday instead of Monday + if (wday == 6) + wday = 0; + else + wday++; + + /* A bit bruteforce, but simple. */ + for (i = 0; i <= 30; i++) { + mktime(tm); + /* Not this weekday, skip. */ + if (tm->tm_wday != wday) { + tm->tm_mday++; + continue; + } + /* Not interested in next month. */ + if (tm->tm_mday < mday) + break; + + /* Found a matching. */ + mday = tm->tm_mday; + days[(*j)++] = tm->tm_mday; + tm->tm_mday++; + } +} + +/* Returns the days in the given week. */ +static void get_days_from_week(struct tm *tm, int week, int *days, int *k) +{ + int i, j, week_counter = 0; + bool week_over = false; + + tm->tm_mday = 1; + + /* Remaining days of this month. */ + for (i = 0; i <= 30; i++) { + mktime(tm); + + /* Last day of this week? */ + if (tm->tm_wday == 6) + week_over = true; + + /* Not the week we are searching for. */ + if (week != week_counter) { + tm->tm_mday++; + if (week_over) { + week_counter++; + week_over = false; + } + continue; + } + + /* Found matching. */ + for (j = tm->tm_wday; j <= 6; j++) { + days[(*k)++] = tm->tm_mday++; + mktime(tm); + } + break; + } +} + +static int monthdays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + +static int last_month_day(struct tm *tm) +{ + /* Leap year? Adjust it. */ + if (tm->tm_mon == 1) { + tm->tm_mday = 29; + mktime(tm); + if (tm->tm_mday == 29) + return 29; + + tm->tm_mon = 1; + } + + return monthdays[tm->tm_mon]; +} + +/* Returns the days in the given week. */ +static void get_last_week(struct tm *tm, int *days, int *j) +{ + int i, last_day; + + last_day = last_month_day(tm); + tm->tm_mday = last_day; + + for (i = last_day; i >= last_day - 6; i--) { + mktime(tm); + + days[(*j)++] = tm->tm_mday; + + + /* Last day of this week? */ + if (tm->tm_wday == 1) + break; + + tm->tm_mday--; + } +} + +static void og_parse_years(uint16_t years_mask, int years[]) +{ + int i, j = 0; + + for (i = 0; i < 16; i++) { + if ((1 << i) & years_mask) + years[j++] = 2010 + i - 1900; + } +} + +static void og_parse_months(uint16_t months_mask, int months[]) +{ + int i, j = 0; + + for (i = 0; i < 12; i++) { + if ((1 << i) & months_mask) + months[j++] = i + 1; + } +} + +static void og_parse_days(uint32_t days_mask, int *days) +{ + int i, j = 0; + + for (i = 0; i < 31; i++) { + if ((1 << i) & days_mask) + days[j++] = i + 1; + } +} + +static void og_parse_hours(uint16_t hours_mask, uint8_t am_pm, int hours[]) +{ + int pm = 12 * am_pm; + int i, j = 0; + + for (i = 0; i < 12; i++) { + if ((1 << i) & hours_mask) + hours[j++] = i + pm + 1; + } +} + +static void og_schedule_remove_duplicates() +{ + struct og_schedule *schedule, *next, *prev = NULL; + + list_for_each_entry_safe(schedule, next, &schedule_list, list) { + if (!prev) { + prev = schedule; + continue; + } + if (prev->seconds == schedule->seconds && + prev->task_id == schedule->task_id) { + list_del(&prev->list); + free(prev); + } + prev = schedule; + } +} + +static bool og_schedule_stale(time_t seconds) +{ + time_t now; + + now = time(NULL); + if (seconds < now) + return true; + + return false; +} + +static void og_schedule_create_weekdays(int month, int year, + int *hours, int minutes, int week_days, + uint32_t task_id, uint32_t schedule_id, + enum og_schedule_type type, + bool on_start) +{ + struct og_schedule *schedule; + int month_days[5]; + int n_month_days; + time_t seconds; + uint32_t wday; + struct tm tm; + int k, l; + + for (wday = 0; wday < 7; wday++) { + if (!((1 << wday) & week_days)) + continue; + + memset(&tm, 0, sizeof(tm)); + tm.tm_mon = month; + tm.tm_year = year; + + n_month_days = 0; + memset(month_days, 0, sizeof(month_days)); + get_days_from_weekday(&tm, wday, month_days, &n_month_days); + + for (k = 0; month_days[k] != 0 && k < n_month_days; k++) { + for (l = 0; hours[l] != 0 && l < 31; l++) { + memset(&tm, 0, sizeof(tm)); + tm.tm_year = year; + tm.tm_mon = month; + tm.tm_mday = month_days[k]; + tm.tm_hour = hours[l] - 1; + tm.tm_min = minutes; + seconds = mktime(&tm); + + if (on_start && og_schedule_stale(seconds)) + continue; + + schedule = (struct og_schedule *) + calloc(1, sizeof(struct og_schedule)); + if (!schedule) + return; + + schedule->seconds = seconds; + schedule->task_id = task_id; + schedule->schedule_id = schedule_id; + schedule->type = type; + og_schedule_add(schedule); + } + } + } +} + +static void og_schedule_create_weeks(int month, int year, + int *hours, int minutes, int weeks, + uint32_t task_id, uint32_t schedule_id, + enum og_schedule_type type, bool on_start) +{ + struct og_schedule *schedule; + int month_days[7]; + int n_month_days; + time_t seconds; + struct tm tm; + int week; + int k, l; + + for (week = 0; week < 5; week++) { + if (!((1 << week) & weeks)) + continue; + + memset(&tm, 0, sizeof(tm)); + tm.tm_mon = month; + tm.tm_year = year; + + n_month_days = 0; + memset(month_days, 0, sizeof(month_days)); + if (week == 5) + get_last_week(&tm, month_days, &n_month_days); + else + get_days_from_week(&tm, week, month_days, &n_month_days); + + for (k = 0; month_days[k] != 0 && k < n_month_days; k++) { + for (l = 0; hours[l] != 0 && l < 31; l++) { + memset(&tm, 0, sizeof(tm)); + tm.tm_year = year; + tm.tm_mon = month; + tm.tm_mday = month_days[k]; + tm.tm_hour = hours[l] - 1; + tm.tm_min = minutes; + seconds = mktime(&tm); + + if (on_start && og_schedule_stale(seconds)) + continue; + + schedule = (struct og_schedule *) + calloc(1, sizeof(struct og_schedule)); + if (!schedule) + return; + + schedule->seconds = seconds; + schedule->task_id = task_id; + schedule->schedule_id = schedule_id; + schedule->type = type; + og_schedule_add(schedule); + } + } + } +} + +static void og_schedule_create_days(int month, int year, + int *hours, int minutes, int *days, + uint32_t task_id, uint32_t schedule_id, + enum og_schedule_type type, bool on_start) +{ + struct og_schedule *schedule; + time_t seconds; + struct tm tm; + int k, l; + + for (k = 0; days[k] != 0 && k < 31; k++) { + for (l = 0; hours[l] != 0 && l < 31; l++) { + + memset(&tm, 0, sizeof(tm)); + tm.tm_year = year; + tm.tm_mon = month; + tm.tm_mday = days[k]; + tm.tm_hour = hours[l] - 1; + tm.tm_min = minutes; + seconds = mktime(&tm); + + if (on_start && og_schedule_stale(seconds)) + continue; + + schedule = (struct og_schedule *) + calloc(1, sizeof(struct og_schedule)); + if (!schedule) + return; + + schedule->seconds = seconds; + schedule->task_id = task_id; + schedule->schedule_id = schedule_id; + schedule->type = type; + og_schedule_add(schedule); + } + } +} + +void og_schedule_create(unsigned int schedule_id, unsigned int task_id, + enum og_schedule_type type, + struct og_schedule_time *time) +{ + int year, month, minutes; + int months[12] = {}; + int years[12] = {}; + int hours[12] = {}; + int days[31] = {}; + int i, j; + + og_parse_years(time->years, years); + og_parse_months(time->months, months); + og_parse_days(time->days, days); + og_parse_hours(time->hours, time->am_pm, hours); + minutes = time->minutes; + + for (i = 0; years[i] != 0 && i < 12; i++) { + for (j = 0; months[j] != 0 && j < 12; j++) { + month = months[j] - 1; + year = years[i]; + + if (time->week_days) + og_schedule_create_weekdays(month, year, + hours, minutes, + time->week_days, + task_id, + schedule_id, + type, + time->on_start); + + if (time->weeks) + og_schedule_create_weeks(month, year, + hours, minutes, + time->weeks, + task_id, + schedule_id, + type, time->on_start); + + if (time->days) + og_schedule_create_days(month, year, + hours, minutes, + days, + task_id, + schedule_id, + type, time->on_start); + } + } + + og_schedule_remove_duplicates(); +} + +void og_schedule_delete(struct ev_loop *loop, uint32_t schedule_id) +{ + struct og_schedule *schedule, *next; + + list_for_each_entry_safe(schedule, next, &schedule_list, list) { + if (schedule->schedule_id != schedule_id) + continue; + + list_del(&schedule->list); + if (current_schedule == schedule) { + ev_timer_stop(loop, &schedule->timer); + current_schedule = NULL; + og_schedule_refresh(loop); + } + free(schedule); + } +} + +void og_schedule_update(struct ev_loop *loop, unsigned int schedule_id, + unsigned int task_id, struct og_schedule_time *time) +{ + og_schedule_delete(loop, schedule_id); + og_schedule_create(schedule_id, task_id, OG_SCHEDULE_TASK, time); +} + +static void og_agent_timer_cb(struct ev_loop *loop, ev_timer *timer, int events) +{ + struct og_schedule *current; + + current = container_of(timer, struct og_schedule, timer); + og_schedule_run(current->task_id, current->schedule_id, current->type); + + ev_timer_stop(loop, timer); + list_del(¤t->list); + free(current); + + og_schedule_next(loop); +} + +void og_schedule_next(struct ev_loop *loop) +{ + struct og_schedule *schedule; + time_t now, seconds; + + if (list_empty(&schedule_list)) { + current_schedule = NULL; + return; + } + + schedule = list_first_entry(&schedule_list, struct og_schedule, list); + now = time(NULL); + if (schedule->seconds <= now) + seconds = 0; + else + seconds = schedule->seconds - now; + + ev_timer_init(&schedule->timer, og_agent_timer_cb, seconds, 0.); + ev_timer_start(loop, &schedule->timer); + current_schedule = schedule; +} + +void og_schedule_refresh(struct ev_loop *loop) +{ + if (current_schedule) + ev_timer_stop(loop, ¤t_schedule->timer); + + og_schedule_next(loop); +} diff --git a/admin/Sources/Services/ogAdmServer/sources/schedule.h b/admin/Sources/Services/ogAdmServer/sources/schedule.h new file mode 100644 index 00000000..8e0ab8a1 --- /dev/null +++ b/admin/Sources/Services/ogAdmServer/sources/schedule.h @@ -0,0 +1,48 @@ +#ifndef _OG_SCHEDULE_H_ +#define _OG_SCHEDULE_H_ + +#include <stdint.h> +#include <stdbool.h> +#include "dbi.h" +#include "list.h" +#include <ev.h> + +struct og_schedule_time { + uint32_t years; + uint32_t months; + uint32_t weeks; + uint32_t week_days; + uint32_t days; + uint32_t hours; + uint32_t am_pm; + uint32_t minutes; + bool on_start; +}; + +enum og_schedule_type { + OG_SCHEDULE_TASK, + OG_SCHEDULE_PROCEDURE, + OG_SCHEDULE_COMMAND, +}; + +struct og_schedule { + struct list_head list; + struct ev_timer timer; + time_t seconds; + unsigned int task_id; + unsigned int schedule_id; + enum og_schedule_type type; +}; + +void og_schedule_create(unsigned int schedule_id, unsigned int task_id, + enum og_schedule_type type, + struct og_schedule_time *time); +void og_schedule_update(struct ev_loop *loop, unsigned int schedule_id, + unsigned int task_id, struct og_schedule_time *time); +void og_schedule_delete(struct ev_loop *loop, uint32_t schedule_id); +void og_schedule_next(struct ev_loop *loop); +void og_schedule_refresh(struct ev_loop *loop); +void og_schedule_run(unsigned int task_id, unsigned int schedule_id, + enum og_schedule_type type); + +#endif diff --git a/admin/Sources/Services/ogAdmServer/sources/utils.c b/admin/Sources/Services/ogAdmServer/sources/utils.c new file mode 100644 index 00000000..4aa76f8b --- /dev/null +++ b/admin/Sources/Services/ogAdmServer/sources/utils.c @@ -0,0 +1,14 @@ +#include <ctype.h> +#include "utils.h" + +const char *str_toupper(char *str) +{ + char *c = str; + + while (*c) { + *c = toupper(*c); + c++; + } + + return str; +} diff --git a/admin/Sources/Services/ogAdmServer/sources/utils.h b/admin/Sources/Services/ogAdmServer/sources/utils.h new file mode 100644 index 00000000..e32d0067 --- /dev/null +++ b/admin/Sources/Services/ogAdmServer/sources/utils.h @@ -0,0 +1,6 @@ +#ifndef _OG_UTILS_H +#define _OG_UTILS_H + +const char *str_toupper(char *str); + +#endif diff --git a/admin/Sources/Services/ogAdmServer/tests/create_schedule.json b/admin/Sources/Services/ogAdmServer/tests/create_schedule.json new file mode 100644 index 00000000..7269fd8c --- /dev/null +++ b/admin/Sources/Services/ogAdmServer/tests/create_schedule.json @@ -0,0 +1 @@ +{"task":"1","name":"test",","when":{"years":1024,"months":1,"days":536870912,"hours":2048,"am_pm":0,"minutes":0}} diff --git a/admin/Sources/Services/ogAdmServer/tests/run-tests.sh b/admin/Sources/Services/ogAdmServer/tests/run-tests.sh index 893e0264..88d8c781 100755 --- a/admin/Sources/Services/ogAdmServer/tests/run-tests.sh +++ b/admin/Sources/Services/ogAdmServer/tests/run-tests.sh @@ -20,3 +20,5 @@ curl -X POST -H "Authorization: $API_KEY" http://127.0.0.1:8888/image/create/inc curl -X POST -H "Authorization: $API_KEY" http://127.0.0.1:8888/image/restore/basic -d @restore_basic_image.json curl -X POST -H "Authorization: $API_KEY" http://127.0.0.1:8888/image/restore/incremental -d @restore_incremental_image.json curl -X POST -H "Authorization: $API_KEY" http://127.0.0.1:8888/run/schedule -d @run_schedule.json +curl -X POST -H "Authorization: $API_KEY" http://127.0.0.1:8888/task/run -d @task.json +curl -X POST -H "Authorization: $API_KEY" http://127.0.0.1:8888/schedule/create -d @create_schedule.json diff --git a/admin/Sources/Services/ogAdmServer/tests/task.json b/admin/Sources/Services/ogAdmServer/tests/task.json new file mode 100644 index 00000000..fe9d19cb --- /dev/null +++ b/admin/Sources/Services/ogAdmServer/tests/task.json @@ -0,0 +1 @@ +{ "task" : "13" } diff --git a/admin/Sources/Services/opengnsys.default b/admin/Sources/Services/opengnsys.default index d7376cf1..085d779f 100644 --- a/admin/Sources/Services/opengnsys.default +++ b/admin/Sources/Services/opengnsys.default @@ -1,6 +1,5 @@ # RUN_OGADMSERVER defined as OpenGnsys Admin Server # RUN_OGADMREPO defined as OpenGnsys Repository Manager -# RUN_OGADMAGENT run task scheduler service, only if Admin Server is enabled # RUN_BTTRACKER run Bittorrent Tracker, only if Repository is enabled # RUN_BTSEEDER start seeding of selected torrent files, only if Repository is enabled # BTSEEDER_PRIORITY nice priority to seed torrent files; recommended values: @@ -9,7 +8,6 @@ # -8 for Repo with Torrent RUN_OGADMSERVER="yes" RUN_OGADMREPO="yes" -RUN_OGADMAGENT="yes" RUN_BTTRACKER="yes" RUN_BTSEEDER="yes" BTSEEDER_PRIORITY=0 diff --git a/admin/Sources/Services/opengnsys.init b/admin/Sources/Services/opengnsys.init index ae27593b..ef5a5b8c 100755 --- a/admin/Sources/Services/opengnsys.init +++ b/admin/Sources/Services/opengnsys.init @@ -42,15 +42,6 @@ SERVERAUXPORT=2011 ############# IRINA # -# Servidor de tareas programadas -# -AGENTNAME=ogAdmAgent -AGENTDAEMON=$BASEDIR/sbin/$AGENTNAME -AGENTCFG=$BASEDIR/etc/$AGENTNAME.cfg -AGENTLOG=$BASEDIR/log/$AGENTNAME.log -AGENTDAEMON_OPTIONS="-f $AGENTCFG -l $AGENTLOG" - -# # Opciones Bittorrent # @@ -155,14 +146,6 @@ arranca_demonios() { faucet $REPOAUXPORT --daemon --in bash -c "$REPOAUXDAEMON" [ $? = 0 ] && $SUCCESSMSG || $FAILMSG fi - if [ $RUN_OGADMSERVER = "yes" ] && [ $RUN_OGADMAGENT = "yes" ]; then - sleep 5 # Damos tiempo a que ogAdmServer este funcionando - fi - if [ $RUN_OGADMAGENT = "yes" ]; then - $ACTIONMSG "Iniciando demonio: $AGENTNAME" - $DAEMONSTART $AGENTDAEMON $EXTRAOPTS $AGENTDAEMON_OPTIONS $ENDOPTS - [ $? = 0 ] && $SUCCESSMSG || $FAILMSG - fi if [ $RUN_BTTRACKER = "yes" ]; then $ACTIONMSG "Iniciando demonio: $BTTRACK" $TRACKERSTART $BTTRACK $EXTRAOPTS $BTTRACK_OPTIONS $ENDOPTS @@ -189,9 +172,6 @@ para_demonios() { [ $? = 0 ] && $SUCCESSMSG || $FAILMSG rm -f $BTTRACKPID fi - $ACTIONMSG "Parando demonio: $AGENTNAME" - $DAEMONSTOP $AGENTNAME - [ $? = 0 ] && $SUCCESSMSG || $FAILMSG $ACTIONMSG "Parando demonio: $REPOAUXNAME" pkill faucet [ $? -le 1 ] && $SUCCESSMSG || $FAILMSG diff --git a/admin/Sources/Services/opengnsys.service b/admin/Sources/Services/opengnsys.service new file mode 100644 index 00000000..89b8c492 --- /dev/null +++ b/admin/Sources/Services/opengnsys.service @@ -0,0 +1,25 @@ +# OpenGnsys systemd service file + +[Unit] +Documentation=https://opengnsys.es/trac/wiki/En%3ADocumentacionUsuario +SourcePath=/etc/init.d/opengnsys +Description=LSB: OpenGnsys system services +Before=multi-user.target +Before=graphical.target +Requires=mysql.service +After=mysql.service + +[Install] +WantedBy=multi-user.target + +[Service] +Type=forking +Restart=no +TimeoutSec=5min +IgnoreSIGPIPE=no +KillMode=process +GuessMainPID=no +RemainAfterExit=yes +SuccessExitStatus=5 6 +ExecStart=/etc/init.d/opengnsys start +ExecStop=/etc/init.d/opengnsys stop diff --git a/admin/WebConsole/comandos/gestores/gestor_Comandos.php b/admin/WebConsole/comandos/gestores/gestor_Comandos.php index d7704509..64e159af 100644 --- a/admin/WebConsole/comandos/gestores/gestor_Comandos.php +++ b/admin/WebConsole/comandos/gestores/gestor_Comandos.php @@ -79,9 +79,11 @@ function run_command($idcomando, $cadenaip, $cadenamac, $atributos) { software($cadenaip, $atributos); break; case OG_CMD_ID_SCRIPT: - case OG_CMD_ID_DELETE_CACHED_IMAGE: shell(3, $cadenaip, $atributos); break; + case OG_CMD_ID_DELETE_CACHED_IMAGE: + shell(4, $cadenaip, $atributos); + break; } } @@ -195,7 +197,7 @@ if($sw_ejya=='on' || $sw_ejprg=="on" ){ $parametros=$funcion.$atributos; $aplicacion=chr(13)."ido=".$cadenaid.chr(13)."mac=".$cadenamac.chr(13)."iph=".$cadenaip.chr(13); if($sw_seguimiento==1 || $sw_ejprg=="on"){ // Switch de ejecución con seguimiento o comando programado - $sesion=time(); + $sesion = 0; $cmd->ParamSetValor("@tipoaccion",$EJECUCION_COMANDO); $cmd->ParamSetValor("@idtipoaccion",$idcomando); $cmd->ParamSetValor("@descriaccion",$descricomando); @@ -221,7 +223,14 @@ if($sw_ejya=='on' || $sw_ejprg=="on" ){ VALUES (@idordenador,@tipoaccion,@idtipoaccion,@descriaccion,@ip, @sesion,@idcomando,@parametros,@fechahorareg,@estado,@resultado,@ambito,@idambito,@restrambito,@idcentro)"; $resul=$cmd->Ejecutar(); + if ($i == 0) { + $sesion = $cmd->Autonumerico(); + $cmd->ParamSetValor("@sesion",$sesion); + } } + $cmd->texto = "UPDATE acciones SET sesion=@sesion ". + "WHERE idaccion = @sesion"; + $resul=$cmd->Ejecutar(); $acciones=chr(13)."ids=".$sesion.chr(13); // Para seguimiento } if (!$resul){ @@ -233,11 +242,19 @@ if($sw_ejya=='on' || $sw_ejprg=="on" ){ $ValorParametros=extrae_parametros($parametros,chr(13),'='); $script=@urldecode($ValorParametros["scp"]); if($sw_ejya=='on'){ - if (($sw_seguimiento == 1 || $sw_ejprg == "on") && - $idcomando != OG_CMD_ID_WAKEUP) - run_schedule($cadenaip); - else + if ($sw_seguimiento == 1) { + $when = now_params(); + $resul = create_schedule(strval($sesion), + $EJECUCION_PROCEDIMIENTO, + "", $when['map_year'], + $when['map_month'], + 0, 0, $when['map_day'], + $when['map_hour'], + $when['map_am_pm'], + $when['map_minute']); + } else { run_command($idcomando, $cadenaip, $cadenamac, $atributos); + } // En agente nuevo devuelvo siempre correcto $resulhidra = 1; @@ -354,7 +371,10 @@ if($sw_mkprocedimiento=='on' || $sw_mktarea=='on'){ $cmd->ParamSetValor("@idprocedimiento",$idprocedimiento); $cmd->ParamSetValor("@idcomando",$idcomando); $cmd->ParamSetValor("@ordprocedimiento",$ordprocedimiento); - $parametros=$funcion.$atributos; + if ($idcomando == OG_CMD_ID_SCRIPT) + $parametros=$funcion.substr(rawurldecode($atributos), 0, -2); + else + $parametros=$funcion.$atributos; $cmd->ParamSetValor("@parametros",$parametros); $cmd->texto="INSERT INTO procedimientos_acciones(idprocedimiento,orden,idcomando,parametros) VALUES (@idprocedimiento,@ordprocedimiento,@idcomando,@parametros)"; diff --git a/admin/WebConsole/gestores/gestor_ejecutaracciones.php b/admin/WebConsole/gestores/gestor_ejecutaracciones.php index edb976f2..5349e1d0 100644 --- a/admin/WebConsole/gestores/gestor_ejecutaracciones.php +++ b/admin/WebConsole/gestores/gestor_ejecutaracciones.php @@ -59,7 +59,7 @@ if ($cmd){ RecopilaIpesMacs($cmd,$ambito,$idambito); // Recopila Ipes del ámbito if(opcion!=$EJECUCION_AUTOEXEC){ //Creación parametros para inserción en tabla acciones - $sesion=time(); + $sesion=0; $cmd->CreaParametro("@tipoaccion",$opcion,1); $cmd->CreaParametro("@idtipoaccion",0,1); $cmd->CreaParametro("@descriaccion","",0); @@ -95,7 +95,7 @@ if ($cmd){ $cmd->ParamSetValor("@idtipoaccion",$idtarea); $cmd->ParamSetValor("@descriaccion",$descritarea); $cmd->ParamSetValor("@idtarea",$idtarea); - $resul=ejecucionTarea($idtarea); + $resul=run_task($idtarea); $literal="resultado_ejecutar_tareas"; break; } @@ -147,14 +147,6 @@ function ejecucionProcedimiento($idprocedimiento,$ambito,$idambito) return(recorreProcedimientos($idprocedimiento,$ambito,$idambito)); } //________________________________________________________________________________________________________ -// -// Ejecuta una tarea: la registra en acciones y la envía por la red -//________________________________________________________________________________________________________ -function ejecucionTarea($idtarea) -{ - return(recorreTareas($idtarea)); -} -//________________________________________________________________________________________________________ function recorreProcedimientos($idprocedimiento,$ambito,$idambito) { global $cadenamac; @@ -205,51 +197,12 @@ function recorreProcedimientos($idprocedimiento,$ambito,$idambito) return(true); } //________________________________________________________________________________________________________ -function recorreTareas($idtarea) -{ - global $cadenaid; - global $cadenaip; - global $cadenamac; - global $cmd; - - $cmd->texto="SELECT tareas_acciones.orden,tareas_acciones.idprocedimiento,tareas_acciones.tareaid, - tareas.ambito,tareas.idambito,tareas.restrambito - FROM tareas - INNER JOIN tareas_acciones ON tareas_acciones.idtarea=tareas.idtarea - WHERE tareas_acciones.idtarea=".$idtarea." - ORDER BY tareas_acciones.orden"; - //echo $cmd->texto; - $rs=new Recordset; - $rs->Comando=&$cmd; - if (!$rs->Abrir()) return(false); // Error al abrir recordset - while (!$rs->EOF){ - $tareaid=$rs->campos["tareaid"]; - if($tareaid>0){ // Tarea recursiva - if(!recorreTareas($tareaid)){ - return(false); - } - } - else{ - $ambito=$rs->campos["ambito"]; - $idambito=$rs->campos["idambito"]; - if($ambito==0 && $idambito==0){ // Ámbito restringido - $idambito=$rs->campos["restrambito"]; - } - RecopilaIpesMacs($cmd,$ambito,$idambito); // Recopila Ipes del ámbito - $idprocedimiento=$rs->campos["idprocedimiento"]; - if(!recorreProcedimientos($idprocedimiento,$ambito,$idambito)) - return(false); - } - $rs->Siguiente(); - } - return(true); -} -//________________________________________________________________________________________________________ // // Registra un procedimiento para un ambito concreto //________________________________________________________________________________________________________ function insertaComando($idcomando,$parametros,$idprocedimiento,$ambito,$idambito) { + global $EJECUCION_PROCEDIMIENTO; global $cadenaid; global $cadenaip; global $cmd; @@ -281,13 +234,22 @@ function insertaComando($idcomando,$parametros,$idprocedimiento,$ambito,$idambit $resul=$cmd->Ejecutar(); //echo $cmd->texto; if(!$resul) return(false); - - // Let the clients know they can start executing pending commands. - if(empty($vez)){ - run_schedule($cadenaip); - $vez++; + if ($i == 0) { + $sesion = $cmd->Autonumerico(); + $cmd->ParamSetValor("@sesion",$sesion); } } + $cmd->texto = "UPDATE acciones SET sesion=@sesion ". + "WHERE idaccion = @sesion"; + $resul=$cmd->Ejecutar(); + if (resul) { + $when = now_params(); + $resul = create_schedule(strval($sesion), $EJECUCION_PROCEDIMIENTO, "", + $when['map_year'], $when['map_month'], + 0, 0, $when['map_day'], + $when['map_hour'], $when['map_am_pm'], + $when['map_minute']); + } return(true); } diff --git a/admin/WebConsole/gestores/gestor_ordenadores.php b/admin/WebConsole/gestores/gestor_ordenadores.php index e0123d6d..0b5321c2 100644 --- a/admin/WebConsole/gestores/gestor_ordenadores.php +++ b/admin/WebConsole/gestores/gestor_ordenadores.php @@ -31,6 +31,8 @@ $idaula=0; $idordenador=0; $nombreordenador=""; $numserie=""; +$n_row=0; +$n_col=0; $ip=""; $mac=""; $idperfilhard=0; @@ -71,6 +73,8 @@ if (isset($_POST["idordenador"])) $idordenador=$_POST["idordenador"]; if (isset($_POST["identificador"])) $idordenador=$_POST["identificador"]; if (isset($_POST["nombreordenador"])) $nombreordenador=$_POST["nombreordenador"]; if (isset($_POST["numserie"])) $numserie=$_POST["numserie"]; +$n_row=$_POST["n_row"]??0; +$n_col=$_POST["n_col"]??0; if (isset($_POST["ip"])) $ip=$_POST["ip"]; if (isset($_POST["mac"])) $mac=str_replace(":","",$_POST["mac"]); if (isset($_POST["idperfilhard"])) $idperfilhard=$_POST["idperfilhard"]; @@ -207,6 +211,8 @@ function Gestiona(){ global $idordenador; global $nombreordenador; global $numserie; + global $n_row; + global $n_col; global $ip; global $mac; global $idaula; @@ -240,6 +246,8 @@ function Gestiona(){ $cmd->CreaParametro("@idordenador",$idordenador,1); $cmd->CreaParametro("@nombreordenador",$nombreordenador,0); $cmd->CreaParametro("@numserie",$numserie,0); + $cmd->CreaParametro("@n_row",$n_row,1); + $cmd->CreaParametro("@n_col",$n_col,1); $cmd->CreaParametro("@ip",$ip,0); $cmd->CreaParametro("@mac",$mac,0); $cmd->CreaParametro("@idperfilhard",$idperfilhard,1); @@ -262,8 +270,8 @@ function Gestiona(){ $duplicates = checkDuplicates($cmd, $datosduplicados, $idordenador, $nombreordenador, $ip, $mac); // Si no hay datos duplicados insertamos el ordenador; if (!$duplicates) { - $cmd->texto="INSERT INTO ordenadores(nombreordenador,numserie,ip,mac,idperfilhard,idrepositorio,oglivedir, - idmenu,idproautoexec,idaula,grupoid,netiface,netdriver,fotoord,validacion,paginalogin,paginavalidacion) VALUES (@nombreordenador,@numserie,@ip,@mac,@idperfilhard,@idrepositorio,@oglivedir, + $cmd->texto="INSERT INTO ordenadores(nombreordenador,numserie,n_row,n_col,ip,mac,idperfilhard,idrepositorio,oglivedir, + idmenu,idproautoexec,idaula,grupoid,netiface,netdriver,fotoord,validacion,paginalogin,paginavalidacion) VALUES (@nombreordenador,@numserie,@n_row,@n_col,@ip,@mac,@idperfilhard,@idrepositorio,@oglivedir, @idmenu,@idprocedimiento,@idaula,@grupoid,@netiface,@netdriver,@fotoordenador,@validacion,@paginalogin,@paginavalidacion)"; } $resul=$cmd->Ejecutar(); @@ -282,7 +290,7 @@ function Gestiona(){ case $op_modificacion: $duplicates = checkDuplicates($cmd, $datosduplicados, $idordenador, $nombreordenador, $ip, $mac); if (!$duplicates) { - $cmd->texto="UPDATE ordenadores SET nombreordenador=@nombreordenador,numserie=@numserie,ip=@ip,mac=@mac,idperfilhard=@idperfilhard, + $cmd->texto="UPDATE ordenadores SET nombreordenador=@nombreordenador,numserie=@numserie,n_row=@n_row,n_col=@n_col,ip=@ip,mac=@mac,idperfilhard=@idperfilhard, idrepositorio=@idrepositorio,oglivedir=@oglivedir,idmenu=@idmenu,idproautoexec=@idprocedimiento,netiface=@netiface,netdriver=@netdriver,fotoord=@fotoordenador,validacion=@validacion,paginalogin=@paginalogin,paginavalidacion=@paginavalidacion WHERE idordenador=@idordenador"; } diff --git a/admin/WebConsole/gestores/gestor_programaciones.php b/admin/WebConsole/gestores/gestor_programaciones.php index 599427e5..0a76a8d9 100644 --- a/admin/WebConsole/gestores/gestor_programaciones.php +++ b/admin/WebConsole/gestores/gestor_programaciones.php @@ -12,6 +12,8 @@ include_once("../includes/ctrlacc.php"); include_once("../includes/CreaComando.php"); include_once("../clases/AdoPhp.php"); include_once("../includes/comunes.php"); +include_once("../includes/restfunctions.php"); +include_once("../includes/constantes.php"); //________________________________________________________________________________________________________ $op_alta=1; $op_modificacion=2; @@ -70,46 +72,43 @@ if(empty($pminutos)) $pminutos=0; if(empty($psegundos)) $psegundos=0; if(empty($pminutosini)) $pminutosini=0; if(empty($pminutosfin)) $pminutosfin=0; - if($wsw_sus=='true') $psw_sus=1; else $psw_sus=0 ; -$cmd=CreaComando($cadenaconexion); // Crea objeto comando -$resul=false; -if ($cmd){ - $resul=Gestiona(); - $cmd->Conexion->Cerrar(); -} +if ($ptipoaccion == $EJECUCION_COMANDO) + $pidentificador = $psesion; + if($pswop!=$op_suspension){ - if (!$resul){ // Ha ocurrido algún error - $reporerr=$cmd->UltimoError(); - $repordes=$cmd->DescripUltimoError(); - echo "error_programacion()"; - } - else{ // programacion registrada correctamente - switch($pswop){ - case $op_modificacion : - $idr=$pidprogramacion; // Identificador de la programacion modificada - $swop=$op_modificacion; - break; - case $op_alta: - $idr=$pidprogramacion; // Identificador de la programacion nueva - $swop=$op_alta; - break; - case $op_eliminacion : - $idr=$pidprogramacion; // Identificador de la programacion eliminada - $swop=$op_eliminacion; - break; - default: - break; - } - echo 'registro_programacion('.$idr.',"'.$pnombrebloque.'",'.$swop.')'; + $result; + $idr=$pidprogramacion; + switch($pswop){ + case $op_alta: + $result = create_schedule($pidentificador, $ptipoaccion, + $pnombrebloque, $pannos, $pmeses, $psemanas, + $pdias, $pdiario, $phoras, $pampm, $pminutos); + $swop=$op_alta; + $schedule = get_schedule($pidentificador); + $idr = max(array_column($schedule['schedule'], OG_REST_PARAM_ID)); + break; + case $op_eliminacion: + $result = delete_schedule($pidprogramacion); + $swop=$op_eliminacion; + break; + case $op_modificacion: + $result = update_schedule($pidprogramacion, + $pidentificador, $pnombrebloque, $pannos, + $pmeses, $pdiario, $phoras, $pampm, $pminutos); + $swop = $op_modificacion; + break; + default: + break; } + echo 'registro_programacion('.$idr.',"'.$pnombrebloque.'",'.$swop.')'; } else{ - if (!$resul){ // Ha ocurrido algún error + if ($resul) { // Ha ocurrido algún error $reporerr=0; $repordes="Error al suspender la programación"; echo 'error_programacion()'; diff --git a/admin/WebConsole/idiomas/php/cat/propiedades_ordenadores_cat.php b/admin/WebConsole/idiomas/php/cat/propiedades_ordenadores_cat.php index d4e1a97b..d5cd6ef0 100644 --- a/admin/WebConsole/idiomas/php/cat/propiedades_ordenadores_cat.php +++ b/admin/WebConsole/idiomas/php/cat/propiedades_ordenadores_cat.php @@ -29,7 +29,12 @@ $TbMsg[495]="Data/Caché"; $TbMsg[4951]="Caché lliure"; // AGP $TbMsg['COMM_DEFOGLIVE']="Assignat per l'administrador"; -$TbMsg["PROP_SERIALNO"]="Nº de serie"; +$TbMsg["LABEL_SERIALNO"]="Nº de serie"; $TbMsg["WARN_NOTREPO"]="<em>AVISO: sin repositorio asignado.</em>"; $TbMsg["WARN_NOTDETECTED"]="<em>(no detectado)</em>"; $TbMsg['WARN_PROFESSOR']="profesor"; +$TbMsg["LABEL_LOCATION"]="Localización en el aula"; +$TbMsg["PROP_ROW"]="Fila"; +$TbMsg["PROP_COLUMN"]="Columna"; +$TbMsg["VAL_UNSPECIFIED"]="No especificado"; + diff --git a/admin/WebConsole/idiomas/php/eng/propiedades_ordenadores_eng.php b/admin/WebConsole/idiomas/php/eng/propiedades_ordenadores_eng.php index 0a18d8a4..7bc37799 100644 --- a/admin/WebConsole/idiomas/php/eng/propiedades_ordenadores_eng.php +++ b/admin/WebConsole/idiomas/php/eng/propiedades_ordenadores_eng.php @@ -28,7 +28,12 @@ $TbMsg[495]="Content Cache"; $TbMsg[4951]="Cache Free"; // AGP $TbMsg['COMM_DEFOGLIVE']="Assigned by administrator"; -$TbMsg["PROP_SERIALNO"]="Serial No."; +$TbMsg["LABEL_SERIALNO"]="Serial No."; $TbMsg["WARN_NOREPO"]="<em>WARNING: no repository assigned.</em>"; $TbMsg["WARN_NOTDETECTED"]="<em>(not detected)</em>"; $TbMsg['WARN_PROFESSOR']="teacher"; +$TbMsg["LABEL_LOCATION"]="Location in the lab."; +$TbMsg["PROP_ROW"]="Row"; +$TbMsg["PROP_COLUMN"]="Column"; +$TbMsg["VAL_UNSPECIFIED"]="Unspecified"; + diff --git a/admin/WebConsole/idiomas/php/esp/propiedades_ordenadores_esp.php b/admin/WebConsole/idiomas/php/esp/propiedades_ordenadores_esp.php index be2bbb93..00377b76 100644 --- a/admin/WebConsole/idiomas/php/esp/propiedades_ordenadores_esp.php +++ b/admin/WebConsole/idiomas/php/esp/propiedades_ordenadores_esp.php @@ -34,7 +34,11 @@ $TbMsg[495]="Fecha/Caché"; $TbMsg[4951]="Caché libre"; //AGP $TbMsg['COMM_DEFOGLIVE']="Asignado por el administrador"; -$TbMsg["PROP_SERIALNO"]="Nº de serie"; +$TbMsg["LABEL_SERIALNO"]="Nº de serie"; $TbMsg["WARN_NOREPO"]="<em>AVISO: sin repositorio asignado.</em>"; $TbMsg["WARN_NOTDETECTED"]="<em>(no detectado)</em>"; $TbMsg['WARN_PROFESSOR']="profesor"; +$TbMsg["LABEL_LOCATION"]="Localización en el aula"; +$TbMsg["PROP_ROW"]="Fila"; +$TbMsg["PROP_COLUMN"]="Columna"; +$TbMsg["VAL_UNSPECIFIED"]="No especificado"; diff --git a/admin/WebConsole/includes/comunes.php b/admin/WebConsole/includes/comunes.php index f6598c86..213e764e 100644 --- a/admin/WebConsole/includes/comunes.php +++ b/admin/WebConsole/includes/comunes.php @@ -400,3 +400,21 @@ } } + function now_params() + { + $year = intval(date('Y')) - 2010; + $month = intval(date('m')) - 1; + $day = intval(date('j')) - 1; + $hour = intval(date('g')); + $am_pm = date('a'); + $minute = intval(date('i')); + + $params['map_year'] = 1 << $year; + $params['map_month'] = 1 << $month; + $params['map_day'] = 1 << $day; + $params['map_hour'] = 1 << $hour; + $params['map_am_pm'] = strcmp($am_pm, 'am') ? 1 : 0; + $params['map_minute'] = $minute; + + return $params; + } diff --git a/admin/WebConsole/includes/restfunctions.php b/admin/WebConsole/includes/restfunctions.php index 653fcbf3..b1355e36 100644 --- a/admin/WebConsole/includes/restfunctions.php +++ b/admin/WebConsole/includes/restfunctions.php @@ -26,6 +26,11 @@ define('OG_REST_CMD_CREATE_INCREMENTAL_IMAGE', 'image/create/incremental'); define('OG_REST_CMD_RESTORE_BASIC_IMAGE', 'image/restore/basic'); define('OG_REST_CMD_RESTORE_INCREMENTAL_IMAGE', 'image/restore/incremental'); define('OG_REST_CMD_RUN_SCHEDULE', 'run/schedule'); +define('OG_REST_CMD_RUN_TASK', 'task/run'); +define('OG_REST_CMD_CREATE_SCHEDULE', 'schedule/create'); +define('OG_REST_CMD_DELETE_SCHEDULE', 'schedule/delete'); +define('OG_REST_CMD_UPDATE_SCHEDULE', 'schedule/update'); +define('OG_REST_CMD_GET_SCHEDULE', 'schedule/get'); define('OG_REST_PARAM_CLIENTS', 'clients'); define('OG_REST_PARAM_ADDR', 'addr'); @@ -59,6 +64,23 @@ define('OG_REST_PARAM_DIFF_ID', 'diff_id'); define('OG_REST_PARAM_DIFF_NAME', 'diff_name'); define('OG_REST_PARAM_METHOD', 'method'); define('OG_REST_PARAM_ECHO', 'echo'); +define('OG_REST_PARAM_TASK', 'task'); +define('OG_REST_PARAM_WHEN', 'when'); +define('OG_REST_PARAM_YEARS', 'years'); +define('OG_REST_PARAM_MONTHS', 'months'); +define('OG_REST_PARAM_WEEKS', 'weeks'); +define('OG_REST_PARAM_WEEK_DAYS', 'week_days'); +define('OG_REST_PARAM_DAYS', 'days'); +define('OG_REST_PARAM_HOURS', 'hours'); +define('OG_REST_PARAM_AM_PM', 'am_pm'); +define('OG_REST_PARAM_MINUTES', 'minutes'); + +define('TYPE_COMMAND', 1); +define('TYPE_PROCEDURE', 2); +define('TYPE_TASK', 3); +define('OG_SCHEDULE_COMMAND', 'command'); +define('OG_SCHEDULE_PROCEDURE', 'procedure'); +define('OG_SCHEDULE_TASK', 'task'); $conf_file = parse_ini_file(__DIR__ . '/../../etc/ogAdmServer.cfg'); define('OG_REST_API_TOKEN', 'Authorization: ' . $conf_file['APITOKEN']); @@ -105,13 +127,6 @@ function shell($case, $string_ips, $command) { $ips = explode(';',$string_ips); switch ($case) { - case 3: - $command = substr($command, 4); - $data = array(OG_REST_PARAM_CLIENTS => $ips, - OG_REST_PARAM_RUN => $command, - OG_REST_PARAM_ECHO => false); - $command = OG_REST_CMD_RUN; - break; case 1: $data = array(OG_REST_PARAM_CLIENTS => $ips, OG_REST_PARAM_RUN => $command, @@ -122,6 +137,22 @@ function shell($case, $string_ips, $command) { case 2: $data = array(OG_REST_PARAM_CLIENTS => $ips); $command = OG_REST_CMD_OUTPUT; + break; + case 3: + $decoded_cmds = rawurldecode(substr($command, 4)); + $command = substr($decoded_cmds, 0, -2); + $data = array(OG_REST_PARAM_CLIENTS => $ips, + OG_REST_PARAM_RUN => $command, + OG_REST_PARAM_ECHO => false); + $command = OG_REST_CMD_RUN; + break; + case 4: + $decoded_cmds = rawurldecode(substr($command, 4)); + $command = substr($decoded_cmds, 0, -1); + $data = array(OG_REST_PARAM_CLIENTS => $ips, + OG_REST_PARAM_RUN => $command, + OG_REST_PARAM_ECHO => false); + $command = OG_REST_CMD_RUN; } $result = common_request($command, POST, @@ -544,6 +575,87 @@ function run_schedule($string_ips) { common_request(OG_REST_CMD_RUN_SCHEDULE, POST, $data); } +function run_task($task_id) { + $data = array(OG_REST_PARAM_TASK => $task_id); + return common_request(OG_REST_CMD_RUN_TASK, POST, $data); +} + +function create_schedule($task_id, $type, $name, $years, $months, $weeks, + $week_days, $days, $hours, $am_pm, $minutes) { + $type_string; + + switch ($type) { + case TYPE_COMMAND: + $type_string = OG_SCHEDULE_COMMAND; + break; + case TYPE_PROCEDURE: + $type_string = OG_SCHEDULE_PROCEDURE; + break; + case TYPE_TASK: + default: + $type_string = OG_SCHEDULE_TASK; + } + + $data = array ( + OG_REST_PARAM_TASK => $task_id, + OG_REST_PARAM_TYPE => $type_string, + OG_REST_PARAM_NAME => $name, + OG_REST_PARAM_WHEN => array ( + OG_REST_PARAM_YEARS => intval($years), + OG_REST_PARAM_MONTHS => intval($months), + OG_REST_PARAM_WEEKS => intval($weeks), + OG_REST_PARAM_WEEK_DAYS => intval($week_days), + OG_REST_PARAM_DAYS => intval($days), + OG_REST_PARAM_HOURS => intval($hours), + OG_REST_PARAM_AM_PM => intval($am_pm), + OG_REST_PARAM_MINUTES => intval($minutes) + ) + ); + + return common_request(OG_REST_CMD_CREATE_SCHEDULE, POST, $data); +} + +function delete_schedule($schedule_id) { + + $data = array ( + OG_REST_PARAM_ID => $schedule_id, + ); + + return common_request(OG_REST_CMD_DELETE_SCHEDULE, POST, $data); +} + +function update_schedule($schedule_id, $task_id, $name, $years, $months, $days, + $hours, $am_pm, $minutes) { + + $data = array ( + OG_REST_PARAM_ID => $schedule_id, + OG_REST_PARAM_TASK => $task_id, + OG_REST_PARAM_NAME => $name, + OG_REST_PARAM_WHEN => array ( + OG_REST_PARAM_YEARS => intval($years), + OG_REST_PARAM_MONTHS => intval($months), + OG_REST_PARAM_DAYS => intval($days), + OG_REST_PARAM_HOURS => intval($hours), + OG_REST_PARAM_AM_PM => intval($am_pm), + OG_REST_PARAM_MINUTES => intval($minutes) + ) + ); + + return common_request(OG_REST_CMD_UPDATE_SCHEDULE, POST, $data); +} + +function get_schedule($task_id = null, $schedule_id = null) { + if (isset($task_id)) + $data = array(OG_REST_PARAM_TASK => strval($task_id)); + else if (isset($schedule_id)) + $data = array(OG_REST_PARAM_ID => strval($schedule_id)); + else + $data = null; + + $result = common_request(OG_REST_CMD_GET_SCHEDULE, POST, $data); + return $result; +} + /* * @function multiRequest. * @param URLs array (may include header and POST data), cURL options array. diff --git a/admin/WebConsole/principal/aula.php b/admin/WebConsole/principal/aula.php index 05f38a4d..ec3549fc 100644 --- a/admin/WebConsole/principal/aula.php +++ b/admin/WebConsole/principal/aula.php @@ -32,10 +32,13 @@ if (isset($_GET["nombreambito"])) $nombreambito=$_GET["nombreambito"]; $Midordenador= Array(); $Mnombreordenador= Array(); $MimgOrdenador=Array(); +$Mrow=[]; +$Mcol=[]; $Mip= Array(); $Mmac= Array(); +$map=[]; // Mapa del aula $k=0; // Indice de la Matriz - + $cadenaip=""; $idaula=0; $nombreaula=""; @@ -187,7 +190,7 @@ function RecorreAulas($cmd){ $idaula=$rs->campos["idaula"]; $nombreaula=$rs->campos["nombreaula"]; $idordprofesor=(isset($rs->campos["idordprofesor"]) ? $rs->campos["idordprofesor"] : 0); - $cmd->texto="SELECT idordenador,nombreordenador,ip,mac FROM ordenadores WHERE idaula=".$idaula; + $cmd->texto="SELECT idordenador,nombreordenador,n_row,n_col,ip,mac FROM ordenadores WHERE idaula=".$idaula; $k=0; $cadenaip=""; RecorreOrdenadores($cmd); @@ -206,7 +209,7 @@ while (!$rs->EOF){ $idgrupo=$rs->campos["idgrupo"]; $cmd->texto="SELECT idgrupo,nombregrupoordenador FROM gruposOrdenadores WHERE grupoid=".$idgrupo." ORDER BY nombregrupoordenador"; RecorreGruposOrdenadores($cmd); - $cmd->texto="SELECT idordenador,nombreordenador,ip,mac FROM ordenadores WHERE grupoid=".$idgrupo; + $cmd->texto="SELECT idordenador,nombreordenador,n_row,n_col,ip,mac FROM ordenadores WHERE grupoid=".$idgrupo; RecorreOrdenadores($cmd); $rs->Siguiente(); } @@ -217,23 +220,36 @@ function RecorreOrdenadores($cmd){ global $Midordenador; global $Mnombreordenador; global $MimgOrdenador; + global $Mrow; + global $Mcol; global $Mip; global $Mmac; + global $map; // Mapa del aula + global $max_col; // Nº máximo de columnas del aula global $k; // Indice de la Matriz global $cadenaip; - $cmd->texto.= " ORDER BY nombreordenador"; + $cmd->texto.= " ORDER BY n_row, n_col"; $rs=new Recordset; $rs->Comando=&$cmd; if (!$rs->Abrir()) return; // Error al abrir recordset $rs->Primero(); - + $max_col=0; while (!$rs->EOF){ $idordenador=$rs->campos["idordenador"]; $Midordenador[$k]=$rs->campos["idordenador"]; $Mnombreordenador[$k]=$rs->campos["nombreordenador"]; $MimgOrdenador[$k]="ordenador_OFF.png"; + $Mrow[$k]=$rs->campos["n_row"]; + $Mcol[$k]=$rs->campos["n_col"]; + // Calcula nº máximo de columnas para pintar el aula (-1, modo antiguo) + if ($max_col === -1 or $Mrow[$k] === 0 or $Mcol[$k] === 0 or isset($map[$Mrow[$k]][$Mcol[$k]])) { + $max_col = -1; + } else { + $max_col = max($max_col, $Mcol[$k]); + $map[$Mrow[$k]][$Mcol[$k]]=$k; + } $Mip[$k]=$rs->campos["ip"]; $Mmac[$k]=$rs->campos["mac"]; $cadenaip.=$rs->campos["ip"].";"; @@ -252,6 +268,8 @@ function pintaordenadores(){ global $Midordenador; global $Mnombreordenador; global $MimgOrdenador; + global $Mrow; + global $Mcol; global $Mip; global $Mmac; global $k; // Indice de la Matriz @@ -261,6 +279,8 @@ function pintaordenadores(){ global $idordprofesor; global $servidorhidra,$hidraport; global $TbMsg; + global $map; + global $max_col; $ntr=0; // Numero de ordenadores por fila if ($nombreaula!=""){ @@ -268,35 +288,64 @@ function pintaordenadores(){ echo '<p align=center class=cabeceras><img border=0 nod="'.$LITAMBITO_AULAS.'-'.$idaula.'" value="'.$nombreaula.'" style="cursor:pointer" src="../images/iconos/aula.gif" oncontextmenu="nwmenucontextual(this,' ."'flo_".$LITAMBITO_AULAS."'" .')" > '.$TbMsg[23].'</br><span id="'.$LITAMBITO_AULAS.'-'.$idaula.'" class=subcabeceras>'.$nombreaula.'</span></p>'; } - echo '<TABLE style="border: 1px solid #d4d0c8;" align="center"><TR>'; - for($i=0;$i<$k;$i++){ // Vuelve a recorrer los datos de ordenadores para crear HTML - $ntr++; - echo '<TD>'; - echo '<table border=0>'; + echo '<table style="border: 1px solid #d4d0c8;" align="center">'; + if ($max_col === -1) { // Modo antiguo echo '<tr>'; - echo ' <td align=center width=70 height=40>'; - echo ' <a href="#"><img id="'.$Mip[$i].'" border=0 sondeo="" nod="'.$LITAMBITO_ORDENADORES.'-'.$Midordenador[$i].'" - value="'.$Mnombreordenador[$i].'" src="../images/'.$MimgOrdenador[$i].'" oncontextmenu="nwmenucontextual(this,'."'flo_".$LITAMBITO_ORDENADORES."'" .')" width="32" height="32"></A>'; - echo ' </td>'; - echo '</tr>'; - echo '<tr>'; - echo '<td align=center id="'.$LITAMBITO_ORDENADORES.'-'.$Midordenador[$i].'">'; - echo ' <font color="#003300" size="1" face="Arial, Helvetica, sans-serif">'.$Mnombreordenador[$i].($Midordenador[$i]==$idordprofesor?' *':'').'</font>'; - echo ' </br>'; - echo ' <font color="#003300" size="1" face="Arial, Helvetica, sans-serif">'; - echo ' <strong><font color="#D0A126">'.$Mip[$i].'</font></strong>'; - echo ' </br>'; - echo ' <font color="#003300" size="1" face="Arial, Helvetica, sans-serif">'.$Mmac[$i].'</font>'; - echo '</td>'; - echo '</tr>'; - echo '</table>'; - echo '</TD>'; - if ($ntr>4){ - $ntr=0; - echo '</TR><TR>'; + for($i=0;$i<$k;$i++){ // Vuelve a recorrer los datos de ordenadores para crear HTML + $ntr++; + echo '<td>'; + echo '<table border="0">'; + echo '<tr>'; + echo ' <td align=center width=70 height=40>'; + echo ' <a href="#"><img id="'.$Mip[$i].'" border=0 sondeo="" nod="'.$LITAMBITO_ORDENADORES.'-'.$Midordenador[$i].'" + value="'.$Mnombreordenador[$i].'" src="../images/'.$MimgOrdenador[$i].'" oncontextmenu="nwmenucontextual(this,'."'flo_".$LITAMBITO_ORDENADORES."'" .')" width="32" height="32"></a>'; + echo ' </td>'; + echo '</tr>'; + echo '<tr>'; + echo '<td align=center id="'.$LITAMBITO_ORDENADORES.'-'.$Midordenador[$i].'">'; + echo ' <font color="#003300" size="1" face="Arial, Helvetica, sans-serif">'.$Mnombreordenador[$i].($Midordenador[$i]==$idordprofesor?' *':'').'</font>'; + echo ' </br>'; + echo ' <font color="#003300" size="1" face="Arial, Helvetica, sans-serif">'; + echo ' <strong><font color="#D0A126">'.$Mip[$i].'</font></strong>'; + echo ' </br>'; + echo ' <font color="#003300" size="1" face="Arial, Helvetica, sans-serif">'.$Mmac[$i].'</font>'; + echo '</td>'; + echo '</tr>'; + echo '</table>'; + echo '</td>'; + if ($ntr>4){ + $ntr=0; + echo '</TR><TR>'; + } + } + } else { + foreach ($map as $i => $tmp) { + echo "<tr>"; + for ($j=1; $j<=$max_col; $j++) { + echo '<td>'; + echo '<table border="0">'; + echo '<tr>'; + echo ' <td align=center width=70 height=40>'; + if (isset($map[$i][$j])) { + $n=$map[$i][$j]; + echo '<div align="center" id="'.$LITAMBITO_ORDENADORES.'-'.$Midordenador[$n].'">'; + echo ' <a href="#"><img id="'.$Mip[$n].'" border="0" sondeo="" nod="'.$LITAMBITO_ORDENADORES.'-'.$Midordenador[$n].'" value="'.$Mnombreordenador[$n].'" src="../images/'.$MimgOrdenador[$n].'" oncontextmenu="nwmenucontextual(this,'."'flo_".$LITAMBITO_ORDENADORES."'" .')" width="32" height="32"></a>'; + echo ' </div>'; + echo ' <font color="#003300" size="1" face="Arial, Helvetica, sans-serif">'.$Mnombreordenador[$n].($Midordenador[$n]==$idordprofesor?' *':'').'</font>'; + echo ' </br>'; + echo ' <font color="#003300" size="1" face="Arial, Helvetica, sans-serif">'; + echo ' <strong><font color="#D0A126">'.$Mip[$n].'</font></strong>'; + echo ' </br>'; + echo ' <font color="#003300" size="1" face="Arial, Helvetica, sans-serif">'.$Mmac[$n].'</font>'; + } + echo '</td>'; + echo '</tr>'; + echo '</table>'; + echo '</td>'; + } } } - echo '</TABLE>'; + echo '</table>'; echo '<p>'; echo '<table style="border: #d4d0c8 1px solid; background: #eeeeee" align="center">'; echo ' <tr align="center" valign="top">'; @@ -345,12 +394,6 @@ function ContextualXMLAulas(){ $layerXML.=' textoitem='.$TbMsg[4]; $layerXML.='></ITEM>'; - $layerXML.='<ITEM'; - $layerXML.=' alpulsar="purgar_ordenadores()"'; - $layerXML.=' imgitem="../images/iconos/purgar.gif"'; - $layerXML.=' textoitem='.$TbMsg[2]; - $layerXML.='></ITEM>'; - $layerXML.='<SEPARADOR>'; $layerXML.='</SEPARADOR>'; @@ -492,12 +535,6 @@ function ContextualXMLOrdenadores(){ $layerXML.=' textoitem='.$TbMsg[4]; $layerXML.='></ITEM>'; - $layerXML.='<ITEM'; - $layerXML.=' alpulsar="purgar_ordenadores()"'; - $layerXML.=' imgitem="../images/iconos/purgar.gif"'; - $layerXML.=' textoitem='.$TbMsg[2]; - $layerXML.='></ITEM>'; - $layerXML.='<SEPARADOR>'; $layerXML.='</SEPARADOR>'; diff --git a/admin/WebConsole/principal/aulas.php b/admin/WebConsole/principal/aulas.php index 309681fd..ecbbf7c0 100644 --- a/admin/WebConsole/principal/aulas.php +++ b/admin/WebConsole/principal/aulas.php @@ -319,12 +319,6 @@ function ContextualXMLCentros(){ $layerXML.=' textoitem='.$TbMsg[4]; $layerXML.='></ITEM>'; - $layerXML.='<ITEM'; - $layerXML.=' alpulsar="purgar_ordenadores()"'; - $layerXML.=' imgitem="../images/iconos/purgar.gif"'; - $layerXML.=' textoitem='.$TbMsg[2]; - $layerXML.='></ITEM>'; - $layerXML.='<SEPARADOR>'; $layerXML.='</SEPARADOR>'; @@ -414,12 +408,6 @@ function ContextualXMLGruposAulas(){ $layerXML.=' textoitem='.$TbMsg[4]; $layerXML.='></ITEM>'; - $layerXML.='<ITEM'; - $layerXML.=' alpulsar="purgar_ordenadores()"'; - $layerXML.=' imgitem="../images/iconos/purgar.gif"'; - $layerXML.=' textoitem='.$TbMsg[2]; - $layerXML.='></ITEM>'; - $layerXML.='<SEPARADOR>'; $layerXML.='</SEPARADOR>'; @@ -560,12 +548,6 @@ function ContextualXMLAulas(){ $layerXML.=' textoitem='.$TbMsg[4]; $layerXML.='></ITEM>'; - $layerXML.='<ITEM'; - $layerXML.=' alpulsar="purgar_ordenadores()"'; - $layerXML.=' imgitem="../images/iconos/purgar.gif"'; - $layerXML.=' textoitem='.$TbMsg[2]; - $layerXML.='></ITEM>'; - $layerXML.='<SEPARADOR>'; $layerXML.='</SEPARADOR>'; @@ -754,12 +736,6 @@ function ContextualXMLGruposOrdenadores(){ $layerXML.=' textoitem='.$TbMsg[4]; $layerXML.='></ITEM>'; - $layerXML.='<ITEM'; - $layerXML.=' alpulsar="purgar_ordenadores()"'; - $layerXML.=' imgitem="../images/iconos/purgar.gif"'; - $layerXML.=' textoitem='.$TbMsg[2]; - $layerXML.='></ITEM>'; - $layerXML.='<SEPARADOR>'; $layerXML.='</SEPARADOR>'; @@ -881,12 +857,6 @@ function ContextualXMLOrdenadores(){ $layerXML.=' textoitem='.$TbMsg[4]; $layerXML.='></ITEM>'; - $layerXML.='<ITEM'; - $layerXML.=' alpulsar="purgar_ordenadores()"'; - $layerXML.=' imgitem="../images/iconos/purgar.gif"'; - $layerXML.=' textoitem='.$TbMsg[2]; - $layerXML.='></ITEM>'; - $layerXML.='<SEPARADOR>'; $layerXML.='</SEPARADOR>'; diff --git a/admin/WebConsole/propiedades/propiedades_ordenadores.php b/admin/WebConsole/propiedades/propiedades_ordenadores.php index e00f33ee..6e7c60c2 100644 --- a/admin/WebConsole/propiedades/propiedades_ordenadores.php +++ b/admin/WebConsole/propiedades/propiedades_ordenadores.php @@ -26,6 +26,8 @@ $idordenador=0; $ordprofesor=false; $nombreordenador=""; $numserie=""; +$n_row=0; +$n_col=0; $ip=""; $mac=""; $idperfilhard=0; @@ -99,7 +101,7 @@ function abrir_ventana(URL){ $fotomenu=$fotoordenador; $dirfotos="../images/fotos"; ?> - <td colspan="2" valign="top" align="left" rowspan="4"> + <td colspan="2" valign="top" align="left" rowspan="5"> <img border="2" style="border-color:#63676b" src="<?php echo $dirfotos.'/'.$fotoordenador?>" /> <?php if ($opcion!=$op_eliminacion) { echo '<br />(150X110)-(jpg - gif - png) ---- '.$TbMsg[5091].'><br />'; @@ -128,7 +130,7 @@ function abrir_ventana(URL){ </tr> <!-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> <tr> - <th align="center"> <?php echo $TbMsg["PROP_SERIALNO"]?> </th> + <th align="center"> <?php echo $TbMsg["LABEL_SERIALNO"]?> </th> <?php if ($opcion==$op_eliminacion) { echo '<td>'.(isset($numserie)?$numserie:$TbMsg["WARN_NOTDETECTED"]).'</td>'; } else { @@ -140,6 +142,27 @@ function abrir_ventana(URL){ } ?> </tr> +<!-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> + <tr> + <th align="center"> <?php echo $TbMsg["LABEL_LOCATION"] ?> </th> + <?php if ($opcion==$op_eliminacion) { + echo '<td>'.$n_row.', '.$n_col.'</td>'; + } else { + echo "<td>\n"; + $row="0=".$TbMsg["VAL_UNSPECIFIED"].chr(13); + foreach (range(1, 15) as $n) { + $row.="$n=".$TbMsg["PROP_ROW"]." $n".chr(13); + } + echo HTMLCTESELECT($row,"n_row","estilodesple","",$n_row,100); + $col="0=".$TbMsg["VAL_UNSPECIFIED"].chr(13); + foreach (range(1, 15) as $n) { + $col.="$n=".$TbMsg["PROP_COLUMN"]." $n".chr(13); + } + echo HTMLCTESELECT($col,"n_col","estilodesple","",$n_col,100); + echo "</td>\n"; + } + ?> + </tr> <!-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> <TR> <th align=center> <?php echo $TbMsg[509]?> </th> @@ -355,6 +378,8 @@ function TomaPropiedades($cmd,$id){ global $ordprofesor; global $nombreordenador; global $numserie; + global $n_row; + global $n_col; global $ip; global $mac; global $fotoordenador; @@ -400,7 +425,8 @@ EOD; $paginavalidacion=$rs->campos["paginavalidacion"]; ########################### Ramón $arranque=$rs->campos["arranque"]; - + $n_row=$rs->campos["n_row"]; + $n_col=$rs->campos["n_col"]; $rs->Cerrar(); return(true); } diff --git a/admin/WebConsole/varios/consulta_programaciones.php b/admin/WebConsole/varios/consulta_programaciones.php index 127dde3e..c2735030 100644 --- a/admin/WebConsole/varios/consulta_programaciones.php +++ b/admin/WebConsole/varios/consulta_programaciones.php @@ -12,21 +12,30 @@ include_once("../includes/ctrlacc.php"); include_once("../clases/AdoPhp.php"); include_once("../includes/comunes.php"); include_once("../includes/CreaComando.php"); +include_once("../includes/restfunctions.php"); //_________________________________________________________________________________________________________ // Toma parametros $idprogramacion=0; if (isset($_POST["idprogramacion"])) $idprogramacion=$_POST["idprogramacion"]; -// Abre conexiones -$cmd=CreaComando($cadenaconexion); // Crea objeto comando -$rs=new Recordset; // Recupero acciones anidadas -$cmd->texto="SELECT * FROM programaciones WHERE idprogramacion=".$idprogramacion; -$rs->Comando=&$cmd; -if ($rs->Abrir()){ // Error al abrir recordset - $cadena_campos=$rs->campos[0]; - for($i=1;$i<$rs->numerodecampos;$i++) - $cadena_campos.=";".$rs->campos[$i]; // Usa el caracter ; para delimitar - echo $cadena_campos; -} -$rs->Cerrar(); +$schedule = get_schedule(null, $idprogramacion); +$task = $schedule['schedule'][0]; +$cadena_campos = "null;null;null"; +$cadena_campos.= ";".$task[OG_REST_PARAM_NAME]; +$cadena_campos.= ";".$task[OG_REST_PARAM_YEARS]; +$cadena_campos.= ";".$task[OG_REST_PARAM_MONTHS]; +$cadena_campos.= ";".$task[OG_REST_PARAM_DAYS]; +$cadena_campos.= ";".$task['week_days']; +$cadena_campos.= ";".$task['weeks']; +$cadena_campos.= ";".$task[OG_REST_PARAM_HOURS]; +$cadena_campos.= ";".$task[OG_REST_PARAM_AM_PM]; +$cadena_campos.= ";".$task[OG_REST_PARAM_MINUTES]; +$cadena_campos.= ";null"; +$cadena_campos.= ";null"; +$cadena_campos.= ";null"; +$cadena_campos.= ";null"; +$cadena_campos.= ";null"; +$cadena_campos.= ";null"; +$cadena_campos.= ";null"; +echo $cadena_campos; diff --git a/client/shared/etc/init/default.sh b/client/shared/etc/init/default.sh index 0e653e05..d2e3681f 100755 --- a/client/shared/etc/init/default.sh +++ b/client/shared/etc/init/default.sh @@ -18,9 +18,8 @@ echo "${MSG_LAUNCHCLIENT:-.}" # Indicar fichero de teclado de Qt para el idioma especificado (tipo "es.qmap"). [ -f /usr/local/etc/${LANG%_*}.qmap ] && export QWS_KEYBOARD="TTY:keymap=/usr/local/etc/${LANG%_*}.qmap" -if [ -x "$OPENGNSYS/bin/ogAdmClient" -a "$ogstatus" != "offline" ]; then - # Ejecutar servicio cliente. - $OPENGNSYS/bin/ogAdmClient -f $OPENGNSYS/etc/ogAdmClient.cfg -l $OGLOGFILE -d $LOGLEVEL +if [ "$ogstatus" != "offline" ]; then + python3 /opt/opengnsys/ogClient/main.py else for FILE in index $OGGROUP $(ogGetIpAddress) do diff --git a/installer/opengnsys_installer.sh b/installer/opengnsys_installer.sh index 02ec3cad..a1586067 100755 --- a/installer/opengnsys_installer.sh +++ b/installer/opengnsys_installer.sh @@ -132,7 +132,7 @@ function globalSetup () else REMOTE=1 fi - BRANCH="opengnsys-1.1.1c" + BRANCH="master" CODE_URL="https://codeload.github.com/opengnsys/OpenGnsys/zip/$BRANCH" API_URL="https://api.github.com/repos/opengnsys/OpenGnsys" @@ -189,7 +189,7 @@ OSVERSION="${OSVERSION%%.*}" # Configuración según la distribución GNU/Linux (usar minúsculas). case "$OSDISTRIB" in ubuntu|debian|linuxmint) - DEPENDENCIES=( subversion apache2 php php-ldap php-fpm mysql-server php-mysql isc-dhcp-server bittorrent tftp-hpa tftpd-hpa xinetd build-essential g++-multilib libmysqlclient-dev wget curl doxygen graphviz bittornado ctorrent samba rsync unzip netpipes debootstrap schroot squashfs-tools btrfs-tools procps arp-scan realpath php-curl gettext moreutils jq wakeonlan udpcast libev-dev libjansson-dev libssl-dev shim-signed grub-efi-amd64-signed gawk libdbi-dev libdbi1 libdbd-mysql) + DEPENDENCIES=( subversion apache2 php php-ldap php-fpm mysql-server php-mysql isc-dhcp-server bittorrent tftp-hpa tftpd-hpa xinetd build-essential g++-multilib libmysqlclient-dev wget curl doxygen graphviz bittornado ctorrent samba rsync unzip netpipes debootstrap schroot squashfs-tools btrfs-tools procps arp-scan realpath php-curl gettext moreutils jq wakeonlan udpcast libev-dev libjansson-dev libssl-dev shim-signed grub-efi-amd64-signed gawk libdbi-dev libdbi1 libdbd-mysql automake) UPDATEPKGLIST="apt-get update" INSTALLPKG="apt-get -y install --force-yes" CHECKPKG="dpkg -s \$package 2>/dev/null | grep Status | grep -qw install" @@ -227,7 +227,7 @@ case "$OSDISTRIB" in TFTPCFGDIR=/var/lib/tftpboot ;; fedora|centos) - DEPENDENCIES=( subversion httpd mod_ssl php-ldap php-fpm mysql-server mysql-devel mysql-devel.i686 php-mysql dhcp tftp-server tftp xinetd binutils gcc gcc-c++ glibc-devel glibc-devel.i686 glibc-static glibc-static.i686 libstdc++-devel.i686 make wget curl doxygen graphviz ctorrent samba samba-client rsync unzip debootstrap schroot squashfs-tools python-crypto arp-scan procps-ng gettext moreutils jq net-tools udpcast libev-devel jansson-devel openssl-devel shim-x64 grub2-efi-x64 grub2-efi-x64-modules gawk libdbi-devel libdbi libdbi-dbd-mysql http://ftp.altlinux.org/pub/distributions/ALTLinux/5.1/branch/$(arch)/RPMS.classic/netpipes-4.2-alt1.$(arch).rpm ) + DEPENDENCIES=( subversion httpd mod_ssl php-ldap php-fpm mysql-server mysql-devel mysql-devel.i686 php-mysql dhcp tftp-server tftp xinetd binutils gcc gcc-c++ glibc-devel glibc-devel.i686 glibc-static glibc-static.i686 libstdc++-devel.i686 make wget curl doxygen graphviz ctorrent samba samba-client rsync unzip debootstrap schroot squashfs-tools python-crypto arp-scan procps-ng gettext moreutils jq net-tools udpcast libev-devel jansson-devel openssl-devel shim-x64 grub2-efi-x64 grub2-efi-x64-modules gawk libdbi-devel libdbi libdbi-dbd-mysql automake http://ftp.altlinux.org/pub/distributions/ALTLinux/5.1/branch/$(arch)/RPMS.classic/netpipes-4.2-alt1.$(arch).rpm ) [ "$OSDISTRIB" == "centos" ] && UPDATEPKGLIST="yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-$OSVERSION.noarch.rpm http://rpms.remirepo.net/enterprise/remi-release-$OSVERSION.rpm" INSTALLEXTRADEPS=( 'pushd /tmp; wget -t3 http://ftp.acc.umu.se/mirror/bittornado/BitTornado-0.3.18.tar.gz && tar xvzf BitTornado-0.3.18.tar.gz && cd BitTornado-CVS && python setup.py install && ln -fs btlaunchmany.py /usr/bin/btlaunchmany && ln -fs bttrack.py /usr/bin/bttrack; popd' ) INSTALLPKG="yum install -y libstdc++ libstdc++.i686" @@ -1328,30 +1328,12 @@ function servicesCompilation () # Compilar OpenGnsys Server echoAndLog "${FUNCNAME}(): Compiling OpenGnsys Admin Server" pushd $WORKDIR/opengnsys/admin/Sources/Services/ogAdmServer - make && mv ogAdmServer $INSTALL_TARGET/sbin + autoreconf -fi && ./configure && make && mv ogAdmServer $INSTALL_TARGET/sbin if [ $? -ne 0 ]; then echoAndLog "${FUNCNAME}(): error while compiling OpenGnsys Admin Server" hayErrores=1 fi popd - # Compilar OpenGnsys Agent - echoAndLog "${FUNCNAME}(): Compiling OpenGnsys Agent" - pushd $WORKDIR/opengnsys/admin/Sources/Services/ogAdmAgent - make && mv ogAdmAgent $INSTALL_TARGET/sbin - if [ $? -ne 0 ]; then - echoAndLog "${FUNCNAME}(): error while compiling OpenGnsys Agent" - hayErrores=1 - fi - popd - # Compilar OpenGnsys Client - echoAndLog "${FUNCNAME}(): Compiling OpenGnsys Admin Client" - pushd $WORKDIR/opengnsys/admin/Sources/Clients/ogAdmClient - make && mv ogAdmClient ../../../../client/shared/bin - if [ $? -ne 0 ]; then - echoAndLog "${FUNCNAME}(): error while compiling OpenGnsys Admin Client" - hayErrores=1 - fi - popd return $hayErrores } @@ -1406,6 +1388,21 @@ function copyClientFiles() errorAndLog "${FUNCNAME}(): client copy files with errors" fi + local ogclientUrl="https://codeload.github.com/opengnsys/ogClient/zip/$BRANCH" + + echoAndLog "${FUNCNAME}(): downloading ogClient code..." + + if ! (curl "${ogclientUrl}" -o ogclient.zip && \ + unzip -qo ogclient.zip && \ + mv "ogClient-$BRANCH" $INSTALL_TARGET/client/ogClient) + then + errorAndLog "${FUNCNAME}(): "\ + "error getting ogClient code from ${ogclientUrl}" + return 1 + fi + rm -f ogclient.zip + echoAndLog "${FUNCNAME}(): ogClient code was downloaded" + return $errstatus } @@ -1464,6 +1461,8 @@ function openGnsysConfigure() echoAndLog "${FUNCNAME}(): Copying init files." cp -a $WORKDIR/opengnsys/admin/Sources/Services/opengnsys.init /etc/init.d/opengnsys + cp -a $WORKDIR/opengnsys/admin/Sources/Services/opengnsys.service \ + /lib/systemd/system/opengnsys.service cp -a $WORKDIR/opengnsys/admin/Sources/Services/opengnsys.default /etc/default/opengnsys # Deshabilitar servicios de BitTorrent si no están instalados. if [ ! -e /usr/bin/bttrack ]; then @@ -1493,11 +1492,6 @@ function openGnsysConfigure() $WORKDIR/opengnsys/admin/Sources/Services/ogAdmServer/ogAdmServer.cfg > $INSTALL_TARGET/etc/ogAdmServer-$dev.cfg sed -e "s/SERVERIP/${SERVERIP[i]}/g" \ $WORKDIR/opengnsys/repoman/etc/ogAdmRepo.cfg.tmpl > $INSTALL_TARGET/etc/ogAdmRepo-$dev.cfg - sed -e "s/SERVERIP/${SERVERIP[i]}/g" \ - -e "s/DBUSER/$OPENGNSYS_DB_USER/g" \ - -e "s/DBPASSWORD/$OPENGNSYS_DB_PASSWD/g" \ - -e "s/DATABASE/$OPENGNSYS_DATABASE/g" \ - $WORKDIR/opengnsys/admin/Sources/Services/ogAdmAgent/ogAdmAgent.cfg > $INSTALL_TARGET/etc/ogAdmAgent-$dev.cfg CONSOLEURL="https://${SERVERIP[i]}/opengnsys" sed -e "s/SERVERIP/${SERVERIP[i]}/g" \ -e "s/DBUSER/$OPENGNSYS_DB_USER/g" \ @@ -1505,19 +1499,15 @@ function openGnsysConfigure() -e "s/DATABASE/$OPENGNSYS_DATABASE/g" \ -e "s/OPENGNSYSURL/${CONSOLEURL//\//\\/}/g" \ $INSTALL_TARGET/www/controlacceso.php > $INSTALL_TARGET/www/controlacceso-$dev.php - sed -e "s/SERVERIP/${SERVERIP[i]}/g" \ - -e "s/OPENGNSYSURL/${CONSOLEURL//\//\\/}/g" \ - $WORKDIR/opengnsys/admin/Sources/Clients/ogAdmClient/ogAdmClient.cfg > $INSTALL_TARGET/client/etc/ogAdmClient-$dev.cfg if [ "$dev" == "$DEFAULTDEV" ]; then OPENGNSYS_CONSOLEURL="$CONSOLEURL" + OPENGNSYS_SERVERIP="${SERVERIP[i]}" fi fi let i++ done ln -f $INSTALL_TARGET/etc/ogAdmServer-$DEFAULTDEV.cfg $INSTALL_TARGET/etc/ogAdmServer.cfg ln -f $INSTALL_TARGET/etc/ogAdmRepo-$DEFAULTDEV.cfg $INSTALL_TARGET/etc/ogAdmRepo.cfg - ln -f $INSTALL_TARGET/etc/ogAdmAgent-$DEFAULTDEV.cfg $INSTALL_TARGET/etc/ogAdmAgent.cfg - ln -f $INSTALL_TARGET/client/etc/ogAdmClient-$DEFAULTDEV.cfg $INSTALL_TARGET/client/etc/ogAdmClient.cfg ln -f $INSTALL_TARGET/www/controlacceso-$DEFAULTDEV.php $INSTALL_TARGET/www/controlacceso.php # Configuración del motor de clonación. @@ -1551,6 +1541,10 @@ EOT echoAndLog "${FUNCNAME}(): Starting OpenGnsys services." $STARTSERVICE fi + + echoAndLog "${FUNCNAME}(): Creating ogClient config files." + sed -i -e "s/127\.0\.0\.1/$OPENGNSYS_SERVERIP/g" \ + $INSTALL_TARGET/client/ogClient/cfg/ogclient.json } diff --git a/installer/opengnsys_update.sh b/installer/opengnsys_update.sh index f0a6f32f..aa981c0a 100755 --- a/installer/opengnsys_update.sh +++ b/installer/opengnsys_update.sh @@ -55,8 +55,6 @@ fi # Cargar configuración de acceso a la base de datos. if [ -r $INSTALL_TARGET/etc/ogAdmServer.cfg ]; then source $INSTALL_TARGET/etc/ogAdmServer.cfg -elif [ -r $INSTALL_TARGET/etc/ogAdmAgent.cfg ]; then - source $INSTALL_TARGET/etc/ogAdmAgent.cfg fi OPENGNSYS_DATABASE=${OPENGNSYS_DATABASE:-"$CATALOG"} # Base de datos OPENGNSYS_DBUSER=${OPENGNSYS_DBUSER:-"$USUARIO"} # Usuario de acceso @@ -117,7 +115,7 @@ function autoConfigure() # Configuración según la distribución de Linux. if [ -f /etc/debian_version ]; then # Distribución basada en paquetes Deb. - DEPENDENCIES=( curl rsync btrfs-tools procps arp-scan realpath php-curl gettext moreutils jq wakeonlan udpcast libev-dev libjansson-dev libssl-dev shim-signed grub-efi-amd64-signed php-fpm gawk libdbi-dev libdbi1 libdbd-mysql) + DEPENDENCIES=( curl rsync btrfs-tools procps arp-scan realpath php-curl gettext moreutils jq wakeonlan udpcast libev-dev libjansson-dev libssl-dev shim-signed grub-efi-amd64-signed php-fpm gawk libdbi-dev libdbi1 libdbd-mysql automake) # Paquete correcto para realpath. [ -z "$(apt-cache pkgnames realpath)" ] && DEPENDENCIES=( ${DEPENDENCIES[@]//realpath/coreutils} ) UPDATEPKGLIST="add-apt-repository -y ppa:ondrej/php; apt-get update" @@ -144,7 +142,7 @@ function autoConfigure() INETDCFGDIR=/etc/xinetd.d elif [ -f /etc/redhat-release ]; then # Distribución basada en paquetes rpm. - DEPENDENCIES=( curl rsync btrfs-progs procps-ng arp-scan gettext moreutils jq net-tools udpcast libev-devel jansson-devel openssl-devel shim-x64 grub2-efi-x64 grub2-efi-x64-modules gawk libdbi-devel libdbi libdbi-dbd-mysql) + DEPENDENCIES=( curl rsync btrfs-progs procps-ng arp-scan gettext moreutils jq net-tools udpcast libev-devel jansson-devel openssl-devel shim-x64 grub2-efi-x64 grub2-efi-x64-modules gawk libdbi-devel libdbi libdbi-dbd-mysql automake) # Repositorios para PHP 7 en CentOS. [ "$OSDISTRIB" == "centos" ] && UPDATEPKGLIST="yum update -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-$OSVERSION.noarch.rpm http://rpms.remirepo.net/enterprise/remi-release-$OSVERSION.rpm" INSTALLPKGS="yum install -y" @@ -972,9 +970,27 @@ function updateServerFiles() if ! diff -q $WORKDIR/opengnsys/admin/Sources/Services/opengnsys.init /etc/init.d/opengnsys 2>/dev/null; then echoAndLog "${FUNCNAME}(): updating new init file" backupFile /etc/init.d/opengnsys + service="opengnsys" + $STOPSERVICE cp -a $WORKDIR/opengnsys/admin/Sources/Services/opengnsys.init /etc/init.d/opengnsys + systemctl daemon-reload + $STARTSERVICE NEWFILES="$NEWFILES /etc/init.d/opengnsys" fi + if ! diff -q \ + $WORKDIR/opengnsys/admin/Sources/Services/opengnsys.service \ + /lib/systemd/system/opengnsys.service 2>/dev/null; then + echoAndLog "${FUNCNAME}(): updating new service file" + backupFile /lib/systemd/system/opengnsys.service + service="opengnsys" + $STOPSERVICE + cp -a \ + $WORKDIR/opengnsys/admin/Sources/Services/opengnsys.service \ + /lib/systemd/system/opengnsys.service + systemctl daemon-reload + $STARTSERVICE + NEWFILES="$NEWFILES /lib/systemd/system/opengnsys.service" + fi if ! diff -q $WORKDIR/opengnsys/admin/Sources/Services/opengnsys.default /etc/default/opengnsys >/dev/null; then echoAndLog "${FUNCNAME}(): updating new default file" backupFile /etc/default/opengnsys @@ -987,12 +1003,6 @@ function updateServerFiles() done < $WORKDIR/opengnsys/admin/Sources/Services/opengnsys.default NEWFILES="$NEWFILES /etc/default/opengnsys" fi - if egrep -q "(UrlMsg=.*msgbrowser.php)|(UrlMenu=http://)" $INSTALL_TARGET/client/etc/ogAdmClient.cfg 2>/dev/null; then - echoAndLog "${FUNCNAME}(): updating new client config file" - backupFile $INSTALL_TARGET/client/etc/ogAdmClient.cfg - perl -pi -e 's!UrlMsg=.*msgbrowser\.php!UrlMsg=http://localhost/cgi-bin/httpd-log\.sh!g; s!UrlMenu=http://!UrlMenu=https://!g' $INSTALL_TARGET/client/etc/ogAdmClient.cfg - NEWFILES="$NEWFILES $INSTALL_TARGET/client/etc/ogAdmClient.cfg" - fi echoAndLog "${FUNCNAME}(): updating cron files" [ ! -f /etc/cron.d/torrentcreator ] && echo "* * * * * root [ -x $INSTALL_TARGET/bin/torrent-creator ] && $INSTALL_TARGET/bin/torrent-creator" > /etc/cron.d/torrentcreator @@ -1029,11 +1039,13 @@ function moveNewService() # Comparar los ficheros. if ! diff -q $1 $2/$(basename $1) &>/dev/null; then # Parar los servicios si fuese necesario. - [ -z "$NEWSERVICES" ] && service="opengnsys" $STOPSERVICE + service="opengnsys" + [ -z "$NEWSERVICES" ] && $STOPSERVICE # Nuevo servicio. NEWSERVICES="$NEWSERVICES $(basename $1)" # Mover el nuevo fichero de servicio mv $1 $2 + $STARTSERVICE fi } @@ -1046,7 +1058,7 @@ function compileServices() # Compilar OpenGnsys Server echoAndLog "${FUNCNAME}(): Recompiling OpenGnsys Admin Server" pushd $WORKDIR/opengnsys/admin/Sources/Services/ogAdmServer - make && moveNewService ogAdmServer $INSTALL_TARGET/sbin + autoreconf -fi && ./configure && make && moveNewService ogAdmServer $INSTALL_TARGET/sbin if [ $? -ne 0 ]; then echoAndLog "${FUNCNAME}(): error while compiling OpenGnsys Admin Server" hayErrores=1 @@ -1054,25 +1066,11 @@ function compileServices() popd # Parar antiguo servicio de repositorio. pgrep ogAdmRepo > /dev/null && service="ogAdmRepo" $STOPSERVICE - # Compilar OpenGnsys Agent - echoAndLog "${FUNCNAME}(): Recompiling OpenGnsys Server Agent" - pushd $WORKDIR/opengnsys/admin/Sources/Services/ogAdmAgent - make && moveNewService ogAdmAgent $INSTALL_TARGET/sbin - if [ $? -ne 0 ]; then - echoAndLog "${FUNCNAME}(): error while compiling OpenGnsys Server Agent" - hayErrores=1 - fi - popd + # Remove OpenGnsys Agent (ogAdmAgent) + echoAndLog "${FUNCNAME}(): deleting deprecated OpenGnsys Agent" + [ -e $INSTALL_TARGET/sbin/ogAdmAgent ] && \ + rm -f $INSTALL_TARGET/sbin/ogAdmAgent - # Compilar OpenGnsys Client - echoAndLog "${FUNCNAME}(): Recompiling OpenGnsys Client" - pushd $WORKDIR/opengnsys/admin/Sources/Clients/ogAdmClient - make && mv ogAdmClient $INSTALL_TARGET/client/bin - if [ $? -ne 0 ]; then - echoAndLog "${FUNCNAME}(): error while compiling OpenGnsys Client" - hayErrores=1 - fi - popd # Generar un API token de ogAdmServer si no existe en el fichero de configuración. grep -q "APITOKEN=" $INSTALL_TARGET/etc/ogAdmServer.cfg || \ $INSTALL_TARGET/bin/settoken -f @@ -1138,6 +1136,30 @@ function updateClient() fi } +# Update ogClient +function updateOgClient() +{ + local ogclientUrl="https://codeload.github.com/opengnsys/ogClient/zip/$BRANCH" + + echoAndLog "${FUNCNAME}(): downloading ogClient code..." + + if ! (curl "${ogclientUrl}" -o ogclient.zip && \ + unzip -qo ogclient.zip) + then + errorAndLog "${FUNCNAME}(): "\ + "error getting ogClient code from ${ogclientUrl}" + return 1 + fi + if [ -e $INSTALL_TARGET/client/ogClient/cfg/ogclient.json ]; then + rm -f ogClient-"$BRANCH"/cfg/ogclient.json + fi + mv -f "ogClient-$BRANCH" $INSTALL_TARGET/client/ogClient + rm -f ogclient.zip + echoAndLog "${FUNCNAME}(): ogClient code was downloaded and updated" + + return 0 +} + # Comprobar permisos y ficheros. function checkFiles() { @@ -1330,6 +1352,12 @@ if [ $? -ne 0 ]; then exit 1 fi +# Update ogClient +if ! updateOgClient; then + errorAndLog "Error updating ogClient files" + exit 1 +fi + # Comprobar permisos y ficheros. checkFiles diff --git a/server/bin/checkperms b/server/bin/checkperms index b7559e84..c03f88bf 100755 --- a/server/bin/checkperms +++ b/server/bin/checkperms @@ -48,8 +48,6 @@ chown -R $OPENGNSYS_USER:$OPENGNSYS_USER $OPENGNSYS_DIR/client/etc/ssl/private chmod -R go-rwx $OPENGNSYS_DIR/client/etc/ssl/private chown $OPENGNSYS_USER:$OPENGNSYS_USER $OPENGNSYS_DIR/client/interfaceAdm/CambiarAcceso chmod 700 $OPENGNSYS_DIR/client/interfaceAdm/CambiarAcceso -chown root:root $OPENGNSYS_DIR/etc/ogAdmAgent*.cfg -chmod 600 $OPENGNSYS_DIR/etc/ogAdmAgent*.cfg chown root:$APACHE_GROUP $OPENGNSYS_DIR/{www/controlacceso*.php,etc/ogAdmRepo*.cfg,etc/ogAdmServer*.cfg} chmod 640 $OPENGNSYS_DIR/{www/controlacceso*.php,etc/ogAdmRepo*.cfg,etc/ogAdmServer*.cfg} chown -R $APACHE_USER:$APACHE_GROUP $OPENGNSYS_DIR/www/images/{fotos,iconos} diff --git a/server/bin/setserveraddr b/server/bin/setserveraddr index 18ee8c6a..203e095b 100755 --- a/server/bin/setserveraddr +++ b/server/bin/setserveraddr @@ -33,7 +33,7 @@ source $OPENGNSYS/lib/ogfunctions.sh || exit 1 [ "$USER" != "root" ] && raiseError access "Need to be root" [ $# -ne 1 ] && raiseError usage [ -r $DEFAULTFILE ] || raiseError access "Cannot read default configuration file" -for f in $OPENGNSYS/{etc/{ogAdmServer,ogAdmRepo,ogAdmAgent}.cfg,www/controlacceso.php,client/etc/ogAdmClient.cfg}; do +for f in $OPENGNSYS/{etc/{ogAdmServer,ogAdmRepo}.cfg,www/controlacceso.php,client/ogClient/cfg/ogclient.json}; do [ -w $f ] || raiseError access "Cannot write to file: $f" done @@ -88,7 +88,7 @@ if [ -n "$SERVERIP" ]; then OLDSERVERIP=$ServidorAdm # Checking if configuration files need to be modified. CHANGE=0 - for f in $OPENGNSYS/{etc/{ogAdmServer,ogAdmRepo,ogAdmAgent}.cfg,www/controlacceso.php,client/etc/ogAdmClient.cfg}; do + for f in $OPENGNSYS/{etc/{ogAdmServer,ogAdmRepo}.cfg,www/controlacceso.php}; do # Updating configuration variables (if URL does not contain "localhost"). sed -e "s,\(ServidorAdm\|IPlocal\)=.*,\1=$SERVERIP," \ -e "s,^INTERFACE=.*,INTERFACE=$SERVERDEV," \ @@ -105,6 +105,10 @@ if [ -n "$SERVERIP" ]; then # Processing when something has changed. if [ $CHANGE == 1 ]; then + # Config ogClient. + IP_PATTERN="[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" + sed -i -e "s/$IP_PATTERN/$SERVERIP/g" \ + "$OPENGNSYS"/client/ogClient/cfg/ogclient.json # Restart OpenGnsys services. echo "Restarting services..." restart opengnsys >/dev/null |