diff --git a/bin/setsmbpass b/bin/setsmbpass index 44a7004..cb57c28 100755 --- a/bin/setsmbpass +++ b/bin/setsmbpass @@ -1,9 +1,10 @@ #!/bin/bash #/** -# setsmbpass #@file setsmbpass [ogLive] -#@brief Cambia la contraseña del usuario del cliente para acceder a los servicios Samba. +#@brief Cambia la contraseña de los clientes para acceder a los servicios principales. +#@usage setsmbpass [ogLive] +#@param ogLive solo modifica la clave del cliente indicado (puede crear inconsistencias) #@warning Se modifica el Initrd del cliente y se cambia la clave en el servidor. #@warning No se modifica el usuario de acceso (usuario "opengnsys"). #@version 1.0.2 - Versión inicial. @@ -12,38 +13,41 @@ #@version 1.1.0 - Soporte para varios clientes ogLive. #@author Ramón M. Gómez - ETSII Univ. Sevilla #@date 2017-06-20 +#@version 1.2.0 - Soporte para varios compresores de Initrd. +#@author Ramón M. Gómez - ETSII Univ. Sevilla +#@date 2020-09-02 #*/ ## -# Variables. -PROG=$(basename "$0") -PATH=$PATH:$(dirname "$(realpath "$0")") +# Variables y funciones globales. +PROG="$(basename "$0")" OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"} -OGCFGFILE=$OPENGNSYS/etc/opengnsys.json +PATH=$PATH:$OPENGNSYS/bin SAMBAUSER="opengnsys" # Usuario por defecto. TFTPDIR=$OPENGNSYS/tftpboot INITRD=oginitrd.img TMPDIR=/tmp/oglive$$ let CHANGES=0 -# Control básico de errores. -if [ "$USER" != "root" ]; then - echo "$PROG: Error: solo ejecutable por root" >&2 - exit 1 -fi +source $OPENGNSYS/lib/ogfunctions.sh || exit 1 + +# Control de parámetros. +[ "$*" == "help" ] && help +[ "$*" == "version" ] && version +[ "$USER" != "root" ] && raiseError access "Solo ejecutable por root" case $# in 0) # Cambios en todos los clientes ogLive instalados. + echolog "Cambiando contraseña en todos los clientes ogLive instalados" if which oglivecli &>/dev/null; then LIST=$(oglivecli list | awk '{print $2}') else LIST="ogclient" fi ;; 1) # Cambios en único ogLive (AVISO: puede crear inconsistencias con otros ogLive). + echolog "Cambiando contraseña en un solo ogLive" LIST="$1" ;; *) # Error de formato. - echo "$PROG: Error de ejecución" >&2 - echo "Formato: $PROG ogLive" - exit 1 ;; + raiseError usage ;; esac # Recuperar eco de consola si se corta el proceso. @@ -61,9 +65,8 @@ for OGLIVE in $LIST; do # Solo se deben aceptar números y letras para la clave de acceso. if [[ "$SAMBAPASS" =~ [^a-zA-Z0-9] ]]; then echo - echo "$PROG: Error: la clave solo debe contener caracteres alfanuméricos" >&2 stty echo 2>/dev/null - exit 2 + raiseError cancel "La clave solo debe contener caracteres alfanuméricos" fi echo # Obtener confirmación clave sin eco en pantalla. @@ -71,34 +74,15 @@ for OGLIVE in $LIST; do read -r SAMBAPASS2 echo stty echo 2>/dev/null - if [ "$SAMBAPASS" != "$SAMBAPASS2" ]; then - echo "$PROG: Error: las claves no coinciden" >&2 - exit 2 - fi + [ "$SAMBAPASS" != "$SAMBAPASS2" ] && raiseError cancel "Las claves no coinciden" fi # Editar la parte de acceso del cliente: # descomprimir Initrd, sustituir clave y recomprimir Initrd). - echo "Configurando cliente \"$OGLIVE\" ..." + echolog "Configurando cliente \"$OGLIVE\" ..." mkdir -p $TMPDIR - cd $TMPDIR || { echo "Error: no se pudo cambiar al directorio temporal."; exit 3; } - - # Verificar si el archivo es gzip o lz4 antes de descomprimir. - if file "$CLIENTINITRD" | grep -q "gzip compressed data"; then - if ! gzip -dc "$CLIENTINITRD" | cpio -im; then - echo "Error: No se pudo descomprimir y extraer $CLIENTINITRD con gzip." - exit 4 - fi - COMPRESS_CMD="gzip -9c" - elif file "$CLIENTINITRD" | grep -q "LZ4 compressed data"; then - if ! lz4 -d "$CLIENTINITRD" | cpio -im; then - echo "Error: No se pudo descomprimir y extraer $CLIENTINITRD con lz4." - exit 4 - fi - COMPRESS_CMD="lz4 -c" - else - echo "Error: $CLIENTINITRD no está en formato gzip o lz4." - exit 4 - fi + cd $TMPDIR || ogRaiseError access "Directorio temporal" + COMPRESS=$(file -b "$CLIENTINITRD" | awk '{print tolower($1);}') + $COMPRESS -dc "$CLIENTINITRD" | cpio -im if [ -f scripts/ogfunctions ]; then sed -i "s/OPTIONS=\(.*\)user=\w*\(.*\)pass=\w*\(.*\)/OPTIONS=\1user=$SAMBAUSER\2pass=$SAMBAPASS\3/" scripts/ogfunctions # TEMPORAL: solución ticket 554, actualizar cliente en caché (ogLive r3257). @@ -106,37 +90,30 @@ for OGLIVE in $LIST; do # FIN CÓDIGO TEMPORAL. # Ticket 565, preparar acceso Rsync cliente. echo "$SAMBAPASS" > scripts/passrsync - # Guardar tokens de seguridad. - cat << EOT > scripts/client.cfg -CLIENTID=$(jq -r .client.id $OGCFGFILE) -CLIENTSECRET=$(jq -r .client.secret $OGCFGFILE) -EOT - chown root.root scripts/passrsync scripts/client.cfg - chmod 400 scripts/passrsync scripts/client.cfg - # Generar Initrd del cliente. - if ! find . | cpio -H newc -oa | $COMPRESS_CMD > "$CLIENTINITRD"; then - echo "Error: No se pudo recomprimir $CLIENTINITRD." - exit 5 - fi + chown root.root scripts/passrsync + chmod 400 scripts/passrsync + # Generar Initrd del cliente (siempre comprimido con gzip). + find . | cpio -H newc -oa | gzip -9c > "$CLIENTINITRD" else - echo "$PROG: Aviso: no se ha modificado la clave del cliente \"$OGLIVE\"." + echolog "$PROG: Aviso: no se ha modificado la clave del cliente \"$OGLIVE\"." fi rm -fr $TMPDIR # Calcular suma de comprobación. md5sum "$CLIENTINITRD" | cut -f1 -d" " > "$CLIENTINITRD.sum" let CHANGES++ else - echo "$PROG: Cliente \"$OGLIVE\" no accesible." + echolog "$PROG: Cliente \"$OGLIVE\" no accesible." fi done if [[ $CHANGES != 0 ]]; then # Ticket 565, preparar acceso Rsync servidor. - echo "$SAMBAUSER:$SAMBAPASS" > /etc/rsyncd.secrets + [ -e /etc/rsyncd.secrets ] && sed -i -n -e "/^$SAMBAUSER:/!p" -e "$ a$SAMBAUSER:$SAMBAPASS" /etc/rsyncd.secrets || echo "$SAMBAUSER:$SAMBAPASS" > /etc/rsyncd.secrets chown root.root /etc/rsyncd.secrets chmod 600 /etc/rsyncd.secrets # Cambiar clave Samba. echo -ne "$SAMBAPASS\n$SAMBAPASS\n" | smbpasswd -a -s $SAMBAUSER else - echo "$PROG: Aviso: no se ha modificado la clave de ningún cliente." + echolog "$PROG: Aviso: no se ha modificado la clave de ningún cliente." fi + diff --git a/installer/ogboot_installer.py b/installer/ogboot_installer.py index 17a59a7..3f64e28 100755 --- a/installer/ogboot_installer.py +++ b/installer/ogboot_installer.py @@ -45,7 +45,7 @@ ROUTERIP = [] BRANCH = sys.argv[1] if len(sys.argv) > 1 else "main" INETDSERV = "xinetd" -UBUNTU_OS_VERSION = "22" +UBUNTU_OS_VERSION = "24" PYTHON_VERSION = 3 if os.path.isdir(f"{PROGRAM_DIR}/../installer"): @@ -151,7 +151,7 @@ def get_missing_packages(): case "22.04": PACKAGES_TO_INSTALL = ["nfs-common", "xorriso", "genisoimage", "syslinux", "liblzma-dev", "nginx", "arp-scan", "automake", "build-essential", "btrfs-progs", "composer", "curl", "ctorrent", "debootstrap", "g++-multilib", "gawk", "gettext", "graphviz", "grub-efi-amd64-signed", "jq", "libdbi-dev", "libdbi1", "libev-dev", "libjansson-dev", "liblz4-tool", "libssl-dev", "moreutils", "netpipes", "php", "php-bcmath", "php-cli", "php-curl", "php-fpm", "php-gd", "php-json", "php-ldap", "php-mbstring", "php-mysql", "php8.1-common", "php-pear", "php-xml", "php-zip", "procps", "coreutils", "rsync", "samba", "samba-common-bin", "schroot", "shim-signed", "squashfs-tools", "subversion", "tftpd-hpa", "udpcast", "unzip", "wakeonlan", "wget", "xinetd", "jq", "moreutils", "net-tools", "isolinux", "syslinux"] case "24.04": - PACKAGES_TO_INSTALL = ["nfs-common", "xorriso", "genisoimage", "syslinux", "liblzma-dev", "nginx", "arp-scan", "automake", "build-essential", "btrfs-progs", "composer", "curl", "ctorrent", "debootstrap", "g++-multilib", "gawk", "gettext", "graphviz", "grub-efi-amd64-signed", "jq", "libdbi-dev", "libdbi1", "libev-dev", "libjansson-dev", "liblz4-tool", "libssl-dev", "moreutils", "netpipes", "php", "php-bcmath", "php-cli", "php-curl", "php-fpm", "php-gd", "php-json", "php-ldap", "php-mbstring", "php-mysql", "php8.3-common", "php-pear", "php-xml", "php-zip", "procps", "coreutils", "rsync", "samba", "samba-common-bin", "schroot", "shim-signed", "squashfs-tools", "subversion", "tftpd-hpa", "udpcast", "unzip", "wakeonlan", "wget", "xinetd", "jq", "moreutils", "net-tools", "isolinux", "syslinux"] + PACKAGES_TO_INSTALL = ["nfs-common", "xorriso", "genisoimage", "syslinux", "liblzma-dev", "nginx", "arp-scan", "automake", "build-essential", "btrfs-progs", "composer", "curl", "ctorrent", "debootstrap", "g++-multilib", "gawk", "gettext", "graphviz", "grub-efi-amd64-signed", "jq", "libdbi-dev", "libdbi1", "libev-dev", "libjansson-dev", "liblz4-tool", "libssl-dev", "moreutils", "netpipes", "php8.3", "php8.3-bcmath", "php8.3-cli", "php8.3-curl", "php8.3-fpm", "php8.3-gd", "php8.3-ldap", "php8.3-mbstring", "php8.3-mysql", "php8.3-common", "php-pear", "php8.3-xml", "php8.3-zip", "procps", "coreutils", "rsync", "samba", "samba-common-bin", "schroot", "shim-signed", "squashfs-tools", "subversion", "tftpd-hpa", "udpcast", "unzip", "wakeonlan", "wget", "xinetd", "jq", "moreutils", "isolinux", "syslinux", "file"] case _: PACKAGES_TO_INSTALL = ["bash", "rsync"] case "suse": @@ -483,7 +483,7 @@ TFTP_OPTIONS="--secure" symlink_target = f"{INSTALL_OGBOOT_TARGET}/tftpboot" logger.info(f"Creating symbolic link from {TFTPCFGDIR} to {symlink_target}") if not os.path.exists(symlink_target): - os.symlink(TFTPCFGDIR, symlink_target) + os.symlink(TFTPCFGDIR, symlink_targetnstaller/ogboot_installer.py) os.lchown(symlink_target, pwd.getpwnam("tftp").pw_uid, pwd.getpwnam("ogboot").pw_gid) else: logger.warning(f"The symbolic link already exists: {symlink_target}") diff --git a/sources/clients/README.es.txt b/sources/clients/README.es.txt new file mode 100644 index 0000000..56900d8 --- /dev/null +++ b/sources/clients/README.es.txt @@ -0,0 +1,9 @@ +OpenGnsys Services for Clients README +======================================= + + +Este directorio contiene el código fuente de los servicios OpenGnsys específicos para clientes. + +- ogAdmClient servicio para cliente ogLive que atiende peticiones de OpenGnsys Server +- ogagent OGAgent: agente modular para sistemas operativos con API REST + diff --git a/sources/clients/ogAdmClient/Makefile b/sources/clients/ogAdmClient/Makefile new file mode 100644 index 0000000..d3628c9 --- /dev/null +++ b/sources/clients/ogAdmClient/Makefile @@ -0,0 +1,31 @@ +# makefile + +# Nombre del proyecto +PROYECTO := ogAdmClient + +# Directorios y librerias +DIRS := +LIBS := -static + +# Opciones de compilacion +OPCS := -m32 -O0 -g -Wall # Depuracion +#OPCS := -m32 -O3 -Wall # Optimizacion + +# Ficheros objetos +OBJS := sources/ogAdmClient.o + +all: $(PROYECTO) + +$(PROYECTO): $(OBJS) + gcc $(OPCS) $(DIRS) $(LIBS) $(OBJS) -o $(PROYECTO) +# strip $(PROYECTO) # Optimizacion + +clean: + rm -f $(PROYECTO) $(OBJS) + +sources/%.o: sources/%.c + gcc $(OPCS) -I ../../Includes -c -o"$@" "$<" + + + + diff --git a/sources/clients/ogAdmClient/ogAdmClient b/sources/clients/ogAdmClient/ogAdmClient new file mode 100755 index 0000000..0c086d2 Binary files /dev/null and b/sources/clients/ogAdmClient/ogAdmClient differ diff --git a/sources/clients/ogAdmClient/ogAdmClient.cfg b/sources/clients/ogAdmClient/ogAdmClient.cfg new file mode 100644 index 0000000..e49d360 --- /dev/null +++ b/sources/clients/ogAdmClient/ogAdmClient.cfg @@ -0,0 +1,5 @@ +ServidorAdm=172.17.8.67 +PUERTO=2008 +PATHINTERFACE=/opt/opengnsys/interfaceAdm +UrlMenu=https:/172.17.8.67/opengnsys/varios/menubrowser.php +UrlMsg=http://localhost/cgi-bin/httpd-log.sh diff --git a/sources/clients/ogAdmClient/sources/ogAdmClient.c b/sources/clients/ogAdmClient/sources/ogAdmClient.c new file mode 100644 index 0000000..6f87cc4 --- /dev/null +++ b/sources/clients/ogAdmClient/sources/ogAdmClient.c @@ -0,0 +1,2331 @@ +// ******************************************************************************************************** +// Cliernte: ogAdmClient +// Autor: Jos Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla +// Fecha Creacin: Marzo-2010 +// Fecha ltima modificacin: Abril-2010 +// Nombre del fichero: ogAdmClient.c +// Descripcin :Este fichero implementa el cliente general del sistema +// ******************************************************************************************************** + +#include "ogAdmClient.h" +#include "ogAdmLib.c" +//________________________________________________________________________________________________________ +// Funcin: tomaConfiguracion +// +// Descripcin: +// Lee el fichero de configuracin del servicio +// Parmetros: +// filecfg : Ruta completa al fichero de configuracin +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//________________________________________________________________________________________________________ +BOOLEAN tomaConfiguracion(char* filecfg) +{ + char modulo[] = "tomaConfiguracion()"; + + if (filecfg == NULL || strlen(filecfg) == 0) { + errorLog(modulo, 1, FALSE); // Fichero de configuracin del cliente vaco + return (FALSE); + } + FILE *fcfg; + int 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 configuracin del cliente + return (FALSE); + } + + fseek(fcfg, 0, SEEK_END); + lSize = ftell(fcfg); // Obtiene tamao 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); + } + lSize=fread(buffer, 1, lSize, fcfg); // Lee contenido del fichero + buffer[lSize]=CHARNULL; + fclose(fcfg); + + /* Inicializar variables globales */ + servidoradm[0]=CHARNULL; + puerto[0] = CHARNULL; + pathinterface[0]=CHARNULL; + urlmenu[0]=CHARNULL; + urlmsg[0]=CHARNULL; + + numlin = splitCadena(lineas, buffer, '\n'); + for (i = 0; i < numlin; i++) { + splitCadena(dualparametro, lineas[i], '='); + + resul = strcmp(StrToUpper(dualparametro[0]), "SERVIDORADM"); + if (resul == 0) + strcpy(servidoradm, dualparametro[1]); + + resul = strcmp(StrToUpper(dualparametro[0]), "PUERTO"); + if (resul == 0) + strcpy(puerto, dualparametro[1]); + + resul = strcmp(StrToUpper(dualparametro[0]), "PATHINTERFACE"); + if (resul == 0) + strcpy(pathinterface, dualparametro[1]); + + resul = strcmp(StrToUpper(dualparametro[0]), "URLMENU"); + if (resul == 0) + strcpy(urlmenu, dualparametro[1]); + + resul = strcmp(StrToUpper(dualparametro[0]), "URLMSG"); + if (resul == 0) + strcpy(urlmsg, dualparametro[1]); + } + + if (servidoradm[0] == CHARNULL) { + liberaMemoria(buffer); + errorLog(modulo,4, FALSE); // Falta parmetro SERVIDORADM + return (FALSE); + } + + if (puerto[0] == CHARNULL) { + liberaMemoria(buffer); + errorLog(modulo,5, FALSE); // Falta parmetro PUERTO + return (FALSE); + } + if (pathinterface[0] == CHARNULL) { + liberaMemoria(buffer); + errorLog(modulo,56, FALSE); // Falta parmetro PATHINTERFACE + return (FALSE); + } + + if (urlmenu[0] == CHARNULL) { + liberaMemoria(buffer); + errorLog(modulo,89, FALSE); // Falta parmetro URLMENU + return (FALSE); + } + if (urlmsg[0] == CHARNULL) { + liberaMemoria(buffer); + errorLog(modulo,90, FALSE); // Falta parmetro URLMSG + return (FALSE); + } + liberaMemoria(buffer); + return (TRUE); +} +//______________________________________________________________________________________________________ +// Funcin: FinterfaceAdmin +// +// Descripcin: +// Esta funcin es la puerta de comunicacin entre el mdulo de administracin y el motor de clonacin. +// La Aplicacin de administracin utiliza una interface para ejecutar funciones del motor de clonacin; +// esta interface llamar a la API del motor con lo que cambiando el comportamiento de esta interface +// podremos hacer llamadas a otras API de clonacin y de esta manera probar distintos motores. +// +// Parmetros: +// - script: Nombre del mdulo,funcin o script de la interface +// - parametros: Parmetros que se le pasarn a la interface +// - salida: Recoge la salida que genera la llamada a la interface + +// Devuelve: +// Cdigo de error de la ejecucin al mdulo , funcin o script de la interface +// +// Especificaciones: +// El parmetro salida recoge la salida desde un fichero que se genera en la ejecucin del script siempre que +// sea distinto de NULL, esto es, si al llamar a la funcin este parmetro es NULL no se recoger dicha salida. +// Este fichero tiene una ubicacin fija: /tmp/_retinterface +//______________________________________________________________________________________________________ + +int FinterfaceAdmin( char *script,char* parametros,char* salida) +{ + FILE *f; + int lSize,nargs,i,resul; + char msglog[LONSTD],*argumentos[MAXARGS]; + char modulo[] = "FinterfaceAdmin()"; + + + if (ndebug>= DEBUG_MEDIO) { + sprintf(msglog, "%s:%s", tbMensajes[8], script); + infoDebug(msglog); + } + + /* Crea matriz de los argumentos */ + nargs=splitCadena(argumentos,parametros,32); + for(i=nargs;i= DEBUG_ALTO) { + sprintf(msglog, "%s: #%d-%s", tbMensajes[9],i+1,argumentos[i]); + infoDebug(msglog); + } + } + /* Elimina fichero de retorno */ + if(salida!=(char*)NULL){ + f = fopen("/tmp/_retinterface_","w" ); + if (f==NULL){ // Error de eliminacin + scriptLog(modulo,10); + resul=8; + scriptLog(modulo,resul); + return(resul); + } + fclose(f); + } + /* Compone linea de comando */ + if(parametros){ + strcat(script," "); + strcat(script,parametros); + } + /* LLamada funcin interface */ + resul=system(script); + if(resul){ + scriptLog(modulo,10); + scriptLog(modulo,resul); + return(resul); + } + /* Lee fichero de retorno */ + if(salida!=(char*)NULL){ + f = fopen("/tmp/_retinterface_","rb" ); + if (f==NULL){ // Error de apertura + scriptLog(modulo,10); + resul=9; + scriptLog(modulo,resul); + return(resul); + } + else{ + fseek (f ,0,SEEK_END); // Obtiene tamao del fichero. + lSize = ftell (f); + rewind (f); + if(lSize>LONGITUD_SCRIPTSALIDA){ + scriptLog(modulo,10); + resul=11; + scriptLog(modulo,resul); + return(resul); + } + fread (salida,1,lSize,f); // Lee contenido del fichero + rTrim(salida); + fclose(f); + } + } + /* Muestra informacin de retorno */ + if(salida!=(char*)NULL){ + if(ndebug>2){ + sprintf(msglog,"Informacin devuelta %s",salida); + infoDebug(msglog); + } + } + return(resul); +} +//______________________________________________________________________________________________________ +// Funcin: interfaceAdmin +// +// Descripcin: +// Esta funcin es la puerta de comunicacin entre el mdulo de administracin y el motor de clonacin. +// La Aplicacin de administracin utiliza una interface para ejecutar funciones del motor de clonacin; +// esta interface llamar a la API del motor con lo que cambiando el comportamiento de esta interface +// podremos hacer llamadas a otras API de clonacin y de esta manera probar distintos motores. +// +// Parmetros: +// - script: Nombre del mdulo,funcin o script de la interface +// - parametros: Parmetros que se le pasarn a la interface +// - salida: Recoge la salida que genera la llamada a la interface + +// Devuelve: +// Cdigo de error de la ejecucin al mdulo , funcin o script de la interface +// +// Especificaciones: +// El parmetro salida recoge la salida desde el procedimiento hijo que se genera en la ejecucin de ste +// siempre que sea distinto de NULL, esto es, si al llamar a la funcin este parmetro es NULL no se +// recoger dicha salida. +//______________________________________________________________________________________________________ + +int interfaceAdmin( char *script,char* parametros,char* salida) +{ + int descr[2]; /* Descriptores de E y S de la turbera */ + int bytesleidos; /* Bytes leidos en el mensaje */ + int estado; + pid_t pid; + char buffer[LONBLK]; // Buffer de lectura de fichero + pipe (descr); + int i,nargs,resul; + int lon; // Longitud de cadena + char msglog[LONSUC]; // Mensaje de registro de sucesos + char *argumentos[MAXARGS]; + char modulo[] = "interfaceAdmin()"; + if (ndebug>= DEBUG_MEDIO) { + sprintf(msglog, "%s:%s", tbMensajes[8], script); + infoDebug(msglog); + } + + /* Crea matriz de los argumentos */ + nargs=splitCadena(argumentos,parametros,32); + for(i=nargs;i= DEBUG_ALTO) { + // Truncar la cadena si es mayor que el tamao de la lnea de log. + sprintf(msglog, "%s: #%d-", tbMensajes[9], i+1); + lon = strlen (msglog); + if (lon + strlen (argumentos[i]) < LONSUC) { + strcat (msglog, argumentos[i]); + } + else + { + strncat (msglog, argumentos[i], LONSUC - lon - 4); + strcat (msglog, "..."); + } + infoDebug(msglog); + } + } + + if((pid=fork())==0) + { + //_______________________________________________________________ + + /* Proceso hijo que ejecuta la funcin de interface */ + + close (descr[LEER]); + dup2 (descr[ESCRIBIR], 1); + close (descr[ESCRIBIR]); + resul=execv(script,argumentos); + //resul=execlp (script, script, argumentos[0],argumentos[1],NULL); + exit(resul); + + /* Fin de proceso hijo */ + //_______________________________________________________________ + } + else + { + //_______________________________________________________________ + + /* Proceso padre que espera la ejecucin del hijo */ + + if (pid ==-1){ // Error en la creacin del proceso hijo + scriptLog(modulo,10); + resul=13; + scriptLog(modulo,resul); + return(resul); + } + close (descr[ESCRIBIR]); + bytesleidos = read (descr[LEER], buffer, LONBLK-1); + while(bytesleidos>0){ + if(salida!=(char*)NULL){ // Si se solicita retorno de informacin... + buffer[bytesleidos]='\0'; + // Error si se supera el tamao mximo de cadena de salida. + if(strlen(buffer)+strlen(salida)>LONGITUD_SCRIPTSALIDA){ + scriptLog(modulo,10); + resul=11; + scriptLog(modulo,resul); + return(resul); + } + rTrim(buffer); + strcat(salida,buffer); + } + bytesleidos = read (descr[LEER], buffer, LONBLK-1); + } + close (descr[LEER]); + //kill(pid,SIGQUIT); + waitpid(pid,&estado,0); + resul=WEXITSTATUS(estado); + if(resul){ + scriptLog(modulo,10); + scriptLog(modulo,resul); + return(resul); + } + /* Fin de proceso padre */ + //_______________________________________________________________ + } + + /* Muestra informacin de retorno */ + if(salida!=(char*)NULL){ + if(ndebug>2){ + // Truncar la cadena si es mayor que el tamao de la lnea de log. + strcpy(msglog,"Informacion devuelta "); + lon = strlen (msglog); + if (lon + strlen (salida) < LONSUC) { + strcat (msglog, salida); + } + else + { + strncat (msglog, salida, LONSUC-lon-4); + strcat (msglog, "..."); + } + infoDebug(msglog); + } + } + return(resul); +} +//______________________________________________________________________________________________________ +// Funcin: scriptLog +// +// Descripcin: +// Registra los sucesos de errores de scripts en el fichero de log +// Parametros: +// - modulo: Mdulo donde se produjo el error +// - coderr : Cdigo del mensaje de error del script +//______________________________________________________________________________________________________ +void scriptLog(const char *modulo,int coderr) +{ + char msglog[LONSUC]; + + if(coderr>>>>>>>>>>>>>>>>>>>>>>>>> + char msglog[LONSTD]; + char modulo[] = "cuestionCache()"; + + sprintf(interface,"%s/%s",pathinterface,"procesaCache"); + sprintf(parametros,"%s %s","procesaCache",tam); + + herror=interfaceAdmin(interface,parametros,NULL); + if(herror){ + sprintf(msglog,"%s",tbErrores[88]); + errorInfo(modulo,msglog); + return(FALSE); + } + + return(TRUE); +} +//______________________________________________________________________________________________________ +// Funcin: cargaPaginaWeb +// +// Descripcin: +// Muestra una pgina web usando el browser +// Parmetros: +// urp: Direccin url de la pgina +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +// ________________________________________________________________________________________________________ +int cargaPaginaWeb(char *url) +{ + pid_t pidbrowser; // Identificador del proceso que se crea para mostrar una pgina web con el browser + int resul=0; + char* argumentos[4]; + char modulo[] = "cargaPaginaWeb()"; + + // Destruye los procesos del Browser y lanza uno nuevo. + system("pkill -9 browser"); + + sprintf(interface,"/opt/opengnsys/bin/browser"); + sprintf(parametros,"browser -qws %s",url); + + splitCadena(argumentos,parametros,' '); // Crea matriz de los argumentos del scripts + argumentos[3]=NULL; + if((pidbrowser=fork())==0){ + /* Proceso hijo que ejecuta el script */ + resul=execv(interface,argumentos); + exit(resul); + } + else { + if (pidbrowser ==-1){ + scriptLog(modulo,10); + resul=13; + scriptLog(modulo,resul); + return(resul); + } + } + return(resul); +} +//________________________________________________________________________________________________________ +// Funcin: muestraMenu +// +// Descripcin: +// Muestra el menu inicial del cliente +// Parmetros: +// Ninguno +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//________________________________________________________________________________________________________ +void muestraMenu() +{ + cargaPaginaWeb(urlmenu); +} +//______________________________________________________________________________________________________ +// Funcin: muestraMensaje +// +// Descripcin: +// Muestra un mensaje en pantalla +// Parmetros: +// - idx: Indice del mensaje +// - msg: Descripcin Mensaje +// ________________________________________________________________________________________________________ +void muestraMensaje(int idx,char*msg) +{ + char *msgpan,url[250]; + + if(msg){ + msgpan=URLEncode(msg); + sprintf(url,"%s?msg=%s",urlmsg,msgpan); // Url de la pgina de mensajes + liberaMemoria(msgpan); + } + else + sprintf(url,"%s?idx=%d",urlmsg,idx); // Url de la pgina de mensajes + cargaPaginaWeb(url); +} +//______________________________________________________________________________________________________ +// Funcin: InclusionCliente +// Descripcin: +// Abre una sesin en el servidor de administracin y registra al cliente en el sistema +// Parmetros: +// Ninguno +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//______________________________________________________________________________________________________ +BOOLEAN inclusionCliente(TRAMA* ptrTrama) +{ + int lon; // Longitud de cadena + char msglog[LONSUC]; // Mensaje de registro de sucesos + char *cfg; // Datos de configuracin + SOCKET socket_c; + char modulo[] = "inclusionCliente()"; + + cfg=LeeConfiguracion(); + + if(!cfg){ // No se puede recuperar la configuracin del cliente + errorLog(modulo,36,FALSE); + errorLog(modulo,37,FALSE); + return(FALSE); + } + if (ndebug>= DEBUG_ALTO) { + // Truncar la cadena si es mayor que el tamao de la lnea de log. + sprintf(msglog, "%s", tbMensajes[14]); + lon = strlen (msglog); + if (lon + strlen (cfg) < LONSUC) { + strcat (msglog, cfg); + } + else + { + strncat (msglog, cfg, LONSUC - lon - 4); + strcat (msglog, "..."); + } + infoDebug(msglog); + } + initParametros(ptrTrama,0); + lon=sprintf(ptrTrama->parametros,"nfn=InclusionCliente\r"); // Nombre de la funcin a ejecutar en el servidor + lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuracin de los Sistemas Operativos del cliente + liberaMemoria(cfg); + + if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_PETICION)){ + errorLog(modulo,37,FALSE); + return(FALSE); + } + ptrTrama=recibeMensaje(&socket_c); + if(!ptrTrama){ + errorLog(modulo,45,FALSE); + return(FALSE); + } + + close(socket_c); + + if(!gestionaTrama(ptrTrama)){ // Anlisis de la trama + errorLog(modulo,39,FALSE); + return(FALSE); + } + + return(TRUE); +} +//______________________________________________________________________________________________________ +// Funcin: RESPUESTA_InclusionCliente +// +// Descripcin: +// Respuesta del servidor de administracin a la peticin de inicio +// enviando los datos identificativos del cliente y otras configuraciones +// Parmetros: +// - ptrTrama: Trama recibida por el servidor con el contenido y los parmetros +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//______________________________________________________________________________________________________ +BOOLEAN RESPUESTA_InclusionCliente(TRAMA* ptrTrama) +{ + char* res; + char modulo[] = "RESPUESTA_InclusionCliente()"; + + res=copiaParametro("res",ptrTrama); // Resultado del proceso de inclusin + if(atoi(res)==0){ // Error en el proceso de inclusin + liberaMemoria(res); + errorLog(modulo,41,FALSE); + return (FALSE); + } + liberaMemoria(res); + + idordenador=copiaParametro("ido",ptrTrama); // Identificador del ordenador + nombreordenador=copiaParametro("npc",ptrTrama); // Nombre del ordenador + cache=copiaParametro("che",ptrTrama); // Tamao de la cach reservada al cliente + idproautoexec=copiaParametro("exe",ptrTrama); // Procedimento de inicio (Autoexec) + idcentro=copiaParametro("idc",ptrTrama); // Identificador de la Unidad Organizativa + idaula=copiaParametro("ida",ptrTrama); // Identificador del aula + + if(idordenador==NULL || nombreordenador==NULL){ + errorLog(modulo,40,FALSE); + return (FALSE); + } + return(TRUE); +} +//______________________________________________________________________________________________________ +// +// Funcin: LeeConfiguracion +// Descripcin: +// Abre una sesin en el servidor de administracin y registra al cliente en el sistema +// Parmetros: +// Ninguno +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//______________________________________________________________________________________________________ + +char* LeeConfiguracion() +{ + char* parametroscfg; + char modulo[] = "LeeConfiguracion()"; + int herrorcfg; + + // Reservar memoria para los datos de cofiguracin. + parametroscfg=(char*)reservaMemoria(LONGITUD_SCRIPTSALIDA); + if(!parametroscfg){ + errorLog(modulo,3,FALSE); + return(NULL); + } + // Ejecutar script y obtener datos. + sprintf(interface,"%s/%s",pathinterface,"getConfiguration"); + herrorcfg=interfaceAdmin(interface,NULL,parametroscfg); + + if(herrorcfg){ // No se puede recuperar la configuracin del cliente + liberaMemoria(parametroscfg); + errorLog(modulo,36,FALSE); + return(NULL); + } + return(parametroscfg); +} +//________________________________________________________________________________________________________ +// Funcin: autoexecCliente +// +// Descripcin: +// Solicita procedimiento de autoexec para el cliebnte +// Parmetros: +// Ninguno +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//________________________________________________________________________________________________________ +BOOLEAN autoexecCliente(TRAMA* ptrTrama) +{ + SOCKET socket_c; + char modulo[] = "autoexecCliente()"; + + initParametros(ptrTrama,0); + sprintf(ptrTrama->parametros,"nfn=AutoexecCliente\rexe=%s\r",idproautoexec); + + if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_PETICION)){ + errorLog(modulo,42,FALSE); + return(FALSE); + } + ptrTrama=recibeMensaje(&socket_c); + if(!ptrTrama){ + errorLog(modulo,45,FALSE); + return(FALSE); + } + + close(socket_c); + + if(!gestionaTrama(ptrTrama)){ // Anlisis de la trama + errorLog(modulo,39,FALSE); + return(FALSE); + } + + return(TRUE); +} +//________________________________________________________________________________________________________ +// Funcin: autoexecCliente +// +// Descripcin: +// Ejecuta un script de autoexec personalizado en todos los inicios para el cliente +// Parmetros: +// Ninguno +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//________________________________________________________________________________________________________ +BOOLEAN RESPUESTA_AutoexecCliente(TRAMA* ptrTrama) +{ + SOCKET socket_c; + char *res,*nfl; + char modulo[] = "RESPUESTA_AutoexecCliente()"; + + res=copiaParametro("res",ptrTrama); + if(atoi(res)==0){ // Error en el proceso de autoexec + liberaMemoria(res); + return (FALSE); + } + liberaMemoria(res); + + nfl=copiaParametro("nfl",ptrTrama); + initParametros(ptrTrama,0); + sprintf(ptrTrama->parametros,"nfn=enviaArchivo\rnfl=%s\r",nfl); + liberaMemoria(nfl); + + /* Enva peticin */ + if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_PETICION)){ + errorLog(modulo,42,FALSE); + return(FALSE); + } + /* Nombre del archivo destino (local)*/ + char fileautoexec[LONPRM]; + sprintf(fileautoexec,"/tmp/_autoexec_%s",IPlocal); + + /* Recibe archivo */ + if(!recArchivo(&socket_c,fileautoexec)){ + errorLog(modulo,58, FALSE); + close(socket_c); + return(FALSE); + } + + close(socket_c); + + /* Ejecuta archivo */ + ejecutaArchivo(fileautoexec,ptrTrama); + return(TRUE); +} +//______________________________________________________________________________________________________ +// Funcin: comandosPendientes +// +// Descripcin: +// Bsqueda de acciones pendientes en el servidor de administracin +// Parmetros: +// Ninguno +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//______________________________________________________________________________________________________ +BOOLEAN comandosPendientes(TRAMA* ptrTrama) +{ + SOCKET socket_c; + char modulo[] = "comandosPendientes()"; + + CMDPTES=TRUE; + initParametros(ptrTrama,0); + + while(CMDPTES){ + sprintf(ptrTrama->parametros,"nfn=ComandosPendientes\r"); + if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_PETICION)){ + errorLog(modulo,42,FALSE); + return(FALSE); + } + ptrTrama=recibeMensaje(&socket_c); + if(!ptrTrama){ + errorLog(modulo,45,FALSE); + return(FALSE); + } + + close(socket_c); + + if(!gestionaTrama(ptrTrama)){ // Anlisis de la trama + errorLog(modulo,39,FALSE); + return(FALSE); + } + } + return(TRUE); +} +//______________________________________________________________________________________________________ +// Funcin: NoComandosPtes +// +// Descripcin: +// Conmuta el switch de los comandos pendientes y lo pone a false +// Parmetros: +// - ptrTrama: contenido del mensaje +// Devuelve: +// TRUE siempre +// Especificaciones: +// Cuando se ejecuta esta funcin se sale del bucle que recupera los comandos pendientes en el +// servidor y el cliente pasa a a estar disponible para recibir comandos desde el ste. +//______________________________________________________________________________________________________ +BOOLEAN NoComandosPtes(TRAMA* ptrTrama) +{ + CMDPTES=FALSE; // Corta el bucle de comandos pendientes + return(TRUE); +} +//______________________________________________________________________________________________________ +// Funcin: ProcesaComandos +// +// Descripcin: +// Espera comando desde el Servidor de Administracin para ejecutarlos +// Parmetros: +// Ninguno +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +// ________________________________________________________________________________________________________ +void procesaComandos(TRAMA* ptrTrama) +{ + int lon; + SOCKET socket_c; + char modulo[] = "procesaComandos()"; + + initParametros(ptrTrama,0); + while(TRUE){ + lon=sprintf(ptrTrama->parametros,"nfn=DisponibilidadComandos\r"); + lon+=sprintf(ptrTrama->parametros+lon,"tpc=%s\r",CLIENTE_OPENGNSYS); // Activar disponibilidad + if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_INFORMACION)){ + errorLog(modulo,43,FALSE); + return; + } + infoLog(19); // Disponibilidad de cliente activada + ptrTrama=recibeMensaje(&socket_c); + if(!ptrTrama){ + errorLog(modulo,46,FALSE); + return; + } + + close(socket_c); + + if(!gestionaTrama(ptrTrama)){ // Anlisis de la trama + errorLog(modulo,39,FALSE); + return; + } + if(!comandosPendientes(ptrTrama)){ + errorLog(modulo,42,FALSE); + } + } +} +//______________________________________________________________________________________________________ +// Funcin: Actualizar +// +// Descripcin: +// Actualiza los datos de un ordenador como si volviera a solicitar la entrada +// en el sistema al servidor de administracin +// Parmetros: +// ptrTrama: contenido del mensajede +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//______________________________________________________________________________________________________ +BOOLEAN Actualizar(TRAMA* ptrTrama) +{ + char msglog[LONSTD]; // Mensaje de log + char *cfg; // Cadena de datos de configuracin + int lon; // Longitud de cadena + char modulo[] = "Actualizar()"; + + if (ndebug>=DEBUG_MAXIMO) { + sprintf(msglog, "%s:%s",tbMensajes[21],modulo); + infoDebug(msglog); + } + muestraMensaje(1,NULL); + if(!comandosPendientes(ptrTrama)){ + errorLog(modulo,84,FALSE); + return(FALSE); + } + + cfg=LeeConfiguracion(); + herror=0; + if(!cfg){ // No se puede recuperar la configuracin del cliente + errorLog(modulo,36,FALSE); + herror=3; + } + // Envia Configuracion al servidor + initParametros(ptrTrama,0); + lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Configurar"); + lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuracin de los Sistemas Operativos del cliente + respuestaEjecucionComando(ptrTrama,herror,0); + + muestraMenu(); + + return(TRUE); +} +//______________________________________________________________________________________________________ +// Funcin: Purgar +// +// Descripcin: +// Detiene la ejecucin del browser +// Parmetros: +// ptrTrama: contenido del mensajede +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//______________________________________________________________________________________________________ +int Purgar(TRAMA* ptrTrama) +{ + + exit(EXIT_SUCCESS); +} +//______________________________________________________________________________________________________ +// Funcin: Sondeo +// +// Descripcin: +// Enva al servidor una confirmacin de que est dentro del sistema +// Parmetros: +// ptrTrama: contenido del mensajede +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//______________________________________________________________________________________________________ +BOOLEAN Sondeo(TRAMA* ptrTrama) +{ + return(TRUE); +} +//______________________________________________________________________________________________________ +// Funcin: ConsolaRemota +// +// Descripcin: +// Ejecuta un comando de la Shell y envia el eco al servidor (Consola remota) +// Parmetros: +// ptrTrama: contenido del mensaje +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//______________________________________________________________________________________________________ +BOOLEAN ConsolaRemota(TRAMA* ptrTrama) +{ + SOCKET socket_c; + char *nfn,*scp,*aux,ecosrc[LONPRM],ecodst[LONPRM],msglog[LONSTD];; + char modulo[] = "ConsolaRemota()"; + + /* Nombre del archivo de script */ + char filescript[LONPRM]; + sprintf(filescript,"/tmp/_script_%s",IPlocal); + + aux=copiaParametro("scp",ptrTrama); + scp=URLDecode(aux); + escribeArchivo(filescript,scp); + liberaMemoria(aux); + liberaMemoria(scp); + + nfn=copiaParametro("nfn",ptrTrama); + sprintf(interface,"%s/%s",pathinterface,nfn); + sprintf(ecosrc,"/tmp/_econsola_%s",IPlocal); + sprintf(parametros,"%s %s %s",nfn,filescript,ecosrc); + herror=interfaceAdmin(interface,parametros,NULL); + if(herror){ + sprintf(msglog,"%s:%s",tbErrores[86],nfn); + errorInfo(modulo,msglog); + } + else{ + /* Enva fichero de inventario al servidor */ + sprintf(ecodst,"/tmp/_Seconsola_%s",IPlocal); // Nombre que tendra el archivo en el Servidor + initParametros(ptrTrama,0); + sprintf(ptrTrama->parametros,"nfn=recibeArchivo\rnfl=%s\r",ecodst); + if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_COMANDO)){ + errorLog(modulo,42,FALSE); + return(FALSE); + } + /* Espera seal para comenzar el envo */ + liberaMemoria(ptrTrama); + recibeFlag(&socket_c,ptrTrama); + /* Enva archivo */ + if(!sendArchivo(&socket_c,ecosrc)){ + errorLog(modulo,57, FALSE); + herror=12; // Error de envo de fichero por la red + } + close(socket_c); + } + liberaMemoria(nfn); + return(TRUE); +} +//_____________________________________________________________________________________________________ +// Funcin: Comando +// +// Descripcin: +// COmando personalizado enviado desde el servidor +// Parmetros: +// ptrTrama: contenido del mensaje +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//_____________________________________________________________________________________________________ +BOOLEAN Comando(TRAMA* ptrTrama) +{ + char *ids,*nfn,msglog[LONSTD]; + char modulo[] = "Comando()"; + + if (ndebug>=DEBUG_MAXIMO) { + sprintf(msglog, "%s:%s",tbMensajes[21],modulo); + infoDebug(msglog); + } + nfn=copiaParametro("nfn",ptrTrama); + ids=copiaParametro("ids",ptrTrama); + + sprintf(interface,"%s/%s",pathinterface,nfn); + herror=interfaceAdmin(interface,NULL,NULL); + if(herror){ + sprintf(msglog,"%s:%s",tbErrores[86],nfn); + errorInfo(modulo,msglog); + } + /* Envia respuesta de ejecucucin del comando */ + initParametros(ptrTrama,0); + sprintf(ptrTrama->parametros,"nfn=RESPUESTA_%s\r",nfn); + respuestaEjecucionComando(ptrTrama,herror,ids); + liberaMemoria(nfn); + liberaMemoria(ids); + return(TRUE); +} +//_____________________________________________________________________________________________________ +// Funcin: Arrancar +// +// Descripcin: +// Responde a un comando de encendido por la red +// Parmetros: +// ptrTrama: contenido del mensaje +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//_____________________________________________________________________________________________________ +BOOLEAN Arrancar(TRAMA* ptrTrama) +{ + int lon; + char *ids,msglog[LONSTD]; + char modulo[] = "Arrancar()"; + + if (ndebug>=DEBUG_MAXIMO) { + sprintf(msglog, "%s:%s",tbMensajes[21],modulo); + infoDebug(msglog); + } + + ids=copiaParametro("ids",ptrTrama); + + /* Envia respuesta de ejecucucin del script */ + initParametros(ptrTrama,0); + lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Arrancar"); + lon+=sprintf(ptrTrama->parametros+lon,"tpc=%s\r",CLIENTE_OPENGNSYS); + respuestaEjecucionComando(ptrTrama,0,ids); + liberaMemoria(ids); + return(TRUE); +} +//_____________________________________________________________________________________________________ +// Funcin: Apagar +// +// Descripcin: +// Apaga el cliente +// Parmetros: +// ptrTrama: contenido del mensaje +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//_____________________________________________________________________________________________________ +BOOLEAN Apagar(TRAMA* ptrTrama) +{ + char *ids,*nfn,msglog[LONSTD]; + char modulo[] = "Apagar()"; + + if (ndebug>=DEBUG_MAXIMO) { + sprintf(msglog, "%s:%s",tbMensajes[21],modulo); + infoDebug(msglog); + } + nfn=copiaParametro("nfn",ptrTrama); + ids=copiaParametro("ids",ptrTrama); + + initParametros(ptrTrama,0); + sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Apagar"); + respuestaEjecucionComando(ptrTrama,0,ids); + + sprintf(interface,"%s/%s",pathinterface,nfn); + herror=interfaceAdmin(interface,NULL,NULL); + if(herror){ + sprintf(msglog,"%s:%s",tbErrores[86],nfn); + liberaMemoria(nfn); + liberaMemoria(ids); + errorInfo(modulo,msglog); + return(FALSE); + } + liberaMemoria(nfn); + liberaMemoria(ids); + return(TRUE); +} +//_____________________________________________________________________________________________________ +// Funcin: Reiniciar +// +// Descripcin: +// Apaga el cliente +// Parmetros: +// ptrTrama: contenido del mensaje +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//_____________________________________________________________________________________________________ +BOOLEAN Reiniciar(TRAMA* ptrTrama) +{ + char *nfn,*ids,msglog[LONSTD]; + char modulo[] = "Reiniciar()"; + + if (ndebug>=DEBUG_MAXIMO) { + sprintf(msglog, "%s:%s",tbMensajes[21],modulo); + infoDebug(msglog); + } + nfn=copiaParametro("nfn",ptrTrama); + ids=copiaParametro("ids",ptrTrama); + + initParametros(ptrTrama,0); + sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Reiniciar"); + respuestaEjecucionComando(ptrTrama,0,ids); + + sprintf(interface,"%s/%s",pathinterface,nfn); + herror=interfaceAdmin(interface,NULL,NULL); + if(herror){ + sprintf(msglog,"%s:%s",tbErrores[86],nfn); + liberaMemoria(nfn); + liberaMemoria(ids); + errorInfo(modulo,msglog); + return(FALSE); + } + liberaMemoria(nfn); + liberaMemoria(ids); + return(TRUE); +} +//_____________________________________________________________________________________________________ +// Funcin: IniciarSesion +// +// Descripcin: +// Inicia sesin en el Sistema Operativo de una de las particiones +// Parmetros: +// ptrTrama: contenido del mensaje +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//_____________________________________________________________________________________________________ +BOOLEAN IniciarSesion(TRAMA* ptrTrama) +{ + char *nfn,*ids,*disk,*par,msglog[LONSTD]; + char modulo[] = "IniciarSesion()"; + + if (ndebug>=DEBUG_MAXIMO) { + sprintf(msglog, "%s:%s",tbMensajes[21],modulo); + infoDebug(msglog); + } + nfn=copiaParametro("nfn",ptrTrama); + ids=copiaParametro("ids",ptrTrama); + disk=copiaParametro("dsk",ptrTrama); + par=copiaParametro("par",ptrTrama); + + initParametros(ptrTrama,0); + sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_IniciarSesion"); + respuestaEjecucionComando(ptrTrama,0,ids); + liberaMemoria(ids); + + sprintf(interface,"%s/%s",pathinterface,nfn); + sprintf(parametros,"%s %s %s",nfn,disk,par); + liberaMemoria(par); + + herror=interfaceAdmin(interface,parametros,NULL); + + if(herror){ + sprintf(msglog,"%s:%s",tbErrores[86],nfn); + liberaMemoria(nfn); + errorInfo(modulo,msglog); + return(FALSE); + } + liberaMemoria(nfn); + return(TRUE); +} +//______________________________________________________________________________________________________ +// Funcin: CrearImagen +// +// Descripcin: +// Crea una imagen de una particin +// Parmetros: +// ptrTrama: contenido del mensaje +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//______________________________________________________________________________________________________ +BOOLEAN CrearImagen(TRAMA* ptrTrama) +{ + int lon; + char *nfn,*dsk,*par,*cpt,*idi,*ipr,*nci,*ids,msglog[LONSTD]; + char modulo[] = "CrearImagen()"; + + if (ndebug>=DEBUG_MAXIMO) { + sprintf(msglog, "%s:%s",tbMensajes[21],modulo); + infoDebug(msglog); + } + + dsk=copiaParametro("dsk",ptrTrama); // Disco + par=copiaParametro("par",ptrTrama); // Nmero de particin + cpt=copiaParametro("cpt",ptrTrama); // Cdigo de la particin + idi=copiaParametro("idi",ptrTrama); // Identificador de la imagen + nci=copiaParametro("nci",ptrTrama); // Nombre cannico de la imagen + ipr=copiaParametro("ipr",ptrTrama); // Ip del repositorio + + nfn=copiaParametro("nfn",ptrTrama); + ids=copiaParametro("ids",ptrTrama); + muestraMensaje(7,NULL); + + if(InventariandoSoftware(ptrTrama,FALSE,"InventarioSoftware")){ // Crea inventario Software previamente + muestraMensaje(2,NULL); + sprintf(interface,"%s/%s",pathinterface,nfn); + sprintf(parametros,"%s %s %s %s %s",nfn,dsk,par,nci,ipr); + herror=interfaceAdmin(interface,parametros,NULL); + if(herror){ + sprintf(msglog,"%s:%s",tbErrores[86],nfn); + errorInfo(modulo,msglog); + muestraMensaje(10,NULL); + } + else + muestraMensaje(9,NULL); + } + else{ + sprintf(msglog,"%s:%s",tbErrores[86],nfn); + errorInfo(modulo,msglog); + } + + /* Envia respuesta de ejecucin de la funcin de interface */ + initParametros(ptrTrama,0); + lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_CrearImagen"); + lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen + lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Nmero de disco + lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Nmero de particin de donde se cre + lon+=sprintf(ptrTrama->parametros+lon,"cpt=%s\r",cpt); // Tipo o cdigo de particin + lon+=sprintf(ptrTrama->parametros+lon,"ipr=%s\r",ipr); // Ip del repositorio donde se aloj + respuestaEjecucionComando(ptrTrama,herror,ids); + + liberaMemoria(dsk); + liberaMemoria(par); + liberaMemoria(cpt); + liberaMemoria(idi); + liberaMemoria(nci); + liberaMemoria(ipr); + liberaMemoria(nfn); + liberaMemoria(ids); + + muestraMenu(); + + return(TRUE); +} +//______________________________________________________________________________________________________ +// Funcin: CrearImagenBasica +// +// Descripcin: +// Crea una imagen bsica a travers dela sincronizacin +// Parmetros: +// ptrTrama: contenido del mensaje +// +// FDevuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//______________________________________________________________________________________________________ +BOOLEAN CrearImagenBasica(TRAMA* ptrTrama) +{ + int lon; + char *nfn,*dsk,*par,*cpt,*idi,*nci,*rti,*ipr,*msy,*whl,*eli,*cmp,*bpi,*cpc,*bpc,*nba,*ids,msglog[LONSTD]; + char modulo[] = "CrearImagenBasica()"; + + if (ndebug>=DEBUG_MAXIMO) { + sprintf(msglog, "%s:%s",tbMensajes[21],modulo); + infoDebug(msglog); + } + nfn=copiaParametro("nfn",ptrTrama); + dsk=copiaParametro("dsk",ptrTrama); // Disco + par=copiaParametro("par",ptrTrama); // Nmero de particin + cpt=copiaParametro("cpt",ptrTrama); // Tipo de particin + idi=copiaParametro("idi",ptrTrama); // Identificador de la imagen + nci=copiaParametro("nci",ptrTrama); // Nombre cannico de la imagen + rti=copiaParametro("rti",ptrTrama); // Ruta de origen de la imagen + ipr=copiaParametro("ipr",ptrTrama); // Ip del repositorio + + msy=copiaParametro("msy",ptrTrama); // Mtodo de sincronizacin + + whl=copiaParametro("whl",ptrTrama); // Envo del fichero completo si hay diferencias + eli=copiaParametro("eli",ptrTrama); // Elimiar archivos en destino que no estn en origen + cmp=copiaParametro("cmp",ptrTrama); // Comprimir antes de enviar + + bpi=copiaParametro("bpi",ptrTrama); // Borrar la imagen antes de crearla + cpc=copiaParametro("cpc",ptrTrama); // Copiar tambin imagen a la cache + bpc=copiaParametro("bpc",ptrTrama); // Borrarla de la cache antes de copiarla en ella + nba=copiaParametro("nba",ptrTrama); // No borrar archivos en destino + + muestraMensaje(7,NULL); // Creando Inventario Software + if(InventariandoSoftware(ptrTrama,FALSE,"InventarioSoftware")){ // Crea inventario Software previamente + muestraMensaje(30,NULL);// Creando Imagen Bsica, por favor espere... + sprintf(interface,"%s/%s",pathinterface,nfn); + sprintf(parametros,"%s %s %s %s %s %s%s%s %s%s%s%s %s %s",nfn,dsk,par,nci,ipr,whl,eli,cmp,bpi,cpc,bpc,nba,msy,rti); + herror=interfaceAdmin(interface,parametros,NULL); + if(herror){ + sprintf(msglog,"%s:%s",tbErrores[86],nfn); + errorInfo(modulo,msglog); + muestraMensaje(29,NULL);// Ha habido algn error en el proceso de creacin de imagen bsica + } + else + muestraMensaje(28,NULL);// El proceso de creacin de imagen bsica ha terminado correctamente + } + else{ + sprintf(msglog,"%s:%s",tbErrores[86],nfn); + errorInfo(modulo,msglog); + } + + ids=copiaParametro("ids",ptrTrama); // Identificador de la sesin + + /* Envia respuesta de ejecucin de la funcin de interface */ + initParametros(ptrTrama,0); + lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_CrearImagenBasica"); + lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen + lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Nmero de disco + lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Nmero de particin de donde se cre + lon+=sprintf(ptrTrama->parametros+lon,"cpt=%s\r",cpt); // Tipo o cdigo de particin + lon+=sprintf(ptrTrama->parametros+lon,"ipr=%s\r",ipr); // Ip del repositorio donde se aloj + respuestaEjecucionComando(ptrTrama,herror,ids); + + liberaMemoria(nfn); + liberaMemoria(dsk); + liberaMemoria(par); + liberaMemoria(cpt); + liberaMemoria(idi); + liberaMemoria(nci); + liberaMemoria(rti); + liberaMemoria(ipr); + + liberaMemoria(msy); + + liberaMemoria(whl); + liberaMemoria(eli); + liberaMemoria(cmp); + + liberaMemoria(bpi); + liberaMemoria(cpc); + liberaMemoria(bpc); + liberaMemoria(nba); + liberaMemoria(ids); + + muestraMenu(); + + return(TRUE); +} +//______________________________________________________________________________________________________ +// Funcin: CrearSoftIncremental +// +// Descripcin: +// Crea una software incremental comparando una particin con una imagen bsica +// Parmetros: +// ptrTrama: contenido del mensaje +// +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//______________________________________________________________________________________________________ +BOOLEAN CrearSoftIncremental(TRAMA* ptrTrama) +{ + int lon; + char *nfn,*dsk,*par,*idi,*idf,*ipr,*nci,*rti,*ncf,*msy,*whl,*eli,*cmp,*bpi,*cpc,*bpc,*nba,*ids,msglog[LONSTD]; + char modulo[] = "CrearSoftIncremental()"; + + if (ndebug>=DEBUG_MAXIMO) { + sprintf(msglog, "%s:%s",tbMensajes[21],modulo); + infoDebug(msglog); + } + nfn=copiaParametro("nfn",ptrTrama); + + dsk=copiaParametro("dsk",ptrTrama); // Disco + par=copiaParametro("par",ptrTrama); // Nmero de particin + idi=copiaParametro("idi",ptrTrama); // Identificador de la imagen + nci=copiaParametro("nci",ptrTrama); // Nombre cannico de la imagen + rti=copiaParametro("rti",ptrTrama); // Ruta de origen de la imagen + ipr=copiaParametro("ipr",ptrTrama); // Ip del repositorio + idf=copiaParametro("idf",ptrTrama); // Identificador de la imagen diferencial + ncf=copiaParametro("ncf",ptrTrama); // Nombre cannico de la imagen diferencial + + msy=copiaParametro("msy",ptrTrama); // Mtodo de sincronizacin + + whl=copiaParametro("whl",ptrTrama); // Envo del fichero completo si hay diferencias + eli=copiaParametro("eli",ptrTrama); // Elimiar archivos en destino que no estn en origen + cmp=copiaParametro("cmp",ptrTrama); // Comprimir antes de enviar + + bpi=copiaParametro("bpi",ptrTrama); // Borrar la imagen antes de crearla + cpc=copiaParametro("cpc",ptrTrama); // Copiar tambin imagen a la cache + bpc=copiaParametro("bpc",ptrTrama); // Borrarla de la cache antes de copiarla en ella + nba=copiaParametro("nba",ptrTrama); // No borrar archivos en destino + + muestraMensaje(7,NULL); // Creando Inventario Software + if(InventariandoSoftware(ptrTrama,FALSE,"InventarioSoftware")){ // Crea inventario Software previamente + muestraMensaje(25,NULL);// Creando Imagen Incremental, por favor espere... + sprintf(interface,"%s/%s",pathinterface,nfn); + sprintf(parametros,"%s %s %s %s %s %s %s%s%s %s%s%s%s %s %s",nfn,dsk,par,nci,ipr,ncf,whl,eli,cmp,bpi,cpc,bpc,nba,msy,rti); + + herror=interfaceAdmin(interface,parametros,NULL); + if(herror){ + sprintf(msglog,"%s:%s",tbErrores[86],nfn); + errorInfo(modulo,msglog); + muestraMensaje(27,NULL);// Ha habido algn error en el proceso de creacin de imagen bsica + } + else + muestraMensaje(26,NULL);// El proceso de creacin de imagen incremental ha terminado correctamente + } + else{ + sprintf(msglog,"%s:%s",tbErrores[86],nfn); + errorInfo(modulo,msglog); + } + + ids=copiaParametro("ids",ptrTrama); // Identificador de la sesin + + /* Envia respuesta de ejecucin de la funcin de interface */ + initParametros(ptrTrama,0); + lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_CrearSoftIncremental"); + lon+=sprintf(ptrTrama->parametros+lon,"idf=%s\r",idf); // Identificador de la imagen incremental + lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Nmero de disco + lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Nmero de particin + respuestaEjecucionComando(ptrTrama,herror,ids); + + liberaMemoria(nfn); + liberaMemoria(dsk); + liberaMemoria(par); + liberaMemoria(idi); + liberaMemoria(nci); + liberaMemoria(rti); + liberaMemoria(ipr); + liberaMemoria(idf); + liberaMemoria(ncf); + liberaMemoria(msy); + liberaMemoria(whl); + liberaMemoria(eli); + liberaMemoria(cmp); + liberaMemoria(bpi); + liberaMemoria(cpc); + liberaMemoria(bpc); + liberaMemoria(nba); + liberaMemoria(ids); + + muestraMenu(); + + return(TRUE); +} +//______________________________________________________________________________________________________ +// Funcin: RestaurarImagen +// +// Descripcin: +// Restaura una imagen en una particin +// Parmetros: +// ptrTrama: contenido del mensaje +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En bpccaso de ocurrir algn error +//______________________________________________________________________________________________________ +BOOLEAN RestaurarImagen(TRAMA* ptrTrama) +{ + int lon; + char *nfn,*dsk,*par,*idi,*ipr,*ifs,*cfg,*nci,*ids,*ptc,msglog[LONSTD]; + char modulo[] = "RestaurarImagen()"; + + if (ndebug>=DEBUG_MAXIMO) { + sprintf(msglog, "%s:%s",tbMensajes[21],modulo); + infoDebug(msglog); + } + + dsk=copiaParametro("dsk",ptrTrama); + par=copiaParametro("par",ptrTrama); + idi=copiaParametro("idi",ptrTrama); + ipr=copiaParametro("ipr",ptrTrama); + nci=copiaParametro("nci",ptrTrama); + ifs=copiaParametro("ifs",ptrTrama); + ptc=copiaParametro("ptc",ptrTrama); + + nfn=copiaParametro("nfn",ptrTrama); + ids=copiaParametro("ids",ptrTrama); + muestraMensaje(3,NULL); + sprintf(interface,"%s/%s",pathinterface,nfn); + sprintf(parametros,"%s %s %s %s %s %s",nfn,dsk,par,nci,ipr,ptc); + herror=interfaceAdmin(interface,parametros,NULL); + if(herror){ + sprintf(msglog,"%s:%s",tbErrores[86],nfn); + errorInfo(modulo,msglog); + muestraMensaje(12,NULL); + } + else + muestraMensaje(11,NULL); + + /* Obtener nueva configuracin */ + cfg=LeeConfiguracion(); + if(!cfg){ // No se puede recuperar la configuracin del cliente + errorLog(modulo,36,FALSE); + } + + /* Envia respuesta de ejecucin de la funcin de interface */ + initParametros(ptrTrama,0); + lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_RestaurarImagen"); + lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen + lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Nmero de disco + lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Nmero de particin + lon+=sprintf(ptrTrama->parametros+lon,"ifs=%s\r",ifs); // Identificador del perfil software + lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuracin de discos + respuestaEjecucionComando(ptrTrama,herror,ids); + + liberaMemoria(nfn); + liberaMemoria(dsk); + liberaMemoria(par); + liberaMemoria(idi); + liberaMemoria(nci); + liberaMemoria(ipr); + liberaMemoria(ifs); + liberaMemoria(cfg); + liberaMemoria(ptc); + liberaMemoria(ids); + + muestraMenu(); + + return(TRUE); +} +//______________________________________________________________________________________________________ +// Funcin: RestaurarImagenBasica +// +// Descripcin: +// Restaura una imagen bsica en una particin +// Parmetros: +// ptrTrama: contenido del mensaje +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//______________________________________________________________________________________________________ +BOOLEAN RestaurarImagenBasica(TRAMA* ptrTrama) +{ + int lon; + char *nfn,*dsk,*par,*idi,*ipr,*met,*nci,*rti,*ifs,*cfg,*msy,*whl,*eli,*cmp,*tpt,*bpi,*cpc,*bpc,*nba,*ids,msglog[LONSTD]; + char modulo[] = "RestaurarImagenBasica()"; + + if (ndebug>=DEBUG_MAXIMO) { + sprintf(msglog, "%s:%s",tbMensajes[21],modulo); + infoDebug(msglog); + } + dsk=copiaParametro("dsk",ptrTrama); + par=copiaParametro("par",ptrTrama); + idi=copiaParametro("idi",ptrTrama); + ipr=copiaParametro("ipr",ptrTrama); + met=copiaParametro("met",ptrTrama); // Mtodo de clonacin 0= desde cach 1= desde repositorio + nci=copiaParametro("nci",ptrTrama); + rti=copiaParametro("rti",ptrTrama); // Ruta de origen de la imagen + ifs=copiaParametro("ifs",ptrTrama); + + tpt=copiaParametro("tpt",ptrTrama); // Tipo de trasnmisin unicast o multicast + msy=copiaParametro("msy",ptrTrama); // Metodo de sincronizacion + + whl=copiaParametro("whl",ptrTrama); // Envo del fichero completo si hay diferencias + eli=copiaParametro("eli",ptrTrama); // Elimiar archivos en destino que no estn en origen + cmp=copiaParametro("cmp",ptrTrama); // Comprimir antes de enviar + + bpi=copiaParametro("bpi",ptrTrama); // Borrar la imagen antes de crearla + cpc=copiaParametro("cpc",ptrTrama); // Copiar tambin imagen a la cache + bpc=copiaParametro("bpc",ptrTrama); // Borrarla de la cache antes de copiarla en ella + nba=copiaParametro("nba",ptrTrama); // No borrar archivos en destino + + nfn=copiaParametro("nfn",ptrTrama); + ids=copiaParametro("ids",ptrTrama); + muestraMensaje(31,NULL); + sprintf(interface,"%s/%s",pathinterface,nfn); + sprintf(parametros,"%s %s %s %s %s %s %s%s%s %s%s%s%s %s %s %s",nfn,dsk,par,nci,ipr,tpt,whl,eli,cmp,bpi,cpc,bpc,nba,met,msy,rti); + herror=interfaceAdmin(interface,parametros,NULL); + if(herror){ + sprintf(msglog,"%s:%s",tbErrores[86],nfn); + errorInfo(modulo,msglog); + muestraMensaje(33,NULL); + } + else + muestraMensaje(32,NULL); + + /* Obtener nueva configuracin */ + cfg=LeeConfiguracion(); + if(!cfg){ // No se puede recuperar la configuracin del cliente + errorLog(modulo,36,FALSE); + } + + /* Envia respuesta de ejecucin de la funcin de interface */ + initParametros(ptrTrama,0); + lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_RestaurarImagenBasica"); + lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen + lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Nmero de disco + lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Nmero de particin + lon+=sprintf(ptrTrama->parametros+lon,"ifs=%s\r",ifs); // Identificador del perfil software + lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuracin de discos + respuestaEjecucionComando(ptrTrama,herror,ids); + + liberaMemoria(nfn); + liberaMemoria(dsk); + liberaMemoria(par); + liberaMemoria(idi); + liberaMemoria(nci); + liberaMemoria(rti); + liberaMemoria(ifs); + liberaMemoria(cfg); + liberaMemoria(ipr); + liberaMemoria(met); + + liberaMemoria(tpt); + liberaMemoria(msy); + + liberaMemoria(whl); + liberaMemoria(eli); + liberaMemoria(cmp); + + liberaMemoria(bpi); + liberaMemoria(cpc); + liberaMemoria(bpc); + liberaMemoria(nba); + liberaMemoria(ids); + + muestraMenu(); + + return(TRUE); +} +//______________________________________________________________________________________________________ +// Funcin: RestaurarSoftIncremental +// +// Descripcin: +// Restaura software incremental en una particin +// Parmetros: +// ptrTrama: contenido del mensaje +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//______________________________________________________________________________________________________ +BOOLEAN RestaurarSoftIncremental(TRAMA* ptrTrama) +{ + int lon; + char *nfn,*dsk,*par,*idi,*ipr,*met,*ifs,*nci,*rti,*idf,*ncf,*msy,*whl,*eli,*cmp,*tpt,*bpi,*cpc,*bpc,*nba,*ids,msglog[LONSTD]; + char modulo[] = "RestaurarSoftIncremental()"; + + if (ndebug>=DEBUG_MAXIMO) { + sprintf(msglog, "%s:%s",tbMensajes[21],modulo); + infoDebug(msglog); + } + dsk=copiaParametro("dsk",ptrTrama); + par=copiaParametro("par",ptrTrama); + idi=copiaParametro("idi",ptrTrama); + idf=copiaParametro("idf",ptrTrama); + ipr=copiaParametro("ipr",ptrTrama); + met=copiaParametro("met",ptrTrama); // Mtodo de clonacin 0= desde cach 1= desde repositorio + ifs=copiaParametro("ifs",ptrTrama); + nci=copiaParametro("nci",ptrTrama); + rti=copiaParametro("rti",ptrTrama); // Ruta de origen de la imagen + ncf=copiaParametro("ncf",ptrTrama); + + tpt=copiaParametro("tpt",ptrTrama); // Tipo de trasnmisin unicast o multicast + msy=copiaParametro("msy",ptrTrama); // Metodo de sincronizacion + + whl=copiaParametro("whl",ptrTrama); // Envo del fichero completo si hay diferencias + eli=copiaParametro("eli",ptrTrama); // Elimiar archivos en destino que no estn en origen + cmp=copiaParametro("cmp",ptrTrama); // Comprimir antes de enviar + + bpi=copiaParametro("bpi",ptrTrama); // Borrar la imagen antes de crearla + cpc=copiaParametro("cpc",ptrTrama); // Copiar tambin imagen a la cache + bpc=copiaParametro("bpc",ptrTrama); // Borrarla de la cache antes de copiarla en ella + nba=copiaParametro("nba",ptrTrama); // No borrar archivos en destino + + nfn=copiaParametro("nfn",ptrTrama); + ids=copiaParametro("ids",ptrTrama); + muestraMensaje(31,NULL); + sprintf(interface,"%s/%s",pathinterface,nfn); + sprintf(parametros,"%s %s %s %s %s %s %s %s%s%s %s%s%s%s %s %s %s",nfn,dsk,par,nci,ipr,ncf,tpt,whl,eli,cmp,bpi,cpc,bpc,nba,met,msy,rti); + herror=interfaceAdmin(interface,parametros,NULL); + if(herror){ + sprintf(msglog,"%s:%s",tbErrores[86],nfn); + errorInfo(modulo,msglog); + muestraMensaje(35,NULL); + } + else + muestraMensaje(34,NULL); + + /* Envia respuesta de ejecucin de la funcin de interface */ + initParametros(ptrTrama,0); + lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_RestaurarSoftIncremental"); + lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idf); // Identificador de la imagen incremental (Forzada a idi) + lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Nmero de disco + lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Nmero de particin + lon+=sprintf(ptrTrama->parametros+lon,"ifs=%s\r",ifs); // Identificador del perfil software + + respuestaEjecucionComando(ptrTrama,herror,ids); + + liberaMemoria(nfn); + liberaMemoria(dsk); + liberaMemoria(par); + liberaMemoria(idi); + liberaMemoria(idf); + liberaMemoria(nci); + liberaMemoria(rti); + liberaMemoria(ncf); + liberaMemoria(ifs); + liberaMemoria(ipr); + liberaMemoria(met); + + liberaMemoria(tpt); + liberaMemoria(msy); + + liberaMemoria(whl); + liberaMemoria(eli); + liberaMemoria(cmp); + + liberaMemoria(bpi); + liberaMemoria(cpc); + liberaMemoria(bpc); + liberaMemoria(nba); + liberaMemoria(ids); + + muestraMenu(); + + return(TRUE); +} +//______________________________________________________________________________________________________ +// Funcin: Configurar +// +// Descripcin: +// Configura la tabla de particiones y formatea +// Parmetros: +// ptrTrama: contenido del mensaje +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//______________________________________________________________________________________________________ +BOOLEAN Configurar(TRAMA* ptrTrama) +{ + int lon; + char *nfn,*dsk,*cfg,*ids,msglog[LONSTD]; + char modulo[] = "Configurar()"; + + if (ndebug>=DEBUG_MAXIMO) { + sprintf(msglog, "%s:%s",tbMensajes[21],modulo); + infoDebug(msglog); + } + + dsk=copiaParametro("dsk",ptrTrama); + cfg=copiaParametro("cfg",ptrTrama); + /* Sustituir caracteres */ + sustituir(cfg,'\n','$'); + sustituir(cfg,'\t','#'); + + nfn=copiaParametro("nfn",ptrTrama); + ids=copiaParametro("ids",ptrTrama); + muestraMensaje(4,NULL); + sprintf(interface,"%s/%s",pathinterface,nfn); + sprintf(parametros,"%s %s %s",nfn,dsk,cfg); + + herror=interfaceAdmin(interface,parametros,NULL); + if(herror){ + sprintf(msglog,"%s:%s",tbErrores[86],nfn); + errorInfo(modulo,msglog); + muestraMensaje(13,NULL); + } + else + muestraMensaje(14,NULL); + + cfg=LeeConfiguracion(); + if(!cfg){ // No se puede recuperar la configuracin del cliente + errorLog(modulo,36,FALSE); + return(FALSE); + } + + /* Envia respuesta de ejecucin del comando*/ + initParametros(ptrTrama,0); + lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Configurar"); + lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuracin de los Sistemas Operativos del cliente + respuestaEjecucionComando(ptrTrama,herror,ids); + + liberaMemoria(dsk); + liberaMemoria(cfg); + liberaMemoria(nfn); + liberaMemoria(ids); + + muestraMenu(); + + return(TRUE); +} +// ________________________________________________________________________________________________________ +// Funcin: InventarioHardware +// +// Descripcin: +// Envia al servidor el nombre del archivo de inventario de su hardware para posteriormente +// esperar que ste lo solicite y enviarlo por la red. +// Parmetros: +// ptrTrama: contenido del mensaje +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//______________________________________________________________________________________________________ +BOOLEAN InventarioHardware(TRAMA* ptrTrama) +{ + int lon; + SOCKET socket_c; + char *nfn,*ids,msglog[LONSTD],hrdsrc[LONPRM],hrddst[LONPRM]; + char modulo[] = "InventarioHardware()"; + + if (ndebug>=DEBUG_MAXIMO) { + sprintf(msglog, "%s:%s",tbMensajes[21],modulo); + infoDebug(msglog); + } + + nfn=copiaParametro("nfn",ptrTrama); + ids=copiaParametro("ids",ptrTrama); + muestraMensaje(6,NULL); + + sprintf(interface,"%s/%s",pathinterface,nfn); + sprintf(hrdsrc,"/tmp/Chrd-%s",IPlocal); // Nombre que tendra el archivo de inventario + sprintf(parametros,"%s %s",nfn,hrdsrc); + herror=interfaceAdmin(interface,parametros,NULL); + if(herror){ + sprintf(msglog,"%s:%s",tbErrores[86],nfn); + errorInfo(modulo,msglog); + muestraMensaje(18,NULL); + } + else{ + /* Enva fichero de inventario al servidor */ + sprintf(hrddst,"/tmp/Shrd-%s",IPlocal); // Nombre que tendra el archivo en el Servidor + initParametros(ptrTrama,0); + sprintf(ptrTrama->parametros,"nfn=recibeArchivo\rnfl=%s\r",hrddst); + if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_COMANDO)){ + liberaMemoria(nfn); + liberaMemoria(ids); + errorLog(modulo,42,FALSE); + return(FALSE); + } + /* Espera seal para comenzar el envo */ + liberaMemoria(ptrTrama); + recibeFlag(&socket_c,ptrTrama); + /* Enva archivo */ + if(!sendArchivo(&socket_c,hrdsrc)){ + errorLog(modulo,57, FALSE); + herror=12; // Error de envo de fichero por la red + } + close(socket_c); + muestraMensaje(17,NULL); + } + + /* Envia respuesta de ejecucin de la funcin de interface */ + initParametros(ptrTrama,0); + lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_InventarioHardware"); + lon+=sprintf(ptrTrama->parametros+lon,"hrd=%s\r",hrddst); + respuestaEjecucionComando(ptrTrama,herror,ids); + liberaMemoria(nfn); + liberaMemoria(ids); + + muestraMenu(); + + return(TRUE); +} +// ________________________________________________________________________________________________________ +// Funcin: InventarioSoftware +// +// Descripcin: +// Crea el inventario software de un sistema operativo instalado en una particin. +// Parmetros: +// ptrTrama: contenido del mensaje +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//______________________________________________________________________________________________________ +BOOLEAN InventarioSoftware(TRAMA* ptrTrama) +{ + char *nfn,*ids,msglog[LONSTD]; + char modulo[] = "InventarioSoftware()"; + + if (ndebug>=DEBUG_MAXIMO) { + sprintf(msglog, "%s:%s",tbMensajes[21],modulo); + infoDebug(msglog); + } + nfn=copiaParametro("nfn",ptrTrama); + ids=copiaParametro("ids",ptrTrama); + muestraMensaje(7,NULL); + InventariandoSoftware(ptrTrama,TRUE,nfn); + respuestaEjecucionComando(ptrTrama,herror,ids); + liberaMemoria(nfn); + liberaMemoria(ids); + muestraMenu(); + return(TRUE); +} +// ________________________________________________________________________________________________________ +// +// Funcin: InventariandoSoftware +// +// Descripcin: +// Envia al servidor el nombre del archivo de inventario de su software para posteriormente +// esperar que ste lo solicite y enviarlo por la red. +// Parmetros: +// ptrTrama: contenido del mensaje +// sw: switch que indica si la funcin es llamada por el comando InventarioSoftware(true) o CrearImagen(false) +// nfn: Nombre de la funcin del Interface que implementa el comando +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//______________________________________________________________________________________________________ +BOOLEAN InventariandoSoftware(TRAMA* ptrTrama,BOOLEAN sw,char *nfn) +{ + int lon; + SOCKET socket_c; + char *dsk,*par,msglog[LONSTD],sftsrc[LONPRM],sftdst[LONPRM]; + char modulo[] = "InventariandoSoftware()"; + + dsk=copiaParametro("dsk",ptrTrama); // Disco + par=copiaParametro("par",ptrTrama); + + sprintf(interface,"%s/%s",pathinterface,nfn); + sprintf(sftsrc,"/tmp/CSft-%s-%s",IPlocal,par); // Nombre que tendra el archivo de inventario + sprintf(parametros,"%s %s %s %s",nfn,dsk,par,sftsrc); + + herror=interfaceAdmin(interface,parametros,NULL); + herror=0; + if(herror){ + sprintf(msglog,"%s:%s",tbErrores[86],nfn); + errorInfo(modulo,msglog); + muestraMensaje(20,NULL); + } + else{ + /* Enva fichero de inventario al servidor */ + sprintf(sftdst,"/tmp/Ssft-%s-%s",IPlocal,par); // Nombre que tendra el archivo en el Servidor + initParametros(ptrTrama,0); + + sprintf(ptrTrama->parametros,"nfn=recibeArchivo\rnfl=%s\r",sftdst); + if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_COMANDO)){ + errorLog(modulo,42,FALSE); + liberaMemoria(dsk); + liberaMemoria(par); + return(FALSE); + } + /* Espera seal para comenzar el envo */ + liberaMemoria(ptrTrama); + if(!recibeFlag(&socket_c,ptrTrama)){ + errorLog(modulo,17,FALSE); + } + /* Enva archivo */ + if(!sendArchivo(&socket_c,sftsrc)){ + errorLog(modulo,57, FALSE); + herror=12; // Error de envo de fichero por la red + } + close(socket_c); + muestraMensaje(19,NULL); + } + initParametros(ptrTrama,0); + lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_InventarioSoftware"); + lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); + lon+=sprintf(ptrTrama->parametros+lon,"sft=%s\r",sftdst); + if(!sw) + respuestaEjecucionComando(ptrTrama,herror,"0"); + + liberaMemoria(dsk); + liberaMemoria(par); + return(TRUE); +} +// ________________________________________________________________________________________________________ +// Funcin: EjecutarScript +// +// Descripcin: +// Ejecuta cdigo de script +// Parmetros: +// ptrTrama: contenido del mensaje +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//______________________________________________________________________________________________________ +BOOLEAN EjecutarScript(TRAMA* ptrTrama) +{ + int lon; + char *nfn,*aux,*ids,*scp,*cfg,msglog[LONSTD]; + char modulo[] = "EjecutarScript()"; + + if (ndebug>=DEBUG_MAXIMO) { + sprintf(msglog, "%s:%s",tbMensajes[21],modulo); + infoDebug(msglog); + } + aux=copiaParametro("scp",ptrTrama); + scp=URLDecode(aux); + + + muestraMensaje(8,NULL); + /* Nombre del archivo de script */ + char filescript[LONPRM]; + sprintf(filescript,"/tmp/_script_%s",IPlocal); + escribeArchivo(filescript,scp); + nfn=copiaParametro("nfn",ptrTrama); + sprintf(interface,"%s/%s",pathinterface,nfn); + sprintf(parametros,"%s %s",nfn,filescript); + herror=interfaceAdmin(interface,parametros,NULL); + if(herror){ + sprintf(msglog,"%s:%s",tbErrores[86],nfn); + errorInfo(modulo,msglog); + muestraMensaje(21,NULL); + } + else + muestraMensaje(22,NULL); + + // Toma configuracin de particiones + cfg=LeeConfiguracion(); + if(!cfg){ // No se puede recuperar la configuracin del cliente + errorLog(modulo,36,FALSE); + herror=36; + } + + ids=copiaParametro("ids",ptrTrama); + + //herror=ejecutarCodigoBash(scp); + initParametros(ptrTrama,0); + lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_EjecutarScript"); + lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuracin de los Sistemas Operativos del cliente + respuestaEjecucionComando(ptrTrama,herror,ids); + + liberaMemoria(nfn); + liberaMemoria(ids); + liberaMemoria(aux); + liberaMemoria(scp); + liberaMemoria(cfg); + + muestraMenu(); + + return(TRUE); +} +//______________________________________________________________________________________________________ +// Funcin: respuestaEjecucionComando +// +// Descripcin: +// Envia una respuesta a una ejecucion de comando al servidor de Administracin +// Parmetros: +// - ptrTrama: contenido del mensaje +// - res: Resultado de la ejecucin (Cdigo de error devuelto por el script ejecutado) +// - ids: Identificador de la sesion (En caso de no haber seguimiento es NULO) +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +// ________________________________________________________________________________________________________ +BOOLEAN respuestaEjecucionComando(TRAMA* ptrTrama,int res,char *ids) +{ + int lon; + SOCKET socket_c; + char modulo[] = "respuestaEjecucionComando()"; + + lon=strlen(ptrTrama->parametros); + if(ids){ // Existe seguimiento + lon+=sprintf(ptrTrama->parametros+lon,"ids=%s\r",ids); // Aade identificador de la sesin + } + if (res==0){ // Resultado satisfactorio + lon+=sprintf(ptrTrama->parametros+lon,"res=%s\r","1"); + lon+=sprintf(ptrTrama->parametros+lon,"der=%s\r",""); + } + else{ // Algn error + lon+=sprintf(ptrTrama->parametros+lon,"res=%s\r","2"); + if(res>MAXERRORSCRIPT) + lon+=sprintf(ptrTrama->parametros+lon,"der=%s (Error de script:%d)\r",tbErroresScripts[0],res);// Descripcin del error + else + lon+=sprintf(ptrTrama->parametros+lon,"der=%s\r",tbErroresScripts[res]);// Descripcin del error + } + if(!(enviaMensajeServidor(&socket_c,ptrTrama,MSG_NOTIFICACION))){ + errorLog(modulo,44,FALSE); + return(FALSE); + } + + close(socket_c); + return(TRUE); +} +// ________________________________________________________________________________________________________ +// Funcin: gestionaTrama +// +// Descripcin: +// Procesa las tramas recibidas. +// Parametros: +// ptrTrama: contenido del mensaje +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +// ________________________________________________________________________________________________________ +BOOLEAN gestionaTrama(TRAMA *ptrTrama) +{ + int i, res; + char *nfn; + char modulo[] = "gestionaTrama()"; + + INTROaFINCAD(ptrTrama); + nfn = copiaParametro("nfn", ptrTrama); // Toma nombre de funcin + for (i = 0; i < MAXIMAS_FUNCIONES; i++) { // Recorre funciones que procesan las tramas + res = strcmp(tbfuncionesClient[i].nf, nfn); + if (res == 0) { // Encontrada la funcin que procesa el mensaje + liberaMemoria(nfn); + return(tbfuncionesClient[i].fptr(ptrTrama)); // Invoca la funcin + } + } + + liberaMemoria(nfn); + + /* Slo puede ser un comando personalizado + if (ptrTrama->tipo==MSG_COMANDO) + return(Comando(ptrTrama)); + */ + errorLog(modulo, 18, FALSE); + return (FALSE); +} +//________________________________________________________________________________________________________ +// Funcin: ejecutaArchivo +// +// Descripcin: +// Ejecuta los comando contenido en un archivo (cada comando y sus parametros separados por un +// salto de linea. +// Parmetros: +// filecmd: Nombre del archivo de comandos +// ptrTrama: Puntero a una estructura TRAMA usada en las comunicaciones por red (No debe ser NULL) +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +//________________________________________________________________________________________________________ +BOOLEAN ejecutaArchivo(char* filecmd,TRAMA *ptrTrama) +{ + char* buffer,*lineas[MAXIMAS_LINEAS]; + int i,numlin; + char modulo[] = "ejecutaArchivo()"; + + buffer=leeArchivo(filecmd); + if(buffer){ + numlin = splitCadena(lineas, buffer, '@'); + initParametros(ptrTrama,0); + for (i = 0; i < numlin; i++) { + if(strlen(lineas[i])>0){ + strcpy(ptrTrama->parametros,lineas[i]); + //strcat(ptrTrama->parametros,"\rMCDJ@"); // Fin de trama + if(!gestionaTrama(ptrTrama)){ // Anlisis de la trama + errorLog(modulo,39,FALSE); + //return(FALSE); + } + } + } + } + liberaMemoria(buffer); + return(TRUE); +} + +BOOLEAN EjecutaComandosPendientes(TRAMA* ptrTrama) +{ + return(TRUE); +} + +//______________________________________________________________________________________________________ +// Funcin: enviaMensajeServidor +// +// Descripcin: +// Envia un mensaje al servidor de Administracin +// Parmetros: +// - socket_c: (Salida) Socket utilizado para el envo +// - ptrTrama: contenido del mensaje +// - tipo: Tipo de mensaje +// C=Comando, N=Respuesta a un comando, P=Peticion,R=Respuesta a una peticin, I=Informacion +// Devuelve: +// TRUE: Si el proceso es correcto +// FALSE: En caso de ocurrir algn error +// ________________________________________________________________________________________________________ +BOOLEAN enviaMensajeServidor(SOCKET *socket_c,TRAMA *ptrTrama,char tipo) +{ + int lon; + char modulo[] = "enviaMensajeServidor()"; + + *socket_c=abreConexion(); + if(*socket_c==INVALID_SOCKET){ + errorLog(modulo,38,FALSE); // Error de conexin con el servidor + return(FALSE); + } + ptrTrama->arroba='@'; // Cabecera de la trama + strncpy(ptrTrama->identificador,"JMMLCAMDJ_MCDJ",14); // identificador de la trama + ptrTrama->tipo=tipo; // Tipo de mensaje + lon=strlen(ptrTrama->parametros); // Compone la trama + lon+=sprintf(ptrTrama->parametros+lon,"iph=%s\r",IPlocal); // Ip del ordenador + lon+=sprintf(ptrTrama->parametros+lon,"ido=%s\r",idordenador); // Identificador del ordenador + lon+=sprintf(ptrTrama->parametros+lon,"npc=%s\r",nombreordenador); // Nombre del ordenador + lon+=sprintf(ptrTrama->parametros+lon,"idc=%s\r",idcentro); // Identificador del centro + lon+=sprintf(ptrTrama->parametros+lon,"ida=%s\r",idaula); // Identificador del aula + + if (!mandaTrama(socket_c,ptrTrama)) { + errorLog(modulo,26,FALSE); + return (FALSE); + } + return(TRUE); +} +// ******************************************************************************************************** +// PROGRAMA PRINCIPAL (CLIENTE) +// ******************************************************************************************************** +int main(int argc, char *argv[]) +{ + TRAMA *ptrTrama; + char modulo[] = "main()"; + + ptrTrama=(TRAMA *)reservaMemoria(sizeof(TRAMA)); + if (ptrTrama == NULL) { // No hay memoria suficiente para el bufer de las tramas + errorLog(modulo, 3, FALSE); + exit(EXIT_FAILURE); + } + /*-------------------------------------------------------------------------------------------------------- + Validacin de parmetros de ejecucin y fichero de configuracin + ---------------------------------------------------------------------------------------------------------*/ + if (!validacionParametros(argc, argv,3)) // Valida parmetros de ejecucin + exit(EXIT_FAILURE); + + if (!tomaConfiguracion(szPathFileCfg)) // Toma parametros de configuracin + exit(EXIT_FAILURE); + /*-------------------------------------------------------------------------------------------------------- + Carga catlogo de funciones que procesan las tramas + ---------------------------------------------------------------------------------------------------------*/ + int cf = 0; + + strcpy(tbfuncionesClient[cf].nf, "RESPUESTA_AutoexecCliente"); + tbfuncionesClient[cf++].fptr = &RESPUESTA_AutoexecCliente; + + strcpy(tbfuncionesClient[cf].nf, "RESPUESTA_InclusionCliente"); + tbfuncionesClient[cf++].fptr = &RESPUESTA_InclusionCliente; + + strcpy(tbfuncionesClient[cf].nf, "NoComandosPtes"); + tbfuncionesClient[cf++].fptr = &NoComandosPtes; + + strcpy(tbfuncionesClient[cf].nf, "Actualizar"); + tbfuncionesClient[cf++].fptr = &Actualizar; + + strcpy(tbfuncionesClient[cf].nf, "Purgar"); + tbfuncionesClient[cf++].fptr = &Purgar; + + strcpy(tbfuncionesClient[cf].nf, "ConsolaRemota"); + tbfuncionesClient[cf++].fptr = &ConsolaRemota; + + strcpy(tbfuncionesClient[cf].nf, "Sondeo"); + tbfuncionesClient[cf++].fptr = &Sondeo; + + strcpy(tbfuncionesClient[cf].nf, "Arrancar"); + tbfuncionesClient[cf++].fptr = &Arrancar; + + strcpy(tbfuncionesClient[cf].nf, "Apagar"); + tbfuncionesClient[cf++].fptr = &Apagar; + + strcpy(tbfuncionesClient[cf].nf, "Reiniciar"); + tbfuncionesClient[cf++].fptr = &Reiniciar; + + strcpy(tbfuncionesClient[cf].nf, "IniciarSesion"); + tbfuncionesClient[cf++].fptr = &IniciarSesion; + + strcpy(tbfuncionesClient[cf].nf, "CrearImagen"); + tbfuncionesClient[cf++].fptr = &CrearImagen; + + strcpy(tbfuncionesClient[cf].nf, "CrearImagenBasica"); + tbfuncionesClient[cf++].fptr = &CrearImagenBasica; + + strcpy(tbfuncionesClient[cf].nf, "CrearSoftIncremental"); + tbfuncionesClient[cf++].fptr = &CrearSoftIncremental; + + strcpy(tbfuncionesClient[cf].nf, "RestaurarImagen"); + tbfuncionesClient[cf++].fptr = &RestaurarImagen; + + strcpy(tbfuncionesClient[cf].nf, "RestaurarImagenBasica"); + tbfuncionesClient[cf++].fptr = &RestaurarImagenBasica; + + strcpy(tbfuncionesClient[cf].nf, "RestaurarSoftIncremental"); + tbfuncionesClient[cf++].fptr = &RestaurarSoftIncremental; + + + strcpy(tbfuncionesClient[cf].nf, "Configurar"); + tbfuncionesClient[cf++].fptr = &Configurar; + + strcpy(tbfuncionesClient[cf].nf, "EjecutarScript"); + tbfuncionesClient[cf++].fptr = &EjecutarScript; + + strcpy(tbfuncionesClient[cf].nf, "InventarioHardware"); + tbfuncionesClient[cf++].fptr = &InventarioHardware; + + strcpy(tbfuncionesClient[cf].nf, "InventarioSoftware"); + tbfuncionesClient[cf++].fptr = &InventarioSoftware; + + strcpy(tbfuncionesClient[cf].nf, "EjecutaComandosPendientes"); + tbfuncionesClient[cf++].fptr = &EjecutaComandosPendientes; + + /*-------------------------------------------------------------------------------------------------------- + Toma direccin IP del cliente + ---------------------------------------------------------------------------------------------------------*/ + if(!tomaIPlocal()){ // Error al recuperar la IP local + errorLog(modulo,0,FALSE); + exit(EXIT_FAILURE); + } + /*-------------------------------------------------------------------------------------------------------- + Inicio de sesin + ---------------------------------------------------------------------------------------------------------*/ + infoLog(1); // Inicio de sesin + infoLog(3); // Abriendo sesin en el servidor de Administracin; + /*-------------------------------------------------------------------------------------------------------- + Inclusin del cliente en el sistema + ---------------------------------------------------------------------------------------------------------*/ + if(!inclusionCliente(ptrTrama)){ // Ha habido algn problema al abrir sesin + errorLog(modulo,0,FALSE); + exit(EXIT_FAILURE); + } + infoLog(4); // Cliente iniciado + + /*-------------------------------------------------------------------------------------------------------- + Procesamiento de la cache + ---------------------------------------------------------------------------------------------------------*/ + infoLog(23); // Abriendo sesin en el servidor de Administracin; + if(!cuestionCache(cache)){ + errorLog(modulo,0,FALSE); + exit(EXIT_FAILURE); + } + /*-------------------------------------------------------------------------------------------------------- + Ejecucin del autoexec + ---------------------------------------------------------------------------------------------------------*/ + if(atoi(idproautoexec)>0){ // Ejecucin de procedimiento Autoexec + infoLog(5); + if(!autoexecCliente(ptrTrama)){ // Ejecucin fichero autoexec + errorLog(modulo,0,FALSE); + exit(EXIT_FAILURE); + } + } + /*-------------------------------------------------------------------------------------------------------- + Comandos pendientes + ---------------------------------------------------------------------------------------------------------*/ + infoLog(6); // Procesa comandos pendientes + if(!comandosPendientes(ptrTrama)){ // Ejecucin de acciones pendientes + errorLog(modulo,0,FALSE); + exit(EXIT_FAILURE); + } + infoLog(7); // Acciones pendientes procesadas + /*-------------------------------------------------------------------------------------------------------- + Bucle de recepcin de comandos + ---------------------------------------------------------------------------------------------------------*/ + muestraMenu(); + procesaComandos(ptrTrama); // Bucle para procesar comandos interactivos + /*-------------------------------------------------------------------------------------------------------- + Fin de la sesin + ---------------------------------------------------------------------------------------------------------*/ + exit(EXIT_SUCCESS); +} diff --git a/sources/clients/ogAdmClient/sources/ogAdmClient.h b/sources/clients/ogAdmClient/sources/ogAdmClient.h new file mode 100644 index 0000000..da0a5c3 --- /dev/null +++ b/sources/clients/ogAdmClient/sources/ogAdmClient.h @@ -0,0 +1,183 @@ +// ******************************************************************************************************** +// Cliernte: ogAdmClient +// Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla +// Fecha Creación: Marzo-2010 +// Fecha Última modificación: Marzo-2010 +// Nombre del fichero: ogAdmClient.h +// Descripción :Este fichero implementa el cliente general del sistema +// ******************************************************************************************************** +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ogAdmLib.h" +// ________________________________________________________________________________________________________ +// Variables globales +// ________________________________________________________________________________________________________ +char *idordenador; // Identificador del ordenador +char *nombreordenador; // Nombre del ordenador +char *cache; // Tamaño de la caché +char *idproautoexec; // Identificador del procedimiento de autoexec +char *idcentro; // Identificador de la Unidad Organizativa +char *idaula; // Identificador del aula +char IPlocal[LONIP]; // Ip local + +char servidoradm[LONPRM]; // Dirección IP del servidor de administración +char puerto[LONPRM]; // Puerto de comunicación +char pathinterface[LONPRM]; // Path donde está la interface entre la administración y el módulo de clonación + +char interface[LONFUN]; // Nombre del módulo,función o script de la interface con el módulo de administración +char parametros[LONSTD]; // Parámetros para la llamada +int herror; + +BOOLEAN CMDPTES; // Para bucle de comandos pendientes + + +char urlmenu[MAXLONURL]; // Url de la pagina de menu para el browser +char urlmsg[MAXLONURL]; // Url de la página de mensajed para el browser + + +typedef struct{ // Estructura usada para referenciar las funciones que procesan las tramas + char nf[LONFUN]; // Nombre de la función + BOOLEAN (*fptr)(TRAMA*); // Puntero a la función que procesa la trama +}MSGFUN; +MSGFUN tbfuncionesClient[MAXIMAS_FUNCIONES]; +// ________________________________________________________________________________________________________ +// Tabla de errores de la ejecución de los scripts +// ________________________________________________________________________________________________________ +char* tbErroresScripts[]={"Se han generado errores desconocidos. No se puede continuar la ejecución de este módulo",\ + "001-Formato de ejecución incorrecto.",\ + "002-Fichero o dispositivo no encontrado",\ + "003-Error en partición de disco",\ + "004-Partición o fichero bloqueado",\ + "005-Error al crear o restaurar una imagen",\ + "006-Sin sistema operativo",\ + "007-Programa o función BOOLEAN no ejecutable",\ + "008-Error en la creación del archivo de eco para consola remota",\ + "009-Error en la lectura del archivo temporal de intercambio",\ + "010-Error al ejecutar la llamada a la interface de administración",\ + "011-La información retornada por la interface de administración excede de la longitud permitida",\ + "012-Error en el envío de fichero por la red",\ + "013-Error en la creación del proceso hijo",\ + "014-Error de escritura en destino",\ + "015-Sin Cache en el Cliente",\ + "016-No hay espacio en la cache para almacenar fichero-imagen",\ + "017-Error al Reducir el Sistema Archivos",\ + "018-Error al Expandir el Sistema Archivos",\ + "019-Valor fuera de rango o no válido.",\ + "020-Sistema de archivos desconocido o no se puede montar",\ + "021-Error en partición de caché local",\ + "022-El disco indicado no contiene una particion GPT",\ + "023-Error no definido",\ + "024-Error no definido",\ + "025-Error no definido",\ + "026-Error no definido",\ + "027-Error no definido",\ + "028-Error no definido",\ + "029-Error no definido",\ + "030-Error al restaurar imagen - Imagen mas grande que particion",\ + "031-Error al realizar el comando updateCache",\ + "032-Error al formatear",\ + "033-Archivo de imagen corrupto o de otra versión de partclone",\ + "034-Error no definido",\ + "035-Error no definido",\ + "036-Error no definido",\ + "037-Error no definido",\ + "038-Error no definido",\ + "039-Error no definido",\ + "040-Error imprevisto no definido",\ + "041-Error no definido",\ + "042-Error no definido",\ + "043-Error no definido",\ + "044-Error no definido",\ + "045-Error no definido",\ + "046-Error no definido",\ + "047-Error no definido",\ + "048-Error no definido",\ + "049-Error no definido",\ + "050-Error en la generación de sintaxis de transferenica unicast",\ + "051-Error en envio UNICAST de una particion",\ + "052-Error en envio UNICAST de un fichero",\ + "053-Error en la recepcion UNICAST de una particion",\ + "054-Error en la recepcion UNICAST de un fichero",\ + "055-Error en la generacion de sintaxis de transferenica Multicast",\ + "056-Error en envio MULTICAST de un fichero",\ + "057-Error en la recepcion MULTICAST de un fichero",\ + "058-Error en envio MULTICAST de una particion",\ + "059-Error en la recepcion MULTICAST de una particion",\ + "060-Error en la conexion de una sesion UNICAST|MULTICAST con el MASTER",\ + "061-Error no definido",\ + "062-Error no definido",\ + "063-Error no definido",\ + "064-Error no definido",\ + "065-Error no definido",\ + "066-Error no definido",\ + "067-Error no definido",\ + "068-Error no definido",\ + "069-Error no definido",\ + "070-Error al montar una imagen sincronizada.",\ + "071-Imagen no sincronizable (es monolitica).",\ + "072-Error al desmontar la imagen.",\ + "073-No se detectan diferencias entre la imagen basica y la particion.",\ + "074-Error al sincronizar, puede afectar la creacion/restauracion de la imagen.",\ + "Error desconocido " + }; + #define MAXERRORSCRIPT 74 // Error máximo cometido +// ________________________________________________________________________________________________________ +// Prototipo de funciones +// ________________________________________________________________________________________________________ +BOOLEAN autoexecCliente(TRAMA*); +BOOLEAN RESPUESTA_AutoexecCliente(TRAMA*); +void procesaComandos(TRAMA*); + +BOOLEAN tomaConfiguracion(char*); +BOOLEAN tomaIPlocal(void); +void scriptLog(const char *,int ); + +BOOLEAN gestionaTrama(TRAMA *); +BOOLEAN inclusionCliente(); +char* LeeConfiguracion(); +BOOLEAN RESPUESTA_InclusionCliente(TRAMA *); + +BOOLEAN comandosPendientes(TRAMA*); +BOOLEAN NoComandosPtes(TRAMA *); + +BOOLEAN respuestaEjecucionComando(TRAMA *,int,char*); +BOOLEAN Sondeo(TRAMA *); +BOOLEAN Actualizar(TRAMA *); +int Purgar(TRAMA* ); + +BOOLEAN ConsolaRemota(TRAMA*); + +BOOLEAN Arrancar(TRAMA *); +BOOLEAN Apagar(TRAMA *); +BOOLEAN Reiniciar(TRAMA *); +BOOLEAN IniciarSesion(TRAMA *); +BOOLEAN CrearImagen(TRAMA *); +BOOLEAN CrearImagenBasica(TRAMA *); +BOOLEAN CrearSoftIncremental(TRAMA*); + +BOOLEAN InventarioHardware(TRAMA *); +BOOLEAN InventariandoSoftware(TRAMA *,BOOLEAN,char*); +BOOLEAN EjecutarScript(TRAMA *); +BOOLEAN ejecutaArchivo(char*,TRAMA*); + +BOOLEAN cuestionCache(char*); +int cargaPaginaWeb(char *); +void muestraMenu(void); +void muestraMensaje(int idx,char*); + +BOOLEAN enviaMensajeServidor(SOCKET *,TRAMA *,char); + + + + diff --git a/sources/clients/ogAdmClient/sources/ogAdmClient.o b/sources/clients/ogAdmClient/sources/ogAdmClient.o new file mode 100644 index 0000000..e8bec64 Binary files /dev/null and b/sources/clients/ogAdmClient/sources/ogAdmClient.o differ diff --git a/sources/interface/Apagar b/sources/interface/Apagar new file mode 100755 index 0000000..ae1e5ba --- /dev/null +++ b/sources/interface/Apagar @@ -0,0 +1,3 @@ +#!/bin/bash +poweroff +exit 0 diff --git a/sources/interface/CambiarAcceso b/sources/interface/CambiarAcceso new file mode 100755 index 0000000..f698d19 --- /dev/null +++ b/sources/interface/CambiarAcceso @@ -0,0 +1,54 @@ +#!/bin/bash + +#______________________________________ +# +# PARAMETROS RECIBIDOS DESDE EL CLIENTE +# $1 modo (admin, user) +#______________________________________ + +# Error si llamada no se realliza desde OpenGnsys Client. +PROG=$(basename $0) +CALLER=$(ogGetCaller) +if ! $(ogCheckStringInGroup "$CALLER" "CrearImagen ConsolaRemota CrearImagenBasica CrearSoftIncremental"); then + ogRaiseError $OG_ERR_NOTEXEC "$CALLER -> $PROG" + exit $? +fi + +# Salir si el repositorio está bloquedo (tiene ficheros abiertos). +REPOIP=$(ogGetRepoIp) +if [ -z "$REPOIP" ]; then + ogRaiseError $OG_ERR_NOTFOUND "repo no montado" + exit $? +fi +if ogIsRepoLocked; then + ogRaiseError $OG_ERR_LOCKED "repo $REPOIP" + exit $? +fi + +# Comprobar protocolo y modo de acceso. +PROTO=${ogprotocol:-"smb"} +case "$PROTO" in + nfs|smb) ;; + *) ogRaiseError $OG_ERR_FORMAT "protocolo desconocido $PROTO" + exit $? ;; +esac +case "$1" in + admin) MODE="rw" ;; + user) MODE="ro" ;; + *) ogRaiseError $OG_ERR_FORMAT "modo desconocido $1" + exit $? ;; +esac + +# Desmontar repositorio y volver a montarlo con el modo adecuado. +umount $OGIMG +# Unidad organizativa +[ "$ogunit" != "" ] && OGUNIT="/$ogunit" +ogEcho info "$PROG: Montar repositorio $REPO por $PROTO en modo $1" +case "$PROTO" in + nfs) mount -t nfs $REPOIP:$OGIMG$OGUNIT $OGIMG -o $MODE ;; + smb) PASS=$(grep "^[ ]*\(export \)\?OPTIONS=" /scripts/ogfunctions 2>&1 | \ + sed 's/\(.*\)pass=\(\w*\)\(.*\)/\2/') + PASS=${PASS:-"og"} + mount.cifs //$REPOIP/ogimages$OGUNIT $OGIMG -o $MODE,serverino,acl,username=opengnsys,password=$PASS +esac + diff --git a/sources/interface/Configurar b/sources/interface/Configurar new file mode 100755 index 0000000..e88d073 --- /dev/null +++ b/sources/interface/Configurar @@ -0,0 +1,159 @@ +#!/bin/bash + + +#Load engine configurator from engine.cfg file. +#Carga el configurador del engine desde el fichero engine.cfg +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + +# Clear temporary file used as log track by httpdlog +# Limpia los ficheros temporales usados como log de seguimieincludento para httpdlog +echo " " > $OGLOGSESSION; echo " " > $OGLOGCOMMAND; echo " " > ${OGLOGCOMMAND}.tmp + +# Registro de inicio de ejecución +ogEcho log session "$MSG_INTERFACE_START $0 $*" + +# Solo ejecutable por OpenGnsys Client. +PATH=$PATH:$(dirname $0) +PROG=$(basename $0) + +#____________________________________________________________________ +# +# El parámetro $2 es el que aporta toda la información y el $1 se queda obsoleto +# Formato de entrada: +# dis=Número de disco +# *=caracter de separación +# che=Vale 0 o 1 +# *=caracter de separación +# $tch=tamaño cache +# != caracter de separación +# +# Y un numero indeterminado de cadenas del tipo siguuenteseparadas por el caracter '$': +# par=Número de particion*cod=Código de partición*sfi=Sistema de ficheros*tam=Tamaño de la partición*ope=Operación +# @= caracter de separación +#____________________________________________________________________ + +# Captura de parámetros (se ignora el 1er parámetro y se eliminan espacios y tabuladores). +#param='dis=1*che=0*tch=70000000!par=1*cpt=NTFS*sfi=NTFS*tam=11000000*ope=0%' +shift +param="$(echo $* | sed 's/[ ]//g')" + +# Activa navegador para ver progreso +coproc /opt/opengnsys/bin/browser -qws http://localhost/cgi-bin/httpd-log.sh + +# Leer los dos bloques de parámetros, separados por '!'. +declare -a TBPRM + +IFS='!' read -a TBPRM <<<"$param" +pparam="${TBPRM[0]}" # Parámetros generales del disco. +sparam="${TBPRM[1]}" # Parámetros de particionado y formateo. + + +# Toma valores de disco y caché, separados por "*". +# Los valores están en las variables $dis: disco, $che: existe cache (1, 0), $tch: Tamaño de la cache. +unset TBPRM +IFS='*' read -a TBPRM <<<"$pparam" +[[ ${TBPRM} =~ = ]] && eval ${TBPRM[@]} # Comprobar asignación antes de exportar valores. + +# Error si no se define el parámetro de disco (dis). +[ -z "$dis" ] && exit $OG_ERR_FORMAT + +# Toma valores de distribución de particiones, separados por "%". +declare -a CFG # Valores de configuración. +declare -a TBP # Tabla de particionado. +declare -a TBF # Tabla de formateo. + +unset TBPRM +IFS='%' read -a TBPRM <<<"$sparam" + +maxp=0 +for ((i=0; i<${#TBPRM[@]}; i++)); do + # Leer datos de la partición, separados por "*". + unset par + IFS='*' read -a CFG <<<"${TBPRM[i]}" 2>/dev/null + [[ ${CFG} =~ = ]] && eval ${CFG[@]} # Comprobar asignación antes de exportar valores. + # Componer datos de particionado. + if [ "$cpt" != "CACHE" ]; then + TBP[par]="$cpt:$tam" + fi + # Si se activa operación de formatear, componer datos de formateo. + if [ "$ope" == 1 ]; then + # Comprobamos que la particion y el s.f sean validos. + ogCheckStringInGroup $cpt "EMPTY EXTENDED LINUX-LVM LVM ZPOOL" + [ $? -ne 0 ] && TBF[par]="$sfi" + fi + # Obtener la partición mayor. + [ $par -gt $maxp ] && maxp=$par +done +#____________________________________________________ +# +# Proceso +#____________________________________________________ + +# Tamaño actual de la cache +CACHESIZE=$(ogGetCacheSize) + +# Desmonta todas las particiones y la caché + +ogEcho session log "[10] $MSG_HELP_ogUnmountAll" +ogUnmountAll $dis &>/dev/null +ogUnmountCache + +# Elimina la tabla de particiones +if [ `ogGetPartitionTableType 1` != 'MSDOS' ]; then + ogDeletePartitionTable $dis + ogExecAndLog COMMAND ogUpdatePartitionTable $dis + + # Crea tabla de particiones MSDOS (NOTA: adaptar para tablas GPT). + ogCreatePartitionTable $dis MSDOS +fi + +# Inicia la cache. +if echo "$sparam" |grep "CACHE" >/dev/null; then + ogEcho session log "[30] $MSG_HELP_ogCreateCache" + ogEcho session log " initCache $tch" + ogExecAndLog COMMAND initCache $tch +fi + +# Definir particionado. +ogEcho session log "[50] $MSG_HELP_ogCreatePartitions" +ogEcho session log " ogCreatePartitions $dis ${TBP[@]}" +ogExecAndLog COMMAND ogCreatePartitions $dis ${TBP[@]} +if [ $? -ne 0 ]; then + kill $COPROC_PID + exit $(ogRaiseError session log $OG_ERR_GENERIC "ogCreatePartitions $dis ${TBP[@]}") +fi +ogExecAndLog COMMAND ogUpdatePartitionTable $dis + +# Formatear particiones +ogEcho session log "[70] $MSG_HELP_ogFormat" + +for ((par=1; par<=$maxp; par++)); do + case "${TBF[par]}" in + CACHE) # Si el tamaño es distinto ya se ha formateado. + if [ "$CACHESIZE" == $tch ]; then + ogEcho session log " ogFormatCache" + ogExecAndLog COMMAND ogFormatCache + fi + ;; + "") ;; + *) ogEcho session log " ogFormatFs $dis $par ${TBF[par]}" + ogExecAndLog COMMAND ogFormatFs $dis $par ${TBF[par]} + if [ $? -ne 0 ]; then + kill $COPROC_PID + exit $(ogRaiseError session log $OG_ERR_GENERIC "ogFormatFs $dis $par ${TBF[par]}"); + fi + ;; + esac +done +RETVAL=$? +# Registro de fin de ejecución +ogEcho log session "$MSG_INTERFACE_END $RETVAL" + +#___________________________________________________________________ +# +# Retorno +#___________________________________________________________________ + +kill $COPROC_PID +exit 0 + diff --git a/sources/interface/ConsolaRemota b/sources/interface/ConsolaRemota new file mode 100755 index 0000000..f569771 --- /dev/null +++ b/sources/interface/ConsolaRemota @@ -0,0 +1,3 @@ +#!/bin/bash +chmod +x $1 +$1>$2 || exit $? diff --git a/sources/interface/CrearImagen b/sources/interface/CrearImagen new file mode 100755 index 0000000..e3b21c7 --- /dev/null +++ b/sources/interface/CrearImagen @@ -0,0 +1,91 @@ +#!/bin/bash + +#___________________________________________________ +# +# PARAMETROS RECIBIDOS DESDE EL CLIENTE: +# $1 Número de disco +# $2 Número de particion +# $3 Nombre canónico de la imagen (sin extensión) +# $4 Dirección del repositorio (REPO, por defecto) +#___________________________________________________ + + +#$OG_ERR_NOTEXEC Si no es llamada por OG client +#$OG_ERR_LOCKED=4 Si la particion está bloqueada. + + +#Codigos de error del scripts createImage +#@exception OG_ERR_FORMAT # 1 formato incorrecto. +#@exception OG_ERR_PARTITION # 3 Error en partición de disco o en su sistema de archivos +#@exception OG_ERR_IMAGE # 5 Error en funcion ogCreateImage o ogRestoreImage. +#@exception OG_ERR_NOTWRITE # 14 error de escritura +#@exception OG_ERR_NOTCACHE # 15 si cache no existe 15 +#@exception OG_ERR_CACHESIZE # 16 si espacio de la cache local o remota no tiene espacio 16 +#@exception OG_ERR_REDUCEFS # 17 error al reducir sistema de archivos. +#@exception OG_ERR_EXTENDFS # 18 Errror al expandir el sistema de archivos. + + +#Códigos de error de la funcion ogCreateImage + + + +TIME1=$SECONDS + +#Load engine configurator from engine.cfg file. +#Carga el configurador del engine desde el fichero engine.cfg +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + +# Clear temporary file used as log track by httpdlog +# Limpia los ficheros temporales usados como log de seguimiento para httpdlog +echo " " > $OGLOGSESSION; echo " " > $OGLOGCOMMAND; echo " " > ${OGLOGCOMMAND}.tmp + +# Registro de inicio de ejecución +ogEcho log session "$MSG_INTERFACE_START $0 $*" + +# Solo ejecutable por OpenGnsys Client. +PATH=$PATH:$(dirname $0) +PROG=$(basename $0) +CALLER=$(ogGetCaller) +if [ "$CALLER" != "ogAdmClient" ]; then + ogRaiseError $OG_ERR_NOTEXEC "$CALLER -> $PROG" + exit $? +fi + +# Valor por defecto para el repositorio. +REPO=${4:-"REPO"} +[ "$REPO" == "$(ogGetIpAddress)" ] && REPO="CACHE" +# Si es una ip y es distinta a la del recurso samba cambiamos de REPO. +ogCheckIpAddress $REPO +if [ $? == 0 -o $REPO == "REPO" ] ; then + # Unidad organizativa + [ "$ogunit" != "" ] && OGUNIT="$ogunit" + # Si falla el cambio -> salimos con error repositorio no valido + ogChangeRepo $REPO $OGUNIT || exit $(ogRaiseError $OG_ERR_NOTFOUND '$REPO'; echo $?) + REPO="REPO" +fi + +# Si el destino es REPO y el cliente no está en modo "admin"; activar repositorio para escritura, +if [ "$REPO" == "REPO" -a "$boot" != "admin" ] +then + CambiarAcceso admin &>> $OGLOGFILE + RETVAL=$? + [ $RETVAL -gt 0 ] && exit $RETVAL +fi + +ogEcho createImage "$1" "$2" "$4" /"$3" +# Si existe, ejecuta script personalizado "createImageCustom"; si no, llama al genérico "createImage". +if which createImageCustom &>/dev/null; then + createImageCustom "$1" "$2" "$4" /"$3" &>> $OGLOGCOMMAND +else + createImage "$1" "$2" "$4" /"$3" &>> $OGLOGCOMMAND +fi +RETVAL=$? + +# Cambiar acceso a modo usuario, si es necesario. +[ "$REPO" == "REPO" -a "$boot" != "admin" ] && CambiarAcceso user + +# Registro de fin de ejecución +ogEcho log session "$MSG_INTERFACE_END $RETVAL" + +exit $RETVAL + diff --git a/sources/interface/CrearImagenBasica b/sources/interface/CrearImagenBasica new file mode 100755 index 0000000..8aaf5aa --- /dev/null +++ b/sources/interface/CrearImagenBasica @@ -0,0 +1,98 @@ +#!/bin/bash +#___________________________________________________________________ +# +# CREAR IMAGEN BÁSICA +#___________________________________________________________________ +# +# Parámetros recibidos desde el cliente: +# +# $1 Número de disco +# $2 Número de particion +# $3 Nombre canónico de la imagen básica (sin extensión) +# $4 Dirección del repositorio +# $5 Es una cadena "nnn" tipo flags que codifica varios parametros. +# Tiene el formato "nnn" donde "n" vale 0 ó 1. +# 1XX: Gestionar fichero completo en lugar de diferencas +# X1X: Eliminar archivos de la imagen que no estén en la partición +# XX1: Comprimir archivos para enviarlos por la red +# El valor X indica que no importa el valor que tenga el dato +# $6 Es una cadena "nnnn" tipo flags que codifica varios parametros. +# Tiene el formato "nnnn" donde "n" vale 0 ó 1. +# 1XXX: Borrar la imagen del repositorio antes de crearla +# X1XX: Copiar Imagen básica también a la cache +# XX1X: Borrar previamente la imagen de la cache antes de copiarla +# XXX1: No borrar archivos en destino +# El valor X indica que no importa el valor que tenga el dato +# $7 Método de syncronización 1=Sincronización1 2=Sincronizacion2 +# $8 Ruta de origen de la Imagen (Carpeta) + +#___________________________________________________________________ +# +# Control parámetros +#___________________________________________________________________ + + + PROG="$(basename $0)" + if [ $# -lt 7 ]; then + usage=" ndisco nparticion nombre_imagen_basica ip_repositorio" + usage="$usage copiar_a_caché Borrar_cache_previamente Ruta_origen" + ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $PROG $usage" + exit $? + fi + + #Load engine configurator from engine.cfg file. + #Carga el configurador del engine desde el fichero engine.cfg + [ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + + # Clear temporary file used as log track by httpdlog + # Limpia los ficheros temporales usados como log de seguimiento para httpdlog + echo -n "" > $OGLOGSESSION; echo -n "" > $OGLOGCOMMAND + + # Registro de inicio de ejecución + ogEcho log session "$MSG_INTERFACE_START $0 $*" + + # Si el destino es REPO y el cliente no está en modo "admin"; activar repositorio para escritura, + PATH=$PATH:$(dirname $0) + CLIENTIP=$(ogGetIpAddress) + [ "$4" == "$CLIENTIP" ] && DEST=CACHE || DEST=REPO + if [ "$DEST" == "REPO" -a "$boot" != "admin" ]; then + CambiarAcceso admin &>> $OGLOGFILE + RETVAL=$? + [ $RETVAL -gt 0 ] && exit $RETVAL + fi + + if [ $7 -eq 1 ]; then + #sincronizacion1 + ogCrearImagenBasica "$@" + RETVAL=$? + fi + + if [ $7 -eq 2 ]; then + # Sincronizacion2 + flag=$5 + WHOLE=${flag:0:1} + DELFILE=${flag:1:1} + COMPRESS=${flag:2:1} + + # Nota los valores se pasan como variables de entorno, + # la idea es que mas adelante vayan en el fichero PXE. + [ $WHOLE -eq 1 ] && export ogrsyncw=true || export ogrsyncw=false + [ $DELFILE -eq 1 ] && export ogrsyncdel=true || export ogrsyncdel=false + [ $COMPRESS -eq 1 ] && export ogrsyncz=true || export ogrsyncz=false + + # [ "$4" == "0.0.0.0" ] && DEST="CACHE" || DEST="REPO" + + createBaseImage $1 $2 $DEST "$3" + RETVAL=$? + + fi + + # Si estamos en modo user montamos el repositorio en modo lectura. + [ "$DEST" == "REPO" -a "$boot" != "admin" ] && CambiarAcceso user + # Registro de fin de ejecución + ogEcho log session "$MSG_INTERFACE_END $RETVAL" + + + + exit $RETVAL + diff --git a/sources/interface/CrearSoftIncremental b/sources/interface/CrearSoftIncremental new file mode 100755 index 0000000..fc29451 --- /dev/null +++ b/sources/interface/CrearSoftIncremental @@ -0,0 +1,98 @@ +#!/bin/bash +#___________________________________________________________________ +# +# CREAR IMAGEN INCREMENTAL +#___________________________________________________________________ +# +# Parámetros recibidos desde el cliente: +# +# $1 Número de disco +# $2 Número de particion +# $3 Nombre canónico de la imagen básica (sin extensión) +# $4 Dirección del repositorio +# $5 Nombre canónico de la imagen incremental (sin extensión) +# $6 Es una cadena "nnn" tipo flags que codifica varios parametros. +# Tiene el formato "nnn" donde "n" vale 0 ó 1. +# 1XX: Gestionar fichero completo en lugar de diferencas +# X1X: Eliminar archivos de la imagen que no estén en la partición +# XX1: Comprimir archivos para enviarlos por la red +# El valor X indica que no importa el valor que tenga el dato +# $7 Es una cadena "nnnn" tipo flags que codifica varios parametros. +# Tiene el formato "nnnn" donde "n" vale 0 ó 1. +# 1XXX: Borrar la imagen incremental del repositorio antes de crearla +# X1XX: Copiar imagen incremental también a la cache +# XX1X: Borrar previamente la imagen incremental de la cache antes de copiarla +# XXX1: No borrar archivos en destino +# El valor X indica que no importa el valor que tenga el dato +# $8 Método de syncronización 1=Sincronización1 2=Sincronizacion2 +# $9 Ruta de origen de la Imagen (Carpeta) + +#___________________________________________________________________ +# +# Control parámetros +#___________________________________________________________________ + PROG="$(basename $0)" + if [ $# -lt 8 ]; then + usage=" ndisco nparticion nombre_imagen_basica ip_repositorio nombre_imagen_incremental" + usage="$usage copiar_a_caché Borrar_cache_previamente Ruta_origen" + ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $PROG $usage" + exit $? + fi + + #Load engine configurator from engine.cfg file. + #Carga el configurador del engine desde el fichero engine.cfg + [ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + + # Clear temporary file used as log track by httpdlog + # Limpia los ficheros temporales usados como log de seguimiento para httpdlog + echo -n "" > $OGLOGSESSION; echo -n "" > $OGLOGCOMMAND + + # Registro de inicio de ejecución + ogEcho log session "$MSG_INTERFACE_START $0 $*" + + + # Si el destino es REPO y el cliente no está en modo "admin"; activar repositorio para escritura, + PATH=$PATH:$(dirname $0) + CLIENTIP=$(ogGetIpAddress) + [ "$4" == "$CLIENTIP" ] && DEST=CACHE || DEST=REPO + if [ "$DEST" == "REPO" -a "$boot" != "admin" ]; then + CambiarAcceso admin &>> $OGLOGFILE + RETVAL=$? + [ $RETVAL -gt 0 ] && exit $RETVAL + fi + + if [ $8 -eq 1 ]; then + #sincronizacion1 + ogCrearSoftIncremental "$@" + RETVAL=$? + fi + + + if [ $8 -eq 2 ]; then + #sincronizacion 2 + flag=$6 + WHOLE=${flag:0:1} + DELFILE=${flag:1:1} + COMPRESS=${flag:2:1} + + # Nota los valores se pasan como variables de entorno, + # la idea es que mas adelante vayan en el fichero PXE. + [ $WHOLE -eq 1 ] && export ogrsyncw=true || export ogrsyncw=false + [ $DELFILE -eq 1 ] && export ogrsyncdel=true || export ogrsyncdel=false + [ $COMPRESS -eq 1 ] && export ogrsyncz=true || export ogrsyncz=false + + # REPOSITORIO: Si la ip es la del propio equipo CACHE, si no REPO + #CLIENTIP=$(ogGetIpAddress) + #[ "$4" == "$CLIENTIP" ] && DEST=CACHE || DEST=REPO + createDiffImage $1 $2 $DEST "$3" "$5" + RETVAL=$? + + fi + + # Si estamos en modo user montamos el repositorio en modo lectura. + [ "$DEST" == "REPO" -a "$boot" != "admin" ] && CambiarAcceso user + + # Registro de fin de ejecución + ogEcho log session "$MSG_INTERFACE_END $RETVAL" + + exit $RETVAL diff --git a/sources/interface/EjecutarScript b/sources/interface/EjecutarScript new file mode 100755 index 0000000..26453ed --- /dev/null +++ b/sources/interface/EjecutarScript @@ -0,0 +1,44 @@ +#!/bin/bash +TIME1=$SECONDS + + +#Load engine configurator from engine.cfg file. +#Carga el configurador del engine desde el fichero engine.cfg +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + +# Clear temporary file used as log track by httpdlog +# Limpia los ficheros temporales usados como log de seguimiento para httpdlog +echo -n "" > $OGLOGSESSION; echo -n "" > $OGLOGCOMMAND + +# Registro de inicio de ejecución +ogEcho log session "$MSG_INTERFACE_START $0 $*" + +echo -e "\n Instrucciones a ejecutar: *****************************" >> $OGLOGFILE +cat $1 >> $OGLOGFILE + + +echo -e "\n Salida de las instrucciones: *****************************" >> $OGLOGFILE +chmod +x $1 +# Si mandamos la salida a OGLOGCOMMAND reescribimos lo que manda el comando. +#$1 &>> $OGLOGCOMMAND +$1 +RETVAL=$? + + + +TIME=$[SECONDS-TIME1] +if [ $RETVAL == 0 ] +then + ogEcho log session "[100] Duracion de la operacion $[TIME/60]m $[TIME%60]s" +else + ogRaiseError log session $RETVAL + ogEcho log session error "Operacion no realizada" +fi + + +# Registro de fin de ejecución +ogEcho log session "$MSG_INTERFACE_END $RETVAL" + + +exit $RETVAL + diff --git a/sources/interface/IniciarSesion b/sources/interface/IniciarSesion new file mode 100755 index 0000000..750d96d --- /dev/null +++ b/sources/interface/IniciarSesion @@ -0,0 +1,13 @@ +#!/bin/bash + +# UHU - Comprobamos el disco, si solo hay un parametro, disco es 1, por compatibilidad con clientes antiguos +if [ $# == 1 ] +then + disk=1 + part=$1 +else + disk=$1 + part=$2 +fi + +bootOs $disk $part diff --git a/sources/interface/InventarioHardware b/sources/interface/InventarioHardware new file mode 100755 index 0000000..17614a5 --- /dev/null +++ b/sources/interface/InventarioHardware @@ -0,0 +1,6 @@ +#!/bin/bash +# Script de interfaz para guardar en un fichero el inventario de hardware de un cliente. + +file=$(listHardwareInfo) +tail -n+2 $file >$1 + diff --git a/sources/interface/InventarioSoftware b/sources/interface/InventarioSoftware new file mode 100755 index 0000000..fa96565 --- /dev/null +++ b/sources/interface/InventarioSoftware @@ -0,0 +1,19 @@ +#!/bin/bash + +TIME1=$SECONDS + +#Carga el configurador del engine desde el fichero engine.cfg +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + +# Limpia los ficheros temporales usados como log de seguimiento para httpdlog +echo -n " " | tee $OGLOGSESSION $OGLOGCOMMAND ${OGLOGCOMMAND}.tmp + +# Registro de inicio de ejecución +ogEcho log session "$MSG_INTERFACE_START $0 $*" + +file=$(listSoftwareInfo $1 $2) +cp $file $3 + +TIME=$[SECONDS-TIME1] +ogEcho log session " [ ] $MSG_SCRIPTS_TIME_PARTIAL : $[TIME/60]m $[TIME%60]s" + diff --git a/sources/interface/Reiniciar b/sources/interface/Reiniciar new file mode 100755 index 0000000..df93c1b --- /dev/null +++ b/sources/interface/Reiniciar @@ -0,0 +1,3 @@ +#!/bin/bash +reboot +exit 0 diff --git a/sources/interface/RestaurarImagen b/sources/interface/RestaurarImagen new file mode 100755 index 0000000..6f9ae24 --- /dev/null +++ b/sources/interface/RestaurarImagen @@ -0,0 +1,15 @@ +#!/bin/bash +#_______________________________________________________________________________________________________________________________ +# +# PARAMETROS RECIBIDOS DESDE EL CLIENTE: +# $1 disco +# $2 par=Número de particion +# $3 Nombre canónico de la imagen +# $4 Dirección IP del repositorio +# $5 Protocolo UNICAST MULTICAST TORRENT +# $6 Opciones del protocolo +#_______________________________________________________________________________________________________________________________ + +# Llamar al script de despliegue "deployImage". +deployImage "$4" "$3" "$1" "$2" "$5" "$6" "$7" "$8" || exit $? + diff --git a/sources/interface/RestaurarImagenBasica b/sources/interface/RestaurarImagenBasica new file mode 100755 index 0000000..c87b318 --- /dev/null +++ b/sources/interface/RestaurarImagenBasica @@ -0,0 +1,89 @@ +#!/bin/bash +#___________________________________________________________________ +# +# RESTAURAR IMAGEN BÁSICA +#___________________________________________________________________ +# +# Parámetros recibidos desde el cliente: +# +# $1 Número de disco +# $2 Número de particion +# $3 Nombre canónico de la imagen básica (sin extensión) +# $4 Dirección del repositorio +# $5 Tipo de transmisión 0=Unicast 1=Multicast +# $6 Es una cadena "nnn" tipo flags que codifica varios parametros. +# Tiene el formato "nnn" donde "n" vale 0 ó 1. +# 1XX: Gestionar fichero completo en lugar de diferencas +# X1X: Eliminar archivos de la partición que no estén en la imagen +# XX1: Comprimir archivos para enviarlos por la red +# El valor X indica que no importa el valor que tenga el dato +# $7 Es una cadena "nnnn" tipo flags que codifica varios parametros. +# Tiene el formato "nnnn" donde "n" vale 0 ó 1. +# 1XXX: Borrar la particion de destino antes de restaurar la imagen basica +# X1XX: Copiar Imagen básica también a la cache +# XX1X: Borrar previamente la imagen basica de la cache antes de copiarla +# XXX1: No borrar archivos en destino +# El valor X indica que no importa el valor que tenga el dato +# $8 Método de clonación 0=Desde caché 1=Desde repositorio +# $9 Metodo de sincronizacion 1=Sincronización1 2=Sincronizacion2 +# $10 Ruta de origen de la Imagen (Carpeta) + +#___________________________________________________________________ +# +# Control parámetros +#___________________________________________________________________ + + PROG="$(basename $0)" + if [ $# -lt 9 ]; then + usage=" ndisco nparticion nombre_imagen_basica ip_repositorio copiar_a_caché " + usage="$usage Borrar_cache_previamente metodo_clonación Ruta_origen" + ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $PROG $usage" + exit $? + fi + + #Load engine configurator from engine.cfg file. + #Carga el configurador del engine desde el fichero engine.cfg + [ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + + # Clear temporary file used as log track by httpdlog + # Limpia los ficheros temporales usados como log de seguimiento para httpdlog + echo -n "" > $OGLOGSESSION; echo " " > $OGLOGCOMMAND + + # Registro de inicio de ejecución + ogEcho log session "$MSG_INTERFACE_START $0 $*" + + if [ $9 -eq 1 ]; then + #sincronizacion1 + ogRestaurarImagenBasica "$@" + RETVAL=$? + fi + + if [ $9 -eq 2 ]; then + #sincronizacion2 + # Opciones de clonacion + flag=$6 + WHOLE=${flag:0:1} + DELFILE=${flag:1:1} + COMPRESS=${flag:2:1} + + # Nota los valores se pasan como variables de entorno, + # la idea es que mas adelante vayan en el fichero PXE. + [ $WHOLE -eq 1 ] && export ogrsyncw=true || export ogrsyncw=false + [ $DELFILE -eq 1 ] && export ogrsyncdel=true || export ogrsyncdel=false + [ $COMPRESS -eq 1 ] && export ogrsyncz=true || export ogrsyncz=false + + # Origen de la imagen. + [ $8 -eq 0 ] && DEST="CACHE" || DEST="REPO" + + # Protocolo de clonacion y opciones + PROTO=${5%_*} + OPT=${5#*_} + + restoreBaseImage $DEST "$3" $1 $2 $PROTO $OPT + RETVAL=$? + fi + + # Registro de fin de ejecución + ogEcho log session "$MSG_INTERFACE_END $RETVAL" + + exit $RETVAL diff --git a/sources/interface/RestaurarSoftIncremental b/sources/interface/RestaurarSoftIncremental new file mode 100755 index 0000000..ee895d9 --- /dev/null +++ b/sources/interface/RestaurarSoftIncremental @@ -0,0 +1,82 @@ +#!/bin/bash +#___________________________________________________________________ +# +# RESTAURAR IMAGEN INCREMENTAL +#___________________________________________________________________ +# +# Parámetros recibidos desde el cliente: +# +# $1 Número de disco +# $2 Número de particion +# $3 Nombre canónico de la imagen básica (sin extensión) +# $4 Dirección del repositorio +# $5 Nombre canónico del software incremental (sin extensión) +# $6 Tipo de transmisión 0=Unicast 1=Multicast +# $7 Es una cadena "nnn" tipo flags que codifica varios parametros. +# Tiene el formato "nnn" donde "n" vale 0 ó 1. +# 1XX: Gestionar fichero completo en lugar de diferencas +# X1X: Eliminar archivos de la partición que no estén en la imagen +# XX1: Comprimir archivos para enviarlos por la red +# El valor X indica que no importa el valor que tenga el dato +# $8 Es una cadena "nnnn" tipo flags que codifica varios parametros. +# Tiene el formato "nnnn" donde "n" vale 0 ó 1. +# 1XXX: Borrar la particion de destino antes de restaurar la imagen basica +# X1XX: Copiar Imagen básica también a la cache +# XX1X: Borrar previamente la imagen basica de la cache antes de copiarla +# XXX1: No borrar archivos en destino +# El valor X indica que no importa el valor que tenga el dato +# $9 Método de clonación 0=Desde caché 1=Desde repositorio +# $10 Metodo de sincronizacion 1=Sincronización1 2=Sincronizacion2 +# $11 Ruta de origen de la Imagen (Carpeta) + +#___________________________________________________________________ +# +# Control parámetros +#___________________________________________________________________ + #Load engine configurator from engine.cfg file. + #Carga el configurador del engine desde el fichero engine.cfg + [ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + + # Clear temporary file used as log track by httpdlog + # Limpia los ficheros temporales usados como log de seguimiento para httpdlog + echo " " > $OGLOGSESSION; echo " " > $OGLOGCOMMAND + + # Registro de inicio de ejecución + ogEcho log session "$MSG_INTERFACE_START $0 $*" + + + if [ ${10} -eq 1 ]; then + #sincronizacion1 + ogRestaurarSoftIncremental "$@" + RETVAL=$? + fi + + if [ ${10} -eq 2 ]; then + #sincronizacion2 + # Opciones de clonacion + flag=$7 + WHOLE=${flag:0:1} + DELFILE=${flag:1:1} + COMPRESS=${flag:2:1} + + # Nota los valores se pasan como variables de entorno, + # la idea es que mas adelante vayan en el fichero PXE. + [ $WHOLE -eq 1 ] && export ogrsyncw=true || export ogrsyncw=false + [ $DELFILE -eq 1 ] && export ogrsyncdel=true || export ogrsyncdel=false + [ $COMPRESS -eq 1 ] && export ogrsyncz=true || export ogrsyncz=false + + # Origen de la imagen. + [ $9 -eq 0 ] && DEST="CACHE" || DEST="REPO" + + # Protocolo de clonacion y opciones + PROTO=${6%_*} + OPT=${6#*_} + + restoreDiffImage $DEST "$3" "$5" $1 $2 $PROTO $OPT + RETVAL=$? + fi + + # Registro de fin de ejecución + ogEcho log session "$MSG_INTERFACE_END $RETVAL" + + exit $RETVAL diff --git a/sources/interface/getConfiguration b/sources/interface/getConfiguration new file mode 100755 index 0000000..ddfc382 --- /dev/null +++ b/sources/interface/getConfiguration @@ -0,0 +1,88 @@ +#!/bin/bash + +#_______________________________________________________________________________________________________________________________ +# +# Formato de salida: +# disk=Número de disco\tpar=Número de particion\tcod=Código de partición\tsfi=Sistema de ficheros\tsoi=Sistema instalado\ttam=Tamaño de la partición\n +#_______________________________________________________________________________________________________________________________ + + +# No registrar los errores. +export DEBUG="no" + +ser=$(ogGetSerialNumber) +cfg="" +disks=$(ogDiskToDev | wc -w) +for ((dsk=1; dsk<=$disks; dsk++)); do + particiones=$(ogGetPartitionsNumber $dsk) + particiones=${particiones:-0} + # Tipo de tabla de particiones: 1=MSDOS, 2=GPT + ptt=$(ogGetPartitionTableType $dsk) + case "$ptt" in + MSDOS) ptt=1 ;; + GPT) ptt=2 ;; + LVM) ptt=3 ;; + ZPOOL) ptt=4 ;; + *) ptt=0 ;; + esac + # Información de disco (partición 0) + cfg="$cfg$dsk:0:$ptt:::$(ogGetDiskSize $dsk):0;" + for ((par=1;par<=$particiones;par++)); do + # Código del identificador de tipo de partición + cod=$(ogGetPartitionId $dsk $par 2>/dev/null) + # Tipo del sistema de ficheros + fsi=$(getFsType $dsk $par 2>/dev/null) + fsi=${fsi:-"EMPTY"} + # Tamaño de la particón + tam=$(ogGetPartitionSize $dsk $par 2>/dev/null) + tam=${tam:-"0"} + # Sistema operativo instalado + case "$fsi" in + ""|EMPTY|LINUX-SWAP|LINUX-LVM|ZVOL) + soi=""; uso=0 ;; + *) if [ -n "$(ogMount $dsk $par 2>/dev/null)" ]; then + soi=$(getOsVersion $dsk $par 2>/dev/null | cut -f2 -d:) + # Hacer un 2º intento para algunos casos especiales. + [ -z "$soi" ] && soi=$(getOsVersion $dsk $par 2>/dev/null | cut -f2 -d:) + # Sistema de archivos para datos (sistema operativo "DATA") + [ -z "$soi" -a "$fsi" != "EMPTY" -a "$fsi" != "CACHE" ] && soi="DATA" + # Obtener porcentaje de uso. + uso=$(df $(ogGetMountPoint $dsk $par) | awk '{getline; printf "%d",$5}') + uso=${uso:0} + else + soi=""; uso=0 + fi + ;; + esac + cfg="$cfg$dsk:$par:$cod:$fsi:$soi:$tam:$uso;" + done +done + +# Crear configuración por defecto para cliente sin disco. +[ -z "$cfg" ] && cfg="1:0:0:::0;" + +# Guardar salida en fichero temporal. +cfgfile=/tmp/getconfig +echo "${ser:+$ser;}$cfg" > $cfgfile + +# Crear el menú por defecto a partir del fichero generado (no dar ninguna salida). +generateMenuDefault &>/dev/null + +# Componer salida formateada. +awk '{ n=split($0,sep,";"); + for (i=1; i