Centro de Informática. Sistemas Operativos II. Curso 2002

Prueba parcial 2/2
Soluciones

1. El correo de los usuarios se guarda en el directorio /var/mail, en archivos con el nombre de login de cada usuario.
Se desea un script
monimail.sh que monitoree estos archivos, realizando lo siguiente:
a) si el usuario fue borrado, pero quedó su archivo de correo, listar estos usuarios.

b) si el operador invocó el programa sin parámetros, acá termina.
c) si el operador dio un parámetro no numérico, avisa el error y termina.

d) si el operador da como parámetro un número, listar los usuarios que hace más de este número de días que no lee su correo, es decir, que el archivo con su nombre en /var/mail no ha sido accedido. Sugerencia: usar comando
find.
(14 puntos)

#!/bin/bash
# monimail.sh: monitorea estado de correo de usuarios
#   - lista archivos de correo de usuarios borrados
#   - lista usuarios que no leyeron correo últimamente
#   $1: número de días sin leer correo

# archivos de correo de usuarios inexistentes
echo Archivos de correo de usuarios inexistentes:
LISTA=`ls /var/mail`
for USUARIO in $LISTA
do
  id $USUARIO >/dev/null 2>&1
  if [ $? -ne 0 ]    # el usuario no existe
  then
    echo $USUARIO
  fi
done
echo

# si no se indica cantidad de días salir
if [ ! "$1" ]
then
  exit 1
fi

DIAS=$1
# si el parámetro no es numérico, informar error y salir
if [ `echo $DIAS | grep -v [0-9]` ]
then
  echo Parámetro no numérico: debe indicar cantidad de días.
  exit 2
fi

# lista de usuarios que no han leído su correo últimamente
echo Usuarios que no leen correo hace más de $1 días:
NOLEEN=`find /var/mail -atime +$DIAS -print`
for ARCHIVO in $NOLEEN
do
  echo `basename $ARCHIVO`
done

2. Los creadores del programa maravil necesitan un script de instalación, llamado instalar.sh. Debe realizar estas tareas:
1) presentar como pantalla de bienvenida el archivo bienvenida.txt, que ocupa menos de una pantalla; el usuario deberá digitar Enter para continuar. (2p)
2) presentar una pantalla con la licencia, el archivo licencia.txt, también menor de una pantalla; el usuario deberá digitar la tecla S para aceptar la licencia, si no la acepta el programa avisa y termina con código de error 1. (4p)
3) inicializar una variable DIRINSTAL con el nombre del directorio de instalación por defecto, /usr/local/maravil. (2p)
4) preguntar al usuario el directorio de instalación, mostrando el nombre sugerido (variable DIRINSTAL); el usuario podrá digitar un nombre de directorio o Enter para aceptar el directorio sugerido. En cualquier caso, el nombre del directorio de instalación deberá quedar en la variable DIRINSTAL.(6p)
5) verificar si existe ya el directorio de instalación; es así, continúa la instalación, y si no, deberá pedir autorización al usuario, crearlo y verificar la creación exitosa. Si el usuario no autoriza la creación del directorio, el programa termina con error 2; si no se pudo crear el directorio el programa termina con error 3. En todos los casos se informa lo realizado.(10p)
6) copiar los archivos maravil.py, LEAME y manual.txt hacia el directorio de instalación.  Si la copia no da error, se informa la terminacion exitosa de la instalación; en otro caso, se informa el error y se borra el directorio de instalación y todo su contenido. (4p)
(28 puntos)

#!/bin/bash
#instalar.sh: instala el programa "maravil"

# pantalla de bienvenida
clear
cat bienvenida.txt
echo "Digite Enter para continuar"
read

# pantalla de licencia
clear
cat licencia.txt
echo "Digite la tecla S para aceptar las condiciones de licencia."
read LICENCIA
if [ ! "$LICENCIA" = "S" -a ! "$LICENCIA" = "s" ]
then
  echo "No se aceptó la licencia."
  exit 1
fi

# directorio de instalación por defecto
DIRINSTAL=./maravil

# preguntar directorio de instalación
echo Digite directorio de instalación, o tecla Enter
echo si acepta la opción propuesta.
echo -n "Directorio de instalación [$DIRINSTAL]: "
read OTRODIR
if [ $OTRODIR ]
then
  DIRINSTAL=$OTRODIR
fi

# verificar si existe directorio de instalación
if [ -d $DIRINSTAL ]
then
  echo El directorio $DIRINSTAL existe, continúa instalación.
else
  # pedir permiso para crear directorio
  echo -n "El directorio $DIRINSTAL no existe. ¿Crear(sS)?: "
  read CREARDIR
  if [ ! "$CREARDIR" = "s" -a ! "$CREARDIR" = "S" ]
  then
    echo "No se autorizó crear directorio. ¡Adiós!"
    exit 2
  fi
  mkdir $DIRINSTAL 2>/dev/null
  # verificar creación correcta de directorio de instalación
  if [ $? -ne 0 ]
  then
    echo Error: no fue posible crear el directorio $DIRINSTAL
    exit 3
  else
    echo Fue creado el directorio ${DIRINSTAL}.
  fi
fi

# copiar el archivo de programa hacia el directorio de instalación
echo Copiando archivos.
cp maravil.py LEAME manual.txt $DIRINSTAL
if [ $? -eq 0 ]
then
  echo "Instalación terminada. ¡Felicitaciones!"
else
  echo Ha ocurrido un error al copiar los archivos.
  echo El programa no fue instalado correctamente.
  rm -r $DIRINSTAL
  echo Fue borrado el directorio de instalación y todo su contenido.
fi

3.  Se desea saber qué páginas de un servidor web son más accedidas. El archivo /var/log/apache/access.log contiene líneas del siguiente formato:

127.0.0.1 - - [25/Jul/2002:20:21:51 -0300] "GET /fabmelo/version7/modif_clave.php?nombre=pa232&clave=madrid HTTP/1.1" 200 1609
127.0.0.1 - - [25/Jul/2002:20:21:58 -0300] "POST /fabmelo/version7/menu.php HTTP/1.1" 200 1012
127.0.0.1 - - [25/Jul/2002:20:22:00 -0300] "GET /fabmelo/version7/presupuestos2.php?nombre=pa232&clave=belice HTTP/1.1" 200 642

Los accesos contienen la palabra GET, los nombres de las páginas terminan en espacio o en "?". Listar los nombres de páginas de las 20 más accedidas. (12 puntos).

cat /var/log/apache/access.log.0 | grep -w GET | cut -d" " -f7 | cut -d"?" -f1 | sort | uniq -c | sort -nr | head -20

Total prueba: 54 puntos.