1 | //**************************************************************************************************************************************************** |
---|
2 | // Aplicación OpenGNSys |
---|
3 | // Autor: José Manuel Alonso. |
---|
4 | // Licencia: Open Source |
---|
5 | // Fichero: ogAdmServer.cpp |
---|
6 | // Descripción: |
---|
7 | // Este módulo de la aplicación OpenGNSys implementa las comunicaciones con el Servidor. |
---|
8 | // **************************************************************************************************************************************************** |
---|
9 | #include <sys/types.h> |
---|
10 | #include <sys/socket.h> |
---|
11 | #include <netinet/in.h> |
---|
12 | #include <arpa/inet.h> |
---|
13 | #include <stdio.h> |
---|
14 | #include <stdlib.h> |
---|
15 | #include <string.h> |
---|
16 | #include <errno.h> |
---|
17 | #include <unistd.h> |
---|
18 | #include <time.h> |
---|
19 | #include <ctype.h> |
---|
20 | #include </usr/include/mysql/mysql.h> |
---|
21 | #include <pthread.h> |
---|
22 | #include "Database.h" |
---|
23 | |
---|
24 | #define LONGITUD_PARAMETROS 4000 // Longitud m�ima de la informaci� de la trama (parametros) |
---|
25 | #define LONGITUD_TRAMA LONGITUD_PARAMETROS+11 // Longitud m�ima de la trama completa |
---|
26 | #define MAXCMD_PARAMETROS 200 // M�imo numero de par�etros de una trama de comandos |
---|
27 | #define MAXIMOS_SOCKETS 4000 // M�imo numero de conexiones con ordenadores clientes |
---|
28 | #define MAXIMOS_SRVRMB 200 // Maximo numero de servidores rembo |
---|
29 | #define MAXLON_PARAMETROSIPH 3000 // M�ima longitud de un parametro iph |
---|
30 | |
---|
31 | #define MAX_INTERFACE_LIST 20 |
---|
32 | #define MAX_NUM_CSADDRS 20 |
---|
33 | |
---|
34 | #define MAXHARDWARE 30 // mÁXIMOS ELEMENTOS HARDSWARE A DETECTAR |
---|
35 | |
---|
36 | #define PUERTOMINUSER 40000 |
---|
37 | #define PUERTOMAXUSER 60000 |
---|
38 | |
---|
39 | #define LITAMBITO_CENTROS "centros" |
---|
40 | #define LITAMBITO_GRUPOSAULAS "gruposaulas" |
---|
41 | #define LITAMBITO_AULAS "aulas" |
---|
42 | #define LITAMBITO_GRUPOSORDENADORES "gruposordenadores" |
---|
43 | #define LITAMBITO_ORDENADORES "ordenadores" |
---|
44 | |
---|
45 | #define ACCION_EXITOSA "1" // Finalizada con exito |
---|
46 | #define ACCION_FALLIDA "2" // Finalizada con errores |
---|
47 | #define ACCION_TERMINADA "3" // Finalizada manualmente con indicacion de exito |
---|
48 | #define ACCION_ABORTADA "4" // Finalizada manualmente con indicacion de errores |
---|
49 | #define ACCION_SINERRORES "5" // Activa y sin ningn error |
---|
50 | #define ACCION_CONERRORES "6" // Activa y con algn error |
---|
51 | |
---|
52 | #define ACCION_DETENIDA "0" // Acci� momentanemente parada |
---|
53 | #define ACCION_INICIADA "1" // Acci� activa |
---|
54 | #define ACCION_FINALIZADA "2" // Accion finalizada |
---|
55 | |
---|
56 | #define PROCESOS 0x01 |
---|
57 | |
---|
58 | #define EJECUCION_PROCEDIMIENTO 0x0000 // Accion Procedimiento |
---|
59 | #define EJECUCION_COMANDO 0x0001 // Accion Comando |
---|
60 | #define EJECUCION_TAREA 0x0002 // Accion Tarea |
---|
61 | #define EJECUCION_TRABAJO 0x0003 // Accion Trabajo |
---|
62 | |
---|
63 | #define EJECUTOR_servidorHIDRA 0x0001 // Ejecutor Servidor hidra |
---|
64 | #define EJECUTOR_clienteREMBO 0x0002 // Ejecutor cliente rembo |
---|
65 | #define EJECUTOR_servidorREMBO 0x0003 // Ejecutor Servidor rembo |
---|
66 | |
---|
67 | #define CLIENTE_REMBO "RMB" // Sistema operativo Rembo |
---|
68 | #define CLIENTE_OCUPADO "BSY" // Cliente ocupado |
---|
69 | #define CLIENTE_APAGADO "OFF" // Cliente apagado |
---|
70 | #define CLIENTE_INICIANDO "INI" // Cliente iniciando |
---|
71 | |
---|
72 | #define AUTOINCORPORACION_OFF 0x0000 // Los ordenadores no se pueden dar de alta autm�icamente |
---|
73 | #define AUTOINCORPORACION_ONA 0x0001 // Los ordenadores se pueden dar de alta autom�icamente si existe el aula |
---|
74 | #define AUTOINCORPORACION_ONX 0x0002 // Los ordenadores se pueden dar de alta autom�icamente y si no existe el aula la crea |
---|
75 | |
---|
76 | #define MAX_NUM_CSADDRS 20 |
---|
77 | #define MAX_INTERFACE_LIST 20 |
---|
78 | |
---|
79 | #define TRUE 1 |
---|
80 | #define FALSE 0 |
---|
81 | |
---|
82 | #define true 1 |
---|
83 | #define false 0 |
---|
84 | |
---|
85 | #define SOCKET_ERROR (-1) |
---|
86 | #define INVALID_SOCKET (SOCKET)(~0) |
---|
87 | |
---|
88 | // __________________________________________________________________________________________________________ |
---|
89 | typedef unsigned long DWORD; |
---|
90 | typedef unsigned short WORD; |
---|
91 | typedef int BOOLEAN; |
---|
92 | typedef char BYTE; |
---|
93 | typedef int SOCKET; |
---|
94 | // __________________________________________________________________________________________________________ |
---|
95 | |
---|
96 | char szPathFileLog[128],szPathFileCfg[128],msglog[250]; |
---|
97 | FILE *FLog,*Fconfig; |
---|
98 | char AulaUp[2]; |
---|
99 | int aulaup; // Switch para permitir que un ordenador se de de alta autom�icamente en un aula existenta |
---|
100 | // Valores: |
---|
101 | // 0: El ordenador No se da de alta autom�icamente en un aula |
---|
102 | // 1: El ordenador se da de alta en un aula si existe |
---|
103 | // 2: El ordenador se da de alta en un aula si existe y si no existe la crea para darse de alta |
---|
104 | |
---|
105 | char IPlocal[20]; // Ip local |
---|
106 | char servidorhidra[20]; // IP servidor HIDRA |
---|
107 | char Puerto[20]; // Puerto Unicode |
---|
108 | int puerto; // Puerto |
---|
109 | char usuario[20]; |
---|
110 | char pasguor[20]; |
---|
111 | char datasource[20]; |
---|
112 | char catalog[50]; |
---|
113 | |
---|
114 | typedef struct{ // Estructura de la trama recibida |
---|
115 | char arroba; // Caracter arroba siempre |
---|
116 | char identificador[9]; // Identificador de la trama, siempre JMMLCAMDJ: |
---|
117 | char ejecutor; // Identificador del encargado de ejecutar la funci� ( 1= Servidor 2=Cliente rembo: |
---|
118 | char parametros[LONGITUD_PARAMETROS]; // Contenido de la trama (par�etros) |
---|
119 | }TRAMA; |
---|
120 | |
---|
121 | struct s_socketCLRMB{ // Estructura usada para guardar informaci� de los clientes |
---|
122 | char ip[16]; // IP del cliente |
---|
123 | char estado[4]; // Tipo de sistema Operativo del cliente "RMB"=rembo,"W98"=windows98,"W2K"=windows 2000, etc |
---|
124 | SOCKET sock; // Socket por el que se comunica |
---|
125 | char ipsrvdhcp[16]; // IP del servidor dhcp |
---|
126 | char ipsrvrmb[16]; // IP del servidor rembo |
---|
127 | }; |
---|
128 | struct s_socketCLRMB tbsockets[MAXIMOS_SOCKETS]; |
---|
129 | |
---|
130 | struct s_socketSRVRMB{ // Estructura usada para guardar informaci� de los servidores REMBO |
---|
131 | char ip[16]; // IP del servidor rembo |
---|
132 | int puertorepo; |
---|
133 | char ipes[MAXLON_PARAMETROSIPH]; // IP de los clientes rembo |
---|
134 | int swenv; // Switch de envio |
---|
135 | |
---|
136 | }; |
---|
137 | struct s_socketSRVRMB tbsocketsSRVRMB[MAXIMOS_SRVRMB]; |
---|
138 | |
---|
139 | static pthread_mutex_t guardia; // Controla acceso exclusivo de hebras |
---|
140 | |
---|
141 | // Prototipo de funciones |
---|
142 | void* GestionaConexion(void*); |
---|
143 | void gestiona_comando(SOCKET s,TRAMA trama); |
---|
144 | int manda_comando(SOCKET sock,char* parametros); |
---|
145 | int manda_trama(SOCKET sock,TRAMA* trama); |
---|
146 | int recibe_trama(SOCKET sock,TRAMA* trama); |
---|
147 | int manda_trama_servidorrembo(char* ,char *,int); |
---|
148 | |
---|
149 | SOCKET UDPConnect(char *); |
---|
150 | int envia_comandos(SOCKET ,TRAMA* , char* ,int); |
---|
151 | |
---|
152 | |
---|
153 | int hay_hueco(int *); |
---|
154 | BOOLEAN cliente_existente(char *,int*); |
---|
155 | int hay_huecoservidorrembo(int *); |
---|
156 | BOOLEAN servidorrembo_existente(char *,int*); |
---|
157 | BOOLEAN IgualIP(char*,char*); |
---|
158 | |
---|
159 | void INTROaFINCAD(char* ); |
---|
160 | void FINCADaINTRO(char*,char*); |
---|
161 | |
---|
162 | int cuenta_ipes(char*); |
---|
163 | char * toma_parametro(const char*,char *); |
---|
164 | char * corte_iph(char *); |
---|
165 | |
---|
166 | int respuesta_cortesia(SOCKET ); |
---|
167 | int NoComandosPendientes(SOCKET); |
---|
168 | int Coloca_estado(char *,const char *,SOCKET); |
---|
169 | int actualiza_configuracion(Database , Table ,char* ,int,int ,char* ); |
---|
170 | int actualiza_hardware(Database , Table ,char* ,char* ,char*); |
---|
171 | int CuestrionPerfilHardware(Database , Table ,int ,char* ,int *,int ,char*); |
---|
172 | void TomaParticiones(char*, char* ,int ); |
---|
173 | int Toma_menu(Database,Table,char*,int,int); |
---|
174 | int RecuperaItem(SOCKET,char *); |
---|
175 | int ComandosPendientes(SOCKET ,char *); |
---|
176 | int procesaCOMANDOS(SOCKET ,char *); |
---|
177 | int DisponibilidadComandos(SOCKET ,char *); |
---|
178 | |
---|
179 | int InclusionClienteHIDRA(SOCKET,char *); |
---|
180 | int inclusion_srvRMB(char *,int); |
---|
181 | int inclusion_REPO(SOCKET,char *); |
---|
182 | int inclusion_cliWINLNX(SOCKET ,char *); |
---|
183 | |
---|
184 | int Sondeo(SOCKET ,char *); |
---|
185 | int Arrancar(char *); |
---|
186 | int Actualizar(char *); |
---|
187 | int FicheroOperador(char *); |
---|
188 | int IconoItem(TRAMA*); |
---|
189 | int Conmutar(char *); |
---|
190 | int RenovarItems(char *); |
---|
191 | |
---|
192 | SOCKET AbreConexion(char *,int); |
---|
193 | void RegistraLog(const char *,int); |
---|
194 | |
---|
195 | void PurgarTablaSockets(char *); |
---|
196 | int borra_entrada(int); |
---|
197 | int RESPUESTA_Arrancar(SOCKET ,char *); |
---|
198 | int RESPUESTA_Apagar(SOCKET ,char *); |
---|
199 | int RESPUESTA_RemboOffline(SOCKET ,char *); |
---|
200 | int RESPUESTA_Reiniciar(SOCKET ,char *); |
---|
201 | int RESPUESTA_Actualizar(SOCKET,char *); |
---|
202 | int RESPUESTA_ExecShell(SOCKET ,char *); |
---|
203 | int RespuestaEstandar(char *,char *,char *,char*,Database, Table); |
---|
204 | int RESPUESTA_CrearPerfilSoftware(SOCKET ,char *); |
---|
205 | int RESPUESTA_CrearSoftwareIncremental(SOCKET,char *); |
---|
206 | int RESPUESTA_RestaurarImagen(SOCKET,char *); |
---|
207 | int RESPUESTA_ParticionaryFormatear(SOCKET ,char *); |
---|
208 | int RESPUESTA_Configurar(SOCKET ,char *); |
---|
209 | int RESPUESTA_TomaConfiguracion(SOCKET ,char *); |
---|
210 | int RESPUESTA_TomaHardware(SOCKET ,char *); |
---|
211 | |
---|
212 | int RESPUESTA_inclusionREPO(TRAMA*); |
---|
213 | |
---|
214 | int Actualiza_ordenador_imagen(char *,const char *,char *,Database); |
---|
215 | |
---|
216 | int busca_comandos(char* ,char*,char *,int *); |
---|
217 | int InsertaNotificaciones(int,int,int,char *,Database); |
---|
218 | int comprueba_resultados(int ,Database ); |
---|
219 | int comprueba_finalizada(int ,char *,Database ); |
---|
220 | |
---|
221 | void EnviaServidoresRembo(char*); |
---|
222 | void DesmarcaServidoresRembo(void); |
---|
223 | void MarcaServidoresRembo(char*,char*); |
---|
224 | |
---|
225 | int EjecutarItem(SOCKET,char *); |
---|
226 | BOOLEAN TomaIPServidorRembo(char*,int*); |
---|
227 | |
---|
228 | void envia_tarea(char* ); |
---|
229 | int EjecutarTarea(int ,int ,int ,int , Database,char * ); |
---|
230 | int EjecutarTrabajo(int ,Database,char * ); |
---|
231 | int cuestion_nuevoordenador(Database,Table ,int*,char *,char *,char *,char *,char*,char*,char*); |
---|
232 | int alta_ordenador(Database db,Table tbl,int*,char *,char *,char*,int,int,int); |
---|
233 | int Toma_idservidorres(Database ,Table ,char*,char*,int*,int*); |
---|
234 | |
---|
235 | void cambiacarac(char *,char , char ); |
---|
236 | int TomaConfiguracion(char* ); |
---|
237 | int split_parametros(char **,char *, char *); |
---|
238 | struct tm * TomaHora(); |
---|