Centro de Informática. Sistemas Operativos II. Curso 2000, reedición 2o. semestre

Prueba parcial 2/2 - Soluciones

1. La lista de correos electrónicos de interesados en recibir un boletín mensual de novedades se encuentra en un archivo de este formato:
  # LISTA ENVIO BOLETIN ELECTRONICO
  # nombre alumno:dirección e-mail:situación
  Julio Pérez:jperez@adinet.com.uy:enlista
  Mariela Lombardo::notiene
  Adán Paz:apaz@netgate.com.uy:noenvio
  Gabriel Giménez:ggime@multi.com.uy:enlista
Las categorías son: enlista (desea recibir el boletín), noenvio (no desea recibir el boletín), notiene (no tiene correo electrónico). Escribir un script que muestre cantidad y porcentaje de cada categoría. ¿Qué modificación habría que hacer al script si no se conocen a priori los nombres de las categorías? (15 puntos).

 
#!/bin/bash
# prob1: calcula cantidad y porcentaje en lista de envío.
#

echo
echo LISTA DE ENVIO: cantidad y porcentaje por categorías
echo "Categoría   Cantidad    %"

# calcula el total por número de líneas
TOTAL=`cat listaenvio | grep -v "#" | wc -l`

# inicializa lista de categorías
CATEGORIAS="enlista noenvio notiene"

# calcula y presenta porcentajes
for CAT in $CATEGORIAS
do
  echo -n "$CAT  "
  CANT=`cat listaenvio | grep -v "#" | grep $CAT | wc -l`
  echo -n "$CANT      "
  echo `expr $CANT \* 100 / $TOTAL`\%

done
 
###
# modificación: si no se conocen a priori los nombres de las categorías:
# CATEGORIAS=`cat listaenvio | grep -v "#" | cut -d ":" -f3 | sort | uniq`
###
 

2. Los intentos fallidos de login se registran con líneas del tipo
  Set 5 6:29:57 liebre login[486]: invalid password for `UNKNOWN' on `ttyp2' from `tero'
  Oct 11 16:33:48 liebre login[492]: invalid password for `victor' on `ttyp2' from `liebre'
  Dec 15 19:49:01 liebre login[492]: invalid password for `cristina' on `ttyp2' from `nutria'
en el archivo auth.log en el directorio /var/log. Cuando este archivo se hace muy grande, se aplica una rotación de archivos que genera auth.log.0, authlog.1.gz, auth.log.2.gz, ..., auth.log.9.gz. Los archivos terminados en .gz están comprimidos, pero pueden visualizarse con zcat, comando análogo a cat.
Construir un script que examine todos los archivos auth.log* y emita un listado de nombres de login fallidos (mensaje "invalid password") y su cantidad, en un listado del tipo
      9 UNKNOWN
      3 cristina
      6 root
      3 victor
(15  puntos).

  

#!/bin/bash
# prob2: cuenta intentos de login fallidos.
#
zcat /var/log/auth.log.?.gz | \

  cat /var/log/auth.log /var/log/auth.log.0 - | \
  grep "invalid password" | tr -s " " | cut -d " " -f9 | \
  sort | uniq -c | tr -d \`\'
 

3. Escribir un script de arranque tango para un sofware llamado tango que funciona en base a un demonio tangod. El script deberá aceptar los parámetros siguientes y realizar las acciones indicadas:
    start - arrancar el demonio tangod
    stop - detener el demonio tangod, con señal 15
    restart - detener y volver a arrancar tangod
    reload - releer la configuración enviando una señal 1 al proceso tangod.
Sugerencia. El comando ps ax muestra el PID de los procesos en sus primeros 6 caracteres, con relleno de blancos sobre la izquierda. (20 puntos).

Nota para prueba en máquina. El proceso tangod puede simularse con el siguiente script:

#!/bin/bash
# tangod: emulación de demonio para tango
#   arrancarlo en background

echo tangod: corriendo...
trap "echo recibida señal 1" 1
trap "echo recibida señal 15,terminando ; exit" 15
while true
do
  sleep 6
done
###
 

#!/bin/bash
# tango: script de arranque para tango.
#
# sleep 3 da tiempo a mensajes del script emulador.

PID=`ps ax | grep tangod | grep -v grep | cut -c1-6 | tr -d " "`

case "$1" in
start)
  /tmp/tangod &
  sleep 3
  ;;
stop)
  kill -15 $PID
  sleep 3
  ;;
restart)
  ./tango stop
  sleep 3
  ./tango start
  sleep 3
  ;;
reload)
  kill -1 $PID
  sleep 3
  ;;
*)
  echo "uso de tango: tango { start | stop | restart | reload }"
  ;;
esac