lunes, 18 de junio de 2012

Un examen completo: gestion de usuarios, grupos, servicios, aplicaciones, ...

A continuación se muestra el enunciado y posible solución para una convocatoria de examen sobre scripts Linux.


ENUNCIADO DEL PROBLEMA


GESTIÓN DE SERVIDORES DE AULA

Para la realización de este script el alumnado debe tener en cuenta las siguientes cuestiones:
  • Se deben utilizar funciones.
  • Todas las peticiones de introducción de datos por teclado deben ser filtradas correctamente.
  • Los comentarios a lo largo del código fuente serán valorados positivamente.
  • El orden del código fuente, tabulaciones y estructura del programa se tendrán muy en cuenta.
  • Se prestará especial atención al funcionamiento y sintaxis de las estructuras condicionales, condicionales múltiples, bucles, etc.

Una vez descritos los requisitos generales que el script debe cumplir, se detalla a continuación el enunciado a resolver.

Función para crear un archivo “log” (4 puntos):
Realiza una función que cree en la carpeta del programa una carpeta llamada “log”. Se ha de comprobar si la carpeta ya existía. Si es así, no se borrará. Si no existía, se creará y se comprobará su correcta creación. Seguidamente, se comprobará si existía un archivo en dicha carpeta llamado “log.txt”. Si es así, no se modificará nada y si no existía, se creará conteniendo en su interior la siguiente cabecera:

REGISTRO DE OPERACIONES REALIZADAS
Programa: <nombre del script>
Alumno/a: <nombre del alumno/a>
Curso: <curso>
2011/2012
Función para escribir en archivo “log” (4 puntos):
Realiza una función genérica para registrar en el archivo “log” del programa, todas aquellas acciones que el enunciado indique que han de anotarse. Para ello, se ha de tener en cuenta la fecha y hora en la que se realiza la anotación, así como la operación realizada. Esta función debe recibir como parámetro la cadena de texto que se quiere escribir en el archivo “log” del programa.

Nota: Si la función se denomina registrar_en_log y queremos escribir en el archivo el mensaje “El usuario Antonio ha sido creado con éxito”, dentro de la función debemos utilizar $1 que representará el parámetro que recibirá la cadena de caracteres. Cuando vayamos a realizar la llamada a la función en nuestro programa principal o desde otra función, tendremos que escribir:
registrar_en_log “El usuario Antonio ha sido creado con éxito”.

De este modo, podremos utilizar esta función genérica desde cualquier parte de nuestro script para insertar las anotaciones que sean necesarias.

Función para instalación de aplicaciones (3 puntos):
Realiza una función genérica que sirva para realizar la instalación de aplicaciones. Se debe solicitar al usuario que introduzca por teclado el nombre de la aplicación a instalar. Antes de intentar instalarla, el programa debe comprobar si esta aplicación ya está instalada en el sistema. Si lo está, se comunicará al usuario. Si no lo está, se lanzará una orden de instalación y se comprobará el resultado de ésta informando al usuario. Para cada acción realizada se debe llevar a cabo una anotación en el archivo “log” del programa.

Función para desinstalación de aplicaciones (3 puntos):
Realiza una función genérica que sirva para realizar la desinstalación de aplicaciones. Se debe solicitar al usuario que introduzca por teclado el nombre de la aplicación a desinstalar. Antes de intentar desinstalarla, el programa debe comprobar si esta aplicación ya está instalada en el sistema. Si lo está, se comunicará al usuario y se lanzará una orden de desinstalación, se comprobará el resultado de ésta informando al usuario. Si la aplicación no está instalada, se informará al usuario. . Para cada acción realizada se debe llevar a cabo una anotación en el archivo “log” del programa.

Función para el chequeo del estado de todos los servicios (2 puntos):
Realiza una función que muestre por pantalla el estado actual de todos los servicios del sistema.

Función para la activación, desactivación o reinicio de servicios (2 puntos):
Realiza una función que solicite al usuario el nombre de un servicio. El script debe comprobar el estado del servicio y mostrarlo por pantalla. Una vez hecho esto, se ha de preguntar al usuario si quiere iniciarlo, pararlo o reiniciarlo. En función de la respuesta, se llevará a cabo dicha acción. Para cada acción que se realice, se debe llevar a cabo una anotación en el archivo “log” del programa.

Función para la preparación del aula (6 puntos):
Realiza una función genérica que sirva para la preparación de un aula. Esta función deberá funcionar como un “asistente” llevando a cabo su trabajo a través de varias preguntas:
  1. Primer paso: Se solicitará al usuario que introduzca el nombre del aula, una vez introducido se comprobará si el aula existe como grupo dentro del sistema. Si no está creado dicho grupo, se creará.
  2. Segundo paso: Se creará en la carpeta del script, una carpeta con el mismo nombre que la del aula.
  3. Tercer paso: Se solicitará al usuario que introduzca el nombre de usuario del profesor. Se ha de comprobar si este usuario existe en el sistema, si no se creará y se integrará en el grupo del aula. Se establecerá su home en el interior de la carpeta correspondiente al aula.
  4. Cuarto paso: Se solicitará al usuario que introduzca el número de usuarios que forman el aula. Se dará de alta a tantos usuarios como se haya indicado, integrando a cada uno de ellos en el grupo del aula. Se establecerá su home en el interior de la carpeta correspondiente al aula. Para cada usuario a crear, se deben realizar las comprobaciones previas necesarias.

Para cada uno de los pasos, se ha de realizar una anotación en el archivo “log” del programa. Estas anotaciones deben realizarse tanto si el aula, profesor o usuarios son creados satisfactoriamente, como si no es así.

Función para mostrar el estado de particiones del servidor (2 puntos):
Realiza una función que muestre por pantalla el estado actual de todas las particiones del sistema, su tamaño, porcentaje de utilización, etc.

Programa principal (2 puntos):

Construye el programa principal que debe crear en primer lugar el archivo “log” del programa. Una vez realizada esta acción, se mostrará por pantalla el siguiente menú de opciones:

1)       Instalar aplicaciones
2)       Desinstalar aplicaciones
3)       Visualizar estado de servicios
4)       Gestionar un servicio
5)       Preparación del aula
6)       Visualizar estado almacenamiento
7)       Visualizar log de operaciones
8)       Salir

Tanto el menú, como las distintas opciones deben gestionarse a través de las estructuras de control adecuadas.




CÓDIGO FUENTE DE UNA POSIBLE SOLUCIÓN

#!/bin/bash

# Función para crear un archivo log
function crea_log()
{
    if [ -d /home/$USERNAME/finalsor/log ]
    then
        echo "La carpeta que alojará el log del programa ya existe, no se creará"
    else
        echo "Creando carpeta para alojar log"
        mkdir /home/$USERNAME/finalsor/log
        if [ $? -ne 0 ]
        then
            echo "Error al crear la carpeta para alojar log"
        else
            echo "Carpeta para alojar log creada con éxito"
        fi
    fi

    echo "Comprobando la existencia de un archivo log..."

    if [ -f /home/$USERNAME/finalsor/log/log.txt ]
    then
        echo "Ya existe un archivo log, no se creará"
    else
        echo "No existe un archivo log, procediendo a su creación..."      
        touch /home/$USERNAME/finalsor/log/log.txt
        if [ -f /home/$USERNAME/finalsor/log/log.txt ]
        then
            echo "Archivo log creado con éxito"
            echo "Insertando cabecera..."
            echo "###################################" >> /home/$USERNAME/finalsor/log/log.txt
            echo "REGISTRO DE OPERACIONES REALIZADAS" >> /home/$USERNAME/finalsor/log/log.txt
            echo "Programa: finalsor.sh" >> /home/$USERNAME/finalsor/log/log.txt
            echo "Alumno/a: profesor" >> /home/$USERNAME/finalsor/log/log.txt
            echo "Curso: 2ºSMR" >> /home/$USERNAME/finalsor/log/log.txt
            echo "2011/2012" >> /home/$USERNAME/finalsor/log/log.txt
            echo "###################################" >> /home/$USERNAME/finalsor/log/log.txt
        else
            echo "Error al crear el archivo log"
        fi
    fi

}

function escribe_en_log()
{
    #Función genérica que escribirá en el archivo log el mensaje que le pasemos como parámetro
    hora=`date +%T`
    fecha=`date +%d/%m/%Y`
    #echo "El mensaje a registrar en el log es: " $1
    #echo "Insertando mensaje en log..."
    echo $fecha" "$hora".............."$1 >> /home/$USERNAME/finalsor/log/log.txt
    if [ $? -eq 0 ]
    then
        echo "Inserción en log realizada con éxito"
    else
        echo "Error al insertar en el log"
    fi
}

