161 lines
6.3 KiB
Bash
161 lines
6.3 KiB
Bash
#!/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
|
|
|