From b2696b37832c90365288fd9944a4df1d7704d7e0 Mon Sep 17 00:00:00 2001 From: lgromero Date: Mon, 5 Aug 2024 06:53:50 +0000 Subject: [PATCH] refs #503 adds sudo to root commands --- bin/oglivecli | 29 +++---- bin/setsmbpass | 200 +++++++++++++++++++++++++++++-------------------- 2 files changed, 134 insertions(+), 95 deletions(-) diff --git a/bin/oglivecli b/bin/oglivecli index 51a872c..0794cf9 100755 --- a/bin/oglivecli +++ b/bin/oglivecli @@ -379,9 +379,11 @@ function install() { TMPDIR=/tmp/${OGLIVEFILE%.iso} mkdir -p $OGLIVEDIR $TMPDIR 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; } - umount $TMPDIR >/dev/null 2>&1 + sudo umount $TMPDIR >/dev/null 2>&1 if [ ! -f $INFOFILE ]; then rm -f $TFTPDIR/$DEFOGLIVE $TFTPDIR/$OGCLIENT @@ -390,9 +392,9 @@ function install() { fi 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 - $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 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" } - -# Main progrram. +# Main program. # Access control. -[ -r $OPENGNSYS/www/controlacceso.php ] && ACCESS="web" -[ "$USER" = "root" ] && ACCESS="root" -[ -z "$ACCESS" ] && raiseError access "Need to be root." +if [ "$USER" = "root" ] || [ "$USER" = "ogboot" ] || groups $USER | grep -qw "ogboot"; then + ACCESS="root" +else + raiseError access "Need to be root, ogboot or a member of the ogboot group." +fi + # Check dependencies. which sponge &>/dev/null || raiseError notfound "Need to install \"moreutils\"." + # Commands control. shopt -s extglob -case "$ACCESS" in - 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 +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)' + case "$1" in $CMDS) COMMAND="${1/-/}"; shift; $COMMAND "$@" ;; *) raiseError usage ;; diff --git a/bin/setsmbpass b/bin/setsmbpass index cb57c28..42d7887 100755 --- a/bin/setsmbpass +++ b/bin/setsmbpass @@ -1,53 +1,33 @@ #!/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")" +PROG=$(basename $0) OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"} -PATH=$PATH:$OPENGNSYS/bin -SAMBAUSER="opengnsys" # Usuario por defecto. +OGCFGFILE=$OPENGNSYS/etc/opengnsys.json +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 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 0) # Cambios en todos los clientes ogLive instalados. - echolog "Cambiando contraseña 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). - echolog "Cambiando contraseña en un solo ogLive" LIST="$1" ;; - *) # Error de formato. - raiseError usage ;; + *) # 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. @@ -58,62 +38,118 @@ for OGLIVE in $LIST; do 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). - echolog "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 - echolog "$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++ + # 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 + cd $TMPDIR || { echo "Error: no se pudo cambiar al directorio temporal."; exit 3; } + + # Verificar si el archivo es gzip o lz4 antes de descomprimir. + if file "$CLIENTINITRD" | grep -q "gzip compressed data"; then + if ! gzip -dc "$CLIENTINITRD" | sudo 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" | sudo cpio -im; then + echo "Error: No se pudo descomprimir y extraer $CLIENTINITRD con lz4." + exit 4 + fi + COMPRESS_CMD="lz4 -c" + else + 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 < /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 - echolog "$PROG: Cliente \"$OGLIVE\" no accesible." + echo "$PROG: Cliente \"$OGLIVE\" no accesible." fi done + if [[ $CHANGES != 0 ]]; then # 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 + 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" | smbpasswd -a -s $SAMBAUSER + echo -ne "$SAMBAPASS\n$SAMBAPASS\n" | sudo smbpasswd -a -s $SAMBAUSER 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 -