function instala()
{
          # Función para instalación de aplicaciones
    echo "INSTALACIÓN DE APLICACIONES"
    while [ -z $programa ]
    do
        read -p "Introduce el nombre de la aplicación a instalar: " programa
    done
    which $programa > /dev/null
    if [ $? -eq 0 ]
    then
        echo "La aplicación: $programa ya está instalada en su sistema"
    else
        echo "La aplicación: $programa no se encuentra instalada, procediendo..."
        sudo apt-get install $programa
        if [ $? -eq 0 ]
        then
            echo "Instalación satisfactoria"
            escribe_en_log "Aplicación: $programa - Éxito en la instalación"
        else
            echo "Error al instalar"
            escribe_en_log "Aplicación: $programa - Error durante la instalación"
        fi
    fi

}

function desinstala()
{
    echo "DESINSTALACIÓN DE APLICACIONES"
    while [ -z $programades ]
    do
        read -p "Introduce el nombre de la aplicación a desinstalar: " programades
    done  
    which $programades > /dev/null
    if [ $? -eq 0 ]
    then
        echo "La aplicación: $programades se encuentra instalada en su sistema, procediendo a su desinstalación..."
        sudo apt-get remove $programades --purge
        if [ $? -eq 0 ]
        then
            echo "Desinstalación satisfactoria"
            escribe_en_log "Aplicación: $programades - Éxito al desinstalar"
        else
            echo "Error al desinstalar"
            escribe_en_log "Aplicación: $programades - Error durante la desinstalación"
        fi
    else
        echo "La aplicación: $programades no se encuentra instalada, no se puede desinstalar"
      
    fi
}

function estado_servicios()
{
    clear
    echo "VISUALIZACIÓN DE ESTADO DE SERVICIOS DEL SERVIDOR"
    service --status-all | more
    read -p "Pulse una tecla para continuar"
}

function gestiona_servicio()
{
    clear
    echo "GESTIÓN DE SERVICIO"
    servicio=""
    while [ -z $servicio ]
    do
        read -p "Introduzca el nombre del servicio a gestionar: " servicio
    done
    echo "El servicio introducido es: " $servicio
    which $servicio  > /dev/null 2>/dev/null
    if [ $? -eq 0 ]
    then
        echo "Estado del servicio $servicio: "
        service $servicio status
        echo "Pulse 1 para detener, 2 para iniciar, 3 para reiniciar"
        operacion=""       
        while [ -z $operacion ]
        do
            read -p "operación: " operacion
        done
       
       
            case $operacion in
                1) echo "Deteniendo servicio: $servicio";
                   sudo service $servicio stop;
                   escribe_en_log "Servicio: $servicio detenido";
                   read -p "Pulse una tecla para continuar";;
   
                2) echo "Iniciando servicio: $servicio";
                               sudo service $servicio start;
                   escribe_en_log "Servicio: $servicio iniciado";
                   read -p "Pulse una tecla para continuar";;
           
                3) echo "Reiniciando servicio: $servicio";
                               sudo service $servicio restart;
                   escribe_en_log "Servicio: $servicio reiniciado";
                   read -p "Pulse una tecla para continuar";;

                *) echo "Opción no válida";

                   read -p "Pulse una tecla para continuar";;
            esac
           
    else
        echo "El servicio: $servicio, no se encuentra disponible"
        read -p "Pulse una tecla para continuar"
    fi
}

function prepara_aula()
{
    clear
    echo "PREPARACIÓN DE AULA"
    aula=""   
    while [ -z $aula ]
    do
        read -p "Introduzca el nombre del aula: " aula
    done
   
    cat /etc/group | grep -w $aula > /dev/null
    if [ $? -eq 0 ]
    then
        echo "El grupo: $aula existe en el sistema, no se creará"
    else
        echo "El grupo: $aula no existe en el sistema, creando..."
        sudo addgroup $aula
        if [ $? -eq 0 ]
        then
            echo "Grupo: $aula creado con éxito"
            escribe_en_log "Grupo: $aula - Éxito al crear"
        else
            echo "Grupo: $aula no creado"
            escribe_en_log "Grupo: $aula - Error al crear"
        fi
    fi


    if [ -d /home/$USERNAME/finalsor/$aula ]

    then
        echo "La carpeta del aula: $aula existe en el sistema"
    else
        echo "Creando ahora la carpeta del aula: $aula..."
        mkdir /home/$USERNAME/finalsor/$aula       
        if [ $? -eq 0 ]
        then
            echo "Éxito al crear la carpeta del aula: $aula"
            escribe_en_log "Carpeta:$aula - Éxito al crear"
        else
            echo "Error al crear la carpeta del aula:$aula"
            escribe_en_log "Carpeta:$aula - Error al crear"
        fi
    fi

    echo "PROFESOR DEL AULA"   

    echo "Creando el usuario del profesor del aula: $aula"
    profesor=""
    while [ -z $profesor ]
    do
        read -p "Introduzca el nombre de usuario del profesor: " profesor
    done
   
    cat /etc/passwd | grep -w $profesor > /dev/null
    if [ $? -eq 0 ]
    then
        echo "El usuario: $profesor del profesor ya existe en el sistema, no se creará"
    else
        echo "El usuario $profesor no existe, creando..."
        sudo adduser --home /home/$USERNAME/finalsor/$aula/$profesor $profesor
        if [ $? -eq 0 ]
        then
            echo "Usuario: $profesor creado con éxito"
            escribe_en_log "Usuario: $profesor - Éxito al crear"
        else
            echo "Usuario: $profesor creado sin éxito"
            escribe_en_log "Usuario: $profesor - Error al crear"
        fi
    fi
   
    echo "ALUMNOS DEL AULA"
    alumnos=""
    while [ -z $alumnos ]
    do
        read -p "Introduzca el número de alumnos del aula $aula: " alumnos
    done
    echo "Ha introducido: $alumnos"
    echo "Comienza la creación automática de los $alumnos alumnos..."
    for ((contador=1;contador<=$alumnos;contador++))
    do
        nombre_alumno=$aula"_alumno"$contador
        cat /etc/passwd | grep -w $nombre_alumno > /dev/null
         if [ $? -eq 0 ]
        then
            echo "El usuario: $nombre_alumno ya existe en el sistema, no se creará"
        else
            echo "El usuario $nombre_alumno no existe, creando..."
            sudo adduser --home /home/$USERNAME/finalsor/$aula/$nombre_alumno $nombre_alumno
            if [ $? -eq 0 ]
            then
                echo "Usuario: $nombre_alumno creado con éxito"
                escribe_en_log "Usuario: $nombre_alumno - Éxito al crear"
            else
                echo "Usuario: $nombre_alumno creado sin éxito"
                escribe_en_log "Usuario: $nombre_alumno - Error al crear"
            fi
        fi
    done   

}


#........................................................................................
# PROGRAMA PRINCIPAL
#........................................................................................
crea_log
opcion=9
while [ $opcion -ne 8 ]
do
    clear
    echo "******************************************"
    echo "*      GESTIÓN DE SERVIDORES DE AULA     *"
    echo "******************************************"
    echo "* 1)Instalar aplicaciones                *"
    echo "* 2)Desinstalar aplicaciones             *"
    echo "* 3)Visualizar estado de servicios       *"
    echo "* 4)Gestionar servicio                   *"
    echo "* 5)Preparación del aula                 *"
    echo "* 6)Visualizar estado almacenamiento     *"
    echo "* 7)Visualizar log de operaciones        *"
    echo "* 8)Salir                                *"
    echo "******************************************"
    read -p "Introduzca una opción: " opcion
    echo "******************************************"
  

    case $opcion in

        1)instala;;
        2)desinstala;;
        3)estado_servicios;;
        4)gestiona_servicio;;  
        5)prepara_aula;;
        6)clear; echo "ESTADO DE ALMACENAMIENTO DEL SISTEMA"; df -h;read -p "Pulse una tecla para continuar";;
        7)clear; echo "VISUALIZANDO LOG DE OPERACIONES"; cat /home/$USERNAME/finalsor/log/log.txt;read -p "Pulse una tecla para continuar";;
        8)clear; echo "GRACIAS POR UTILIZAR ESTE SOFTWARE";exit 0;;
        *)clear; echo "Error, opción no válida. Inténtelo de nuevo";;
    esac
done

No hay comentarios: