# 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.
```