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 Cliente. |
---|
8 | // **************************************************************************************************************************************************** |
---|
9 | #include <sys/types.h> |
---|
10 | #include <sys/wait.h> |
---|
11 | #include <arpa/inet.h> |
---|
12 | #include <stdio.h> |
---|
13 | #include <stdlib.h> |
---|
14 | #include <string.h> |
---|
15 | #include <errno.h> |
---|
16 | #include <unistd.h> |
---|
17 | #include <ctype.h> |
---|
18 | #include <time.h> |
---|
19 | #include <signal.h> |
---|
20 | |
---|
21 | #define LEER 0 |
---|
22 | #define ESCRIBIR 1 |
---|
23 | |
---|
24 | #define LONGITUD_SCRIPTSALIDA 4064 // Longitud máxima de la informacin devuelta por un script |
---|
25 | #define LONGITUD_PARAMETROS_TRAMA 4024 // Longitud máima de la informacin de la trama (parametros) |
---|
26 | #define LONGITUD_TRAMA LONGITUD_PARAMETROS_TRAMA+11 // Longitud máxima de la trama completa |
---|
27 | #define LONGITUD_CONFIGURACION 1024 // Longitud mxima de las configuraciones de particin |
---|
28 | #define MAX_NUM_CSADDRS 20 |
---|
29 | #define MAX_INTERFACE_LIST 20 |
---|
30 | #define MAXCNX 5 // Máximos intentos de conexión al servidor de Administración |
---|
31 | #define MAXITEMS 100 |
---|
32 | #define MAXHTMLMNU 4000 |
---|
33 | #define MAXPARTICIONES 24 |
---|
34 | #define MAXINFOSO 5 // Numero máximo de nemonicos enla inforamción del S.O. de una partición |
---|
35 | #define MAXARGS 16 // Numero máximo de argumentos enviados a un scripts |
---|
36 | #define LONSTD 512 // Longitud de memoria estandar |
---|
37 | #define LONSTDC 256 // Longitud de memoria estandar corta |
---|
38 | |
---|
39 | #define PUERTOMINUSER 20000 |
---|
40 | #define PUERTOMAXUSER 60000 |
---|
41 | |
---|
42 | #define TRUE 1 |
---|
43 | #define FALSE 0 |
---|
44 | |
---|
45 | #define true 1 |
---|
46 | #define false 0 |
---|
47 | |
---|
48 | #define SOCKET_ERROR (-1) |
---|
49 | #define INVALID_SOCKET (SOCKET)(~0) |
---|
50 | |
---|
51 | typedef unsigned short WORD; |
---|
52 | typedef int BOOL; |
---|
53 | typedef char BYTE; |
---|
54 | typedef int SOCKET; |
---|
55 | |
---|
56 | typedef struct{ // EstructUra de la trama recibida |
---|
57 | char arroba; // cabecera de la trama |
---|
58 | char identificador[9]; // identificador de la trama |
---|
59 | char ejecutor; // ejecutor de la trama 1=el servidor de admistración 2=el cliente 3=el repositorio |
---|
60 | char parametros[LONGITUD_PARAMETROS_TRAMA]; // Contenido de la trama (par?etros) |
---|
61 | }TRAMA; |
---|
62 | |
---|
63 | TRAMA trama[1]; |
---|
64 | |
---|
65 | char IPlocal[20]; // Ip local |
---|
66 | char Servidorhidra[20]; // IP servidor de Administración |
---|
67 | char Puerto[20]; // Puerto Unicode |
---|
68 | |
---|
69 | char szPathFileCfg[128]; |
---|
70 | char szPathFileLog[128]; |
---|
71 | |
---|
72 | //___________________________________________________________________________________________________ |
---|
73 | // Variables y estructuras |
---|
74 | //___________________________________________________________________________________________________ |
---|
75 | |
---|
76 | char cmdshell[LONSTD]; |
---|
77 | char parametros[LONSTD]; |
---|
78 | char* argumentos[MAXARGS]; |
---|
79 | char msglog[LONSTD]; |
---|
80 | char msgcon[LONSTD]; |
---|
81 | char filecmdshell[LONSTDC]; |
---|
82 | char urlpag[LONSTDC]; |
---|
83 | char fileini[LONSTDC]; |
---|
84 | char filecmd[LONSTDC]; |
---|
85 | |
---|
86 | struct excepcion { |
---|
87 | int herror; |
---|
88 | char msg[LONSTDC]; |
---|
89 | char modulo[LONSTDC]; |
---|
90 | }; |
---|
91 | struct excepcion e; |
---|
92 | |
---|
93 | int ndebug=1; // Nivel de debuger por defecto |
---|
94 | |
---|
95 | // Nemónicos |
---|
96 | int MsDos=1; |
---|
97 | int Win98=2; |
---|
98 | int Win2K=3; |
---|
99 | int WinXP=4; |
---|
100 | int Linux=5; |
---|
101 | |
---|
102 | BOOL PROCESO=true; // Indicador de la actividad del proceso principal |
---|
103 | BOOL CACHEEXISTS; // Indica si existe cache |
---|
104 | |
---|
105 | char HIDRACHEIMAGENES[LONSTDC]; // Path al directorio donde están las imágenes (en la caché) |
---|
106 | char HIDRASRVIMAGENES[LONSTDC]; // Path al directorio donde están las imágenes (en el repositorio) |
---|
107 | char HIDRASRVCMD[LONSTDC]; // Path del directorio del repositorio donde se depositan los comandos para el cliente |
---|
108 | char HIDRASCRIPTS[LONSTDC]; // Path al directorio donde están los scripts de la interface con la APi de funciones de OpenGnsys (en el cliente ) |
---|
109 | char URLMENU[LONSTDC]; // Url de la pagina de menu para el browser |
---|
110 | char URLMSG[LONSTDC]; // Url de la página de mensajed para el browser |
---|
111 | |
---|
112 | |
---|
113 | int HIDRAVER; // Versión de la apliación de Administración |
---|
114 | int TPAR ; // Tamaño de la particin |
---|
115 | |
---|
116 | SOCKET sock; // Socket |
---|
117 | |
---|
118 | struct s_CabMnu { |
---|
119 | char resolucion[2]; // Resolucin de pantalla |
---|
120 | char titulo[LONSTDC]; // Titulo del menu |
---|
121 | char coorx[4]; // Coordenada x |
---|
122 | char coory[4]; // Coordenada y |
---|
123 | char modalidad[2]; // modalidad ( numero de items por linea ) |
---|
124 | char scoorx[4]; // Coordenada x // Menu privado |
---|
125 | char scoory[4]; // Coordenada y |
---|
126 | char smodalidad[LONSTDC]; // modalidad ( numero de items por linea ) |
---|
127 | char htmmenupub[64]; // Nombre del fichero que contiene el html del menu (público) |
---|
128 | char htmmenupri[64]; // Nombre del fichero que contiene el html del menu (privado) |
---|
129 | } CabMnu; // Estructura con los datos de los menús |
---|
130 | |
---|
131 | BOOL swmnu=false; // Indicador de menu asignado |
---|
132 | |
---|
133 | struct s_Item{ |
---|
134 | char idaccionmenu[16]; // Identificador del item a ejecutar |
---|
135 | char urlimg[64]; // Nombre de la imagen de fonfo del botn |
---|
136 | char literal[LONSTDC]; // Literal del item |
---|
137 | char tipoitem[2]; // Tipo de otem ( público o privado) |
---|
138 | char tipoaccion[2]; // Tipo de accin que ejecuta el item |
---|
139 | } ; |
---|
140 | |
---|
141 | struct s_Propiedades { |
---|
142 | char idordenador[16]; // Identificador del ordenador |
---|
143 | char nombreordenador[64]; // Nombre del ordenador |
---|
144 | char idaula[16]; // Identificador del aula |
---|
145 | char servidorhidra[64]; // IP del servidor HUDRA |
---|
146 | char puerto[16]; // Puerto |
---|
147 | char iprepo[16]; // Direción IP repositorio |
---|
148 | char puertorepo[16]; // Puerto |
---|
149 | char idperfilhard[16]; // Identificador del perfil hardware |
---|
150 | char IPlocal[16]; |
---|
151 | char cache[16]; // Tamaño de la cache |
---|
152 | } Propiedades; // Estructura con los datos del odenador |
---|
153 | |
---|
154 | struct s_Particiones{ |
---|
155 | char tiposo[64]; // Tipo de sistema operativo |
---|
156 | char tipopart[16]; // Tipo de particin |
---|
157 | char tamapart[16]; // Tamao de la particin |
---|
158 | char numpart[5]; // Nmero de la particin |
---|
159 | char nombreso[64]; // Nombre del S.O. |
---|
160 | }; |
---|
161 | |
---|
162 | struct s_Hardware{ |
---|
163 | char nemonico[4]; // Tipo de sistema operativo |
---|
164 | char tipo[45]; // Tipo de hardware |
---|
165 | char codigovalor[256]; // Codigo o descripcion |
---|
166 | } |
---|
167 | ; |
---|
168 | struct tiposo { |
---|
169 | char *tipopart; |
---|
170 | char *tiposo; |
---|
171 | char *nombreso; |
---|
172 | }; |
---|
173 | |
---|
174 | char* tbPathImg[]={"CLIEN","CACHE","REPO"}; |
---|
175 | |
---|
176 | struct tiposo tiposos[] = { |
---|
177 | {"BIGDOS", "MsDos","MsDos"}, |
---|
178 | {"NTFS","Windows NT Platafom","Windows 2000,XP,2003"}, |
---|
179 | {"FAT32","Windows","Windos 98,SE,Millenium"}, |
---|
180 | {"EXT","Extendida","Extendida"}, |
---|
181 | {"EXT3","Linux","Linux"}, |
---|
182 | {"EXT2","Linux","Linux"}, |
---|
183 | {"VFAT","VFAT","VFAT"}, |
---|
184 | {"CACHE","CACHE","CACHE"}, |
---|
185 | {"UNKNOWN","UNKNOWN","UNKNOWN"}, |
---|
186 | {"EMPTY","Libre","Libre"}, |
---|
187 | {"LINUX-SWAP","","Linux-swap"}}; |
---|
188 | |
---|
189 | int ntiposo = sizeof (tiposos) / sizeof (struct tiposo); |
---|
190 | |
---|
191 | struct s_Item tbMenu[MAXITEMS]; // Tabla con los items del menu |
---|
192 | int contitems; // Contador items del menu |
---|
193 | |
---|
194 | BOOL PRCCMD; // Indicador de comandos interactivos |
---|
195 | BOOL CMDPTES; // Indicador de comandos pendientes |
---|
196 | |
---|
197 | //char modulo[64]; // Nombre de la funcin donde se produce el error |
---|
198 | |
---|
199 | BOOL aut = false; // Variable para controlar el acceso al menu de administracion |
---|
200 | |
---|
201 | pid_t pidmenu; |
---|
202 | |
---|
203 | char* tbErrores[]={"000-Se han generado errores. No se puede continuar la ejecución de este módulo",\ |
---|
204 | "001-No hay memoria suficiente para el buffer",\ |
---|
205 | "002-No se puede establecer conexión con el servidor de administración",\ |
---|
206 | "003-El fichero especificado no existe o bien no puede crearse o abrirse",\ |
---|
207 | "004-Comando Error",\ |
---|
208 | "005-El fichero est vacio",\ |
---|
209 | "006-Error en la ejecución del fichero autoexec",\ |
---|
210 | "007-Error en la recuperacion del Menu principal",\ |
---|
211 | "008-No hay espacio reservado para la cache en este disco",\ |
---|
212 | "009-Ha ocurrido algún error generando el perfil software",\ |
---|
213 | "010-IPlocal, NO se ha definido este parámetro",\ |
---|
214 | "011-IPhidra, NO se ha definido este parámetro",\ |
---|
215 | "012-Puerto, NO se ha definido este parámetro",\ |
---|
216 | "013-NO existe fichero de configuración o contiene un error de sintaxis",\ |
---|
217 | "014-Fallo de sintaxis en los parámetros: Debe especificar -f nombre_del_fichero_de_configuración",\ |
---|
218 | "015-No se ha podido crear socket para comunicación con el repositorio",\ |
---|
219 | "016-No se ha podido comunicar con el repositorio",\ |
---|
220 | "017-No existe Menu principal",\ |
---|
221 | "018-No se ha podido recuperar la configuración hardware del ordenador",\ |
---|
222 | "019-El cliente no se ha podido incluir en el sistema por un fallo en la conexión con el Servidor de Administración",\ |
---|
223 | "020-No se ha podido crear la carpeta en el repositorio",\ |
---|
224 | "021-Error en el envío de tramas al Servidor de Administración",\ |
---|
225 | "022-Error en la recepción de tramas desde el Servidor de Administración",\ |
---|
226 | "023-Error al crear Proceso Hijo para mostrar Menú",\ |
---|
227 | "024-Error desconocido",\ |
---|
228 | }; |
---|
229 | #define MAXERROR 24 // Error máximo cometido |
---|
230 | |
---|
231 | char* tbErroresScripts[]={"000-Se han generado errores. No se puede continuar la ejecución de este módulo",\ |
---|
232 | "001-Formato de ejecución incorrecto.",\ |
---|
233 | "002-Fichero o dispositivo no encontrado",\ |
---|
234 | "003-Error en partición de disco",\ |
---|
235 | "004- Partición o fichero bloqueado",\ |
---|
236 | "005-Error al crear o restaurar una imagen",\ |
---|
237 | "006-Sin sistema operativo",\ |
---|
238 | "007-Programa o función no ejecutable",\ |
---|
239 | "008-Error en la eliminación del archivo temporal de intercambio",\ |
---|
240 | "009-Error en la lectura del archivo temporal de intercambio",\ |
---|
241 | "010-Error al ejecutar código de la shell",\ |
---|
242 | "011-Error desconocido", |
---|
243 | }; |
---|
244 | #define MAXERRORSCRIPT 11 // Error máximo cometido |
---|
245 | |
---|
246 | // Prototipos de funciones |
---|
247 | char* Desencriptar(char *); |
---|
248 | char* Encriptar(char *); |
---|
249 | int ValidacionParametros(int,char**); |
---|
250 | int CrearArchivoLog(char*); |
---|
251 | int LeeFileConfiguracion(); |
---|
252 | void Log(char*); |
---|
253 | void UltimoError(int,char*); |
---|
254 | void UltimoErrorScript(int,char*); |
---|
255 | |
---|
256 | void INTROaFINCAD(char*); |
---|
257 | char* TomaParametro(char*,char*); |
---|
258 | int SplitParametros(char**,char*, char*); |
---|
259 | |
---|
260 | int EjecutarScript (char*,char* ,char*,int); |
---|
261 | char* ReservaMemoria(int); |
---|
262 | |
---|
263 | SOCKET TCPConnect(char *,char* ); |
---|
264 | void TCPClose(SOCKET); |
---|
265 | int AbreConexionTCP(void); |
---|
266 | void CierraConexionTCP(void); |
---|
267 | int EnviaTramasHidra(SOCKET,TRAMA*); |
---|
268 | int RecibeTramasHidra(SOCKET,TRAMA*); |
---|
269 | int TCPWrite(SOCKET ,TRAMA*); |
---|
270 | int TCPRead(SOCKET ,TRAMA*); |
---|
271 | SOCKET UDPConnect(); |
---|
272 | int EnviaTramaRepo(SOCKET,TRAMA*,char*,char*); |
---|
273 | int RecibeTramaRepo(SOCKET,int); |
---|
274 | |
---|
275 | long CreateTextFile(char*,char*); |
---|
276 | int ExisteFichero(char*); |
---|
277 | int RemoveFile(char *); |
---|
278 | int LoadTextFile(char *); |
---|
279 | |
---|
280 | int ProcesaComandos(); |
---|
281 | int DisponibilidadComandos(int); |
---|
282 | int GestionTramas(TRAMA *); |
---|
283 | |
---|
284 | int Cortesia(); |
---|
285 | int NoComandosPtes(); |
---|
286 | int TomaIPlocal(); |
---|
287 | int InclusionCliente(); |
---|
288 | int RESPUESTA_InclusionCliente(TRAMA*); |
---|
289 | int ComandosPendientes(void); |
---|
290 | int Arrancar(TRAMA *,TRAMA *); |
---|
291 | int Apagar(TRAMA*,TRAMA*); |
---|
292 | int Reiniciar(TRAMA*,TRAMA*); |
---|
293 | int IniciarSesion(TRAMA*,TRAMA*); |
---|
294 | int Actualizar(); |
---|
295 | int CrearPerfilSoftware(TRAMA*,TRAMA*); |
---|
296 | int CrearPerfil(char*,char*,char*,char*,char*); |
---|
297 | int Nemonico(char*); |
---|
298 | int RestaurarImagen(TRAMA*,TRAMA*); |
---|
299 | int RestaurandoImagen(char* ,char *,char* ,char *,char *,char *,char*); |
---|
300 | |
---|
301 | int ParticionaryFormatear(TRAMA*,TRAMA*); |
---|
302 | int Particionar(char*,char*,char* ); |
---|
303 | int Particionando(char*,char*,char*); |
---|
304 | int Formatear(char*,char*); |
---|
305 | int SetCachePartitionSize(int); |
---|
306 | int AutoexecClienteHidra(void); |
---|
307 | char* LeeConfiguracion(char*); |
---|
308 | char* TomaNomSO(char*,int); |
---|
309 | int InventarioHardware(TRAMA *,TRAMA *); |
---|
310 | int InventarioSoftware(TRAMA *,TRAMA *); |
---|
311 | int TomaConfiguracion(TRAMA *,TRAMA *); |
---|
312 | int RespuestaEjecucionComando(TRAMA* , TRAMA *, int); |
---|
313 | int ExecShell(TRAMA *,TRAMA *); |
---|
314 | int ConsolaRemota(TRAMA *,TRAMA *); |
---|
315 | int ExecBash(char*); |
---|
316 | char* URLDecode(char*); |
---|
317 | char* URLEncode(char *); |
---|
318 | int MuestraMenu(char*); |
---|
319 | void MuestraMensaje(int,char*); |
---|
320 | int cuestionCache(char*); |
---|