Construyendo un servidor de logs usando Netcat, tail y Bash
Me toco entre estos días escribir un hack (no por lo malo sino por lo rápido que tenia que hacerlo) un servidor que debía proporcional el contenido de una bitacora la cual crece de manera continua durante el día. El grupo que nos pidio esto es de auditoria, lo cual implica que no debe perderse información.
Primero les muestro el código del programa y explico como funciona:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #!/bin/bash # author: josevnz@kodegeek.com # set -o monitor declare -a pids declare -r SCRIPT=${0##*/} declare -r FIFO="/tmp/$SCRIPT-$$.fifo" if [ -z "$1" ]; then echo "Please provide the file to tail and try again" exit 192 fi if [ -z "$2" ]; then echo "Please provide port and try again" exit 192 fi trap cleanup exit INT TERM if [ ! -e "$FIFO" ]; then mkfifo "$FIFO" if [ $? != 0 ]; then exit $? fi fi tail -F "$1" > "$FIFO" & trap "test -e $FIFO && rm -f $FIFO" exit INT TERM while true; do test -e "$FIFO" && netcat -v -v -v -l -p $2 < "$FIFO" done trap "kill -9 $! $$" exit INT TERM |
La idea es revisar los contenidos del archivo usando ‘tail -F’. La opción ‘-F’ le dice a tail que reintente si tiene problemas eyendo el archivo; De allí redirigimos los contenidos a una cola (FIFO, first in first out) en Unix la cual garantiza que aunque el servidor TCP muera los datos estaran allí listos para ser enviados al cliente. Dejamos a tail corriendo en segundo plano…
El siguiente paso es arrancar nuestro servidor TCP. Netcat recibe los contenidos de la cola que creamos en el paso anterior. Fijense como lo encerramos en un ciclo infinito ya que si el cliente se muere (o desconecta por otra razón) Netcat cerrará la conexión.
Finalmente le decimos al script que mate todos los procesos hijos o el mismo programa si decidimos matar al servidor o nos matan el proceso.
Bueno, aqui les muestro como correr el servidor:
auyan:~ josevnz$ ./nettail fakelog.log 9000
Listening on any address 9000 (cslistener)
Connection from 127.0.0.1:50754
Total received bytes: 0
Total sent bytes: 432
Listening on any address 9000 (cslistener)
Connection from 127.0.0.1:50819
Y un ejemplo de como conectarse:
auyan:~ josevnz$ nc -v -v -v localhost 9000
nc: connect to localhost port 9000 (tcp) failed: Connection refused
Connection to localhost 9000 port [tcp/cslistener] succeeded!
This is a kodegeek test: Sat Mar 14 00:02:15 EDT 2009
This is a kodegeek test: Sat Mar 14 00:02:45 EDT 2009
This is a kodegeek test: Sat Mar 14 00:03:15 EDT 2009
This is a kodegeek test: Sat Mar 14 00:03:45 EDT 2009
This is a kodegeek test: Sat Mar 14 00:04:15 EDT 2009
This is a kodegeek test: Sat Mar 14 00:04:45 EDT 2009
This is a kodegeek test: Sat Mar 14 00:05:15 EDT 2009
This is a kodegeek test: Sat Mar 14 00:05:45 EDT 2009
This is a kodegeek test: Sat Mar 14 00:06:15 EDT 2009
Espero les guste esta solución de 5 minutos
Veneblogs: bash, netcat, tail, kodegeek, server
Blogalaxia: bash, netcat, tail, kodegeek, server
To2blogs: bash, netcat, tail, kodegeek, server
Technorati: bash, netcat, tail, kodegeek, server
Del.icio.us: bash, netcat, tail, kodegeek, server
java, linux, opensource, ruby, venezuela
Comentarios recientes