#971 move ogAdmLib to ogAdmServer

Move remaining ogAdmLib code to ogAdmServer
master
OpenGnSys Support Team 2020-06-09 13:25:44 +02:00
parent f4e7832656
commit cf7bbdac90
4 changed files with 482 additions and 3 deletions

View File

@ -1,8 +1,9 @@
sbin_PROGRAMS = ogAdmServer
AM_CFLAGS = -I../../Includes ${LIBDBI_CFLAGS} ${LIBJANSSON_CFLAGS} ${LIBEVENT_CFLAGS} -g -Wall
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/utils.c \
sources/ogAdmLib.c

362
sources/ogAdmLib.c 100644
View File

@ -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);
}

117
sources/ogAdmLib.h 100644
View File

@ -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) );})

View File

@ -7,7 +7,6 @@
// 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"