Scripting (SOLUCIONADO)

Buenos días,

Ultimamente me he estado interesando por recibir mensajes de telegram de determinados sucesos que ocurren en la red, esto es relativamente sencillo y tras ensallo error tienes un canal donde aparecen diferentes sucesos tales como saber quien se conecta por DCHP a nuestro router.

Lo complicado de esto, es el scripting ya que es un lenguaje de programación que te dice quien está en red o que mac tiene.

Lo que yo pretendo es hacer un script para saber en todo momento quien está conectado a mi wifi y cuanto tiempo está conectado; yo tengo todos mis dispositivos wifi dados de alta en "wireless>acces list" por lo que todos los dispositivos conectados pasan si o si por /interface wireless registration-table.

¿Alguien me podría ayudar a confeccionar un script que me indique que dispositivo está en red y que dispositivo ha abandonado la red?

Si teneis por ahí algún manual con los diferentes comandos de scripting de routeros tambien me podría valer

Gracias de antemano
 
No te resultaría más sencillo instalarte un servidor Radius? Es la manera correcta de llevar al contabilidad de enlace inalámbrico. Además, podrías incluso hacer allí la autenticación

Sino, la manera más sencilla que se me ocurre es usando los leases del servidor DHCP. Si creas un segmento de red sólo para el wifi, y, en su servidor DHCP, tienes una opción para lanzar un script cada vez que haya un evento de lease:
1619434824673.png
Contando con que ya tienes hecho el script de notificación por telegram, sería tan sencillo como invocarlo desde ahí.

No obstante, mírate lo del Radius, que es la manera correcta de tener la wifi bajo supervisión.

Saludos!
 
No te resultaría más sencillo instalarte un servidor Radius? Es la manera correcta de llevar al contabilidad de enlace inalámbrico. Además, podrías incluso hacer allí la autenticación

Sino, la manera más sencilla que se me ocurre es usando los leases del servidor DHCP. Si creas un segmento de red sólo para el wifi, y, en su servidor DHCP, tienes una opción para lanzar un script cada vez que haya un evento de lease:
Ver el adjunto 81504Contando con que ya tienes hecho el script de notificación por telegram, sería tan sencillo como invocarlo desde ahí.

No obstante, mírate lo del Radius, que es la manera correcta de tener la wifi bajo supervisión.

Saludos!

No se @pokoyo, de momento estoy haciendo pruebas... con lo que estoy jugando ahora es con lo siguiente

:local mac $leaseActMAC
:local host $"lease-hostname"
:global leaseBound
:global telegramMessage
:local botid
:local chatid

set botid "XXXXXXXXXXXXXXXX:YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
set chatid "-ZZZZZZZZZZZZZZZZZZ"

:if ($leaseBound = 1) do={
:local maccheck [/interface wireless registration-table print count-only where comment~"$mac"]
:local hostcheck [/interface wireless registration-table print count-only where comment="$host - $mac "]
:if ($maccheck = 0) do={
:log info "$mac not registered previously, allowed"
}
:if (($maccheck = 1)&&($hostcheck = 0)) do={
:log info "error $mac already registered with different hostname, removing previous session"
/ip hotspot cookie remove [find mac-address=$mac]
/ip hotspot active remove [find mac-address=$mac]
}
:if (($maccheck = 1)&&($hostcheck = 1)) do={
:log info "$mac registered with correct hostname $host"
}
}
:if ($leaseBound = 0) do={
:log info "$mac dhcp assign removed"
}

/tool fetch url="https://api.telegram.org/bot$botid/sendMessage\?chat_id=$chatid&text=$telegramMessage" keep-result=no
:delay 2


Pero claro, yo no soy programador y me voy guiando por la escasa información que existe de scripting routeros
Supuestamente lo que debe hacer es localizar la MAC de un dispositivo en "Access List" y comprobarla en "Registration" si está online.

Con respecto a Radius no me voy a meter, cada una de mis MAC tienen una contraseña diferente para poder acceder a la wifi y teniendo esto hecho no me voy a marear para hacer lo mismo de otra forma.

Saludos
 
Lo que he estado haciendo al respecto es evaluar los distintos sitios para meter el script y que me diga en telegram la información que se requiere.

He estado probando en /ip dhcp server la parte de script

Código:
:if ($leaseBound = "1") do={
global telegramMessage "$"lease-hostname" ($leaseActMAC) #got wifi address $leaseActIP from wifi"
}
:if ($leaseBound = 0) do={
    :log info "$mac dhcp assign removed"
}

:execute "Envia_mensaje_telegram";
}

Donde "Envia_mensaje_telegram" se encuentra en /system script con la soguiente información

Código:
:global telegramMessage
:local botid
:local chatid
set botid "xxxxxx:yyyyyyyyyy"
set chatid "-zzzzzzzzzz"
/tool fetch url="https://api.telegram.org/bot$botid/sendMessage\?chat_id=$chatid&text=$telegramMessage" keep-result=no
:delay 2

Al hacer esto me "canta" en telegram las mac y dispositivos que acceden a la wifi, todos menos los que tienen ruta estática (a los que le hemos dado en "make static"), pero solo canta cuando se vincula no cuando se desvincula.

Por otro lado, si pongo el siguiente script en /system script

Código:
:local mac $leaseActMAC
:local host $"lease-hostname"
:global leaseBound
:global telegramMessage
:local botid
:local chatid

set botid "XXXXXXXXXXXXXXXX:YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
set chatid "-ZZZZZZZZZZZZZZZZZZ"

:if ($leaseBound = 1) do={
:local maccheck [/interface wireless registration-table print count-only where comment~"$mac"]
:local hostcheck [/interface wireless registration-table print count-only where comment="$host - $mac "]
:if ($maccheck = 0) do={
:log info "$mac not registered previously, allowed"
}
:if ($leaseBound = 0) do={
:log info "$mac dhcp assign removed"
}

/tool fetch url="https://api.telegram.org/bot$botid/sendMessage\?chat_id=$chatid&text=$telegramMessage" keep-result=no
:delay 2

Y le pongo un /system scheduler cada X tiempo, lo único que hace es "cantarme" el último dispositivo vinculado, pero tampoco desvincula dispositivos

Con este código en /system script que he optenido de un script de 11 páginas de word

Código:
 :if (message = "Wifi") do={:set unauthcmd 1;
    $sendlog msg="Response: wifi"
#    :local registrations [:len [/caps-man registration-table find]]
      :local registrations [:len [/interface wireless registration-table find]]
#    :local registration [len [/interface wireless registration-table print as-value]]
    :set tmsg "There are $registrations wireless registrations"
  }

Me dice cuantos dispositivos wifi tengo vinculados, sin más información

Alguien que me pueda ayudar será Bienvenido

Saludos
 
Última edición:
Bueno pues ya lo tengo solucionado.

El objetivo es que Telegram nos cuente todo lo que pasa en nuestra red, para ello tenemos que tener en cuenta varios factores

- Conexiones DHCP
- Conexiones estáticas
- Conexiones bridge
- Conexiones wifi si usan un pool diferente a DHCP

Primero vamos a conexiones DHCP Server (/ip dhcp-server)
Accedemos a dhcp server y pinchamos en la pestaña "DHCP", ahí vemos los diferentes servidores DHCP que hemos creado a lo largo del tiempo, hacemos doble click sobre el nombre de DHCP que nos interese y vamos a la pestaña "script", una vez ahí escribimos

Código:
:if ($leaseBound = "1") do={
global telegramMessage "$"lease-hostname" ($leaseActMAC) got wifi address $leaseActIP from DHCP-Server"
:execute "Envia_mensaje_telegram";
}
:if ($leaseBound = "0") do={
global telegramMessage "$"lease-hostname" ($leaseActMAC) remove wifi address $leaseActIP from DHCP-Server"
:execute "Envia_mensaje_telegram";
}

Cabe destacar que en el caso de $leaseBound = "1" nos va a dar una información similar a esta
Galaxy-SY (6A:F7:80:00:00:00) got wifi address 192.168.10.31 from DHCP-Server

Que nos dice que el dispositivo "Galaxy-SY" se ha conectado a nuestro DHCP

En el caso de $leaseBound = "0" nos da la información contraria, Galaxy-SY (6A:F7:80:00:00:00) remove wifi address 192.168.10.31 from DHCP_Server

Cabe destacar que estas líneas ejecutan un script llamado "Envia_mensaje_telegram" que se encuentra en /system script del que hablaremos al final.

Segundo conexiones estáticas
En este caso accedemos a /tool netwatch y le damos al botón "+", en Host pondremos la ip que sea de nuestro interés monitorear, por ejemplo 192.168.10.30 en mi caso

1620391818128.png


Ahora nos vamos a las pestañas "up" y "dowm" y escribimos lo que tienen que mostrar según el estado del dispositivo.

En el caso de Up
Código:
global telegramMessage "$"lease-hostname" (Moto) adquiere la IP $leaseActIP desde wifi"

/system script run Envia_mensaje_telegram

Lo que nos va a hacer saltar la siguiente informarción "(Moto) adquiere la ip desde wifi"

En el caso de Down
Código:
global telegramMessage "$"lease-hostname" (Moto) desconecta la ip $leaseActIP desde wifi"

/system script run Envia_mensaje_telegram

Lo que nos indica "(Moto) desconecta la ip desde wifi"

El escript de ejecución
Para que todo esto funcione, tenemos que crear el "ejecutable" Envia_mensaje_telegram

Para ello nos vamos a /system script y creamos un script con el nombre "Envia_mensaje_telegram" sin comillas seleccionamos todas las opciones menos dude y añadimos

Código:
:global telegramMessage
:local botid
:local chatid
set botid "XXXXXXX:YYYYYYYYYYYY"
set chatid "-ZZZZZZZZZZ"
/tool fetch url="https://api.telegram.org/bot$botid/sendMessage\?chat_id=$chatid&text=$telegramMessage" keep-result=no

Donde el botid es el token access para la API HTTP
y chatid es el canal de telegram donde van a aparecer todas las notificaciones generadas por el script.

No necesitamos un /system scheduler porque el script de ejecución va a correr siempre que un dispositivo acceda o desconecte de la red Wifi o Lan.

Saludos a todos y espero que os pueda valer como a mi.
 
Muy ilustrativo, has resuelto el problema que planteabas de una manera muy elegante. Enhorabuena.

Saludos!
 
Muy ilustrativo, has resuelto el problema que planteabas de una manera muy elegante. Enhorabuena.

Saludos!
Lo bueno de esto es que te puede decir cuando se te ha caido la conexión a internet de una forma simple (pe la raspi se ha desconectado, en un 90% de los casos es por desconexión a internet) de una forma muy sencilla y con 4 líneas de código...

Pese a haberlo buscado no he encontrado ningún script que te diga que internet se ha desconectado teniendo ip dinámica

Saludos
 
Pese a haberlo buscado no he encontrado ningún script que te diga que internet se ha desconectado teniendo ip dinámica
tienes una conexión pppoe o dhcp? Se me ocurre hacerle un ping con el net watch a la puerta de enlace (el gateway del otro lado) o mismamente a una dns cualquiera.

Saludos!
 
tienes una conexión pppoe o dhcp? Se me ocurre hacerle un ping con el net watch a la puerta de enlace (el gateway del otro lado) o mismamente a una dns cualquiera.

Saludos!
Imagina recibir un ping cada 5 minutos por telegram... es bastante mejor idea cuando un dispositivo se desconecta como la raspi que si está bien configurada no se desconecta por nada.

Si tu pones una DDNS en netwatch te resuelve la ip y cuando el pppoe cambie la ip te va a soltar que la conexión está caída siendo una información falsa.

En mi caso tengo 2 dispositivos que siempre están online una raspi y un hap^2, cuando esas dos conexiones se caigan es que la red ha caído

Saludos
 
No hombre no, me refiero a programar un ping a una DNS que pase cada cierto tiempo y, cuando no responda, hacer el trigger de ese script que te diga "te has quedado sin conexión". O añadir la IP de tu gateway (IP en el otro lado, en el lado del operador) a una lista de direcciones y monitorear si esa IP responde a un ping. E, igualmente, cuando lo lo haga, mensajito.

Saludos!
 
No hombre no, me refiero a programar un ping a una DNS que pase cada cierto tiempo y, cuando no responda, hacer el trigger de ese script que te diga "te has quedado sin conexión". O añadir la IP de tu gateway (IP en el otro lado, en el lado del operador) a una lista de direcciones y monitorear si esa IP responde a un ping. E, igualmente, cuando lo lo haga, mensajito.

Saludos!

No acabo de entenderte, pero como te digo en mi caso tengo 2 dispositivos que si se caen los dos a la vez me chivan que me he quedado sin acceso a internet.

Saludos
 
Muchas gracias!!, me interesa mucho este script.
Pero soy totalmente novato en Telegram, ¿puedes dar más info sobre los valores
set botid "XXXXXXX:YYYYYYYYYYYY"
set chatid "-ZZZZZZZZZZ"?

EDITO, me contesto a mí mismo:
Para conseguir el botid hay que empezar un chat con el usuario @BotFather
Para averiguar el chatid se puede hacer en la web:


Saludos
 
Última edición:
Arriba