summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
l---------admin/Database/ogAdmBD-1.1.0-1.1.1.sql1
l---------admin/Database/ogAdmBD-1.1.0-1.1.1b.sql1
-rw-r--r--admin/Database/ogAdmBD-1.1.0a-1.1.1b.sql (renamed from admin/Database/ogAdmBD-1.1.0a-1.1.1.sql)2
l---------admin/Database/ogAdmBD-1.1.1-1.2.0.sql1
l---------admin/Database/ogAdmBD-1.1.1a-1.2.0.sql1
-rw-r--r--admin/Database/ogAdmBD-1.1.1b-1.2.0.sql22
l---------admin/Database/ogAdmBD-1.1.1pre-1.1.1.sql1
l---------admin/Database/ogAdmBD-1.1.1pre-1.1.1b.sql1
-rw-r--r--admin/Database/ogAdmBD.sql2
-rwxr-xr-xadmin/Interface/CrearImagen8
-rw-r--r--admin/Sources/Clients/README.es.txt9
-rw-r--r--admin/Sources/Clients/ogAdmClient/Makefile31
-rw-r--r--admin/Sources/Clients/ogAdmClient/ogAdmClient.cfg5
-rw-r--r--admin/Sources/Clients/ogAdmClient/sources/ogAdmClient.c2331
-rw-r--r--admin/Sources/Clients/ogAdmClient/sources/ogAdmClient.h183
-rw-r--r--admin/Sources/Includes/Database.cpp203
-rw-r--r--admin/Sources/Includes/Database.h61
-rw-r--r--admin/Sources/Includes/ogAdmLib.c1074
-rw-r--r--admin/Sources/Includes/ogAdmLib.h319
-rw-r--r--admin/Sources/Services/ogAdmAgent/Makefile42
-rw-r--r--admin/Sources/Services/ogAdmAgent/ogAdmAgent.cfg7
-rw-r--r--admin/Sources/Services/ogAdmAgent/sources/ogAdmAgent.cpp914
-rw-r--r--admin/Sources/Services/ogAdmAgent/sources/ogAdmAgent.h81
-rw-r--r--admin/Sources/Services/ogAdmServer/Makefile38
-rw-r--r--admin/Sources/Services/ogAdmServer/Makefile.am9
-rw-r--r--admin/Sources/Services/ogAdmServer/configure.ac25
-rw-r--r--admin/Sources/Services/ogAdmServer/sources/list.h162
-rw-r--r--admin/Sources/Services/ogAdmServer/sources/ogAdmLib.c362
-rw-r--r--admin/Sources/Services/ogAdmServer/sources/ogAdmLib.h117
-rw-r--r--admin/Sources/Services/ogAdmServer/sources/ogAdmServer.c4345
-rw-r--r--admin/Sources/Services/ogAdmServer/sources/ogAdmServer.h9
-rw-r--r--admin/Sources/Services/ogAdmServer/sources/schedule.c470
-rw-r--r--admin/Sources/Services/ogAdmServer/sources/schedule.h48
-rw-r--r--admin/Sources/Services/ogAdmServer/sources/utils.c14
-rw-r--r--admin/Sources/Services/ogAdmServer/sources/utils.h6
-rw-r--r--admin/Sources/Services/ogAdmServer/tests/create_schedule.json1
-rwxr-xr-xadmin/Sources/Services/ogAdmServer/tests/run-tests.sh2
-rw-r--r--admin/Sources/Services/ogAdmServer/tests/task.json1
-rw-r--r--admin/Sources/Services/opengnsys.default2
-rwxr-xr-xadmin/Sources/Services/opengnsys.init20
-rw-r--r--admin/Sources/Services/opengnsys.service25
-rw-r--r--admin/WebConsole/comandos/gestores/gestor_Comandos.php34
-rw-r--r--admin/WebConsole/gestores/gestor_ejecutaracciones.php72
-rw-r--r--admin/WebConsole/gestores/gestor_ordenadores.php14
-rw-r--r--admin/WebConsole/gestores/gestor_programaciones.php61
-rw-r--r--admin/WebConsole/idiomas/php/cat/propiedades_ordenadores_cat.php7
-rw-r--r--admin/WebConsole/idiomas/php/eng/propiedades_ordenadores_eng.php7
-rw-r--r--admin/WebConsole/idiomas/php/esp/propiedades_ordenadores_esp.php6
-rw-r--r--admin/WebConsole/includes/comunes.php18
-rw-r--r--admin/WebConsole/includes/restfunctions.php126
-rw-r--r--admin/WebConsole/principal/aula.php123
-rw-r--r--admin/WebConsole/principal/aulas.php30
-rw-r--r--admin/WebConsole/propiedades/propiedades_ordenadores.php32
-rw-r--r--admin/WebConsole/varios/consulta_programaciones.php33
-rwxr-xr-xclient/shared/etc/init/default.sh5
-rwxr-xr-xinstaller/opengnsys_installer.sh58
-rwxr-xr-xinstaller/opengnsys_update.sh88
-rwxr-xr-xserver/bin/checkperms2
-rwxr-xr-xserver/bin/setserveraddr8
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 = &params->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, &params->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, &params->time.years);
+ params->flags |= OG_REST_PARAM_TIME_YEARS;
+ } else if (!strcmp(key, "months")) {
+ err = og_json_parse_uint(value, &params->time.months);
+ params->flags |= OG_REST_PARAM_TIME_MONTHS;
+ } else if (!strcmp(key, "weeks")) {
+ err = og_json_parse_uint(value, &params->time.weeks);
+ params->flags |= OG_REST_PARAM_TIME_WEEKS;
+ } else if (!strcmp(key, "week_days")) {
+ err = og_json_parse_uint(value, &params->time.week_days);
+ params->flags |= OG_REST_PARAM_TIME_WEEK_DAYS;
+ } else if (!strcmp(key, "days")) {
+ err = og_json_parse_uint(value, &params->time.days);
+ params->flags |= OG_REST_PARAM_TIME_DAYS;
+ } else if (!strcmp(key, "hours")) {
+ err = og_json_parse_uint(value, &params->time.hours);
+ params->flags |= OG_REST_PARAM_TIME_HOURS;
+ } else if (!strcmp(key, "am_pm")) {
+ err = og_json_parse_uint(value, &params->time.am_pm);
+ params->flags |= OG_REST_PARAM_TIME_AM_PM;
+ } else if (!strcmp(key, "minutes")) {
+ err = og_json_parse_uint(value, &params->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 = &params->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, &params, 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, &params->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,
+ &params->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, &params->task_id);
+ params->flags |= OG_REST_PARAM_TASK;
+ } else if (!strcmp(key, "name")) {
+ err = og_json_parse_string(value, &params->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, &params->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, &params->id);
+ params->flags |= OG_REST_PARAM_ID;
+ } else if (!strcmp(key, "task")) {
+ err = og_json_parse_string(value, &params->task_id);
+ params->flags |= OG_REST_PARAM_TASK;
+ } else if (!strcmp(key, "name")) {
+ err = og_json_parse_string(value, &params->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),
+ &params->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, &params->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,
+ &params->task_id);
+ } else if (!strcmp(key, "id")) {
+ err = og_json_parse_string(value, &params->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, &params, 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, &params);
+ } 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, &params);
+ } 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, &params);
+ } 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, &params);
+ } 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, &params);
+ } 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, &params, 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, &params, 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(&current->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, &current_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&ordm; de serie";
+$TbMsg["LABEL_SERIALNO"]="N&ordm; 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&eacute;";
$TbMsg[4951]="Cach&eacute; libre";
//AGP
$TbMsg['COMM_DEFOGLIVE']="Asignado por el administrador";
-$TbMsg["PROP_SERIALNO"]="N&ordm; de serie";
+$TbMsg["LABEL_SERIALNO"]="N&ordm; 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."'" .')" >&nbsp;&nbsp;'.$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">&nbsp;<?php echo $TbMsg["PROP_SERIALNO"]?>&nbsp;</th>
+ <th align="center">&nbsp;<?php echo $TbMsg["LABEL_SERIALNO"]?>&nbsp;</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">&nbsp;<?php echo $TbMsg["LABEL_LOCATION"] ?>&nbsp;</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>&nbsp;<?php echo $TbMsg[509]?>&nbsp;</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