MANUAL: Mikrotik, colección de scripting

Cuando pueda lo pruebo en terminal.
Sí Funciona el módulo de Telegram y muestra el resultado en la app del script que si me funciona.
Estoy probando en un hAP AC2.
Gracias.
Probado en un hAP ac2 y localizado el problema:

Cuando lo pruebas en el terminal (es la mejor forma de que depures el problema) te da este resultado:
1639137586158.png

O sea que no encuentra algo que le pide el script. Lo he revisado y tienes que comentar en la declaración de variables (añadiendo "#" al principio de la línea) , la línea que recupera la temperatura del sistema; es lógico ya que el ac2 no tiene sensor de temperatura (mi RB4011 si lo lleva, por eso no falla).

1639138129922.png


Lo pruebas de nuevo y ya funciona:
NoU2OEO0HT.png


S@lu2.
 
@diamuxin
#:local CurrentTemp [/system health get temperature];
:local CurrentTemp [/system health get [find name=temperature] value];

Correcto con lo que has apuntado. Si comento la temperatura se ejecuta correctamente.

En un hAP AC que tiene sensor de temperatura daba error igualmente y he sustituido la orden para obtener la temperatura por otra que comentó pokoyo en otro hilo, y así si funciona.

Captura de pantalla_2021-12-10_13-42-02.png


Saludos.
 
@diamuxin


Correcto con lo que has apuntado. Si comento la temperatura se ejecuta correctamente.

En un hAP AC que tiene sensor de temperatura daba error igualmente y he sustituido la orden para obtener la temperatura por otra que comentó pokoyo en otro hilo, y así si funciona.

Ver el adjunto 89319

Saludos.
Es lo caprichoso de esta última versión, antes con 6.49 recuperaba la temperatura con una orden y ahora con otra
 
/ip dhcp-server lease
:if ($leaseBound = 1) do={
:do {
# Variables
:local Comment [/ip dhcp-server lease get value-name=comment number=[/ip dhcp-server lease find address=$leaseActIP]]
:local DeviceName [/system identity get name];
# START Send Telegram Module
:local MessageText "\E2\84\B9 <b>$DeviceName:</b> Info DHCP</b> %0D%0A Nombre: $"lease-hostname" %0D%0A IP: $leaseActIP %0D%0A MAC: $leaseActMAC %0D%0A Comentario: $Comment";
:local SendTelegramMessage [:parse [/system script get MyTGBotSendMessage source]];
$SendTelegramMessage MessageText=$MessageText;
#END Send Telegram Module
:log info "Alerta DHCP: $"lease-hostname" $leaseActMAC se ha conectado"
} on-error={:log error "Alerta DHCP: Fallo de notificación a Telegram"}
}

@diamuxin
En el script que tengo en el DHCP Server pestaña Script, parece que tampoco funciona y no manda la info a Telegram.

Edito: Ahora si funciona.

El resto de scripts ahora funcionan bien después de retocar la orden que recoge la temperatura..
Sólo me queda mirar la nueva forma de mandar los emails cuando tenga un rato.
Saludos y gracias.
 
Última edición:
@diamuxin
En el script que tengo en el DHCP Server pestaña Script, parece que tampoco funciona y no manda la info a Telegram.

Edito: Ahora si funciona.

El resto de scripts ahora funcionan bien después de retocar la orden que recoge la temperatura..
Sólo me queda mirar la nueva forma de mandar los emails cuando tenga un rato.
Saludos y gracias.
Prueba con este código: te debe funcionar en el hAP ac2 (probado).

Bash:
/ip dhcp-server lease
:if ($leaseBound = 1) do={
:do {
# Variables
:local Comment [/ip dhcp-server lease get value-name=comment number=[/ip dhcp-server lease find address=$leaseActIP]]
:local DeviceName [/system identity get name];

# START Send Telegram Module
:local MessageText "\E2\84\B9 $DeviceName: Info DHCP %0D%0A Nombre: $"lease-hostname" %0D%0A IP: $leaseActIP %0D%0A MAC: $leaseActMAC %0D%0A Comentario: $Comment";
:local SendTelegramMessage [:parse [/system script get MyTGBotSendMessage source]];
$SendTelegramMessage MessageText=$MessageText;
#END Send Telegram Module

:log info "Alerta DHCP: $"lease-hostname" $leaseActMAC se ha conectado"
} on-error={:log error "Alerta DHCP: Fallo de notificación a Telegram"}
}

