summaryrefslogtreecommitdiffstats
path: root/admin/Sources/Services/ogAdmBoot
diff options
context:
space:
mode:
Diffstat (limited to 'admin/Sources/Services/ogAdmBoot')
-rw-r--r--admin/Sources/Services/ogAdmBoot/Makefile44
-rw-r--r--admin/Sources/Services/ogAdmBoot/ogAdmBoot.cfg8
-rw-r--r--admin/Sources/Services/ogAdmBoot/sources/ogAdmBoot.cpp1264
-rw-r--r--admin/Sources/Services/ogAdmBoot/sources/ogAdmBoot.h262
4 files changed, 0 insertions, 1578 deletions
diff --git a/admin/Sources/Services/ogAdmBoot/Makefile b/admin/Sources/Services/ogAdmBoot/Makefile
deleted file mode 100644
index 78a7e88d..00000000
--- a/admin/Sources/Services/ogAdmBoot/Makefile
+++ /dev/null
@@ -1,44 +0,0 @@
-# makefile
-
-# Nombre del proyecto
-PROYECTO := ogAdmBoot
-
-# Directorio de instalación
-INSTALL_DIR := /opt/opengnsys
-
-# Opciones de compilacion
-CFLAGS := $(shell mysql_config --cflags)
-CFLAGS += -O0 -g -Wall -I../../Includes # Depuracion
-#CFLAGS += -O3 -I../../Includes # Optimizacion
-CPPFLAGS := $(CFLAGS)
-
-# Opciones de linkado
-LDFLAGS := -Wl,--no-as-needed $(shell mysql_config --libs) -lpthread
-
-# Ficheros objetos
-OBJS := ../includes/Database.o sources/ogAdmBoot.o
-
-
-all: $(PROYECTO)
-
-$(PROYECTO): $(OBJS)
- g++ $(LDFLAGS) $(OBJS) -o $(PROYECTO)
-# strip $(PROYECTO) # Optimizacion
-
-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) -I ../includes -c -o"$@" "$<"
-
-sources/%.o: sources/%.c
- gcc $(CFLAGS) -I ../includes -c -o"$@" "$<"
-
-
diff --git a/admin/Sources/Services/ogAdmBoot/ogAdmBoot.cfg b/admin/Sources/Services/ogAdmBoot/ogAdmBoot.cfg
deleted file mode 100644
index 5a33b513..00000000
--- a/admin/Sources/Services/ogAdmBoot/ogAdmBoot.cfg
+++ /dev/null
@@ -1,8 +0,0 @@
-IPLocal=SERVERIP
-USUARIO=usuog
-PASSWORD=passusuog
-datasource=localhost
-CATALOG=ogAdmBD
-router=10.1.12.1
-mascara=255.255.252.0
-
diff --git a/admin/Sources/Services/ogAdmBoot/sources/ogAdmBoot.cpp b/admin/Sources/Services/ogAdmBoot/sources/ogAdmBoot.cpp
deleted file mode 100644
index 03468d5b..00000000
--- a/admin/Sources/Services/ogAdmBoot/sources/ogAdmBoot.cpp
+++ /dev/null
@@ -1,1264 +0,0 @@
-// ********************************************************************************************************
-// Servicio: ogAdmBoot
-// Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla
-// Fecha Creación: Julio-2010
-// Fecha Última modificación: Julio-2010
-// Nombre del fichero: ogAdmBoot.cpp
-// Descripción :Este fichero implementa el servicio dhcp y tftp propios del sistema
-// ********************************************************************************************************
-#include "ogAdmBoot.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);
-
- IPlocal[0] = (char) NULL; //inicializar variables globales
- usuario[0] = (char) NULL;
- pasguor[0] = (char) NULL;
- datasource[0] = (char) NULL;
- catalog[0] = (char) NULL;
- router[0] = (char) NULL;
- mascara[0] = (char) NULL;
-
- numlin = splitCadena(lineas, buffer, '\n');
- for (i = 0; i < numlin; i++) {
- splitCadena(dualparametro, lineas[i], '=');
- resul = strcmp(StrToUpper(dualparametro[0]), "IPLOCAL");
- if (resul == 0)
- strcpy(IPlocal, 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]);
- resul = strcmp(StrToUpper(dualparametro[0]), "ROUTER");
- if (resul == 0)
- strcpy(router, dualparametro[1]);
- resul = strcmp(StrToUpper(dualparametro[0]), "MASCARA");
- if (resul == 0)
- strcpy(mascara, dualparametro[1]);
- }
- if (IPlocal[0] == (char) NULL) {
- errorLog(modulo, 4, FALSE); // Falta parámetro IPLOCAL
- 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: ServicioDHCP
-//
-// Descripción:
-// Esta hebra implementa el servicio DHCP
-// _____________________________________________________________________________________________________________
-
-LPVOID ServicioDHCP(LPVOID ipl)
-{
- SOCKET socket_s; // Socket donde escucha el servidor
- struct TramaDhcpBootp * trmInfo;
- struct sockaddr_in local;
- int ret,resul;
- BOOLEAN bOpt;
- pthread_t hThread;
- char modulo[]="ServicioDHCP()";
-
- socket_s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // Crea socket para UDP
- if (socket_s == SOCKET_ERROR){
- errorLog(modulo,61, TRUE);
- return(FALSE);
- }
- local.sin_addr.s_addr = htonl(INADDR_ANY); // selecciona interface
- local.sin_family = AF_INET;
- local.sin_port = htons(PUERTODHCPORIGEN); // Puerto
-
- // Enlaza socket
- if (bind(socket_s,(struct sockaddr *)&local,sizeof(local)) == SOCKET_ERROR){
- errorLog(modulo,62, TRUE);
- return(FALSE);
- }
-
- bOpt=TRUE; // Pone el socket en modo "soportar Broadcast"
- ret=setsockopt(socket_s,SOL_SOCKET,SO_BROADCAST,(char *)&bOpt,sizeof(bOpt));
- if (ret == SOCKET_ERROR){
- errorLog(modulo,48, TRUE);
- return(FALSE);
- }
- while(true){
- trmInfo = (struct TramaDhcpBootp*)malloc(sizeof(struct TramaDhcpBootp)); // Crea estructura de control para hebra
- if (trmInfo == NULL){
- errorLog(modulo,64, FALSE);
- return(FALSE);
- }
- // Inicializa parámetros
- memset(trmInfo,0,sizeof(struct TramaDhcpBootp));
- trmInfo->sockaddrsize = sizeof(trmInfo->cliente);
- trmInfo->sck=socket_s;
- // Espera tramas DHCP
- ret = recvfrom(trmInfo->sck,(char *)&trmInfo->pckDchp, sizeof(trmInfo->pckDchp),0,(struct sockaddr *)&trmInfo->cliente, &trmInfo->sockaddrsize);
- if (ret == SOCKET_ERROR){
- errorLog(modulo,65, TRUE);
- return(FALSE);
- }
- else{
- if (ret>0){
- resul=pthread_create(&hThread,NULL,GestionaServicioDHCP,(LPVOID)trmInfo);
- if(resul!=0){
- errorLog(modulo,66,TRUE);
- return(FALSE);
- }
- pthread_detach(hThread);
- }
- }
- }
- close(socket_s);
-}
-// _____________________________________________________________________________________________________________
-// Función: ServicioBOOTP
-//
-// Descripción:
-// Esta hebra implementa el servicio BOOTP
-// _____________________________________________________________________________________________________________
-
-LPVOID ServicioBOOTP(LPVOID iplocal)
-{
- SOCKET socket_s; // Socket donde escucha el servidor
- struct TramaDhcpBootp * trmInfo;
- struct sockaddr_in local;
- int ret,resul;
- pthread_t hThread;
- char modulo[]="ServicioBOOTP()";
-
- socket_s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // Crea socket para UDP
- if (socket_s == SOCKET_ERROR){
- errorLog(modulo,67, TRUE);
- return(FALSE);
- }
- local.sin_addr.s_addr = htonl(INADDR_ANY); // selecciona interface
- local.sin_family = AF_INET;
- local.sin_port = htons(PUERTOBOOTPORIGEN); // Puerto
-
- // Enlaza socket
- if (bind(socket_s,(struct sockaddr *)&local,sizeof(local)) == SOCKET_ERROR){
- errorLog(modulo,68, TRUE);
- return(FALSE);
- }
- while(true){
- trmInfo = (struct TramaDhcpBootp*)malloc(sizeof(struct TramaDhcpBootp)); // Crea estructura de control para hebra
- if (trmInfo == NULL){
- errorLog(modulo,69, FALSE);
- return(FALSE);
- }
- // Inicializa parámetros
- memset(trmInfo,0,sizeof(struct TramaDhcpBootp));
- trmInfo->sockaddrsize = sizeof(trmInfo->cliente);
- trmInfo->sck=socket_s;
- // Espera tramas BOOTP
- ret = recvfrom(trmInfo->sck,(char *)&trmInfo->pckDchp, sizeof(trmInfo->pckDchp),0,(struct sockaddr *)&trmInfo->cliente, &trmInfo->sockaddrsize);
-
- if (ret == SOCKET_ERROR){
- errorLog(modulo,70, TRUE);
- return(FALSE);
- }
- else{
- if (ret>0){
- resul=pthread_create(&hThread,NULL,GestionaServicioBOOTP,(LPVOID)trmInfo);
- if(resul!=0){
- errorLog(modulo,71, TRUE);
- return(FALSE);
- }
- pthread_detach(hThread);
- }
- }
- }
- close(socket_s);
-}
-// _____________________________________________________________________________________________________________
-// Función: ServicioTFTP
-//
-// Descripción:
-// Esta hebra implementa el servicio TFTP
-// _____________________________________________________________________________________________________________
-
-LPVOID ServicioTFTP(LPVOID ipl)
-{
- SOCKET socket_s; // Socket donde escucha el servidor
- struct TramaTftp * trmInfo;
- struct sockaddr_in local;
- pthread_t hThread;
- int ret,resul;
- char modulo[]="ServicioTFTP()";
-
- socket_s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // Crea socket para UDP
- if (socket_s == SOCKET_ERROR){
- errorLog(modulo,72, TRUE);
- return(FALSE);
- }
- local.sin_addr.s_addr = htonl(INADDR_ANY); // selecciona interface
- local.sin_family = AF_INET;
- local.sin_port = htons(PUERTOTFTPORIGEN); // Puerto
-
- // Enlaza socket
- if (bind(socket_s,(struct sockaddr *)&local,sizeof(local)) == SOCKET_ERROR){
- errorLog(modulo,73, TRUE);
- return(FALSE);
- }
- while(true){
- trmInfo = (struct TramaTftp*)malloc(sizeof(struct TramaTftp)); // Crea estructura de control para hebra
- if (trmInfo == NULL){
- errorLog(modulo,74, FALSE);
- return(FALSE);
- }
- memset(trmInfo,0,sizeof(struct TramaTftp));
- trmInfo->sockaddrsize = sizeof(trmInfo->cliente);
- // Espera tramas TFTP
- ret = recvfrom(socket_s,(char *)&trmInfo->pckTftp, sizeof(trmInfo->pckTftp),0,(struct sockaddr *)&trmInfo->cliente,&trmInfo->sockaddrsize);
- if (ret == SOCKET_ERROR){
- errorLog(modulo,75, TRUE);
- return(FALSE);
- }
- else{
- if (ret>0){
- resul=pthread_create(&hThread,NULL,GestionaServicioTFTP,(LPVOID)trmInfo);
- if(resul!=0){
- errorLog(modulo,76, TRUE);
- return(FALSE);
- }
- pthread_detach(hThread);
- }
- }
-
- }
- close(socket_s);
-}
-//________________________________________________________________________________________________________
-// Función: GestionaServicioDHCP
-//
-// Descripción:
-// Gestiona la conexiónn con un cliente que sea Hidra para el servicio DHCP
-// Parámetros:
-// lpParam: Puntero a la estructura de control para la conversacion DHCP
-// Devuelve:
-// TRUE: Si el proceso es correcto
-// FALSE: En caso de ocurrir algún error
-//________________________________________________________________________________________________________
-LPVOID GestionaServicioDHCP(LPVOID lpParam)
-{
- struct TramaDhcpBootp * trmInfo=(struct TramaDhcpBootp *)lpParam;
- char IPCliente[16]; // Ip del cliente
- char MACCliente[16]; // Mac del cliente
-
- if(!OpcionesPresentes(trmInfo->pckDchp.magiccookie)) // Comprueba que existen opciones en la trama Dhcp
- return(false);
- strcpy(IPCliente,inet_ntoa(trmInfo->cliente.sin_addr));
- if(strcmp(IPCliente,"0.0.0.0")!=0){ // El cliente tiene una IP concreta distinta de 0.0.0.0
- if(!ClienteExistente(trmInfo,IPCliente,1)){ // Comprueba que se trata de un cliente Hidra
- free(trmInfo);
- return(false);
- }
- }
- else{
- sprintf(MACCliente,"%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x",(unsigned int)trmInfo->pckDchp.chaddr[0],(unsigned int)trmInfo->pckDchp.chaddr[1],(unsigned int)trmInfo->pckDchp.chaddr[2],(unsigned int)trmInfo->pckDchp.chaddr[3],(unsigned int)trmInfo->pckDchp.chaddr[4],(unsigned int)trmInfo->pckDchp.chaddr[5]);
- if(!ClienteExistente(trmInfo,MACCliente,0)){ // Comprueba que se trata de un cliente Hidra (Por la Mac)
- free(trmInfo);
- return(false);
- }
- }
- if(OpcionPXEClient(&trmInfo->pckDchp)) // Comprueba que sea un cliente PXE
- ProcesaTramaClientePXE(trmInfo); // Procesa DHCP para el protocolo PXE
- else
- ProcesaTramaClienteDHCP(trmInfo); // Procesa DHCP de cliente Windows o Linux
-
- free(trmInfo);
- return(false);
-}
-//_______________________________________________________________________________________________________________
-//
-// Gestiona la conexion con un cliente que sea Hidra para el servicio BOOTP
-// Parámetros:
-// lpParam: Puntero a la estructura de control para la conversacion BOOTP
-//_______________________________________________________________________________________________________________
-LPVOID GestionaServicioBOOTP(LPVOID lpParam)
-{
- struct TramaDhcpBootp * trmInfo=(struct TramaDhcpBootp *)lpParam;
- char IPCliente[16]; // Ip del cliente
-
- if(!OpcionesPresentes(trmInfo->pckDchp.magiccookie)) // Comprueba que existen opciones en la trama Dhcp
- return(false);
-
- strcpy(IPCliente,inet_ntoa(trmInfo->cliente.sin_addr));
- if(!ClienteExistente(trmInfo,IPCliente,1)) // Comprueba que se trata de un cliente Hidra
- return(false);
-
- if(OpcionPXEClient(&trmInfo->pckDchp)) // Comprueba que sea un cliente PXE
- ProcesaTramaClienteBOOTP(trmInfo); // Procesa DHCP para el protocolo PXE
-
- free(trmInfo);
- return(trmInfo);
-}
-//_______________________________________________________________________________________________________________
-//
-// Comprueba si la IP del cliente está en la base de datos de Hidra
-// Parámetros:
-// trmInfo: Puntero a la estructura de control de la conversacin DHCP
-// ipmac: IP o MAC del cliente que ha abierto la hebra
-// sw: Si vale 1 o 2 o 3 el parámetro anterior ser una IP en caso contrario ser una MAC
-//
-// Devuelve:
-// true: Si el cliente est en la base de datos
-// false: En caso contrario
-//
-// Comentarios:
-// Slo se procesarn mensages dhcp de clientes hidra.
-//_______________________________________________________________________________________________________________
-int ClienteExistente(struct TramaDhcpBootp *trmInfo,char* ipmac,int sw)
-{
- char sqlstr[1000],ErrStr[200];
- Database db;
- Table tbl;
- char wrouter[LONPRM];
- char wmascara[LONPRM];
- /////////////////////////////////////////////////////////////////////////
- // ACCESO atnico A TRAVEZ DE OBJETO MUTEX a este trozo de cnigo
- pthread_mutex_lock(&guardia);
-
- // Abre conexion con base de datos
- if(!db.Open(usuario,pasguor,datasource,catalog)){ // error de conexion
- db.GetErrorErrStr(ErrStr);
- return(false);
- }
-
- if(sw==1 || sw==2){ // Bsqueda por IP
- sprintf(sqlstr,"SELECT ip,router,mascara FROM ordenadores WHERE ip='%s' ",ipmac);
- }
- else{ // Bsqueda por MAC
- sprintf(sqlstr,"SELECT ip,router,mascara FROM ordenadores WHERE mac='%s' ",ipmac);
- }
- if(!db.Execute(sqlstr,tbl)){ // Error al leer
- db.GetErrorErrStr(ErrStr);
- db.Close();
- pthread_mutex_unlock(&guardia);
- return(false);
- }
-
- if(tbl.ISEOF()){ // No existe el cliente
- db.Close();
- pthread_mutex_unlock(&guardia);
- return(false);
- }
- if(sw==1 || sw==0){ // Sólo para las tramas dhcp PXE y BOOTP
- if(!tbl.Get("ip",trmInfo->bdIP)){ // Incorpora la IP a asignar al cliente a la estructura de control
- tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
- db.Close();
- pthread_mutex_unlock(&guardia);
- return(false);
- }
- if(!tbl.Get("router",wrouter)){ // Toma la configuración router del cliente
- tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
- db.Close();
- pthread_mutex_unlock(&guardia);
- return(false);
- }
- if(strlen(wrouter)>0)
- strcpy(oProuter,wrouter);
- else
- strcpy(oProuter,router);
-
- if(!tbl.Get("mascara",wmascara)){ // Toma la configuración router del cliente
- tbl.GetErrorErrStr(ErrStr); // error al acceder al registro
- db.Close();
- pthread_mutex_unlock(&guardia);
- return(false);
- }
- if(strlen(wmascara)>0)
- strcpy(oPmascara,wmascara);
- else
- strcpy(oPmascara,mascara);
- }
- db.Close();
- pthread_mutex_unlock(&guardia);
- ////////////////////////////////////////////////////////////////////////////////
- return(true);
-}
-//_______________________________________________________________________________________________________________
-//
-// Comprueba que existen opciones en el mensage dhcp analizando la magic cookie
-// Parámetros:
-// mc: Puntero al primer elemento de la magic cookie (primer campo de las opciones)
-//
-// Devuelve:
-// true: Si esta presenta el valor 99..130.83.99
-// false: En caso contrario
-//_______________________________________________________________________________________________________________
-int OpcionesPresentes(unsigned char *mc)
-{
- if(mc[0]!=0x63) return(false);
- if(mc[1]!=0x82) return(false);
- if(mc[2]!=0x53) return(false);
- if(mc[3]!=0x63) return(false);
-
- // Magic Cookie presente
- return(true);
-}
-//_______________________________________________________________________________________________________________
-//
-// Busca una determinada opción dentro de la trama dhcp
-// Parámetros:
-// dhcp_packet: Puntero a la estructura que contiene el mensaje dhcp
-// codop: Cdigo de la opción a buscar
-//
-// Devuelve:
-// Si existe, un puntero al primer elemento de la estructura de la opción (codigo,longitud,valor)
-// en caso contrario devuelve null
-//_______________________________________________________________________________________________________________
-unsigned char * BuscaOpcion(dhcp_packet* tDhcp,unsigned char codop)
-{
- unsigned char wcodop;
- unsigned char wlongitud;
- unsigned char *ptrOp,*ptrDhcp;
-
- ptrDhcp=(unsigned char*)tDhcp; // Se toma el puntero al principio del mensage
- ptrOp=(unsigned char*)&tDhcp->options[0]; // Se toma el puntero a las opciones
-
- while(ptrOp-ptrDhcp<DHCP_OPTION_LEN-4){
- wcodop = ptrOp[0];
- if(wcodop==DHCP_PAD)
- ptrOp++;
- else{
- if(wcodop==DHCP_END) // Fin de la cadena de opciones, no se encontr la opción
- return(NULL);
- else{
-
- if (wcodop == codop) // Encuentra la opción
- return(ptrOp); // Devuelve el puntero a la estructura variable opción
- else{
- wlongitud = ptrOp[1];
- ptrOp+=wlongitud+2; // Avanza hasta la prxima opción
- }
- }
- }
- }
- return(NULL);
-}
-//_______________________________________________________________________________________________________________
-//
-// Comprueba si el mensaje recibido proviene de un cliente PXE
-// Parámetros:
-// dhcp_packet: Puntero a la estructura que contiene el mensaje dhcp
-//
-// Devuelve:
-// true: Si el mensaje lo ha enviado un cliente PXE
-// false: En caso contrario
-//_______________________________________________________________________________________________________________
-int OpcionPXEClient(dhcp_packet* tDhcp)
-{
- if(!BuscaOpcion(tDhcp,DHCP_CLASS_IDENTIFIER))
- return(false);
- else
- return(true);
-}
-//_______________________________________________________________________________________________________________
-//
-// Procesa un mensaje DHCP recibido que proviene de un cliente PXE
-// Parámetros:
-// trmInfo: Puntero a la estructura de control de la conversacin DHCP
-//_______________________________________________________________________________________________________________
-void ProcesaTramaClientePXE(struct TramaDhcpBootp* trmInfo)
-{
- unsigned char codop;
- unsigned char longitud;
- unsigned char *ptrOp;
- unsigned char *msgDhcp;
- char modulo[]="ProcesaTramaClientePXE()";
-
- ptrOp=BuscaOpcion(&trmInfo->pckDchp,DHCP_MESSAGE_TYPE); // Puntero a la opción tipo de mensaje
- if(!ptrOp){ // No existe la opción DHCP
- errorLog(modulo,77, FALSE);
- return;
- }
- codop = ptrOp[0];
- longitud=ptrOp[1];
- msgDhcp=ptrOp+2; // Puntero al dato tipo de mensaje
- switch(*msgDhcp){
- case DHCPDISCOVER:
- dhcpDISCOVER_PXE(trmInfo);
- break;
- case DHCPREQUEST:
- dhcpREQUEST_PXE(trmInfo);
- break;
- }
-}
-//_______________________________________________________________________________________________________________
-//
-// Procesa un mensaje BOOTP recibido que proviene de un cliente PXE
-// Parámetros:
-// trmInfo: Puntero a la estructura de control de la conversacin BOOTP
-//_______________________________________________________________________________________________________________
-void ProcesaTramaClienteBOOTP(struct TramaDhcpBootp* trmInfo)
-{
- unsigned char codop;
- unsigned char longitud;
- unsigned char *ptrOp;
- unsigned char *msgDhcp;
- char modulo[]="ProcesaTramaClienteBOOTP()";
-
- ptrOp=BuscaOpcion(&trmInfo->pckDchp,DHCP_MESSAGE_TYPE); // Puntero a la opción tipo de mensaje
- if(!ptrOp){ // No existe la opción DHCP
- errorLog(modulo,77, FALSE);
- return;
- }
- codop = ptrOp[0];
- longitud=ptrOp[1];
- msgDhcp=ptrOp+2; // Puntero al dato tipo de mensaje
- switch(*msgDhcp){
- case DHCPREQUEST:
- bootpREQUEST_PXE(trmInfo);
- break;
- }
-}
-//_______________________________________________________________________________________________________________
-//
-// Gestiona la conexion con un cliente que sea Hidra para el servicio TFTP
-// Parámetros:
-// lpParam: Puntero a la estructura de control para la conversacion TFTP
-//_______________________________________________________________________________________________________________
-LPVOID GestionaServicioTFTP(LPVOID lpParam)
-{
- struct TramaTftp * trmInfo=(struct TramaTftp *)lpParam;
- char IPCliente[16]; // Ip del cliente
-
- strcpy(IPCliente,inet_ntoa(trmInfo->cliente.sin_addr));
- if(!ClienteExistente((struct TramaDhcpBootp*)trmInfo,IPCliente,2)) // Comprueba que se trata de un cliente Hidra
- return(false);
-
- // Inicializa parámetros
- trmInfo->sockaddrsize = sizeof(trmInfo->cliente);
- trmInfo->sck=TomaSocketUser();
- if(trmInfo->sck==INVALID_SOCKET) return(false); // Ha habido algn problama para crear el socket de usuario
-
- trmInfo->currentopCode=0x0000; // Cdigo de operación para detectar errores de secuencia
- trmInfo->bloquesize=512; // Tamao de bloque por defecto 512
- trmInfo->tsize=0; // Tamao del fichero
- trmInfo->interval=0; // Intervalo
-
- ProcesaTramaClienteTFTP(trmInfo); // Procesa TFTP para el protocolo PXE
- close(trmInfo->sck);
- free(trmInfo);
- return(trmInfo);
-}
-//_______________________________________________________________________________________________________________
-//
-// Procesa un mensaje TFTP recibido que proviene de un cliente PXE
-// Parámetros:
-// trmInfo: Puntero a la estructura de control de la conversacin TFTP
-//_______________________________________________________________________________________________________________
-void ProcesaTramaClienteTFTP(struct TramaTftp* trmInfo)
-{
- char *ptr;
- int bloque,lon,ret;
- char tam[20];
- struct tftppacket_ack* ptrack;
- char modulo[]="ProcesaTramaClienteTFTP()";
-
- while(true){
- switch(ntohs(trmInfo->pckTftp.opcode)){
- case TFTPRRQ: // Read Request
- if(trmInfo->currentopCode!=0x0000) return; // Error en la secuencia de operaciones
- if(!PeticionFichero(trmInfo)) return;
- fseek(trmInfo->fileboot,0,SEEK_SET);
- trmInfo->pckTftp.opcode= htons(TFTPOACK);
- trmInfo->currentopCode=TFTPOACK;
- ptr=&trmInfo->pckTftp.buffer[0];
- if(trmInfo->tsize>0){ // opción tsize
- strcpy(ptr,"tsize");
- ptr+=strlen(ptr)+1;
- //itoa(trmInfo->tsize,tam,10);
- sprintf(tam,"%d",trmInfo->tsize);
- strcpy(ptr,tam);
- ptr+=strlen(ptr)+1;
- *ptr=0x00;
- }
- else{
- if(trmInfo->bloquesize>0){ // opción blksize
- strcpy(ptr,"blksize");
- ptr+=strlen(ptr)+1;
- //itoa(trmInfo->bloquesize,tam,10);
- sprintf(tam,"%d",trmInfo->bloquesize);
- strcpy(ptr,tam);
- ptr+=strlen(ptr)+1;
- *ptr=0x00;
- }
- else
- trmInfo->bloquesize=512;
- }
-
- lon=ptr-(char*)&trmInfo->pckTftp;
- //ret=connect(trmInfo->sck,(struct sockaddr*)&trmInfo->cliente,trmInfo->sockaddrsize);
- //if (ret == SOCKET_ERROR){
- // RegistraLog("***connect() fallo:",true);
- // return;
- //}
- ret=sendto(trmInfo->sck,(char*)&trmInfo->pckTftp,lon,0,(struct sockaddr*)&trmInfo->cliente,trmInfo->sockaddrsize);
- //ret=send(trmInfo->sck,(char*)&trmInfo->pckTftp,lon,0);
- if (ret == SOCKET_ERROR){
- errorLog(modulo,26, TRUE);
- return;
- }
- break;
-
- case TFTPACK: //
- if(trmInfo->currentopCode!=TFTPOACK && trmInfo->currentopCode!=TFTPDATA) return; // Error en la secuencia de operaciones
- ptrack=(struct tftppacket_ack*)&trmInfo->pckTftp;
- bloque=ntohs(ptrack->block);
- trmInfo->currentopCode=TFTPDATA;
- ptrack->opcode=htons(TFTPDATA);
- bloque++;
- ptrack->block=htons(bloque);
- trmInfo->numblock=bloque;
- lon=fread(ptrack->buffer,1,trmInfo->bloquesize,trmInfo->fileboot);
- //ret=connect(trmInfo->sck,(struct sockaddr*)&trmInfo->cliente,trmInfo->sockaddrsize);
- //if (ret == SOCKET_ERROR){
- // RegistraLog("***connect() fallo:",true);
- // return;
- //}
- ret=sendto(trmInfo->sck,(char*)&trmInfo->pckTftp,lon+4,0,(struct sockaddr*)&trmInfo->cliente,trmInfo->sockaddrsize);
- //ret=send(trmInfo->sck,(char*)&trmInfo->pckTftp,lon+4,0);
- if (ret == SOCKET_ERROR){
- errorLog(modulo,26, TRUE);
- return;
- }
- if(lon==0)
- return; // Fin de la trama tftp
- break;
- case TFTPERROR:
- errorLog(modulo,78, TRUE);
- }
- ret = recvfrom(trmInfo->sck,(char *)&trmInfo->pckTftp, sizeof(trmInfo->pckTftp),0,(struct sockaddr *)&trmInfo->cliente,&trmInfo->sockaddrsize);
- if (ret == SOCKET_ERROR){
- errorLog(modulo,79, TRUE);
- return;
- }
- else
- if(ret==0) break;
- }
- return;
-}
-//_______________________________________________________________________________________________________________
-//
-// Procesa un mensaje Tftp de peticin de fichero. Recupera datos de tamao de bloque y otros parámetros
-// para gestionar la conversacin.
-//
-// Parámetros:
-// trmInfo: Puntero a la estructura de control de la conversacin TFTP
-//_______________________________________________________________________________________________________________
-int PeticionFichero(struct TramaTftp* trmInfo)
-{
- char *ptr;
- char nomfile[250];
-
- if(strncmp(trmInfo->pckTftp.buffer,"pxelinux.cfg",12)==0)
- strcpy(nomfile,"default");
- else
- strcpy(nomfile,trmInfo->pckTftp.buffer);
-
- trmInfo->currentopCode=ntohs(trmInfo->pckTftp.opcode); // Guarda código de operación
- // Localiza parámetros
- ptr=&trmInfo->pckTftp.buffer[0];
- ptr+=strlen(ptr)+1; // Avanza al campo siguiente al del nombre de fichero
- if(!strcmp(ptr,"octet")){ // Modo de apertura
- //trmInfo->fileboot=fopen(trmInfo->pckTftp.buffer,"rb");
- trmInfo->fileboot=fopen(nomfile,"rb");
- }
- else{
- //trmInfo->fileboot=fopen(trmInfo->pckTftp.buffer,"rt");
- trmInfo->fileboot=fopen(nomfile,"rt");
- }
- if(trmInfo->fileboot==NULL)
- return(false); // No existe el fichero boot
- ptr+=strlen(ptr)+1; // Paso al parámetro siguiente
- while(*ptr){
- if(strcmp(ptr,"blksize")==0){ // parámetro blksize
- ptr+=strlen(ptr) + 1;
- trmInfo->bloquesize=atoi(ptr);
- if(trmInfo->bloquesize<512) trmInfo->bloquesize=512;
- if(trmInfo->bloquesize>MAXBLOCK) trmInfo->bloquesize=512;
- ptr+=strlen(ptr) + 1;
- }
- else{
- if(strcmp(ptr,"tsize")==0){ // parámetro tsize
- ptr+=strlen(ptr) + 1;
- fseek(trmInfo->fileboot,0,SEEK_END);
- trmInfo->tsize=ftell(trmInfo->fileboot);
- ptr+=strlen(ptr) + 1;
- }
- else{
- if(strcmp(ptr,"interval")==0){ // Tamao de los bloques
- ptr+=strlen(ptr) + 1;
- trmInfo->interval=atoi(ptr);
- ptr+=strlen(ptr) + 1;
- }
- else
- return(false);
- }
-
- }
- }
- return(true);
-}
-//_______________________________________________________________________________________________________________
-//
-// Procesa un mensaje recibido que proviene de un cliente Hidra pero no en el momento de arranque con PXE
-// sino cuando arranca con algn S.O. como (Windows oLinux)
-//
-// Parámetros:
-// trmInfo: Puntero a la estructura de control de la conversacin DHCP
-//_______________________________________________________________________________________________________________
-void ProcesaTramaClienteDHCP(struct TramaDhcpBootp* trmInfo)
-{
- unsigned char codop;
- unsigned char longitud;
- unsigned char *ptrOp;
- unsigned char *msgDhcp;
- int ret;
- char modulo[]="ProcesaTramaClienteDHCP()";
-
- while(true){
- ptrOp=BuscaOpcion(&trmInfo->pckDchp,DHCP_MESSAGE_TYPE); // Puntero a la opción tipo de mensaje
- if(!ptrOp){ // No existe la opción DHCP
- errorLog(modulo,77, FALSE);
- return;
- }
- codop = ptrOp[0];
- longitud=ptrOp[1];
- msgDhcp=ptrOp+2; // Puntero al dato tipo de mensaje
-
- switch(*msgDhcp){
- case DHCPDISCOVER:
- dhcpDISCOVER_PXE(trmInfo);
- break;
- case DHCPREQUEST:
- dhcpREQUEST_PXE(trmInfo);
- break;
- }
- ret = recvfrom(trmInfo->sck,(char *)&trmInfo->pckDchp, sizeof(trmInfo->pckDchp),0,(struct sockaddr *)&trmInfo->cliente,&trmInfo->sockaddrsize);
- if (ret == SOCKET_ERROR){
- errorLog(modulo,80, TRUE);
- }
- else
- if(ret==0) break;
- }
-}
-//_______________________________________________________________________________________________________________
-//
-// Rellena el campo IP asignada(yiaddr) al cliente dentro del mensaje DHCP
-//
-// Parámetros:
-// trmInfo: Puntero a la estructura de control de la conversacin DHCP
-//_______________________________________________________________________________________________________________
-void RellenaIPCLiente(struct TramaDhcpBootp* trmInfo)
-{
- unsigned long aux;
-
- aux=inet_addr(trmInfo->bdIP); // Ip para el cliente
- memcpy((void*)&trmInfo->pckDchp.yiaddr,&aux,sizeof(aux));
-}
-//_______________________________________________________________________________________________________________
-//
-// Rellena el campo IP del servidor(siaddr) dentro del mensaje DHCP
-//
-// Parámetros:
-// trmInfo: Puntero a la estructura de control de la conversacin DHCP
-//_______________________________________________________________________________________________________________
-void RellenaIPServidor(struct TramaDhcpBootp* trmInfo)
-{
- unsigned long aux;
-
- aux=inet_addr(IPlocal); // Ip del servidor
- memcpy(&trmInfo->pckDchp.siaddr,&aux,sizeof(aux));
-}
-//_______________________________________________________________________________________________________________
-//
-// Rellena el campo nombre del servidor boot dentro del mensaje BOOTP
-//
-// Parámetros:
-// trmInfo: Puntero a la estructura de control de la conversacin BOOTP
-//_______________________________________________________________________________________________________________
-void RellenaNombreServidorBoot(struct TramaDhcpBootp* trmInfo)
-{
- char aux[100];
-
- strcpy(aux,"Hidra 2.0 PXE Boot Server");
- memcpy(&trmInfo->pckDchp.sname,&aux,25);
-}
-//_______________________________________________________________________________________________________________
-//
-// Rellena el campo nombre del fichero boot dentro del mensaje BOOTP
-//
-// Parámetros:
-// trmInfo: Puntero a la estructura de control de la conversacin BOOTP
-//_______________________________________________________________________________________________________________
-void RellenaNombreFicheroBoot(struct TramaDhcpBootp* trmInfo)
-{
- char aux[100];
-
- strcpy(aux,"pxelinux.0");
- memcpy(&trmInfo->pckDchp.file,&aux,25);
-}
-//_______________________________________________________________________________________________________________
-//
-// Procesa un mensaje DHCPDISCOVER
-//
-// Parámetros:
-// trmInfo: Puntero a la estructura de control de la conversacin DHCP
-//
-// Devuelve:
-// true: Si el mensaje se procesa correctamente
-// false: En caso contrario
-//_______________________________________________________________________________________________________________
-void dhcpDISCOVER_PXE(struct TramaDhcpBootp* trmInfo)
-{
- unsigned char *ptrOp,*ptrDhcp;
- int lon,ret;
- char modulo[]="dhcpDISCOVER_PXE()";
-
- ptrDhcp=(unsigned char*)&trmInfo->pckDchp; // Se toma el puntero al principio del mensage
- ptrOp=(unsigned char*)&trmInfo->pckDchp.options[0]; // Se toma el puntero a las opciones
- lon=ptrOp-ptrDhcp; //Longitud del mensaje sin las opciones ni la magic coockie
-
- RellenaIPCLiente(trmInfo);
- RellenaIPServidor(trmInfo);
- *ptrOp='\0'; //Borra opciones del mensaje recibido para colocar las nuevas
-
-
- AdjDHCPOFFER(&ptrOp,&lon); // Genera opción de Mensaje (0x35) dhcp valor 1
- AdjSERVERIDENTIFIER(&ptrOp,&lon); // Genera opción de Mensaje (0x36) Dhcp
- AdjLEASETIME(&ptrOp,&lon); // Genera opción de Mensaje (0x33) Dhcp
- AdjSUBNETMASK(&ptrOp,&lon); // Genera opción de Mensaje (0x01) Dhcp
- AdjROUTERS(&ptrOp,&lon); // Genera opción de Mensaje (0x03) Dhcp
- AdjCLASSIDENTIFIER(&ptrOp,&lon); // Genera opción de Mensaje (0x3c) Dhcp
- *ptrOp=DHCP_END;
- lon++;
- trmInfo->pckDchp.op=DHCPOFFER;
- //MandaRespuesta(&trmInfo->pckDchp,htonl(INADDR_BROADCAST),lon,htons(PUERTODHCPDESTINO));
- trmInfo->cliente.sin_addr.s_addr=htonl(INADDR_BROADCAST);
- ret=sendto(trmInfo->sck,(char*)&trmInfo->pckDchp,lon,0,(struct sockaddr*)&trmInfo->cliente,trmInfo->sockaddrsize);
- if (ret == SOCKET_ERROR){
- errorLog(modulo,26, TRUE);
- }
-}
-//_______________________________________________________________________________________________________________
-//
-// Procesa un mensaje DHCPREQUEST (DHCP)
-//
-// Parámetros:
-// trmInfo: Puntero a la estructura de control para la conversacin DHCP
-//
-// Devuelve:
-// true: Si el mensaje se procesa correctamente
-// false: En caso contrario
-//_______________________________________________________________________________________________________________
-void dhcpREQUEST_PXE(struct TramaDhcpBootp* trmInfo)
-{
- unsigned char * ptrOp,*ptrDhcp;
- struct dhcp_opcion;
- int lon,ret;
- char modulo[]="dhcpREQUEST_PXE()";
-
- ptrDhcp=(unsigned char*)&trmInfo->pckDchp; // Se toma el puntero al principio del mensage
- ptrOp=(unsigned char*)&trmInfo->pckDchp.options[0]; // Se toma el puntero a las opciones
- lon=ptrOp-ptrDhcp; //Longitud del mensaje sin las opciones ni la magic coockie
-
- RellenaIPCLiente(trmInfo);
- RellenaIPServidor(trmInfo);
- *ptrOp='\0'; //Borra opciones del mensaje recibido para colocar las nuevas
-
- AdjDHCPACK(&ptrOp,&lon); // Ge db.Close();nera opción de Mensaje (0x35) dhcp valor 5
- AdjSERVERIDENTIFIER(&ptrOp,&lon); // Genera opción de Mensaje (0x36) Dhcp
- AdjLEASETIME(&ptrOp,&lon); // Genera opción de Mensaje (0x33) Dhcp
- AdjSUBNETMASK(&ptrOp,&lon); // Genera opción de Mensaje (0x01) Dhcp
- AdjROUTERS(&ptrOp,&lon); // Genera opción de Mensaje (0x03) Dhcp
- AdjCLASSIDENTIFIER(&ptrOp,&lon); // Genera opción de Mensaje (0x3c) Dhcp
-
- *ptrOp=DHCP_END;
- lon++;
-
- trmInfo->pckDchp.op=DHCPOFFER;
- //MandaRespuesta(&trmInfo->pckDchp,htonl(INADDR_BROADCAST),lon,htons(PUERTODHCPDESTINO));
- trmInfo->cliente.sin_addr.s_addr=htonl(INADDR_BROADCAST);
- ret=sendto(trmInfo->sck,(char*)&trmInfo->pckDchp,lon,0,(struct sockaddr*)&trmInfo->cliente,trmInfo->sockaddrsize);
- if (ret == SOCKET_ERROR){
- errorLog(modulo,26, TRUE);
- }
-}
-//_______________________________________________________________________________________________________________
-//
-// Procesa un mensaje DHCPREQUEST (BOOTP)
-//
-// Parámetros:
-// trmInfo: Puntero a la estructura de control para la conversacin BOOTP
-//
-// Devuelve:
-// true: Si el mensaje se procesa correctamente
-// false: En caso contrario
-//_______________________________________________________________________________________________________________
-void bootpREQUEST_PXE(struct TramaDhcpBootp* trmInfo)
-{
- unsigned char * ptrOp,*ptrDhcp;
- struct dhcp_opcion;
- int lon,ret;
- unsigned long aux;
- char modulo[]="bootpREQUEST_PXE()";
-
- ptrDhcp=(unsigned char*)&trmInfo->pckDchp; // Se toma el puntero al principio del mensage
- ptrOp=(unsigned char*)&trmInfo->pckDchp.options[0]; // Se toma el puntero a las opciones
- lon=ptrOp-ptrDhcp; //Longitud del mensaje sin las opciones ni la magic coockie
-
- aux=inet_addr("0.0.0.0"); // Borra Ip del cliente ( No se porqu pero en la trama aparece as)
- memcpy(&trmInfo->pckDchp.ciaddr,&aux,4);
- RellenaNombreServidorBoot(trmInfo);
- RellenaNombreFicheroBoot(trmInfo);
-
- *ptrOp='\0'; //Borra opciones del mensaje recibido para colocar las nuevas
-
- AdjDHCPACK(&ptrOp,&lon); // Genera opción de Mensaje (0x35) dhcp valor 5
- AdjSERVERIDENTIFIER(&ptrOp,&lon); // Genera opción de Mensaje (0x36) Dhcp
- AdjBOOTSIZE(&ptrOp,&lon); // Genera opción de Mensaje (0x0D) Dhcp
- AdjCLASSIDENTIFIER(&ptrOp,&lon); // Genera opción de Mensaje (0x3c) Dhcp
-
- *ptrOp=DHCP_END;
- lon++;
-
- trmInfo->pckDchp.op=DHCPOFFER;
- //ret=connect(trmInfo->sck,(struct sockaddr*)&trmInfo->cliente,trmInfo->sockaddrsize);
- //if (ret == SOCKET_ERROR){
- // RegistraLog("***connect() fallo:",true);
- // return;
- //}
- //ret=send(trmInfo->sck,(char*)&trmInfo->pckDchp,lon,0);
- ret=sendto(trmInfo->sck,(char*)&trmInfo->pckDchp,lon,0,(struct sockaddr*)&trmInfo->cliente,trmInfo->sockaddrsize);
- if (ret == SOCKET_ERROR){
- errorLog(modulo,26,TRUE);
- return;
- }
-}
-//_______________________________________________________________________________________________________________
-//
-// Genera una opción del tipo 0x35(53) con el valor "Dhcp Offer" valor 2
-//
-// Devuelve:
-// Una estructura de opciones de dhcp(codigo,longitud,dato) con la opciones de Mensaje dhcp Offer
-//_______________________________________________________________________________________________________________
-void AdjDHCPOFFER(unsigned char* *ptrOp,int*lon)
-{
- **ptrOp=DHCP_MESSAGE_TYPE;
- *ptrOp+=1;
- **ptrOp=1;
- *ptrOp+=1;
- **ptrOp=DHCPOFFER;
- *ptrOp+=1;
- *lon+=3;
-}
-//_______________________________________________________________________________________________________________
-//
-// Genera una opción del tipo 0x35(53) con el valor "Dhcp Ack" valor 5
-//
-// Devuelve:
-// Una estructura de opciones de dhcp(codigo,longitud,dato) con la opciones de Mensaje dhcp Ack
-//_______________________________________________________________________________________________________________
-void AdjDHCPACK(unsigned char** ptrOp,int*lon)
-
-{
- **ptrOp=DHCP_MESSAGE_TYPE;
- *ptrOp+=1;
- **ptrOp=1;
- *ptrOp+=1;
- **ptrOp=DHCPACK;
- *ptrOp+=1;
- *lon+=3;
-}
-//_______________________________________________________________________________________________________________
-//
-// Genera una opción del tipo 0x03(3) con la IP del router
-//
-// Devuelve:
-// Una estructura de opciones de dhcp(codigo,longitud,dato) con la opciones de Ip del Routers
-//_______________________________________________________________________________________________________________
-void AdjROUTERS(unsigned char** ptrOp,int*lon)
-{
- unsigned long aux;
- aux=inet_addr(oProuter); // Router
-
- **ptrOp=DHCP_ROUTERS;
- *ptrOp+=1;
- **ptrOp=4;
- *ptrOp+=1;
- memcpy(*ptrOp,&aux,4); // Copia la Ip del router en la estructura
- *ptrOp+=4;
- *lon+=6;
-
-}
-//_______________________________________________________________________________________________________________
-//
-// Genera una opción del tipo 0x01(1) con la mascara de red
-//
-// Devuelve:
-// Una estructura de opciones de dhcp(codigo,longitud,dato) con la opciones de mscara de red
-//_______________________________________________________________________________________________________________
-void AdjSUBNETMASK(unsigned char** ptrOp,int*lon)
-{
- unsigned long aux;
- aux=inet_addr(oPmascara); // Mascara de red
-
- **ptrOp=DHCP_SUBNET_MASK;
- *ptrOp+=1;
- **ptrOp=4;
- *ptrOp+=1;
- memcpy(*ptrOp,&aux,4); // Copia la máscara de red
- *ptrOp+=4;
- *lon+=6;
-}
-//_______________________________________________________________________________________________________________
-//
-// Genera una opción del tipo 0x3c(60) con el literal "PXECLient" para clientes PXE
-//
-// Devuelve:
-// Una estructura de opciones de dhcp(codigo,longitud,dato) con la opciones de clase de cliente
-//_______________________________________________________________________________________________________________
-void AdjCLASSIDENTIFIER(unsigned char** ptrOp,int*lon)
-{
- **ptrOp=DHCP_CLASS_IDENTIFIER;
- *ptrOp+=1;
- **ptrOp=9;
- *ptrOp+=1;
- memcpy(*ptrOp,"PXEClient",9); // Copia el literal PXClient
- *ptrOp+=9;
- *lon+=11;
-}
-//_______________________________________________________________________________________________________________
-//
-// Genera una opción del tipo 0x36(54) con la IP del servidor
-//
-// Devuelve:
-// Una estructura de opciones de dhcp(codigo,longitud,dato) con la opciones de Ip del servidor
-//_______________________________________________________________________________________________________________
-void AdjSERVERIDENTIFIER(unsigned char** ptrOp,int*lon)
-{
- unsigned long aux;
- aux=inet_addr(IPlocal); // Ip del servidor
-
- **ptrOp=DHCP_SERVER_IDENTIFIER;
- *ptrOp+=1;
- **ptrOp=4;
- *ptrOp+=1;
- memcpy(*ptrOp,&aux,4); // Copia la Ip del ervidor en la estructura
- *ptrOp+=4;
- *lon+=6;
-
-}
-//_______________________________________________________________________________________________________________
-//
-// Genera una opción del tipo 0x33(51) con el tiempo de "lease" de la IP
-//
-// Devuelve:
-// Una estructura de opciones de dhcp(codigo,longitud,dato) con la opciones del "Lease Time"
-//_______________________________________________________________________________________________________________
-void AdjLEASETIME(unsigned char** ptrOp,int*lon)
-{
- unsigned long aux;
- aux=0x00006054; // tiempo en segundos
-
- **ptrOp=DHCP_LEASE_TIME;
- *ptrOp+=1;
- **ptrOp=4;
- *ptrOp+=1;
- memcpy(*ptrOp,&aux,4); // Copia el lease time en la estructura
- *ptrOp+=4;
- *lon+=6;
-}
-//_______________________________________________________________________________________________________________
-//
-// Genera una opción del tipo 0x0D(13) con el tiempo tamao del fichero boot
-//
-// Devuelve:
-// Una estructura de opciones de dhcp(codigo,longitud,dato) con la opciones del "Lease Time"
-//_______________________________________________________________________________________________________________
-void AdjBOOTSIZE(unsigned char** ptrOp,int*lon)
-{
- unsigned short aux;
- aux=0x0402; // Tamao en bytes
-
- **ptrOp=DHCP_BOOT_SIZE;
- *ptrOp+=1;
- **ptrOp=2;
- *ptrOp+=1;
- memcpy(*ptrOp,&aux,2); // Copia el tamao en la estructura
- *ptrOp+=2;
- *lon+=4;
-}
-//_______________________________________________________________________________________________________________
-//
-// Crea un socket en un puerto determinado para la conversacin de las distintas hebras
-//
-//_______________________________________________________________________________________________________________
-SOCKET TomaSocketUser()
-{
- SOCKET socket_c; // Socket para hebras (UDP)
- struct sockaddr_in cliente;
- int ret,puerto;
- BOOLEAN bOpt;
- char modulo[]="TomaSocketUser()";
-
- socket_c = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // Crea socket para UDP
-
- if (socket_c == SOCKET_ERROR){
- errorLog(modulo,81,TRUE);
- return(false);
- }
- cliente.sin_addr.s_addr = htonl(INADDR_ANY); // selecciona interface
- cliente.sin_family = AF_INET;
- puerto=PUERTOMINUSER;
- while(puerto<PUERTOMAXUSER){ // Busca puerto libre
- cliente.sin_port = htons(puerto); // Puerto asignado
- if (bind(socket_c,(struct sockaddr *)&cliente,sizeof(cliente)) == SOCKET_ERROR)
- puerto++;
- else
- break;
- }
- if(puerto>=PUERTOMAXUSER){ // No hay puertos libres
- errorLog(modulo,63, TRUE);
- return(INVALID_SOCKET);
- }
-
- bOpt=TRUE; // Pone el socket en modo "soportar Broadcast"
- ret=setsockopt(socket_c,SOL_SOCKET,SO_BROADCAST,(char *)&bOpt,sizeof(bOpt));
- if (ret == SOCKET_ERROR){
- errorLog(modulo,48, TRUE);
- return(INVALID_SOCKET);
- }
- return(socket_c);
-}
-//_______________________________________________________________________________________________________________
-void Pinta(dhcp_packet* tdp)
-{
- return;
- printf("\nop = %d htype = %d hlen = %d hops = %d",tdp -> op, tdp -> htype, tdp -> hlen, tdp -> hops);
- //printf ("\nxid = %x secs = %d flags = %x",tdp -> xid, tdp -> secs, tdp -> flags);
- printf ("\nciaddr = %s", inet_ntoa (tdp -> ciaddr));
- printf ("\nyiaddr = %s", inet_ntoa (tdp -> yiaddr));
- printf ("\nsiaddr = %s", inet_ntoa (tdp -> siaddr));
- printf ("\ngiaddr = %s", inet_ntoa (tdp -> giaddr));
- printf ("\nchaddr = %x:%x:%x:%x:%x:%x",((unsigned char *)(tdp -> chaddr)) [0],((unsigned char *)(tdp -> chaddr)) [1],((unsigned char *)(tdp -> chaddr)) [2],((unsigned char *)(tdp -> chaddr)) [3],((unsigned char *)(tdp -> chaddr)) [4],((unsigned char *)(tdp -> chaddr)) [5]);
- printf ("\nfilename = %s", tdp -> file);
- printf ("\nserver_name = %s", tdp -> sname);
-
- printf ("\n\n");
-}
-//***************************************************************************************************************
-// PROGRAMA PRINCIPAL
-//***************************************************************************************************************
-int main(int argc, char **argv)
-{
- pthread_t hThreadDHCP,hThreadBOOTP,hThreadTFTP;
- int resul;
- char modulo[] = "main()";
-
- /*--------------------------------------------------------------------------------------------------------
- Validación de parámetros de ejecución y lectura del fichero de configuración del servicio
- ---------------------------------------------------------------------------------------------------------*/
- if (!validacionParametros(argc, argv,4)) // Valida parámetros de ejecución
- exit(EXIT_FAILURE);
-
- if (!tomaConfiguracion(szPathFileCfg)) { // Toma parametros de configuracion
- exit(EXIT_FAILURE);
- }
-
- infoLog(1); // Inicio de sesión
-
- // Hebra servicio DHCP ---------------------------------
- resul=pthread_create(&hThreadDHCP,NULL,ServicioDHCP,(LPVOID)IPlocal);
- if(resul!=0){
- errorLog(modulo, 58, TRUE);
- exit(EXIT_FAILURE);
- }
- pthread_detach(hThreadDHCP);
-
-
- // Hebra servicio BOOTP ---------------------------------
- resul=pthread_create(&hThreadBOOTP,NULL,ServicioBOOTP,(LPVOID)IPlocal);
- if(resul!=0){
- errorLog(modulo,59,TRUE);
- exit(EXIT_FAILURE);
- }
- pthread_detach(hThreadBOOTP);
-
- // Hebra servicio TFTP ----------------------------------
- resul=pthread_create(&hThreadTFTP,NULL,ServicioTFTP,(LPVOID)IPlocal);
- if(resul!=0){
- errorLog(modulo,60,TRUE);
- exit(EXIT_FAILURE);
- }
- pthread_detach(hThreadTFTP);
-
- while (true)
- sleep(1000);
-
-}
diff --git a/admin/Sources/Services/ogAdmBoot/sources/ogAdmBoot.h b/admin/Sources/Services/ogAdmBoot/sources/ogAdmBoot.h
deleted file mode 100644
index ec6db36a..00000000
--- a/admin/Sources/Services/ogAdmBoot/sources/ogAdmBoot.h
+++ /dev/null
@@ -1,262 +0,0 @@
-// ********************************************************************************************************
-// Servicio: ogAdmBoot
-// Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla
-// Fecha Creación: Julio-2010
-// Fecha Última modificación: Julio-2010
-// Nombre del fichero: ogAdmBoot.cpp
-// Descripción :Este fichero implementa el servicio dhcp y tftp propios 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 <netinet/in.h>
-#include <arpa/inet.h>
-#include </usr/include/mysql/mysql.h>
-#include <pthread.h>
-#include "Database.h"
-#include "ogAdmLib.h"
-// _____________________________________________________________________________________________________________
-
-#define PUERTODHCPORIGEN 67
-#define PUERTODHCPDESTINO 68
-
-#define PUERTOBOOTPORIGEN 4011
-#define PUERTOBOOTPDESTINO 68
-
-#define PUERTOTFTPORIGEN 69
-
-#define PUERTOMINUSER 20000
-#define PUERTOMAXUSER 60000
-
-#define MAX_INTERFACE_LIST 20
-#define MAX_NUM_CSADDRS 20
-// _____________________________________________________________________________________________________________
-#define DHCP_UDP_OVERHEAD (20 + 8 ) // IP header + UDP header
-#define DHCP_SNAME_LEN 64
-#define DHCP_FILE_LEN 128
-#define DHCP_FIXED_NON_UDP 236
-#define DHCP_FIXED_LEN (DHCP_FIXED_NON_UDP + DHCP_UDP_OVERHEAD) // Longitud de la trama sin las opciones
-#define DHCP_MTU_MAX 1500
-#define DHCP_OPTION_LEN (DHCP_MTU_MAX - DHCP_FIXED_LEN)
-
-#define BOOTP_MIN_LEN 300
-#define DHCP_MIN_LEN 548
-
-struct dhcp_packet {
- unsigned char op; // Message opcode
- unsigned char htype; // Hardware addr type
- unsigned char hlen; // Hardware addr length
- unsigned char hops; // Number of relay agent hops from client
- unsigned long xid; // Transaction ID
- unsigned short secs; // Seconds since client started looking
- unsigned short flags; // Flag bits
- struct in_addr ciaddr; // Client IP address
- struct in_addr yiaddr; // Client IP address
- struct in_addr siaddr; // IP address of next server
- struct in_addr giaddr; // DHCP relay agent IP address
- unsigned char chaddr [16];// Client hardware address
- char sname[DHCP_SNAME_LEN]; // Server name
- char file[DHCP_FILE_LEN]; // Boot filename
- unsigned char magiccookie[4];
- unsigned char options [DHCP_OPTION_LEN-4]; // Optional parameters.
-};
-
-// Estructura genrica de una opcin DHCP
-struct dhcp_opcion {
- unsigned char codop;
- unsigned char tam;
- unsigned char dato;
-};
-
-// Cdigo de las distintas opciones DHCP
-#define DHCP_PAD 0
-#define DHCP_SUBNET_MASK 1
-#define DHCP_TIME_OFFSET 2
-#define DHCP_ROUTERS 3
-#define DHCP_TIME_SERVERS 4
-#define DHCP_NAME_SERVERS 5
-#define DHCP_DOMAIN_NAME_SERVERS 6
-#define DHCP_LOG_SERVERS 7
-#define DHCP_COOKIE_SERVERS 8
-#define DHCP_LPR_SERVERS 9
-#define DHCP_IMPRESS_SERVERS 10
-#define DHCP_RESOURCE_LOCATION_SERVERS 11
-#define DHCP_HOST_NAME 12
-#define DHCP_BOOT_SIZE 13
-#define DHCP_MERIT_DUMP 14
-#define DHCP_DOMAIN_NAME 15
-#define DHCP_SWAP_SERVER 16
-#define DHCP_ROOT_PATH 17
-#define DHCP_EXTENSIONS_PATH 18
-#define DHCP_IP_FORWARDING 19
-#define DHCP_NON_LOCAL_SOURCE_ROUTING 20
-#define DHCP_POLICY_FILTER 21
-#define DHCP_MAX_DGRAM_REASSEMBLY 22
-#define DHCP_DEFAULT_IP_TTL 23
-#define DHCP_PATH_MTU_AGING_TIMEOUT 24
-#define DHCP_PATH_MTU_PLATEAU_TABLE 25
-#define DHCP_INTERFACE_MTU 26
-#define DHCP_ALL_SUBNETS_LOCAL 27
-#define DHCP_BROADCAST_ADDRESS 28
-#define DHCP_PERFORM_MASK_DISCOVERY 29
-#define DHCP_MASK_SUPPLIER 30
-#define DHCP_ROUTER_DISCOVERY 31
-#define DHCP_ROUTER_SOLICITATION_ADDRESS 32
-#define DHCP_STATIC_ROUTES 33
-#define DHCP_TRAILER_ENCAPSULATION 34
-#define DHCP_ARP_CACHE_TIMEOUT 35
-#define DHCP_IEEE802_3_ENCAPSULATION 36
-#define DHCP_DEFAULT_TCP_TTL 37
-#define DHCP_TCP_KEEPALIVE_INTERVAL 38
-#define DHCP_TCP_KEEPALIVE_GARBAGE 39
-#define DHCP_NIS_DOMAIN 40
-#define DHCP_NIS_SERVERS 41
-#define DHCP_NTP_SERVERS 42
-#define DHCP_VENDOR_ENCAPSULATED_OPTIONS 43
-#define DHCP_NETBIOS_NAME_SERVERS 44
-#define DHCP_NETBIOS_DD_SERVER 45
-#define DHCP_NETBIOS_NODE_TYPE 46
-#define DHCP_NETBIOS_SCOPE 47
-#define DHCP_FONT_SERVERS 48
-#define DHCP_X_DISPLAY_MANAGER 49
-#define DHCP_REQUESTED_ADDRESS 50
-#define DHCP_LEASE_TIME 51
-#define DHCP_OPTION_OVERLOAD 52
-#define DHCP_MESSAGE_TYPE 53
-#define DHCP_SERVER_IDENTIFIER 54
-#define DHCP_PARAMETER_REQUEST_LIST 55
-#define DHCP_MESSAGE 56
-#define DHCP_MAX_MESSAGE_SIZE 57
-#define DHCP_RENEWAL_TIME 58
-#define DHCP_REBINDING_TIME 59
-#define DHCP_CLASS_IDENTIFIER 60
-#define DHCP_CLIENT_IDENTIFIER 61
-#define DHCP_USER_CLASS_ID 77
-#define DHCP_END 255
-
-// DHCP message types.
-#define DHCPDISCOVER 1
-#define DHCPOFFER 2
-#define DHCPREQUEST 3
-#define DHCPDECLINE 4
-#define DHCPACK 5
-#define DHCPNAK 6
-#define DHCPRELEASE 7
-#define DHCPINFORM 8
-
-// Estructura para trabajar en cada hebra con el cliente en cuestion
-struct TramaDhcpBootp{
- SOCKET sck;
- struct sockaddr_in cliente;
- socklen_t sockaddrsize;
- struct dhcp_packet pckDchp;
- char bdIP[16];
-};
-// _____________________________________________________________________________________________________________
-
-#define MAXBLOCK 4096
-
-
-// TFTP Cdigos de operacin.
-#define TFTPRRQ 1 // Read request.
-#define TFTPWRQ 2 // Write request
-#define TFTPDATA 3 // Read or write the next block of data.
-#define TFTPACK 4 // Confirnacin de bloque procesado
-#define TFTPERROR 5 // Error message
-#define TFTPOACK 6 // Option acknowledgment
-
-// Paquete TFTP genrico
-struct tftp_packet
-{
- WORD opcode;
- char buffer[MAXBLOCK+2];
-};
-// Paquete TFTP tipo ACK
-struct tftppacket_ack
-{
- WORD opcode;
- WORD block;
- char buffer[MAXBLOCK];
-};
-// Paquete TFTP tipo ERROR packet
-struct tftppacket_error
-{
- WORD opcode;
- WORD errorcode;
- char errormessage[508];
-};
-// Estructura para trabajar en cada hebra con el cliente en cuestion
-struct TramaTftp{
- SOCKET sck;
- struct sockaddr_in cliente;
- socklen_t sockaddrsize;
- struct tftp_packet pckTftp;
- FILE * fileboot;
- int bloquesize;
- int tsize;
- int interval;
- int numblock;
- unsigned short currentopCode;
-};
-//______________________________________________________
-static pthread_mutex_t guardia; // Controla acceso exclusivo de hebras
-//______________________________________________________
-char IPlocal[LONPRM];
-char usuario[LONPRM];
-char pasguor[LONPRM];
-char datasource[LONPRM];
-char catalog[LONPRM];
-char router[LONPRM];
-char mascara[LONPRM];
-
-char oProuter[LONPRM];
-char oPmascara[LONPRM];
-
-// Prototipo de funciones
-void RegistraLog(char *,int);
-int TomaParametrosReg();
-
-LPVOID ServicioDHCP(LPVOID);
-LPVOID ServicioBOOTP(LPVOID);
-LPVOID ServicioTFTP(LPVOID);
-LPVOID GestionaServicioDHCP(LPVOID);
-LPVOID GestionaServicioBOOTP(LPVOID);
-LPVOID GestionaServicioTFTP(LPVOID);
-
-int ClienteExistente(struct TramaDhcpBootp *,char*,int);
-int OpcionesPresentes(unsigned char *);
-unsigned char * BuscaOpcion(dhcp_packet* ,unsigned char );
-
-int OpcionPXEClient(dhcp_packet* );
-void ProcesaTramaClientePXE(struct TramaDhcpBootp* trmInfo);
-void ProcesaTramaClienteDHCP(struct TramaDhcpBootp* trmInfo);
-void ProcesaTramaClienteBOOTP(struct TramaDhcpBootp* trmInfo);
-void ProcesaTramaClienteTFTP(struct TramaTftp * trmInfo);
-
-void RellenaIPCLiente(struct TramaDhcpBootp*);
-void RellenaIPServidor(struct TramaDhcpBootp*);
-void dhcpDISCOVER_PXE(struct TramaDhcpBootp*);
-void dhcpREQUEST_PXE(struct TramaDhcpBootp*);
-void bootpREQUEST_PXE(struct TramaDhcpBootp*);
-
-int PeticionFichero(struct TramaTftp*);
-
-void AdjDHCPOFFER(unsigned char**,int*);
-void AdjDHCPACK(unsigned char**,int*);
-void AdjROUTERS(unsigned char** ,int*);
-void AdjSUBNETMASK(unsigned char**,int*);
-void AdjCLASSIDENTIFIER(unsigned char** ,int*);
-void AdjSERVERIDENTIFIER(unsigned char** ,int*);
-void AdjLEASETIME(unsigned char** ,int*);
-void AdjBOOTSIZE(unsigned char** ,int*);
-
-SOCKET TomaSocketUser();
-struct tm * TomaHora();
-int split_parametros(char **,char *, char *);
-void duerme(unsigned int );