[85179ef] | 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 | // **************************************************************************************************************************************************** |
---|
[c77c7d2] | 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> |
---|
[b0bb14f] | 19 | #include <signal.h> |
---|
[94a3393] | 20 | |
---|
[c77c7d2] | 21 | #define LEER 0 |
---|
| 22 | #define ESCRIBIR 1 |
---|
| 23 | |
---|
[b0bb14f] | 24 | #define LONGITUD_SCRIPTSALIDA 4064 // Longitud máxima de la informacin devuelta por un script |
---|
[09907c1] | 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 |
---|
[c77c7d2] | 27 | #define LONGITUD_CONFIGURACION 1024 // Longitud mxima de las configuraciones de particin |
---|
| 28 | #define MAX_NUM_CSADDRS 20 |
---|
| 29 | #define MAX_INTERFACE_LIST 20 |
---|
[a6b881e] | 30 | #define MAXCNX 5 // Máximos intentos de conexión al servidor de Administración |
---|
[c77c7d2] | 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 |
---|
[a6b881e] | 59 | char ejecutor; // ejecutor de la trama 1=el servidor de admistración 2=el cliente 3=el repositorio |
---|
[09907c1] | 60 | char parametros[LONGITUD_PARAMETROS_TRAMA]; // Contenido de la trama (par?etros) |
---|
[c77c7d2] | 61 | }TRAMA; |
---|
| 62 | |
---|
| 63 | TRAMA trama[1]; |
---|
| 64 | |
---|
| 65 | char IPlocal[20]; // Ip local |
---|
[a6b881e] | 66 | char Servidorhidra[20]; // IP servidor de Administración |
---|
[c77c7d2] | 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]; |
---|
[b0bb14f] | 82 | char urlpag[LONSTDC]; |
---|
[c77c7d2] | 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é) |
---|
[a6b881e] | 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 ) |
---|
[b0bb14f] | 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 | |
---|
[c77c7d2] | 112 | |
---|
[a6b881e] | 113 | int HIDRAVER; // Versión de la apliación de Administración |
---|
[c77c7d2] | 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]; // Ip local |
---|
| 151 | } Propiedades; // Estructura con los datos del odenador |
---|
| 152 | |
---|
| 153 | struct s_Particiones{ |
---|
| 154 | char tiposo[64]; // Tipo de sistema operativo |
---|
| 155 | char tipopart[16]; // Tipo de particin |
---|
| 156 | char tamapart[16]; // Tamao de la particin |
---|
| 157 | char numpart[5]; // Nmero de la particin |
---|
| 158 | char nombreso[64]; // Nombre del S.O. |
---|
| 159 | }; |
---|
| 160 | |
---|
| 161 | struct s_Hardware{ |
---|
| 162 | char nemonico[4]; // Tipo de sistema operativo |
---|
| 163 | char tipo[45]; // Tipo de hardware |
---|
| 164 | char codigovalor[256]; // Codigo o descripcion |
---|
| 165 | } |
---|
| 166 | ; |
---|
| 167 | struct tiposo { |
---|
| 168 | char *tipopart; |
---|
| 169 | char *tiposo; |
---|
| 170 | char *nombreso; |
---|
| 171 | }; |
---|
| 172 | struct tiposo tiposos[] = { |
---|
| 173 | {"BIGDOS", "MsDos","MsDos"}, |
---|
| 174 | {"NTFS","Windows NT Platafom","Windows 2000,XP,2003"}, |
---|
| 175 | {"FAT32","Windows","Windos 98,SE,Millenium"}, |
---|
| 176 | {"EXT","Extendida","Extendida"}, |
---|
| 177 | {"EXT3","Linux","Linux"}, |
---|
| 178 | {"EXT2","Linux","Linux"}, |
---|
| 179 | {"VFAT","VFAT","VFAT"}, |
---|
| 180 | {"CACHE","CACHE","CACHE"}, |
---|
| 181 | {"UNKNOWN","UNKNOWN","UNKNOWN"}, |
---|
| 182 | {"EMPTY","Libre","Libre"}, |
---|
| 183 | {"LINUX-SWAP","","Linux-swap"}}; |
---|
| 184 | |
---|
| 185 | int ntiposo = sizeof (tiposos) / sizeof (struct tiposo); |
---|
| 186 | |
---|
| 187 | struct s_Item tbMenu[MAXITEMS]; // Tabla con los items del menu |
---|
| 188 | int contitems; // Contador items del menu |
---|
| 189 | |
---|
| 190 | BOOL PRCCMD; // Indicador de comandos interactivos |
---|
| 191 | BOOL CMDPTES; // Indicador de comandos pendientes |
---|
| 192 | |
---|
| 193 | //char modulo[64]; // Nombre de la funcin donde se produce el error |
---|
| 194 | |
---|
| 195 | BOOL aut = false; // Variable para controlar el acceso al menu de administracion |
---|
| 196 | |
---|
[b0bb14f] | 197 | pid_t pidmenu; |
---|
[c77c7d2] | 198 | |
---|
| 199 | char* tbErrores[]={"000-Se han generado errores. No se puede continuar la ejecución de este módulo",\ |
---|
| 200 | "001-No hay memoria suficiente para el buffer",\ |
---|
[a6b881e] | 201 | "002-No se puede establecer conexión con el servidor de administración",\ |
---|
[c77c7d2] | 202 | "003-El fichero especificado no existe o bien no puede crearse o abrirse",\ |
---|
| 203 | "004-Comando Error",\ |
---|
| 204 | "005-El fichero est vacio",\ |
---|
| 205 | "006-Error en la ejecución del fichero autoexec",\ |
---|
| 206 | "007-Error en la recuperacion del Menu principal",\ |
---|
| 207 | "008-No hay espacio reservado para la cache en este disco",\ |
---|
| 208 | "009-Ha ocurrido algún error generando el perfil software",\ |
---|
| 209 | "010-IPlocal, NO se ha definido este parámetro",\ |
---|
| 210 | "011-IPhidra, NO se ha definido este parámetro",\ |
---|
| 211 | "012-Puerto, NO se ha definido este parámetro",\ |
---|
| 212 | "013-NO existe fichero de configuración o contiene un error de sintaxis",\ |
---|
| 213 | "014-Fallo de sintaxis en los parámetros: Debe especificar -f nombre_del_fichero_de_configuración",\ |
---|
| 214 | "015-No se ha podido crear socket para comunicación con el repositorio",\ |
---|
| 215 | "016-No se ha podido comunicar con el repositorio",\ |
---|
| 216 | "017-No existe Menu principal",\ |
---|
| 217 | "018-No se ha podido recuperar la configuración hardware del ordenador",\ |
---|
[a6b881e] | 218 | "019-El cliente no se ha podido incluir en el sistema por un fallo en la conexión con el Servidor de Administración",\ |
---|
[c77c7d2] | 219 | "020-No se ha podido crear la carpeta en el repositorio",\ |
---|
[a6b881e] | 220 | "021-Error en el envío de tramas al Servidor de Administración",\ |
---|
| 221 | "022-Error en la recepción de tramas desde el Servidor de Administración",\ |
---|
[c77c7d2] | 222 | "023-Error desconocido",\ |
---|
| 223 | }; |
---|
[b0bb14f] | 224 | #define MAXERROR 23 // Error máximo cometido |
---|
[a6b881e] | 225 | |
---|
| 226 | char* tbErroresScripts[]={"000-Se han generado errores. No se puede continuar la ejecución de este módulo",\ |
---|
| 227 | "001-Formato de ejecución incorrecto.",\ |
---|
| 228 | "002-Fichero o dispositivo no encontrado",\ |
---|
| 229 | "003-Error en partición de disco",\ |
---|
| 230 | "004- Partición o fichero bloqueado",\ |
---|
| 231 | "005-Error al crear o restaurar una imagen",\ |
---|
| 232 | "006-Sin sistema operativo",\ |
---|
[b0bb14f] | 233 | "007-Programa o función no ejecutable",\ |
---|
| 234 | "008-Error en la eliminación del archivo temporal de intercambio",\ |
---|
| 235 | "009-Error en la lectura del archivo temporal de intercambio",\ |
---|
| 236 | "010-Error al ejecutar código de la shell",\ |
---|
| 237 | "011-Error desconocido", |
---|
[a6b881e] | 238 | }; |
---|
[b0bb14f] | 239 | #define MAXERRORSCRIPT 11 // Error máximo cometido |
---|
[c77c7d2] | 240 | |
---|
| 241 | // Prototipos de funciones |
---|
| 242 | char* Desencriptar(char *); |
---|
| 243 | char* Encriptar(char *); |
---|
| 244 | int ValidacionParametros(int,char**); |
---|
| 245 | int CrearArchivoLog(char*); |
---|
| 246 | int LeeFileConfiguracion(); |
---|
| 247 | void Log(char*); |
---|
| 248 | void UltimoError(int,char*); |
---|
[a6b881e] | 249 | void UltimoErrorScript(int,char*); |
---|
| 250 | |
---|
[c77c7d2] | 251 | void INTROaFINCAD(char*); |
---|
| 252 | char* TomaParametro(char*,char*); |
---|
| 253 | int SplitParametros(char**,char*, char*); |
---|
| 254 | |
---|
| 255 | int EjecutarScript (char*,char* ,char*,int); |
---|
| 256 | char* ReservaMemoria(int); |
---|
| 257 | |
---|
| 258 | SOCKET TCPConnect(char *,char* ); |
---|
| 259 | void TCPClose(SOCKET); |
---|
| 260 | int AbreConexionTCP(void); |
---|
| 261 | void CierraConexionTCP(void); |
---|
| 262 | int EnviaTramasHidra(SOCKET,TRAMA*); |
---|
| 263 | int RecibeTramasHidra(SOCKET,TRAMA*); |
---|
| 264 | int TCPWrite(SOCKET ,TRAMA*); |
---|
| 265 | int TCPRead(SOCKET ,TRAMA*); |
---|
| 266 | SOCKET UDPConnect(); |
---|
| 267 | int EnviaTramaRepo(SOCKET,TRAMA*,char*,char*); |
---|
| 268 | int RecibeTramaRepo(SOCKET); |
---|
| 269 | |
---|
| 270 | long CreateTextFile(char*,char*); |
---|
| 271 | int ExisteFichero(char*); |
---|
| 272 | int RemoveFile(char *); |
---|
| 273 | int LoadTextFile(char *); |
---|
| 274 | |
---|
| 275 | int ProcesaComandos(); |
---|
| 276 | int DisponibilidadComandos(int); |
---|
| 277 | int GestionTramas(TRAMA *); |
---|
| 278 | |
---|
| 279 | int Cortesia(); |
---|
| 280 | int NoComandosPtes(); |
---|
| 281 | int TomaIPlocal(); |
---|
[a6b881e] | 282 | int InclusionCliente(); |
---|
| 283 | int RESPUESTA_InclusionCliente(TRAMA*); |
---|
[c77c7d2] | 284 | int ComandosPendientes(void); |
---|
| 285 | int Arrancar(TRAMA *,TRAMA *); |
---|
| 286 | int Apagar(TRAMA*,TRAMA*); |
---|
| 287 | int Reiniciar(TRAMA*,TRAMA*); |
---|
[b0bb14f] | 288 | int IniciarSesion(TRAMA*,TRAMA*); |
---|
[c77c7d2] | 289 | int Actualizar(); |
---|
| 290 | int CrearPerfilSoftware(TRAMA*,TRAMA*); |
---|
| 291 | int CrearPerfil(char*,char*,char*,char*,char*); |
---|
| 292 | int Nemonico(char*); |
---|
| 293 | int RestaurarImagen(TRAMA*,TRAMA*); |
---|
| 294 | int RestaurandoImagen(char*,char*,char*,char*,char*,char*,char*); |
---|
| 295 | int ParticionaryFormatear(TRAMA*,TRAMA*); |
---|
| 296 | int Particionar(char*,char*,char* ); |
---|
| 297 | int Particionando(char*,char*,char*); |
---|
| 298 | int Formatear(char*,char*); |
---|
| 299 | int SetCachePartitionSize(int); |
---|
| 300 | int AutoexecClienteHidra(void); |
---|
| 301 | char* LeeConfiguracion(char*); |
---|
| 302 | char* TomaNomSO(char*,int); |
---|
| 303 | int InventarioHardware(TRAMA *,TRAMA *); |
---|
[5eae07e] | 304 | int InventarioSoftware(TRAMA *,TRAMA *); |
---|
[c77c7d2] | 305 | int TomaConfiguracion(TRAMA *,TRAMA *); |
---|
| 306 | int RespuestaEjecucionComando(TRAMA* , TRAMA *, int); |
---|
| 307 | int ExecShell(TRAMA *,TRAMA *); |
---|
[b0bb14f] | 308 | int ExecBash(char*); |
---|
[c77c7d2] | 309 | char* URLDecode(char*); |
---|
[da3981e] | 310 | char* URLEncode(char *); |
---|
[b0bb14f] | 311 | int MuestraMenu(char*); |
---|
[da3981e] | 312 | void MuestraMensaje(int,char*); |
---|