xxDb8VsHFd.png


S@lu2.
 
Última edición:
@vermetal, @stargate4you,

Ya he averiguado donde está el problema por el que no iba la función SendEmailFunction. Efectivamente como ya sabíamos, con el paso de 6.x a 7.x cambió la sintaxis de algunos comandos y quedó este módulo afectado.

Hay que hacer una pequeña modificación en la parte del TLS en el contenido de la función:

a) Para versiones RouterOS v6.x

Bash:
# Variables
:local SendFrom "Router Mikrotik";
:local PasswordMail "MyStrongPassword";
:local SmtpServer 173.194.76.108;
:local UserName "mi-usuario-gmail";
:local SmtpPort 587;
:local UseTLS "yes";

# Main script code
/tool e-mail send to=$SendTo server=$SmtpServer port=$SmtpPort start-tls=$UseTLS user=$UserName password=$PasswordMail from=$SendFrom subject=$Subject body=$TextMail file=$FileName;

b) Para versiones RouterOS v7.x

Bash:
# Variables
:local SendFrom "Mikrotik Router";
:local PasswordMail "MyStrongPassword";
:local SmtpServer 173.194.76.108;
:local UserName "usuario-gmail";
:local SmtpPort 587;
:local UseTLS "starttls";

# Main script code
/tool e-mail send to=$SendTo server=$SmtpServer port=$SmtpPort tls=$UseTLS user=$UserName password=$PasswordMail from=$SendFrom subject=$Subject body=$TextMail file=$FileName;

Por tanto el módulo Email que hay en los diferentes scripts y que hacen la llamada a la función SendEmailFunction siguen funcionando tal cual estaban desde la v6.x al pasar a la v7.x (solo se modifica la función si vas a pasar a v7.x)

Bash:
# START Send Email Module
    :local SendTo "destino@gmail.com";
    :local Subject "\F0\9F\9F\A2 $DeviceName [$Date $Time] Test message";
    :local MessageText $Text;
    :local FileName "";
    :local SendEmail [:parse [/system script get SendEmailFunction source]];
    $SendEmail SendTo=$SendTo TextMail=$MessageText Subject=$Subject FileName=$FileName;
# END Send Email Module

No obstante, esto es a gusto del consumidor, el que quiera, puede utilizar el módulo mencionado y si no la función ya incorporada en RouterOS de "Tools->Email":

Bash:
/tool e-mail send to="destino@gmail.com" subject="\F0\9F\9F\A2 $DeviceName [$Date $Time] \
    Test message subject" body="test message body" file="";

S@lu2.
 
Última edición:
Buenas, he estado viendo de implementar esto y tal como está falla. Me he leído en diagonal todo el hilo y he visto alguna otra persona que le falla también.

El problema por lo que he visto, es que en la parte de envío de mails el script está tirando de otro script llamado SendEmailFunction, que si no lo tienes no enviará emails claro. El resto de funciones funcionan, mete las ips en la lista negra, lee los logs propios y luego limpia el contenido, etc...

Total que me he googleado y me he encontrado un script, que si no es el mismo será parecido al que ha puesto @diamuxin. Le he dado unas cuantas vueltas y no sé que huevos que no hay manera de que mande los mails, o errores TLS o errores AUTH o nada, nada de nada, parece que los manda pero no aparecen por ningún lado.

Al final he acabado tuneando el script así que lo dejo por aquí, por si alguien le sirve, este script tira del email definido en el propio routeros, así que debe estar configurado y funcionando en la ventana de tools -> email y luego lo probáis con:
Código:
/tool e-mail send to="pepito@gmail.com" start-tls=yes subject="MikroTik prueba" body="Hola ke ase."

Si os llega el mail es que está ok, ahora el script:

Código:
:local logBuffer "failedauth"
:local failthreshold 2
:local blocklist "Lst_AttemptLoginIP"
:local GTime [:pick [/system clock get time] 0 8]
:local DeviceName [/system identity get name];

# ----------------------------------------------------------------------------------------

:local attackiparray {0}
:local attackcountarray {0}
:local logEntryTopics
:local logEntryTime
:local logEntryMessage
:local clearedbuf
:local lines
:local datetime [/system clock get date]
:set clearedbuf 0

