Encender un LED cuando se recibe un Ping entrante

Scooter

Cascarrabias crónico
Estoy haciendo un entrenador de redes en el que se pueden configurar diversas infraestructuras.
El caso es que los equipos son raspberry pi que están conectados a la red y según se configuren irán a una IP u otra y tendrán acceso o no a otra parte de la red.
Se me ha ocurrido que sería muy visual que la raspi lleve un led que parpadee cuando recibe un ping y estoy un poco perdido.
El comando que he encontrado para saber o no que se está recibiendo un ping es:
Código:
usuario@PCx:~$ sudo tcpdump ip proto \\icmp
Que se queda parado esperando un ping y devuelve un listado de la "evolución" del ping y se vuelve a quedar parado.
Algo así:

Código:
09:47:03.435380 IP 162.168.0.20 > PC2: ICMP echo request, id 92, seq 1, length 64
09:47:03.435417 IP PC2 > 162.168.0.20: ICMP echo reply, id 92, seq 1, length 64
09:47:03.551248 IP 162.168.0.20 > PC2: ICMP echo request, id 93, seq 1, length 64
09:47:03.551285 IP PC2 > 162.168.0.20: ICMP echo reply, id 93, seq 1, length 64
09:47:03.684557 IP 162.168.0.20 > PC2: ICMP echo request, id 94, seq 1, length 64
09:47:03.684595 IP PC2 > 162.168.0.20: ICMP echo reply, id 94, seq 1, length 64
... sigue un rato así.

Ahora la cuestión es que no sé muy bien como llamar a ese comando y resolver en función de su respuesta, o de su no respuesta para hacer parpadear el led.
La historia es que si lo llamo desde python lo normal es que no devuelva nada porque en ese momento no hay un ping entrante.

También he probado a reenviar la salida del comando a un archivo añadiendo detrás de él
Código:
usuario@PCx:~$ sudo tcpdump ip proto \\icmp  > ping_entrante.txt
Quizás sea una opción dejar al comando siempre generando el archivo y viendo desde otro programa si el archivo crece o no lo que indicaría la recepción de nuevos pings...

¿Alguna idea u orientación?
 
Ahora la cuestión es que no sé muy bien como llamar a ese comando y resolver en función de su respuesta, o de su no respuesta para hacer parpadear el led.
La historia es que si lo llamo desde python lo normal es que no devuelva nada porque en ese momento no hay un ping entrante.

También he probado a reenviar la salida del comando a un archivo añadiendo detrás de él
Código:
usuario@PCx:~$ sudo tcpdump ip proto \\icmp > ping_entrante.txt
Quizás sea una opción dejar al comando siempre generando el archivo y viendo desde otro programa si el archivo crece o no lo que indicaría la recepción de nuevos pings...
YO haría un shell script que invoque reiteradamente al comando tcpdump, por si este se detiene, y que mande la salida del comando a un grep (o algo mas sofisticado) que detecte el ICMP echo request con una IP diferente de la local, ya que es el "pedido" de ping de la máquina remota. El echo reply no importa por que es la respuesta de la máquina local y a vos te interesa saber cuando te estan pingueando desde otro host.
Para encender un LED podés usar alguna línea del GPIO de la Raspberry activada desde un programa que corra en background y al que le puedas mandar una señal para encender el LED y eventualmente otra para apagarlo, tipo kill -USR1 <pid del programita>.
El problema con todo esto es que tenés que iniciar todo desde el rc.local o similar, por que eso "creo" que corre con derechos de root, y así lo podés ejecutar en forma automática sin estar loggueado ni hacer el "sudo"...
 
Lo he conseguido simplemente mirando el tamaño del archivo que va generando tcpdump.
No es muy elegante porque no va muy fino, a veces tarda un poco mas o un poco menos pero funciona.
De todos modos el ping a veces tarda mas o tarda menos en responder.

Acceder y encender el led no es problema. El reto para mi es detectar el ping.

Todo esto se puede arrancar automáticamente en el inicio del sistema, por eso no hay problema.
 
Lo he conseguido simplemente mirando el tamaño del archivo que va generando tcpdump.
Pero vas a tener que agregar alguna tarea que borre el archivo o le haga un touch para llevar el tamaño a cero para que a la larga no ocupe mucho espacio. De todas formas YO prefiero no escribir mucho en una tarjeta SD...
 
Ya, es una solución transitoria.
Buscaré algo mejor.
Intentaré hacer lo que has dicho.

De todos modos no se van a hacer un millón de pings se harán 100 al día como mucho no todos los días.
 
Ya está.

Pues es mas tonto de lo que pensaba.

El comando tcmpdump permite ponerle una coletilla para que solo capture n paquetes, así que ...
Se le pone detrás -c 5 por ejemplo y leerá cinco paquetes, es decir cinco líneas:
Código:
09:47:03.435380 IP 162.168.0.20 > PC2: ICMP echo request, id 92, seq 1, length 64
09:47:03.435417 IP PC2 > 162.168.0.20: ICMP echo reply, id 92, seq 1, length 64
09:47:03.551248 IP 162.168.0.20 > PC2: ICMP echo request, id 93, seq 1, length 64
09:47:03.551285 IP PC2 > 162.168.0.20: ICMP echo reply, id 93, seq 1, length 64
09:47:03.684557 IP 162.168.0.20 > PC2: ICMP echo request, id 94, seq 1, length 64
El que dice 5 dice 10 o dice 1

Total que el programa consiste en pedir un tcmpdump y esperar a que conteste, cuando contesta se hace el flasheo y se vuelve a esperar.

Para resolver que ejecute los comandos con privilegios sudo he seguido este manual:
Se crea un script:
esperaping.sh
Código:
sudo tcpdump ip proto \\icmp -c 5

El programa python es mas o menos algo como esto:
Código:
#Pseudocódigo guarreado
import os
While True:
    os.system('sudo /home/usuario/esperaping.sh')
    parpadea el led

Bastante limpio y no hay que arrancar servicios antes y tal, solo lanzar ese programa.

Lo tengo a 3/4 porque lo he probado en el PC y no en la rasp pero cuando lo tenga "aseao" lo publico.

Ya como floritura se le puede poner después que detecte de que IP vino el PING y encienda un led de un color u otro o lo muestre en una pantalla o lo que sea.
 
Última edición:
Consulto, porque no manejo UNIX.
Si tu Raspberry es solo cliente, puedes crear un servidor local, que "escuche" todos los puertos, cuando alguien remoto se quiera conectar, o enviar un "ping", éste responda convenientemente.

En Visual Studio sé cómo hacerlo, pero como no manejo Linux de ningún tipo, no puedo decir.
Quizas algo con las libreria de QT, si es asi, tengo en mi Wincho la version 5.9 del QT para probar
 
Supongo que se podrá.
Al ping ya responde de serie y se puede ver en la consola.

Es porque veas algo físico y notable desde lejos.
 
Atrás
Arriba