refs #503 adds sudo to root commands

ogboot_debian_installer
Luis Gerardo Romero Garcia 2024-08-05 06:53:50 +00:00
parent a3339efca7
commit b2696b3783
2 changed files with 134 additions and 95 deletions

View File

@ -379,9 +379,11 @@ function install() {
TMPDIR=/tmp/${OGLIVEFILE%.iso} TMPDIR=/tmp/${OGLIVEFILE%.iso}
mkdir -p $OGLIVEDIR $TMPDIR mkdir -p $OGLIVEDIR $TMPDIR
trap "umount $TMPDIR; rm -fr $TMPDIR" 1 2 3 6 9 15 trap "umount $TMPDIR; rm -fr $TMPDIR" 1 2 3 6 9 15
mount -o loop,ro $OGLIVEFILE $TMPDIR >/dev/null 2>&1 || { echo "{\"status\": \"error\", \"error\": \"mount failed.\"}"; exit 1; } echo "OGLIVEFILE: $OGLIVEFILE"
echo "TMPDIR: $TMPDIR"
sudo mount -o loop,ro $OGLIVEFILE $TMPDIR >/dev/null 2>&1 || { echo "{\"status\": \"error\", \"error\": \"mount failed.\"}"; exit 1; }
cp -va $TMPDIR/ogclient/* $OGLIVEDIR >/dev/null 2>&1 || { echo "{\"status\": \"error\", \"error\": \"Cannot copy files to ogLive directory.\"}"; exit 1; } cp -va $TMPDIR/ogclient/* $OGLIVEDIR >/dev/null 2>&1 || { echo "{\"status\": \"error\", \"error\": \"Cannot copy files to ogLive directory.\"}"; exit 1; }
umount $TMPDIR >/dev/null 2>&1 sudo umount $TMPDIR >/dev/null 2>&1
if [ ! -f $INFOFILE ]; then if [ ! -f $INFOFILE ]; then
rm -f $TFTPDIR/$DEFOGLIVE $TFTPDIR/$OGCLIENT rm -f $TFTPDIR/$DEFOGLIVE $TFTPDIR/$OGCLIENT
@ -390,9 +392,9 @@ function install() {
fi fi
if [ -n "$SAMBAPASS" ]; then if [ -n "$SAMBAPASS" ]; then
echo -ne "$SAMBAPASS\n$SAMBAPASS\n" | $OPENGNSYS/bin/setsmbpass "$(basename $OGLIVEDIR)" >/dev/null 2>&1 || { echo "{\"status\": \"error\", \"error\": \"setsmbpass failed.\"}"; exit 1; } echo -ne "$SAMBAPASS\n$SAMBAPASS\n" | $OPENGNSYS/bin/setsmbpass "$(basename $OGLIVEDIR)" || { echo "{\"status\": \"error\", \"error\": \"setsmbpass failed with SAMBAPASS.\"}"; exit 1; }
else else
$OPENGNSYS/bin/setsmbpass "$(basename $OGLIVEDIR)" >/dev/null 2>&1 || { echo "{\"status\": \"error\", \"error\": \"setsmbpass failed.\"}"; exit 1; } $OPENGNSYS/bin/setsmbpass "$(basename $OGLIVEDIR)" || { echo "{\"status\": \"error\", \"error\": \"setsmbpass failed no SAMBAPASS.\"}"; exit 1; }
fi fi
find -L $OGLIVEDIR -type d -exec chmod 755 {} \; >/dev/null 2>&1 || { echo "{\"status\": \"error\", \"error\": \"chmod directories failed.\"}"; exit 1; } find -L $OGLIVEDIR -type d -exec chmod 755 {} \; >/dev/null 2>&1 || { echo "{\"status\": \"error\", \"error\": \"chmod directories failed.\"}"; exit 1; }
@ -710,21 +712,22 @@ function check_services_status() {
echo "$json_output" echo "$json_output"
} }
# Main program.
# Main progrram.
# Access control. # Access control.
[ -r $OPENGNSYS/www/controlacceso.php ] && ACCESS="web" if [ "$USER" = "root" ] || [ "$USER" = "ogboot" ] || groups $USER | grep -qw "ogboot"; then
[ "$USER" = "root" ] && ACCESS="root" ACCESS="root"
[ -z "$ACCESS" ] && raiseError access "Need to be root." else
raiseError access "Need to be root, ogboot or a member of the ogboot group."
fi
# Check dependencies. # Check dependencies.
which sponge &>/dev/null || raiseError notfound "Need to install \"moreutils\"." which sponge &>/dev/null || raiseError notfound "Need to install \"moreutils\"."
# Commands control. # Commands control.
shopt -s extglob shopt -s extglob
case "$ACCESS" in CMDS='+(help|version|convert|config|check|list|show|search|download|install|uninstall|get-default|set-default|rebuild|assign|disk_usage|list_installed_oglives|get_info|get_default|set_default|check_services_status)'
root) CMDS='+(help|version|convert|config|check|list|show|search|download|install|uninstall|get-default|set-default|rebuild|assign|disk_usage|list_installed_oglives|get_info|get_default|set_default|check_services_status)' ;;
web) CMDS='+(list|show|search|get-default)' ;;
esac
case "$1" in case "$1" in
$CMDS) COMMAND="${1/-/}"; shift; $COMMAND "$@" ;; $CMDS) COMMAND="${1/-/}"; shift; $COMMAND "$@" ;;
*) raiseError usage ;; *) raiseError usage ;;

View File

@ -1,53 +1,33 @@
#!/bin/bash #!/bin/bash
#/** PROG=$(basename $0)
#@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"} OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"}
PATH=$PATH:$OPENGNSYS/bin OGCFGFILE=$OPENGNSYS/etc/opengnsys.json
SAMBAUSER="opengnsys" # Usuario por defecto. SAMBAUSER="opengnsys" # Usuario por defecto.
TFTPDIR=$OPENGNSYS/tftpboot TFTPDIR=$OPENGNSYS/tftpboot
INITRD=oginitrd.img INITRD=oginitrd.img
TMPDIR=/tmp/oglive$$ TMPDIR=/tmp/oglive$$
let CHANGES=0 let CHANGES=0
source $OPENGNSYS/lib/ogfunctions.sh || exit 1 # Control básico de errores.
if [ "$USER" != "root" ] && [ "$USER" != "ogboot" ] && ! id -nG "$USER" | grep -qw "ogboot"; then
echo "$PROG: Error: solo ejecutable por root, ogboot o miembros del grupo ogboot" >&2
exit 1
fi
# Control de parámetros.
[ "$*" == "help" ] && help
[ "$*" == "version" ] && version
[ "$USER" != "root" ] && raiseError access "Solo ejecutable por root"
case $# in case $# in
0) # Cambios en todos los clientes ogLive instalados. 0) # Cambios en todos los clientes ogLive instalados.
echolog "Cambiando contraseña en todos los clientes ogLive instalados"
if which oglivecli &>/dev/null; then if which oglivecli &>/dev/null; then
LIST=$(oglivecli list | awk '{print $2}') LIST=$(oglivecli list | awk '{print $2}')
else else
LIST="ogclient" LIST="ogclient"
fi ;; fi ;;
1) # Cambios en único ogLive (AVISO: puede crear inconsistencias con otros ogLive). 1) # Cambios en único ogLive (AVISO: puede crear inconsistencias con otros ogLive).
echolog "Cambiando contraseña en un solo ogLive"
LIST="$1" ;; LIST="$1" ;;
*) # Error de formato. *) # Error de formato.
raiseError usage ;; echo "$PROG: Error de ejecución" >&2
echo "Formato: $PROG ogLive"
exit 1 ;;
esac esac
# Recuperar eco de consola si se corta el proceso. # Recuperar eco de consola si se corta el proceso.
@ -58,62 +38,118 @@ for OGLIVE in $LIST; do
CLIENTINITRD="$TFTPDIR/$OGLIVE/$INITRD" CLIENTINITRD="$TFTPDIR/$OGLIVE/$INITRD"
if [ -r "$CLIENTINITRD" ]; then if [ -r "$CLIENTINITRD" ]; then
if [ -z "$SAMBAPASS" ]; then if [ -z "$SAMBAPASS" ]; then
# Obtener clave del teclado sin eco en pantalla. # Obtener clave del teclado sin eco en pantalla.
stty -echo 2>/dev/null stty -echo 2>/dev/null
echo -n "Clave del usuario Samba: " echo -n "Clave del usuario Samba: "
read -r SAMBAPASS read -r SAMBAPASS
# Solo se deben aceptar números y letras para la clave de acceso. # Solo se deben aceptar números y letras para la clave de acceso.
if [[ "$SAMBAPASS" =~ [^a-zA-Z0-9] ]]; then if [[ "$SAMBAPASS" =~ [^a-zA-Z0-9] ]]; then
echo echo
stty echo 2>/dev/null echo "$PROG: Error: la clave solo debe contener caracteres alfanuméricos" >&2
raiseError cancel "La clave solo debe contener caracteres alfanuméricos" stty echo 2>/dev/null
fi exit 2
echo fi
# Obtener confirmación clave sin eco en pantalla. echo
echo -n "Confirmar clave: " # Obtener confirmación clave sin eco en pantalla.
read -r SAMBAPASS2 echo -n "Confirmar clave: "
echo read -r SAMBAPASS2
stty echo 2>/dev/null echo
[ "$SAMBAPASS" != "$SAMBAPASS2" ] && raiseError cancel "Las claves no coinciden" stty echo 2>/dev/null
fi if [ "$SAMBAPASS" != "$SAMBAPASS2" ]; then
# Editar la parte de acceso del cliente: echo "$PROG: Error: las claves no coinciden" >&2
# descomprimir Initrd, sustituir clave y recomprimir Initrd). exit 2
echolog "Configurando cliente \"$OGLIVE\" ..." fi
mkdir -p $TMPDIR fi
cd $TMPDIR || ogRaiseError access "Directorio temporal" # Editar la parte de acceso del cliente:
COMPRESS=$(file -b "$CLIENTINITRD" | awk '{print tolower($1);}') # descomprimir Initrd, sustituir clave y recomprimir Initrd).
$COMPRESS -dc "$CLIENTINITRD" | cpio -im echo "Configurando cliente \"$OGLIVE\" ..."
if [ -f scripts/ogfunctions ]; then mkdir -p $TMPDIR
sed -i "s/OPTIONS=\(.*\)user=\w*\(.*\)pass=\w*\(.*\)/OPTIONS=\1user=$SAMBAUSER\2pass=$SAMBAPASS\3/" scripts/ogfunctions cd $TMPDIR || { echo "Error: no se pudo cambiar al directorio temporal."; exit 3; }
# TEMPORAL: solución ticket 554, actualizar cliente en caché (ogLive r3257).
sed -i "s/busybox reboot/reboot/" scripts/ogfunctions # Verificar si el archivo es gzip o lz4 antes de descomprimir.
# FIN CÓDIGO TEMPORAL. if file "$CLIENTINITRD" | grep -q "gzip compressed data"; then
# Ticket 565, preparar acceso Rsync cliente. if ! gzip -dc "$CLIENTINITRD" | sudo cpio -im; then
echo "$SAMBAPASS" > scripts/passrsync echo "Error: No se pudo descomprimir y extraer $CLIENTINITRD con gzip."
chown root.root scripts/passrsync exit 4
chmod 400 scripts/passrsync fi
# Generar Initrd del cliente (siempre comprimido con gzip). COMPRESS_CMD="gzip -9c"
find . | cpio -H newc -oa | gzip -9c > "$CLIENTINITRD" elif file "$CLIENTINITRD" | grep -q "LZ4 compressed data"; then
else if ! lz4 -d "$CLIENTINITRD" | sudo cpio -im; then
echolog "$PROG: Aviso: no se ha modificado la clave del cliente \"$OGLIVE\"." echo "Error: No se pudo descomprimir y extraer $CLIENTINITRD con lz4."
fi exit 4
rm -fr $TMPDIR fi
# Calcular suma de comprobación. COMPRESS_CMD="lz4 -c"
md5sum "$CLIENTINITRD" | cut -f1 -d" " > "$CLIENTINITRD.sum" else
let CHANGES++ echo "Error: $CLIENTINITRD no está en formato gzip o lz4."
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
# 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 root.root scripts/passrsync scripts/client.cfg
sudo chmod 400 scripts/passrsync scripts/client.cfg
pwd
# Paso 1: Buscar archivos
sudo find . -print > /tmp/filelist.txt
if [ $? -ne 0 ]; then
echo "Error: No se pudo encontrar los archivos."
exit 5
fi
# Paso 2: Crear el archivo CPIO
sudo 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
# Paso 3: Comprimir el archivo CPIO
sudo $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 "tee step"
echo $CLIENTINITRD
# Paso 4: Escribir el archivo comprimido en el destino
sudo tee "$CLIENTINITRD" < /tmp/initrd.cpio.gz > /dev/null
if [ $? -ne 0 ]; then
echo "Error: No se pudo escribir el archivo comprimido en el destino."
exit 5
fi
sudo rm /tmp/initrd.cpio /tmp/initrd.cpio.gz
else
echo "$PROG: Aviso: no se ha modificado la clave del cliente \"$OGLIVE\"."
fi
sudo rm -fr $TMPDIR
# Calcular suma de comprobación.
sudo md5sum "$CLIENTINITRD" | cut -f1 -d" " | sudo tee "$CLIENTINITRD.sum" > /dev/null
let CHANGES++
else else
echolog "$PROG: Cliente \"$OGLIVE\" no accesible." echo "$PROG: Cliente \"$OGLIVE\" no accesible."
fi fi
done done
if [[ $CHANGES != 0 ]]; then if [[ $CHANGES != 0 ]]; then
# Ticket 565, preparar acceso Rsync servidor. # 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 echo "$SAMBAUSER:$SAMBAPASS" | sudo tee /etc/rsyncd.secrets > /dev/null
chown root.root /etc/rsyncd.secrets echo "chown debugging"
chmod 600 /etc/rsyncd.secrets sudo chown root:root /etc/rsyncd.secrets
sudo chmod 600 /etc/rsyncd.secrets
# Cambiar clave Samba. # Cambiar clave Samba.
echo -ne "$SAMBAPASS\n$SAMBAPASS\n" | smbpasswd -a -s $SAMBAUSER echo -ne "$SAMBAPASS\n$SAMBAPASS\n" | sudo smbpasswd -a -s $SAMBAUSER
else else
echolog "$PROG: Aviso: no se ha modificado la clave de ningún cliente." echo "$PROG: Aviso: no se ha modificado la clave de ningún cliente."
fi fi