:local i 0
:foreach rule in=[/log print as-value where buffer=($logBuffer)] do={
# Now all data is collected in memory..

# Clear log buffer right away so new entries come in
   :if ($clearedbuf = 0) do={
      /system logging action {
         :set lines [get ($logBuffer) memory-lines]
         set ($logBuffer) memory-lines 1
         set ($logBuffer) memory-lines $lines
      }
      :set clearedbuf 1
   }
# End clear log buffer

   :set logEntryTime ""
   :set logEntryTopics ""
   :set logEntryMessage ""

:set logEntryTime ($rule->"time")
:set logEntryTopics ($rule->"topics")
:set logEntryMessage ($rule->"message")

:if ($logEntryMessage~"login failure") do={

:local attackip [:pick $logEntryMessage ([:find $logEntryMessage "from "]+5) ([:find $logEntryMessage " via"])]

:local x 0
:foreach ip in=$attackiparray do={
  :if ($ip = $attackip) do={
    :set ($attackcountarray->$x) (($attackcountarray->$x)+1)
  } else={
    :set ($attackiparray->$i) $attackip
    :set ($attackcountarray->$i) 1
  }
:set x ($x+1)
}
}
:set i ($i+1)
# end foreach rule
}
:local z 0
:foreach ip in=$attackiparray do={
  :if ($attackcountarray->$z > $failthreshold) do={
    :set ($attackcountarray->$z) 0
    /ip firewall address-list add address=($attackiparray->$z) list=$blocklist timeout=86400
    # START Send Email Module
    /tool e-mail send to="EMAILDESTINO@gmail.com" start-tls=yes subject="MikroTik alerta $datetime" body="Router ($DeviceName) intento de login por: $attackiparray a las $GTime. IP baneada 24 horas. $logEntryMessage"
    # END Send Email Module

  }
:set ($attackcountarray->$z) 0
:set z ($z+1)
}

La diferencia está al final en dos temas, la parte mail ya veis que usa directamente el comando /tool e-mail send al destinatario que pongáis. Ojo que al menos gmail sin el TLS bien puesto no funciona.

La segunda al añadir la IP a la lista de bloqueos le he metido un timeout de 24 horas, pasado el tiempo se borrará de la lista y podrá volver a acceder.
Si fallas 3 veces la contraseña te baneará 24 horas, el tiempo de fallo será el que defináis en la programación de la tarea.


Buenas, otro script que falla.
Y ahora si que no sé porque, no da ningún error. Lo que veo es que donde antes cuando se ejecutaba el script, el log en memoria creado "failedauth" lo leía y borraba las entradas, ahora no lo hace.
He intentado modificar las politicas del script, pero sigue sin borrar las entradas del log, supongo que ni las lee.
 
Buenas, otro script que falla.
Y ahora si que no sé porque, no da ningún error. Lo que veo es que donde antes cuando se ejecutaba el script, el log en memoria creado "failedauth" lo leía y borraba las entradas, ahora no lo hace.
He intentado modificar las politicas del script, pero sigue sin borrar las entradas del log, supongo que ni las lee.
Hola,

Si accedes al post original de este script (ver 2/2): https://www.adslzone.net/foro/mikro...oleccion-scripting.575217/page-3#post-3585798 ayer se hizo la corrección para la v7 y tras probarlo ahora funciona correctamente. (te sobra en la línea de tool e-mail send la parte de "start-tls=yes" que ya no es válido en v7)

Prueba:

Cuando te logueas con otro usuario ficticio, te registra el error en el buffer "failedauth":

1639250570653.png


Al aplicar el script borra la línea de "failedauth"

1639250618051.png


Si intentas registrarte más de dos veces seguidas con el mismo user ( :local failthreshold 2 ) entonces mete la IP en una lista y queda bloqueada con una regla de firewall durante 24h.

1639250800906.png


1639251679070.png


El script funcionando:

Bash:
:local logBuffer "failedauth"
:local failthreshold 2
:local blocklist "Lst_AttemptLoginIP"
:local GTime [:pick [/system clock get time] 0 8]
:local DeviceName [/system identity get name];

# ---------------------------------------------------------------------------------------

:local attackiparray {0}
:local attackcountarray {0}
:local logEntryTopics
:local logEntryTime
:local logEntryMessage
:local clearedbuf
:local lines
:local datetime [/system clock get date]
:set clearedbuf 0

