#!/bin/bash

PROG=$(basename $0)
OPENGNSYS=${OPENGNSYS:-"/opt/ogboot"}
OGCFGFILE=$OPENGNSYS/etc/ogboot_samba.json
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" ] && [ "$USER" != "opengnsys" ] && ! id -nG "$USER" | grep -qw "opengnsys"; then
    echo "$PROG: Error: solo ejecutable por root, ogboot o miembros del grupo ogboot" >&2
    exit 1
fi

case $# in
    0)  # Cambios 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).
        LIST="$1" ;;
    *)  # Error de formato.
        echo "$PROG: Error de ejecución" >&2
        echo "Formato: $PROG ogLive"
        exit 1 ;;
esac

# Recuperar eco de consola si se corta el proceso.
trap "stty echo 2>/dev/null" KILL
# Buscar todos los clients ogLive instalados.
for OGLIVE in $LIST; do
    # Crear clave para usuario de acceso a los recursos.
    CLIENTINITRD="$TFTPDIR/$OGLIVE/$INITRD"
    if [ -r "$CLIENTINITRD" ]; then
        if [ -z "$SAMBAPASS" ]; then
            # Obtener clave del teclado sin eco en pantalla.
            stty -echo 2>/dev/null
            echo -n "Clave del usuario Samba: "
            read -r SAMBAPASS
            # 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
            fi
            echo
            # Obtener confirmación clave sin eco en pantalla.
            echo -n "Confirmar clave: "
            read -r SAMBAPASS2
            echo
            stty echo 2>/dev/null
            if [ "$SAMBAPASS" != "$SAMBAPASS2" ]; then
                echo "$PROG: Error: las claves no coinciden" >&2
                exit 2
            fi
        fi
        # Editar la parte de acceso del cliente:
        #    descomprimir Initrd, sustituir clave y recomprimir Initrd).
        echo "Configurando cliente \"$OGLIVE\" ..."
        mkdir -p $TMPDIR
	echo "TMPDIR $TMPDIR"
        cd $TMPDIR || { echo "Error: no se pudo cambiar al directorio temporal."; exit 3; }

    echo "Verificar si el archivo es gzip, lz4 o ASCII cpio 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"
    elif file "$CLIENTINITRD" | grep -q "ASCII cpio archive"; then
        if ! cpio -im < "$CLIENTINITRD"; then
            echo "Error: No se pudo extraer $CLIENTINITRD como archivo cpio."
            exit 4
        fi
        COMPRESS_CMD="cat"  # No compresión, simplemente se pasa el archivo tal cual
    else
        echo "Error: $CLIENTINITRD no está en formato gzip, lz4 o ASCII cpio."
        exit 4
    fi

        if [ -f scripts/ogfunctions ]; then
            sudo 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).
            sudo sed -i "s/busybox reboot/reboot/" scripts/ogfunctions
            # FIN CÓDIGO TEMPORAL.
            # Ticket 565, preparar acceso Rsync cliente.
            echo "$SAMBAPASS" | sudo tee scripts/passrsync > /dev/null
            echo "Guardar tokens de seguridad"
            cat <<EOT | sudo tee scripts/client.cfg > /dev/null
CLIENTID=$(jq -r .client.id $OGCFGFILE)
CLIENTSECRET=$(jq -r .client.secret $OGCFGFILE)
EOT
            sudo chown ogboot:ogboot scripts/passrsync scripts/client.cfg
#            pwd
#            sudo find . -print > /tmp/filelist.txt
#            if [ $? -ne 0 ]; then
#                echo "Error: No se pudo encontrar los archivos."
#                exit 5
#            fi

#            cpio -H newc -oa < /tmp/filelist.txt > /tmp/initrd.cpio
#            if [ $? -ne 0 ]; then
#                echo "Error: No se pudo crear el archivo CPIO."
#                exit 5
#            fi
#            $COMPRESS_CMD < /tmp/initrd.cpio > /tmp/initrd.cpio.gz
#            if [ $? -ne 0 ]; then
#                echo "Error: No se pudo comprimir el archivo CPIO."
#                exit 5
#            fi
#	    echo "Copiando el contenido del archivo /tmp/initrd.cpio.gz al archivo /opt/opengnsys/tftpboot/ogLive-5.11.0-r20210413/oginitrd.img."
#	    echo $CLIENTINITRD
#            dd if=/tmp/initrd.cpio.gz of=/opt/opengnsys/tftpboot/ogLive-5.11.0-r20210413/oginitrd.img
#	    echo "dd ejecutado correctamente"
#            if [ $? -ne 0 ]; then
#                echo "Error: No se pudo escribir el archivo comprimido en el destino."
#                exit 5
#            fi
#	    echo "borrando rm /tmp/initrd.cpio /tmp/initrd.cpio.gz"
#            sudo  rm /tmp/initrd.cpio /tmp/initrd.cpio.gz
            find . | cpio -H newc -oa | gzip -9c > "$CLIENTINITRD"     
        else
            echo "$PROG: Aviso: no se ha modificado la clave del cliente \"$OGLIVE\"."
        fi
	echo "intentando borrar $TMPDIR"
        rm -fr $TMPDIR
        echo "Calcular suma de comprobación"
        md5sum "$CLIENTINITRD" | cut -f1 -d" " | sudo tee "$CLIENTINITRD.sum" > /dev/null
        let CHANGES++
    else
        echo "$PROG: Cliente \"$OGLIVE\" no accesible."
    fi
done

if [[ $CHANGES != 0 ]]; then
    # Ticket 565, preparar acceso Rsync servidor.
    echo "$SAMBAUSER:$SAMBAPASS" | sudo tee /etc/rsyncd.secrets > /dev/null
    echo "chown debugging"
    sudo chown root:root /etc/rsyncd.secrets
    sudo chmod 600 /etc/rsyncd.secrets
    # Cambiar clave Samba.
    echo -ne "$SAMBAPASS\n$SAMBAPASS\n" | sudo smbpasswd -a -s $SAMBAUSER
    echo "setsmbpass finish"
else
    echo "$PROG: Aviso: no se ha modificado la clave de ningún cliente."
fi

