#!/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 < /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