#!/bin/bash #/** #@file setsmbpass [ogLive] #@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. #@author Ramón M. Gómez - ETSII Univ. Sevilla #@date 2011-07-28 #@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 y funciones globales. PROG="$(basename "$0")" OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"} PATH=$PATH:$OPENGNSYS/bin SAMBAUSER="opengnsys" # Usuario por defecto. TFTPDIR=$OPENGNSYS/tftpboot INITRD=oginitrd.img TMPDIR=/tmp/oglive$$ let CHANGES=0 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. 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. raiseError usage ;; 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 stty echo 2>/dev/null raiseError cancel "La clave solo debe contener caracteres alfanuméricos" fi echo # Obtener confirmación clave sin eco en pantalla. echo -n "Confirmar clave: " read -r SAMBAPASS2 echo stty echo 2>/dev/null [ "$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\" ..." mkdir -p $TMPDIR 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). sed -i "s/busybox reboot/reboot/" scripts/ogfunctions # FIN CÓDIGO TEMPORAL. # Ticket 565, preparar acceso Rsync cliente. echo "$SAMBAPASS" > scripts/passrsync 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\"." 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." fi done if [[ $CHANGES != 0 ]]; then jq ".samba.user = \"$SAMBAUSER\" | .samba.pass = \"$SAMBAPASS\"" \ "$OPENGNSYS"/client/ogClient/cfg/ogclient.json > /tmp/ogclient.json mv /tmp/ogclient.json "$OPENGNSYS"/client/ogClient/cfg/ogclient.json # Ticket 565, preparar acceso Rsync servidor. [ -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." fi