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