#!/bin/bash PROG=$(basename $0) OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys/ogboot"} 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_installed_oglives | jq -r '.installed_ogLives[].directory' | xargs -n1 basename) 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 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 # Cambiar clave Samba. echo "Cambiando clave samba en el servidor" 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