Skip to content

Instantly share code, notes, and snippets.

@scmanjarrez
Created May 15, 2016 14:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save scmanjarrez/b61aa5a31b458c0d49f7c06d116e7dac to your computer and use it in GitHub Desktop.
Save scmanjarrez/b61aa5a31b458c0d49f7c06d116e7dac to your computer and use it in GitHub Desktop.
Corrector casero con las pruebas de la práctica SERVIDOR (Sistemas Operativos)
#!/bin/bash
#!/bin/zsh
########################################################################
# Descripción:
# Fichero auxiliar para el corrector.
#
########################################################################
PID_SRV=""
PID_CLI=""
PID_TO=""
Test_salidas()
{
if sdiff .fd$1 ${2:--}; then
if [ $1 = 1 ]; then
echo -e "\e[0;31mLANZADOR: Contenido del Cliente correcto\e[0;0m\n"
else
echo -e "\e[0;31mLANZADOR: Contenido del Servidor correcto\e[0;0m\n"
fi;
else
echo "El contenido del descriptor $1 NO es el esperado"
exit 1
fi;
return 0
}
Matarile()
{
# Matamos al ultimo cliente
kill -9 $PID_CLI 2> /dev/null
#Matamos al servidor
kill -9 $PID_SRV 2> /dev/null
#Matamos al sleep del timeout
kill -9 $PID_TO 2> /dev/null
}
Alarma()
{
echo "Timeout!!"
Matarile
exit 1
}
Timeout()
{
# Esperamos los segundos indicados como argumento y nos
# mandamos una señal al propio script para capturarla
SECS=$1
sleep $SECS && kill -14 $$ &
# $! es el PID del ultimo proceso en background
# Guardamos el PID del sleep que hace de timeout
PID_TO=$!
}
trap Alarma 14
Timeout $[2+(2*$#)]
# La opción -cli indica que se quieren trazar las llamadas de los clientes
if [ _$1 = "_-cli" ]
then
# Quitamos el argumento 1 ($1) de la lista de argumentos de entrada
shift
# Definimos dos variables para lanzar los clientes
# Ejecutamos los clientes con un strace y eliminamos su salida estándar
CLIENTE="strace ./cliente"
CLIENTE_REDIRECT="/dev/null"
SERVIDOR_REDIRECT="/dev/null"
else
# Definimos dos variables para lanzar los clientes
# Ejecutamos los clientes normal y no redirigimos las salidas
CLIENTE="./cliente"
CLIENTE_REDIRECT=""
SERVIDOR_REDIRECT=""
fi
# La opción -srv indica que se quieren trazar las llamadas del servidor
if [ _$1 = "_-srv" ]
then
# Quitamos el argumento 1 ($1) de la lista de argumentos de entrada
shift
# Ejecutamos el servidor con un strace eliminamos su salida estándar
strace ./servidor > /dev/null &
CLIENTE_REDIRECT="/dev/null"
else
# Ejecutamos el servidor mandando su salida al error estándar
if [ _$SERVIDOR_REDIRECT = _ ]
then
./servidor > .fd2 &
else
./servidor > $SERVIDOR_REDIRECT &
fi
fi
# $! es el PID del ultimo proceso en background (el servidor)
PID_SRV=$!
sleep 1
# Recorremos todos los argumentos (ficheros)
for i in $*
do
# Pedimos que transfiera el fichero $i al cliente
if [ _$CLIENTE_REDIRECT = _ ]
then
echo -e "\e[0;31mLANZADOR: Transfiriendo el fichero $i\e[0;0m"
if [ $i = "$1" ];then
$CLIENTE $i > .fd1 &
else
$CLIENTE $i >> .fd1 &
fi;
else
$CLIENTE $i > $CLIENTE_REDIRECT &
fi
# $! es el PID del ultimo proceso en background (el cliente)
PID_CLI=$!
# Esperamos a que termine este cliente
wait $PID_CLI
# Comparamos los ficheros original y local
diff $i "$i.local" > /dev/null 2>&1 || echo -e "\e[0;31mLANZADOR: El fichero $i has sido transferido erroneamente\e[0;0m"
rm -f "$i.local"
sleep 1
done
if [ _$CLIENTE_REDIRECT = _ ]
then
if [ -z $1 ];then
$CLIENTE > .fd1 &
else
$CLIENTE >> .fd1 &
fi;
else
$CLIENTE > $CLIENTE_REDIRECT &
fi
# $! es el PID del ultimo proceso en background (el cliente)
PID_CLI=$!
# Esperamos a que termine este cliente
wait $PID_CLI
if [ _$CLIENTE_REDIRECT = _ ];then
if [ $# = 0 ];then
Test_salidas 2 <<EOF
SERVIDOR: Creacion del socket UDP: OK
SERVIDOR: Asignacion del puerto servidor: OK
SERVIDOR: Puerto guardado en fichero ./puerto_servidor: OK
SERVIDOR: Creacion del socket TCP: OK
SERVIDOR: Asignacion del puerto servidor: OK
SERVIDOR: Aceptacion de peticiones: OK
SERVIDOR: Puerto TCP reservado: OK
SERVIDOR: Esperando mensaje.
SERVIDOR: Mensaje del cliente: OK
SERVIDOR: QUIT
SERVIDOR: Enviando del resultado [OK]: OK
SERVIDOR: Finalizado
EOF
Test_salidas 1 <<EOF
CLIENTE: Puerto leido de fichero ./puerto_servidor: OK
CLIENTE: Creacion del socket UDP: OK
CLIENTE: Reserva del puerto cliente: OK
CLIENTE: Enviando QUIT(): OK
CLIENTE: Respuesta del servidor: OK
EOF
elif [ $# = 1 ];then
if [ ! -f "$1" ];then
Test_salidas 2 <<EOF
SERVIDOR: Creacion del socket UDP: OK
SERVIDOR: Asignacion del puerto servidor: OK
SERVIDOR: Puerto guardado en fichero ./puerto_servidor: OK
SERVIDOR: Creacion del socket TCP: OK
SERVIDOR: Asignacion del puerto servidor: OK
SERVIDOR: Aceptacion de peticiones: OK
SERVIDOR: Puerto TCP reservado: OK
SERVIDOR: Esperando mensaje.
SERVIDOR: Mensaje del cliente: OK
SERVIDOR: REQUEST(${1}.local,$1)
SERVIDOR: Enviando del resultado [ERROR]: OK
SERVIDOR: Esperando mensaje.
SERVIDOR: Mensaje del cliente: OK
SERVIDOR: QUIT
SERVIDOR: Enviando del resultado [OK]: OK
SERVIDOR: Finalizado
EOF
Test_salidas 1 <<EOF
CLIENTE: Puerto leido de fichero ./puerto_servidor: OK
CLIENTE: Creacion del socket UDP: OK
CLIENTE: Reserva del puerto cliente: OK
CLIENTE: Enviando REQUEST(${1}.local,$1): OK
CLIENTE: Respuesta del servidor: ERROR
CLIENTE: Puerto leido de fichero ./puerto_servidor: OK
CLIENTE: Creacion del socket UDP: OK
CLIENTE: Reserva del puerto cliente: OK
CLIENTE: Enviando QUIT(): OK
CLIENTE: Respuesta del servidor: OK
EOF
else
Test_salidas 2 <<EOF
SERVIDOR: Creacion del socket UDP: OK
SERVIDOR: Asignacion del puerto servidor: OK
SERVIDOR: Puerto guardado en fichero ./puerto_servidor: OK
SERVIDOR: Creacion del socket TCP: OK
SERVIDOR: Asignacion del puerto servidor: OK
SERVIDOR: Aceptacion de peticiones: OK
SERVIDOR: Puerto TCP reservado: OK
SERVIDOR: Esperando mensaje.
SERVIDOR: Mensaje del cliente: OK
SERVIDOR: REQUEST(${1}.local,${1})
SERVIDOR: Enviando del resultado [OK]: OK
SERVIDOR: Llegada de un mensaje: OK
SERVIDOR: Esperando mensaje.
SERVIDOR: Mensaje del cliente: OK
SERVIDOR: QUIT
SERVIDOR: Enviando del resultado [OK]: OK
SERVIDOR: Finalizado
EOF
Test_salidas 1 <<EOF
CLIENTE: Puerto leido de fichero ./puerto_servidor: OK
CLIENTE: Creacion del socket UDP: OK
CLIENTE: Reserva del puerto cliente: OK
CLIENTE: Enviando REQUEST(${1}.local,${1}): OK
CLIENTE: Respuesta del servidor: OK
CLIENTE: Creacion del socket TCP: OK
CLIENTE: Conexion al puerto servidor: OK
CLIENTE: Puerto leido de fichero ./puerto_servidor: OK
CLIENTE: Creacion del socket UDP: OK
CLIENTE: Reserva del puerto cliente: OK
CLIENTE: Enviando QUIT(): OK
CLIENTE: Respuesta del servidor: OK
EOF
fi;
else
unset prueba
for i in $@;do
if [ -z "$prueba" ];then
prueba="SERVIDOR: Esperando mensaje.
SERVIDOR: Mensaje del cliente: OK
SERVIDOR: REQUEST($i.local,$i)
SERVIDOR: Enviando del resultado [OK]: OK
SERVIDOR: Llegada de un mensaje: OK"
else
prueba=$prueba"
SERVIDOR: Esperando mensaje.
SERVIDOR: Mensaje del cliente: OK
SERVIDOR: REQUEST($i.local,$i)
SERVIDOR: Enviando del resultado [OK]: OK
SERVIDOR: Llegada de un mensaje: OK"
fi;
done
Test_salidas 2 <<EOF
SERVIDOR: Creacion del socket UDP: OK
SERVIDOR: Asignacion del puerto servidor: OK
SERVIDOR: Puerto guardado en fichero ./puerto_servidor: OK
SERVIDOR: Creacion del socket TCP: OK
SERVIDOR: Asignacion del puerto servidor: OK
SERVIDOR: Aceptacion de peticiones: OK
SERVIDOR: Puerto TCP reservado: OK
$prueba
SERVIDOR: Esperando mensaje.
SERVIDOR: Mensaje del cliente: OK
SERVIDOR: QUIT
SERVIDOR: Enviando del resultado [OK]: OK
SERVIDOR: Finalizado
EOF
unset prueba
for i in $@;do
if [ -z "$prueba" ];then
prueba="CLIENTE: Puerto leido de fichero ./puerto_servidor: OK
CLIENTE: Creacion del socket UDP: OK
CLIENTE: Reserva del puerto cliente: OK
CLIENTE: Enviando REQUEST($i.local,$i): OK
CLIENTE: Respuesta del servidor: OK
CLIENTE: Creacion del socket TCP: OK
CLIENTE: Conexion al puerto servidor: OK"
else
prueba=$prueba"
CLIENTE: Puerto leido de fichero ./puerto_servidor: OK
CLIENTE: Creacion del socket UDP: OK
CLIENTE: Reserva del puerto cliente: OK
CLIENTE: Enviando REQUEST($i.local,$i): OK
CLIENTE: Respuesta del servidor: OK
CLIENTE: Creacion del socket TCP: OK
CLIENTE: Conexion al puerto servidor: OK"
fi;
done
Test_salidas 1 <<EOF
$prueba
CLIENTE: Puerto leido de fichero ./puerto_servidor: OK
CLIENTE: Creacion del socket UDP: OK
CLIENTE: Reserva del puerto cliente: OK
CLIENTE: Enviando QUIT(): OK
CLIENTE: Respuesta del servidor: OK
EOF
fi;
fi;
echo -e "\e[0;31mLANZADOR: Finalizado correctamente\e[0;0m\n"
Matarile
#!/bin/bash
########################################################################
# El script se encarga de realizar una serie de pruebas
# para comprobar el correcto funcionamiento del programa
# servidor.c
# Uso:
# ./servidor.sh
########################################################################
PID_LANZ=""
TEST=0
# Preparación de ficheros para la realización de las pruebas
echo -e "\e[0;31mTESTER: Preparando fichero prueba.txt...\e[0;0m\n"
cat > prueba.txt <<EOF
Este es un pequeño fichero de prueba
de un par de líneas
EOF
echo -e "\e[0;31mTESTER: Preparando fichero groucho.txt...\e[0;0m\n"
cat > groucho.txt <<EOF
Groucho Marx (1890-1977)
===================================
QUOTES:
I've had a perfectly wonderful evening. But this wasn't it.
It isn't necessary to have relatives in Kansas City in order to be
unhappy.
Military intelligence is a contradiction in terms.
Money frees you from doing things you dislike. Since I dislike doing
nearly everything, money is handy.
My mother loved children -- she would have given anything if I had
been one.
Outside of a dog, a book is man's best friend. Inside of a dog it's
too dark to read.
I do not care to belong to a club that accepts people like me as
members.
I find television very educational. The minute somebody turns it on, I
go to the library and read a good book.
She got her looks from her father. He's a plastic surgeon.
While hunting in Africa, I shot an elephant in my pajamas. How an
elephant got into my pajamas I'll never know.
I never forget a face, but in your case I'll be glad to make an
exception.
Here's to our girlfriends and wives; may they never meet!
EOF
echo -e "\e[0;31mTESTER: Preparando ficheros f[1-5].txt...\e[0;0m\n"
for i in `seq 1 5`;
do
cat > f${i}.txt <<EOF
Prueba $i
EOF
done
###############################################################################
# Comienzo de las pruebas
echo -ne "\e[0;31mTESTER: Empezando la prueba 1..."
sleep 1
echo -e "Enviando mensaje de QUIT\e[0;0m\n"
./lanzador_nuevo.sh &
PID_LANZ=$!
wait $PID_LANZ
if [ $? = 0 ];then
((TESTER+=1))
fi;
sleep 1
echo -ne "\e[0;31mTESTER: Empezando la prueba 2..."
sleep 1
echo -e "Enviando fichero pequeño\e[0;0m\n"
./lanzador_nuevo.sh prueba.txt &
PID_LANZ=$!
wait $PID_LANZ
if [ $? = 0 ];then
((TESTER+=1))
fi;
sleep 1
echo -ne "\e[0;31mTESTER: Empezando la prueba 3..."
sleep 1
echo -e "Enviando fichero grande\e[0;0m\n"
./lanzador_nuevo.sh groucho.txt &
PID_LANZ=$!
wait $PID_LANZ
if [ $? = 0 ];then
((TESTER+=1))
fi;
sleep 1
echo -ne "\e[0;31mTESTER: Empezando la prueba 4..."
sleep 1
echo -e "Enviando varios ficheros, f1.txt, f2.txt, f3.txt, f4.txt, f5.txt\e[0;0m\n"
./lanzador_nuevo.sh f1.txt f2.txt f3.txt f4.txt f5.txt &
PID_LANZ=$!
wait $PID_LANZ
if [ $? = 0 ];then
((TESTER+=1))
fi;
sleep 1
echo -ne "\e[0;31mTESTER: Empezando la prueba 5..."
sleep 1
echo -e "Solicitando fichero que no existe en remoto\e[0;0m\n"
./lanzador_nuevo.sh no_existe.txt &
PID_LANZ=$!
wait $PID_LANZ
if [ $? = 0 ];then
((TESTER+=1))
fi;
sleep 1
###############################################################################
# Borrar todos los ficheros usados en el tester
rm prueba.txt groucho.txt f1.txt f2.txt f3.txt f4.txt f5.txt .fd1 .fd2
unset prueba
if [ $TESTER = 5 ];then
echo -e "\e[0;31mTESTER: El programa pasa todos los test correctamente.\e[0;0m\n"
else
echo -e "\e[0;31mTESTER: El programa NO pasa los test.\e[0;0m\n"
fi;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment