mirror of https://git.48k.eu/ogserver
parent
f4e7832656
commit
cf7bbdac90
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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) );})
|
||||
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue