---
# System prepended metadata

title: Práctica Linux 3 - Grupo 5

---

# Práctica Linux 3 - Grupo 5

---
Primero comenzamos creando el script *getUsu.sh.* Para esto lo abrimos con el editor de textos que prefiramos (vi, vim...) y añadimos una **cabecera** utilizando comentarios.
```
#!/bin/bash
# Programa: getUsu.sh
# Proposito: Añadir y borrar usuarios en el sistema.
# Autor: Grupo 5 - Azahara Ballester, Sandra Martín, Borja Ordoñez y Paula Riesgo
# Fecha: 21/11/2020
```
Tras esto vamos a declarar las **variables** que usaremos en el programa:
```
fichero=$1
fecha=$2
log=/tmp/gestUsu.log
```
## Validaciones


---

El script debe **validar** varios aspectos de los **argumentos** que se le pasen al programa:
* **Número de argumentos.**
* **Existencia del fichero.**
* **Tamaño del fichero > 0.**
* **Fecha en formato correcto.**

La primera validación la realizaremos con el siguiente código:
```
if test $# -ne 2  # Comprueba si el numero de argumentos ($#) pasado sea distinto de dos.
then
        echo "Error en el numero de argumentos. Debe introducir 2 argumentos."
        exit 1 # Salimos del programa mediante un error.
fi
```
Lo siguiente es comprobar que el fichero introducido existe y que el tamaño es mayor que 0. Para esto tendremos otro código:
```
if ! test -s $1 # Comprobamos el fichero introducido.
then
        echo "Error en el archivo introducido."
        exit 1
fi
```
La ultima comprobación es la de la fecha, la cual es realizada mediante dos ordenes if:
```
if [[ $fecha =~ ^[0-9]{4}[/][0-9]{2}[/][0-9]{2}$ ]] # Comprobamos el formato de la fecha YYYY/MM/DD
then
        ANO=${fecha:0:4}
        MES=${fecha:5:2}
        DIA=${fecha:8:2}

        if ! (test $ANO -ge 2020 && test $ANO -le 2039 && test $MES -ge 01 && test $MES -le 12 && test $DIA -ge 01 && test $DIA -le 31)
        then # Comprobamos todos los parámetros pedidos. Si no se sigue alguno, saltará un error. Si se siguen todos, continua.
                echo "Error en la fecha introducida"
                exit 1
        fi
fi
```

Se escribirá lo que va ocurriendo en un fichero de log, de tal manera que se comprueba si éste existe y si no, se crea.
```
if ! test -w $log       # Comprobamos que si el archivo existe y se puede escribir (o no)
then
        touch $log              # Si no existe, lo creamos.
        echo "Log creado"
fi
```
## Programa principal
---


El **funcionamiento principal del programa** incluye que le pasemos un fichero, el cual contiene la información sobre las altas y las bajas de usuarios,  y que el programa sea capaz de leer e interpretar cada línea, ver de que tipo de acción se trata, haga su función y la registre en un archivo log (*/tmp/gestUsu.log*).

Todo el funcionamiento lo incluiremos dentro de un while do para que vaya recorriendo todo el fichero.

* **Lectura de una línea #:** Se interpreta como un comentario y se almacena en el log de manera literal.

```
while read linea
do
        aux=${linea:0:1}
        if test $aux = \#
        then
                echo $linea >> $log
```

* **Lectura de una linea +:** Se interpreta como una alta de un usuario, por lo tanto tendremos que añadirlo con el comando useradd y añadir el registro de la acción al log.

```
elif test $aux = +              # Comprobamos si es una alta de usuario 
        then
                auxlinea=${linea:1}
                user=(${auxlinea//;/ })
                nombre=$(echo $linea | cut -d';' -f2)

                if sudo useradd -m -e $fecha $user      # Si se puede añadir el usuario (-m para crear su directorio home y -e para añadir la fecha de expiración
                then
                        echo "Añadido usuario $user ($nombre), fecha exp: $fecha" >> $log       # Escribimos en el log
                else
                        echo "Error al añadir al usuario $user ($nombre), fecha exp: $fecha">> $log     # Escribimos el error en el log
                fi
```

* **Lectura de una línea -:** Se considera una baja de usuario. El programa leerá la línea y borrará el usuario que se pida. Además, escribirá en el log lo ocurrido. Con esta función finalizaría nuestro programa.

```
        elif test $aux = -                      # Comprobamos si es una baja de usuario
        then
                userB=$(echo $linea | sed -E "s/[^[:alpha:]]//g")               # Almacenamos el nombre de usuario en una variable.
                if (sudo userdel -r $userB)                                     # Si se puede borrar el usuario, lo borramos.
                then
                        echo "Borrado usuario $userB" >> $log                   # Escribimos la acción en el log
                else
                        echo "Error al borrar usuario $userB" >> $log           # Escribimos el error en el log
                fi
```

* **No correspondencia:** Si la linea no comienza por ninguna de las opciones, se mostrará un error de lectura. Con esta función finalizaría nuestro programa.

```
        else                            # Si no coincide con ninguna de las opciones, se escribe un error de lectura.
                echo "Error de lectura en la línea $linea" >> $log
        fi

done <$fichero                  # Fin del procedimiento del programa. Indica el fichero que estamos leyendo.

exit 0                          # Finalización del programa.
```