:local i 0
:foreach rule in=[/log print as-value where buffer=($logBuffer)] do={
# Now all data is collected in memory..

# Clear log buffer right away so new entries come in
   :if ($clearedbuf = 0) do={
      /system logging action {
         :set lines [get ($logBuffer) memory-lines]
         set ($logBuffer) memory-lines 1
         set ($logBuffer) memory-lines $lines
      }
      :set clearedbuf 1
   }
# End clear log buffer

   :set logEntryTime ""
   :set logEntryTopics ""
   :set logEntryMessage ""

:set logEntryTime ($rule->"time")
:set logEntryTopics ($rule->"topics")
:set logEntryMessage ($rule->"message")

:if ($logEntryMessage~"login failure") do={

:local attackip [:pick $logEntryMessage ([:find $logEntryMessage "from "]+5) ([:find $logEntryMessage " via"])]

:local x 0
:foreach ip in=$attackiparray do={
  :if ($ip = $attackip) do={
    :set ($attackcountarray->$x) (($attackcountarray->$x)+1)
  } else={
    :set ($attackiparray->$i) $attackip
    :set ($attackcountarray->$i) 1
  }
:set x ($x+1)
}
}
:set i ($i+1)
# end foreach rule
}
:local z 0
:foreach ip in=$attackiparray do={
  :if ($attackcountarray->$z > $failthreshold) do={
    :set ($attackcountarray->$z) 0
    /ip firewall address-list add address=($attackiparray->$z) list=$blocklist timeout=86400
    # START Send Email Module
    /tool e-mail send to="destinatario@gmail.com" subject="Alerta Despacho $datetime" body="Router $DeviceName: intento de login por: $attackiparray a las $GTime. IP baneada 24 horas. $logEntryMessage"
    # END Send Email Module

  }
:set ($attackcountarray->$z) 0
:set z ($z+1)
}

Y listo.
 

Adjuntos

  • 1639247199742.png
    1639247199742.png
    7.8 KB · Visitas: 77
Última edición:
Script para informar de la conexión/desconexión de un cliente Wireguard

Ahora que la mayoría de los usuarios van migrando a la versión estable de ROS v7.1, hoy comparto unos scripts que nos va a permitir conocer cuando se conecte/desconecte alguien a nuestro servidor VPN Wireguard enviando un mensaje a Telegram.

En primer lugar creamos los scripts:

Nota: La variable "client" la puedes modificar para identificar a tu cliente wireguard. En este caso viene como "SamsungS10" pero lo cambias a tu gusto.

Bash:
/system script
add dont-require-permissions=yes name=vpn-s10-up policy=read,write,policy,test source="\
# START Send Telegram Module\r\
    \n:local deviceName [/system identity get name]\r\
    \n:local client \"SamsungS10\"\r\
    \n:local MessageText \"\\F0\\9F\\9F\\A2 Wireguard \$deviceName: VPN to \$client is UP\";\r\
    \n:local SendTelegramMessage [:parse [/system script get MyTGBotSendMessage source]]; \r\
    \n\$SendTelegramMessage MessageText=\$MessageText;\r\
    \n# END Send Telegram Module\r\
    \n:log info \"Wireguard: VPN to \$client is UP\""
add dont-require-permissions=yes name=vpn-s10-down policy=read,write,policy,test source="\
# START Send Telegram Module\r\
    \n:local deviceName [/system identity get name]\r\
    \n:local client \"SamsungS10\"\r\
    \n:local MessageText \"\\F0\\9F\\9F\\A0 Wireguard \$deviceName: VPN to \$client is Down\";\r\
    \n:local SendTelegramMessage [:parse [/system script get MyTGBotSendMessage source]]; \r\
    \n\$SendTelegramMessage MessageText=\$MessageText;\r\
    \n# END Send Telegram Module\r\
    \n:log info \"Wireguard: VPN to \$client is Down\""

Ahora creamos el host en la utilidad Netwatch, que nos permite chequear cualquier dirección IP, con la ventaja de que mientras la IP esté UP o Down no repite ningún mensaje, sólo avisa con el cambio de estado.

En este caso, mi cliente tiene asignada la IP 10.10.0.2 configurada en el peer.

Bash:
/tool netwatch
add down-script="/system script run vpn-s10-down" \
    host=10.10.0.2 up-script="/system script run vpn-s10-up"

Eso es todo.
S@lu2.
 
Última edición:
Prueba:

Cuando te logueas con otro usuario ficticio, te registra el error en el buffer "failedauth":

Ver el adjunto 89382

Al aplicar el script borra la línea de "failedauth"

Ver el adjunto 89385

Si intentas registrarte más de dos veces seguidas con el mismo user ( :local failthreshold 2 ) entonces mete la IP en una lista y queda bloqueada con una regla de firewall durante 24h.

Pues en la 7.1 en un hap ac3 esto no funciona, he probado con el script antiguo y con el nuevo.
Donde antes se registraban los accesos con failedauth y luego se borraban al leer el script para ver si hay más o menos de 2, ahora no lo hace.

1639486952050.png


No sé si directamente no lee el log o si no es capaz de borrarlo, entiendo que no lo lee, porque si el problema fuese solo el borrado, los emails se enviarían igual.

Asumo que el problema estará por aquí:
Código:
:foreach rule in=[/log print as-value where buffer=($logBuffer)] do={
# Now all data is collected in memory..

# Clear log buffer right away so new entries come in
   :if ($clearedbuf = 0) do={
      /system logging action {
         :set lines [get ($logBuffer) memory-lines]
         set ($logBuffer) memory-lines 1
         set ($logBuffer) memory-lines $lines
      }
      :set clearedbuf 1
   }
# End clear log buffer

Si hago:
Código:
/log print file=log where buffer=failedauth
Tengo el fichero log.txt con las entradas del log correspondientes a failedauth, por tanto esto está bien....

Entonces asumo que las lee, ¿o no...? Estoy totalmente en fuera de juego.
 
Pues en la 7.1 en un hap ac3 esto no funciona, he probado con el script antiguo y con el nuevo.
Donde antes se registraban los accesos con failedauth y luego se borraban al leer el script para ver si hay más o menos de 2, ahora no lo hace.

Ver el adjunto 89496

No sé si directamente no lee el log o si no es capaz de borrarlo, entiendo que no lo lee, porque si el problema fuese solo el borrado, los emails se enviarían igual.

Asumo que el problema estará por aquí:
Código:
:foreach rule in=[/log print as-value where buffer=($logBuffer)] do={
# Now all data is collected in memory..

# Clear log buffer right away so new entries come in
   :if ($clearedbuf = 0) do={
      /system logging action {
         :set lines [get ($logBuffer) memory-lines]
         set ($logBuffer) memory-lines 1
         set ($logBuffer) memory-lines $lines
      }
      :set clearedbuf 1
   }
# End clear log buffer

Si hago:
Código:
/log print file=log where buffer=failedauth
Tengo el fichero log.txt con las entradas del log correspondientes a failedauth, por tanto esto está bien....

Entonces asumo que las lee, ¿o no...? Estoy totalmente en fuera de juego.
Pues algo tienes mal en el script porque lo he probado también en una hAP ac3 y funciona igual de bien que en el RB4011.

1639498867501.png


He copiado paso por paso el proceso según el hilo:

Script para informar sobre intentos fallidos de Login y bloquea la IP (2/2)

y todo ha ido bien:

1639499003035.png


Al ejecutar el script manualmente, borra las líneas de failedauth:

1639499079911.png


Al loguearte erróneamente más de dos veces, los borra y te manda la IP a la lista de baneados, acto seguido envía el correo electrónico informando:

1639499198691.png


Lo único que se me ocurre es que enumeres con detalles los pasos que has seguido (incluyendo el código) a ver si podemos ver algo.

S@lu2.
 
Que mosqueo... pues lo que voy a hacer es borrar todo y empezar de cero, a ver que pasa.
.
.
.
Y misterio resuelto, madre mía...

Lo que pasaba es eso que veis abajo:
Código:
    /tool e-mail send to="destinatario@gmail.com" start-tls=yes subject="MikroTik alerta $datetime" body="Router ($DeviceName) intento de login por: $attackiparray a las $GTime. $logEntryMessage"

    /tool e-mail send to="destinatario@gmail.com" subject="\E2\9A\A0 MikroTik alert on $datetime" body="Your Router ($DeviceName) is attempt login by: $attackiparray at $GTime. Now it has been add to block list." file="";

La primera línea era la que usaba yo en el script que tenía implementado la segunda es la de @diamuxin, la diferencia el start-tls=yes.
No llegue a implementar el script de send mail que usaba este script para enviar mails, si no que lo pasaba plano.

Y aquí estaba una coña, en la config del mail (la ventana de config) especificaba start-tls=tls-only que enviando desde las utilidades iba bien, pero cuando hacías esto por scritp o comandos tenías que especificar el start-tls=yes porque sin especificarlo daba error al enviar....
Ahora el start-tls=yes de línea de comandos no funciona, no lo reconoce como comando al enviar. Y como era lógico he tenido configurar en la ventana del mail start-tls=yes como debería ser y ahora todo funciona.

Lo bueno es que parece que alguien en mikortik le ha dado la vuelta a lo del comando mail y ya tiene lógica lo que configuras y lo que haces desde línea de comandos.

Moraleja un comando mal, peta todo el script.
 
Que mosqueo... pues lo que voy a hacer es borrar todo y empezar de cero, a ver que pasa.
.
.
.
Y misterio resuelto, madre mía...

Lo que pasaba es eso que veis abajo:
Código:
    /tool e-mail send to="destinatario@gmail.com" start-tls=yes subject="MikroTik alerta $datetime" body="Router ($DeviceName) intento de login por: $attackiparray a las $GTime. $logEntryMessage"

    /tool e-mail send to="destinatario@gmail.com" subject="\E2\9A\A0 MikroTik alert on $datetime" body="Your Router ($DeviceName) is attempt login by: $attackiparray at $GTime. Now it has been add to block list." file="";

La primera línea era la que usaba yo en el script que tenía implementado la segunda es la de @diamuxin, la diferencia el start-tls=yes.
No llegue a implementar el script de send mail que usaba este script para enviar mails, si no que lo pasaba plano.

Y aquí estaba una coña, en la config del mail (la ventana de config) especificaba start-tls=tls-only que enviando desde las utilidades iba bien, pero cuando hacías esto por scritp o comandos tenías que especificar el start-tls=yes porque sin especificarlo daba error al enviar....
Ahora el start-tls=yes de línea de comandos no funciona, no lo reconoce como comando al enviar. Y como era lógico he tenido configurar en la ventana del mail start-tls=yes como debería ser y ahora todo funciona.

Lo bueno es que parece que alguien en mikortik le ha dado la vuelta a lo del comando mail y ya tiene lógica lo que configuras y lo que haces desde línea de comandos.

Moraleja un comando mal, peta todo el script.
Efectivamente, en los scripts, cuando hay cualquier error en el código no lo ejecuta, hay que ir revisando y probando en la terminal hasta localizar el problema. El tema del TLS ya estaba explicado más arriba:

En v6.x -> start-tls=yes
En v7.x -> tls=starttls

Me alegro que ya lo tengas funcionando.

S@lu2.
 
Efectivamente, en los scripts, cuando hay cualquier error en el código no lo ejecuta, hay que ir revisando y probando en la terminal hasta localizar el problema. El tema del TLS ya estaba explicado más arriba:

En v6.x -> start-tls=yes
En v7.x -> tls=starttls

Me alegro que ya lo tengas funcionando.

S@lu2.

Ni me fijé que está apuntado en el post :rolleyes:.
Lo que me alegra a mi es que los de mikrotik solucionen esas cosas, no tenía sentido usar las opciones tls-only en un lado y yes en el otro para que funcionase desde los menús de winbox y consola.
Otra cosa para anotar es lo de que en la 7 si peta algo el script no va, por eso me desconcertaba la lectura del log en memoria, con la 6 si petaba en envío de mails, el resto funcionaba bien.

Gracias.
 
Ahora que se acerca una ola de calor de las potentes, os paso este sencillo script para avisarnos por Telegram en el momento que el router alcance el umbral de temperatura que configuremos. *Importante, sólo funcionará en aquellos Mikrotiks que dispongan de sonda de temperatura.

Bash:
:global tempSystem [/system health get temperature]
:local DeviceName [/system identity get name]
:local tempMax "50";

:if ($tempSystem >= $tempMax) do={
:log error "Alerta de Temperatura ALTA: $tempSystem ºC";

# START Send Telegram Module
:local MessageText "\E2\9A\A0 <b>Router Mikrotik $DeviceName</b>%0AAlerta Temperatura ALTA: $tempSystem C";
:local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
$SendTelegramMessage MessageText=$MessageText;
# END Send Telegram Module

} else={
:log warning "La temperatura está dentro de los valores normales: $tempSystem ºC"
}

Nos avisará de esta forma:

Ver el adjunto 85152
*Los 35ºC ya sabemos que no es temperatura alta, solo es a efectos para estas pruebas.

Otro script similar:

Bash:
:global "tempstatus"
:global "templaststatus"
:global "systemtemp" [/system health get temperature]
:local DeviceName [/system identity get name]

:if (systemtemp > "42") do={:set "tempstatus" "La temperatura del sistema es ALTA"}
:if (systemtemp > "52") do={:set "tempstatus" "La temperatura del sistema es MUY ALTA"}
:if (systemtemp > "62") do={:set "tempstatus" "La temperatura del sistema es CRITICA"}
:if (systemtemp < "42") do={:set "tempstatus" "Temperatura del sistema dentro de la normalidad"}
:if ($"tempstatus" != $"templaststatus") do {

# START Send Telegram Module
:local MessageText "\E2\9A\A0 <b>Mikrotik $DeviceName</b>%0A$tempstatus: $systemtemp C";
:local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
$SendTelegramMessage MessageText=$MessageText;
#END Send Telegram Module

:log info "Aviso: $tempstatus $systemtemp C"
:set "templaststatus" $"tempstatus"
} else {
:log warning "$tempstatus: $systemtemp C"
}

Resultado:

Ver el adjunto 85188

S@lu2.
Muchas gracias por el script, voy a usarlo ya.

Se podria hacer para el voltaje también no? Para monitorear cuando cuelga de un ups por ejemplo, tengo que intentarlo aunque me liaré con los palabros fijo
 
Muchas gracias por el script, voy a usarlo ya.

Se podria hacer para el voltaje también no? Para monitorear cuando cuelga de un ups por ejemplo, tengo que intentarlo aunque me liaré con los palabros fijo
De nada, que lo disfrutes.

Recuerda que para obtener la temperatura en la v.7 la sintaxis cambia:
para v6.x: [/system health get temperature]
para v7.x: [/system health get [find name=temperature] value]

Para lo que comentas del voltaje declara una variable con la siguiente llamada:
para v6.x: [/system health get voltage]
para v7.x: [/system health get [find name=voltage] value]

Sería crear un script similar al de temperatura y vas modificando a tu gusto:

Bash:
:global "voltstatus"
:global "voltlaststatus"
:global "systemvolt" [/system health get [find name=voltage] value]
:local DeviceName [/system identity get name]

:if (systemvolt > "26") do={:set "voltstatus" "El voltaje del sistema es ALTO"}
:if (systemvolt > "28") do={:set "voltstatus" "El voltaje del sistema es MUY ALTO"}
:if (systemvolt > "30") do={:set "voltstatus" "El voltaje del sistema es CRITICO"}
:if (systemvolt < "25") do={:set "voltstatus" "Voltaje del sistema dentro de la normalidad"}
:if ($"voltstatus" != $"voltlaststatus") do {

# START Send Telegram Module
:local MessageText "\E2\9A\A0 <b>Mikrotik $DeviceName</b>%0A$voltstatus: $systemvolt C";
:local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
$SendTelegramMessage MessageText=$MessageText;
#END Send Telegram Module

:log info "Aviso: $voltstatus $systemvolt C"
:set "voltlaststatus" $"voltstatus"
} else {
:log warning "$voltstatus: $systemvolt C"
}

S@lu2.
 
De nada, que lo disfrutes.

Recuerda que para obtener la temperatura en la v.7 la sintaxis cambia:
para v6.x: [/system health get temperature]
para v7.x: [/system health get [find name=temperature] value]

Para lo que comentas del voltaje declara una variable con la siguiente llamada:
para v6.x: [/system health get voltage]
para v7.x: [/system health get [find name=voltage] value]

Sería crear un script similar al de temperatura y vas modificando a tu gusto:

Bash:
:global "voltstatus"
:global "voltlaststatus"
:global "systemvolt" [/system health get [find name=voltage] value]
:local DeviceName [/system identity get name]

:if (systemvolt > "26") do={:set "voltstatus" "El voltaje del sistema es ALTO"}
:if (systemvolt > "28") do={:set "voltstatus" "El voltaje del sistema es MUY ALTO"}
:if (systemvolt > "30") do={:set "voltstatus" "El voltaje del sistema es CRITICO"}
:if (systemvolt < "25") do={:set "voltstatus" "Voltaje del sistema dentro de la normalidad"}
:if ($"voltstatus" != $"voltlaststatus") do {

# START Send Telegram Module
:local MessageText "\E2\9A\A0 <b>Mikrotik $DeviceName</b>%0A$voltstatus: $systemvolt C";
:local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
$SendTelegramMessage MessageText=$MessageText;
#END Send Telegram Module

:log info "Aviso: $voltstatus $systemvolt C"
:set "voltlaststatus" $"voltstatus"
} else {
:log warning "$voltstatus: $systemvolt C"
}

S@lu2.
Buah! Muchísimas gracias!! En cuanto pueda lo monto tambien
 
De nada, que lo disfrutes.

Recuerda que para obtener la temperatura en la v.7 la sintaxis cambia:
para v6.x: [/system health get temperature]
para v7.x: [/system health get [find name=temperature] value]

Para lo que comentas del voltaje declara una variable con la siguiente llamada:
para v6.x: [/system health get voltage]
para v7.x: [/system health get [find name=voltage] value]

Sería crear un script similar al de temperatura y vas modificando a tu gusto:

Bash:
:global "voltstatus"
:global "voltlaststatus"
:global "systemvolt" [/system health get [find name=voltage] value]
:local DeviceName [/system identity get name]

:if (systemvolt > "26") do={:set "voltstatus" "El voltaje del sistema es ALTO"}
:if (systemvolt > "28") do={:set "voltstatus" "El voltaje del sistema es MUY ALTO"}
:if (systemvolt > "30") do={:set "voltstatus" "El voltaje del sistema es CRITICO"}
:if (systemvolt < "25") do={:set "voltstatus" "Voltaje del sistema dentro de la normalidad"}
:if ($"voltstatus" != $"voltlaststatus") do {

# START Send Telegram Module
:local MessageText "\E2\9A\A0 <b>Mikrotik $DeviceName</b>%0A$voltstatus: $systemvolt C";
:local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
$SendTelegramMessage MessageText=$MessageText;
#END Send Telegram Module

:log info "Aviso: $voltstatus $systemvolt C"
:set "voltlaststatus" $"voltstatus"
} else {
:log warning "$voltstatus: $systemvolt C"
}

S@lu2.
Hola, al crear este tipo de scripts (con contadores) no se incrementa el uso de CPU del router?
 
Hola, al crear este tipo de scripts (con contadores) no se incrementa el uso de CPU del router?
Hola, los scripts que tengo operativos se ejecutan a diferentes horas y no supone incremento alguno de CPU o memoria. Por lo menos yo no he notado nada fuera de lo normal.

S@lu2.
 
Buenos días a tod@s y Feliz año!

@diamuxin, estoy adentrándome en este mundillo del scripting, más por necesidad ya que previamente tengo previsto seguir aprendiendo más del funcionamiento de estos aparatillos...y por último liarme con scripting ya que, aunque llevo casi 35 años en el mundillo de la informática, siempre me tiró más el hard que el soft... y le dí un poco de lado a la programación.

El motivo de meterme en "berenjenales" es el siguiente. Desde hace unos días vengo observando en logs intentos de conexión denegados a través de winbox/dude, desde diversas IP's.

Ahora mismo lo estoy apañando "a mano", agregando estas ip's a una blacklist que posteriormente gestiono por RAW, pero es ciertamente tedioso estar pendiente de los logs diarios para ver si hay algo raro.

He visto un script que has colgado, muy interesante y que realiza la función que quiero. Por un lado tienes un script que notifica vía e-mail el logueo en el router, y lo complementas con otro script que bloquea las ip's que realizan intentos fallidos de login. Es justo lo que necesito.

La consulta es la siguiente: para ambos scripts, sería posible añadir la notificación por Telegram o directamente sustituir la notificación vía email por la de Telegram? El script de Telegram ya lo tengo creado y funcional (probado con el script de cambio de IP WAN) pero estoy hecho un lío a la hora de adaptar las variables que tiene el script al módulo de Telegram. He realizado varias probaturas, sin éxito.

Podrías echarme una mano o darme algunos tips con los que guiarme para modificar el script?

Gracias de antemano.


Saludos!!
 
Arriba