MANUAL: Mikrotik, colección de scripting

Hola, estaba mirando de hacer un script para que me borre los archivos que tengo de backup en files.

:foreach i in=[/file find] do={:if ([:typeof [:find [/file get $i name] "FTP-"]]!="nil") do={/file remove $i}}

En principio todos los archivos que empiezan por FTP- deberían borrarse pero me hace cosas raras, lo vi en el foro de mikrotik y solo modifique para que me borrara lo que me interesaba pero no tuve éxito, haber si me podéis echar una mano. Gracias.

Saludos
 
Hola, estaba mirando de hacer un script para que me borre los archivos que tengo de backup en files.

:foreach i in=[/file find] do={:if ([:typeof [:find [/file get $i name] "FTP-"]]!="nil") do={/file remove $i}}

En principio todos los archivos que empiezan por FTP- deberían borrarse pero me hace cosas raras, lo vi en el foro de mikrotik y solo modifique para que me borrara lo que me interesaba pero no tuve éxito, haber si me podéis echar una mano. Gracias.

Saludos
Hola,

Veo que por el nombre, estás realizando backups y los envías por FTP. Una vez enviados los ficheros de backup, no tiene mucho sentido dejarlos en Files.

Le metes un delay y borras el fichero en Files

Código:
# Tiempo de proceso antes de borrar los ficheros
:delay 10s
 
# Lo borras con el mismo nombre.
/file remove $backup

Disculpa pero me pillas ahora fuera de casa.

S@lu2.
 
Hola,

Veo que por el nombre, estás realizando backups y los envías por FTP. Una vez enviados los ficheros de backup, no tiene mucho sentido dejarlos en Files.

Le metes un delay y borras el fichero en Files

Código:
# Tiempo de proceso antes de borrar los ficheros
:delay 10s

# Lo borras con el mismo nombre.
/file remove $backup

Disculpa pero me pillas ahora fuera de casa.

S@lu2.
Gracias pro responder, después de darle vueltas ya lo logre hacerlo funcionar, era alguna problema con una variable. Gracias.

Saludos
 
Última edición:
Chicos una pregunta, estoy intentando configurar el módulo de Telegram y con el Script del compi @diamuxin poniendo el número del bot y el chat, no consigo que arranque... ¿Alguna sugerencia?

Un saludo y gracias
 
Chicos una pregunta, estoy intentando configurar el módulo de Telegram y con el Script del compi @diamuxin poniendo el número del bot y el chat, no consigo que arranque... ¿Alguna sugerencia?

Un saludo y gracias
Hola,

Sigue estos pasos:

1.- Acceder a Telegram para crear el bot, abriremos una conversación con el gestor de bots @BotFather
2.- Tecleas: /start
3.- Ahora: /newbot (pedirá dos valores: nombre del bot y usuario del bot)
4.- Al finalizar ya tenemos el bot creado y nos dará un mensaje que contiene el Token (guardar a buen recaudo)
5.- Chat ID: tecleamos @RawDataBot, escribimos /start y obtenemos el Chat ID.
6.- En el Router Mikrotik creamos un script con el nombre "MyTGBotSendMessage" (le puedes dar el nombre que quieras) y guardamos los cambios.
7.- Insertamos este contenido en el script:

Código:
:local BotToken "XXXXXXXXXX:XXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXX";
:local ChatID "XXXXXXXXXX";
:local parseMode "HTML";
:local SendText $MessageText;

/tool fetch url="https://api.telegram.org/bot$BotToken/sendMessage\?chat_id=$ChatID&parse_mode=$parseMode&text=$SendText" keep-result=no;

:log info "==> Send Telegram Message";

8.- Para enviar cualquier info a tu bot de Telegram, vemos un ejemplo de un script que hará una llamada al script anterior (MyTGBotSendMessage) para enviar las notificaciones:

Código:
:local DeviceName [/system identity get name];
:local MessageText "\F0\9F\9F\A2 <b>$DeviceName:</b> <i>italic</i>  <code>inline fixed-width code</code> plain text <a href=\"https://mikrotik.com\">Test OK</a>";
:local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
$SendTelegramMessage MessageText=$MessageText;

S@lu2.
 
Script muy útil para chequear los cambios de IP pública e informar por email y/o Telegram.

Bash:
:global CurrentIP;
:local NewIP ([/tool fetch url=http://api.ipify.org/ as-value output=user] -> "data")

:if ($NewIP != $CurrentIP) do={
    # Variables
    :local Time [/system clock get time];
    :local Date [/system clock get date];
    :local DeviceName [/system identity get name];
    :local Text "Nueva IP: $NewIP\r\nAnterior IP: $CurrentIP";

    # START Send Telegram Module
    :local MessageText "\F0\9F\9F\A2 $DeviceName: La WAN IP ha cambiado%0ANueva IP: $NewIP%0AAnterior IP: $CurrentIP";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
    #END Send Telegram Module

    # START Send Email Module
    :local SendTo "micuenta@gmail.com";
    :local Subject "\F0\9F\9F\A2 $DeviceName [$Date $Time] Nueva IP WAN.";
    :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

    :log info "Detectada nueva IP WAN: $NewIP - Anterior IP: $CurrentIP";

    :delay 5s;
    # Guarda la IP actual en una variable global
    :set CurrentIP $NewIP;

} else={
    :log info "INFO: WAN IP anterior $CurrentIP es igual a la IP actual, no ha cambiado";

    # Recibimos un aviso vía Telegram en caso que no haya cambiado la IP.
    # START Send Telegram Module
    :local MessageText "\F0\9F\9F\A2 $DeviceName: La WAN IP no ha cambiado:%0A$NewIP";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
    #END Send Telegram Module
};

Este script utiliza dos módulos ya predefinidos (scripts) para el envío de mensajes vía email o vía Telegram

Módulo Email:

Nombre del Script: SendEmailFunction

a) Para versiones RouterOS v6.x

Bash:
# Módulo para utilizar una cuenta Gmail para enviar emails.
# 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;

Módulo Telegram:

Nombre del Script: MyTGBotSendMessage

Bash:
:local BotToken "XXXXXXXXXX:XXXXXXXXXXX-XXXXXXXXXXXXXXXXX";
:local ChatID "XXXXXXXXX";
:local parseMode "HTML";
:local SendText $MessageText;

/tool fetch url="https://api.telegram.org/bot$BotToken/sendMessage\?chat_id=$ChatID&parse_mode=$parseMode&text=$SendText" keep-result=no;

:log info "Enviado Mensaje Telegram";

Editado 09/dic/2021: Script compatible con versión 7.1

Bash:
:global CurrentIP;
:local NewIP ([/tool fetch url=http://api.ipify.org/ as-value output=user] -> "data")
:delay 2s


:if ($NewIP != $CurrentIP) do={
    # Variables
    :local Time [/system clock get time];
    :local Date [/system clock get date];
    :local DeviceName [/system identity get name];


    # START Send Telegram Module
    :local MessageText "\F0\9F\9F\A2 $DeviceName: La WAN IP ha cambiado%0ANueva IP: $NewIP%0AAnterior IP: $CurrentIP";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
    #END Send Telegram Module


    # START Send Email
    /tool e-mail send to="micuenta@gmail.com" subject="\F0\9F\9F\A2 $DeviceName [$Date $Time] Nueva IP WAN." body="Nueva IP: $NewIP\r\nAnterior IP: $CurrentIP";
    # END Send Email

    :log info "Detectada nueva IP WAN: $NewIP - Anterior IP: $CurrentIP";
    :delay 5s;

    # Guarda la IP actual en una variable global
    :set CurrentIP $NewIP;


} else={
    :log info "INFO: WAN IP anterior $CurrentIP es igual a la IP actual, no ha cambiado";

    # Recibimos un aviso vía Telegram en caso que no haya cambiado la IP.
    # START Send Telegram Module
    :local MessageText "\F0\9F\9F\A2 $DeviceName: La WAN IP no ha cambiado:%0A$NewIP";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
    #END Send Telegram Module
};
Buenas, no se si esto va aqui, si no abro hilo nuevo, pero normalmente cuando cambia la IP es porque se reinicia el router, o se apaga por corte de luz, en tal caso he comprobado que la varible global se pierde, he estado dando vueltas, de guardar esa variable en un fichero (que entiendo que eso no se borraria) o hay foros en los que dice de crear en L7 una linea con lo que quieres guardar.

hay otra manera mas limpia? o esta bien hacerlo asi.

muchas gracias.
 
Buenas, no se si esto va aqui, si no abro hilo nuevo, pero normalmente cuando cambia la IP es porque se reinicia el router, o se apaga por corte de luz, en tal caso he comprobado que la varible global se pierde, he estado dando vueltas, de guardar esa variable en un fichero (que entiendo que eso no se borraria) o hay foros en los que dice de crear en L7 una linea con lo que quieres guardar.

hay otra manera mas limpia? o esta bien hacerlo asi.

muchas gracias.
Hola,

Efectivamente las variables globales se pierden en cualquier reinicio del router.

Los cambios en la IP WAN aparte de renicios/corte de luz, se pueden producir también en un mantenimiento interno del ISP o simplemente cuando el DHCP renueve las leases, en ese caso cambia la IP y ese script informa del cambio mostrando la anterior IP y la nueva.

En el siguiente post, os dejo sendos scripts para salvar/recuperar las variables globales de tu sistema.

S@lu2.
 
Nuevos scripts para Backup/Restore de las variables globales del sistema.

BACKUP


Prográmalo para que se ejecute por lo menos una vez al día, en mi caso, se ejecuta conjuntamente con un script para comprobar la IP WAN e informar de los posibles cambios.

Bash:
/system script environment
:foreach item in=[find] do={
    :local vname [get $item name]
    :local vvalue [get $item value]
    /ip firewall layer7
    remove [find where name=$vname]
    :if (([:typeof [:find [:tostr $vvalue] "(eval " -1]] = "nil") and ([:typeof [:find [:tostr $vvalue] "(evl " -1]] = "nil")) do={
        :if ([:find $vvalue "*" -1] = 0) do={:set vvalue "ID$vvalue"}
        add name=$vname regex="$vvalue"
    } else={
        :if ([:typeof $vvalue] = "code") do={
            add name=$vname regex="(code)"
        } else={
            add name=$vname regex="(function)"
        }
    }
        :delay 10ms
        :execute "/ip firewall layer7 set [find where name=$vname] comment=[:typeof \$$vname]"
}

RESTORE

Prográmalo para que se ejecute en el arranque del sistema (tarea con Start Time=startup)

Bash:
/ip firewall layer7
:foreach item in=[find where comment~"^(array|bool|id|ip|ip-prefix|ip6|ip6-prefix|num|str|time|code|nothing|nil)\$"] do={
    :local vname  [get $item name]
    :local vvalue [get $item regexp]
    :local vtype  [get $item comment]
    :if ($vvalue = "(code)"    ) do={:set vtype "code"    }
    :if ($vvalue = "(function)") do={:set vtype "function"}
    /system script environment
    remove [find where name=$vname]
    :if ($vtype~"^(array|id|ip|ip6|num|str|time)\$") do={
        :if ($vtype = "id") do={
            :set vvalue [:pick $vvalue [:find $vvalue "*" -1] [:len $vvalue]]
            :execute ":global $vname [:to$vtype $vvalue]"
        } else={
            :execute ":global $vname [:to$vtype [/ip firewall layer7 get [find where name=$vname] regexp]]"
        }
    } else={
        :if ($vtype~"^(ip-prefix|ip6-prefix|nothing|nil)\$") do={
            :if ($vtype~"^(ip-prefix|ip6-prefix)\$") do={:execute ":global $vname [[:parse \":return $vvalue\"]]"}
            :if ($vtype="nothing") do={:execute ":global $vname [:nothing]"}
            :if ($vtype="nil") do={:execute ":global $vname"}
        } else={
            :if ($vtype~"^(bool)\$") do={
                :execute ":global $vname [:to$vtype $vvalue]"
            } else={
                :log error "Unknow variable type >$vtype<"
                :execute ":global $vname [/ip firewall layer7 get [find where name=$vname] regexp]"
            }
        }
    }
    :delay 10ms
}

Nota: Al día de hoy, RouterOS sólo permite salvar en "Firewall->Layer7 Protocols" cualquier tipo de dato excepto funciones.

S@lu2.
 
Última edición:
Hola,

Efectivamente las variables globales se pierden en cualquier reinicio del router.

Los cambios en la IP WAN aparte de renicios/corte de luz, se pueden producir también en un mantenimiento interno del ISP o simplemente cuando el DHCP renueve las leases, en ese caso cambia la IP y ese script informa del cambio mostrando la anterior IP y la nueva.

En el siguiente post, os dejo sendos scripts para salvar/recuperar las variables globales de tu sistema.

S@lu2.
Muchas gracias por contestar @diamuxin

Exacto, cambian de esa manera, puse dos ejemplos para explicarme de manera rapida.

Te agradezco mucho los scripts, ayer estuve peleandome toda la tarde en sacar eso y como estoy pegado en el tema de scriting mikrotik no supe.

de nuevo, muchas gracias!
Un saludo.
 
Script para actualizar la dirección WAN IP en tu DDNS de NoIP

Bash:
# No-IP automatic Dynamic DNS update

:local noipuser "usuario-noip"
:local noippass "contraseña-noip"
:local noiphost "host-noip"
:local inetinterface "pppoe-out1"
# aquí metes tu interfaz WAN que conecta a internet, en mi caso "pppoe-out1"

:global previousIP

:if ([/interface get $inetinterface value-name=running]) do={
:local currentIP [/ip address get [find interface="$inetinterface" disabled=no] address]
:for i from=( [:len $currentIP] - 1) to=0 do={
:if ( [:pick $currentIP $i] = "/") do={
:set currentIP [:pick $currentIP 0 $i]
}
}

:if ($currentIP != $previousIP) do={
:log info "No-IP: la IP actual $currentIP es distinta a la IP anterior, se necesita actualización"
:set previousIP $currentIP

:local url "http://dynupdate.no-ip.com/nic/update\3Fmyip=$currentIP"
:local noiphostarray
:set noiphostarray [:toarray $noiphost]
:foreach host in=$noiphostarray do={
:log info "No-IP: Enviando actualizacion de $host"
/tool fetch url=($url . "&hostname=$host") user=$noipuser password=$noippass mode=http dst-path=("no-ip_ddns_update-" . $host . ".txt")
:log info "No-IP: Es necesario actualizar. la dirección $host se actualizará con la IP $currentIP"
}
} else={
:log info "No-IP: La IP anterior $previousIP es igual a la IP actual, no es necesario actualizar"
}
} else={
:log info "No-IP: El interface $inetinterface en este momento no está operativo, no ha sido posible actualizar"
}

Yo hace tiempo usaba esta versión del script pero me dio un par de disgustos.

Alguna vez, no sé por qué, tras el cambio de IP pública el script se ejecutó correctamente (al menos así lo ponía en el log) pero en no-ip seguía saliendo la IP antigua. Vamos, que no actualizó.

El script tal y como está, aunque comprueba la IP cada X tiempo según lo que programemos en el scheduler, no volverá a informar a no-ip de otra nueva IP hasta que ésta cambie. Por lo tanto, hasta que eso ocurra (pueden pasar días, semanas...), no-ip estará completamente desactualizado.

La solución es sencilla. Modificar el script para que, aunque la IP pública no cambie, lo reporte igualmente a no-ip. Y programar el script con una frecuencia acorde a lo crítico de la incomunicación (yo lo tengo para que compruebe la IP cada 5 minutos por ejemplo).

Os dejo el script modificado:

Código:
# No-IP automatic Dynamic DNS update

#--------------- Modificar las siguientes variables ------------------

# Mantener las comillas siempre.
# Introducir usuario y contraseña de la cuenta de no-ip.
# Se puede actualizar más de un host simultáneamente.
# Separarlos con comas. Ej: "host1.ddns.net, host2.ddns.net, host3.ddns.net"
# Especificar el nombre de la interfaz de la cual se quiere obtener la IP dinámica.


:local noipuser "usuario-noip"
:local noippass "contraseña-noip"
:local noiphost "host-noip"
:local inetinterface "ether1"


# No hacer más cambios de aquí para abajo
#--------------------------------------------------------------------------------------


:global previousIP

:if ([/interface get $inetinterface value-name=running]) do={
:local currentIP [/ip address get [find interface="$inetinterface" disabled=no] address]
:for i from=( [:len $currentIP] - 1) to=0 do={
:if ( [:pick $currentIP $i] = "/") do={
:set currentIP [:pick $currentIP 0 $i]
}
}

:if ($currentIP != $previousIP) do={
:log info "No-IP: Actualización necesaria. La IP actual $currentIP no es igual a la IP anterior ($previousIP)."
:set previousIP $currentIP

:local url "http://dynupdate.no-ip.com/nic/update\3Fmyip=$currentIP"
:local noiphostarray
:set noiphostarray [:toarray $noiphost]
:foreach host in=$noiphostarray do={
/tool fetch url=($url . "&hostname=$host") user=$noipuser password=$noippass mode=http dst-path=("no-ip_ddns_update-" . $host . ".txt")
:log info "No-IP: Host $host actualizado en No-IP con IP $currentIP"
}
}  else={
:log info "No-IP: La IP actual $currentIP es igual a la IP anterior."
:local url "http://dynupdate.no-ip.com/nic/update\3Fmyip=$currentIP"
:local noiphostarray
:set noiphostarray [:toarray $noiphost]
:foreach host in=$noiphostarray do={
:log info "No-IP: Confirmando IP igualmente para $host"
/tool fetch url=($url . "&hostname=$host") user=$noipuser password=$noippass mode=http dst-path=("no-ip_ddns_update-" . $host . ".txt")
}
}
} else={
   :log info "No-IP: La interfaz $inetinterface no está en uso actualmente. No ha sido posible actualizar."
}

Desde entonces no he vuelto a tener problemas por fallos de actualización.
 
Última edición:
Yo hace tiempo usaba esta versión del script pero me dio un par de disgustos.

Alguna vez, no sé por qué, tras el cambio de IP pública el script se ejecutó correctamente (al menos así lo ponía en el log) pero en no-ip seguía saliendo la IP antigua. Vamos, que no actualizó.

El script tal y como está, aunque comprueba la IP cada X tiempo según lo que programemos en el scheduler, no volverá a informar a no-ip de otra nueva IP hasta que ésta cambie. Por lo tanto, hasta que eso ocurra (pueden pasar días, semanas...), no-ip estará completamente desactualizado.

La solución es sencilla. Modificar el script para que, aunque la IP pública no cambie, lo reporte igualmente a no-ip. Y programar el script con una frecuencia acorde a lo crítico de la incomunicación (yo lo tengo para que compruebe la IP cada 5 minutos por ejemplo).

Os dejo el script modificado:

Código:
# No-IP automatic Dynamic DNS update

#--------------- Modificar las siguientes variables ------------------

# Mantener las comillas siempre.
# Introducir usuario y contraseña de la cuenta de no-ip.
# Se puede actualizar más de un host simultáneamente.
# Separarlos con comas. Ej: "host1.ddns.net, host2.ddns.net, host3.ddns.net"
# Especificar el nombre de la interfaz de la cual se quiere obtener la IP dinámica.


:local noipuser "usuario-noip"
:local noippass "contraseña-noip"
:local noiphost "host-noip"
:local inetinterface "ether1"


# No hacer más cambios de aquí para abajo
#--------------------------------------------------------------------------------------


:global previousIP

:if ([/interface get $inetinterface value-name=running]) do={
:local currentIP [/ip address get [find interface="$inetinterface" disabled=no] address]
:for i from=( [:len $currentIP] - 1) to=0 do={
:if ( [:pick $currentIP $i] = "/") do={
:set currentIP [:pick $currentIP 0 $i]
}
}

:if ($currentIP != $previousIP) do={
:log info "No-IP: Actualización necesaria. La IP actual $currentIP no es igual a la IP anterior ($previousIP)."
:set previousIP $currentIP

:local url "http://dynupdate.no-ip.com/nic/update\3Fmyip=$currentIP"
:local noiphostarray
:set noiphostarray [:toarray $noiphost]
:foreach host in=$noiphostarray do={
/tool fetch url=($url . "&hostname=$host") user=$noipuser password=$noippass mode=http dst-path=("no-ip_ddns_update-" . $host . ".txt")
:log info "No-IP: Host $host actualizado en No-IP con IP $currentIP"
}
}  else={
:log info "No-IP: La IP actual $currentIP es igual a la IP anterior."
:local url "http://dynupdate.no-ip.com/nic/update\3Fmyip=$currentIP"
:local noiphostarray
:set noiphostarray [:toarray $noiphost]
:foreach host in=$noiphostarray do={
:log info "No-IP: Confirmando IP igualmente para $host"
/tool fetch url=($url . "&hostname=$host") user=$noipuser password=$noippass mode=http dst-path=("no-ip_ddns_update-" . $host . ".txt")
}
}
} else={
   :log info "No-IP: La interfaz $inetinterface no está en uso actualmente. No ha sido posible actualizar."
}

Desde entonces no he vuelto a tener problemas por fallos de actualización.
Desde que tengo funcionando este script no he tenido problemas (este DDNS apunta a mi NAS por lo que lo uso a diario), lo mismo pillaste alguna caída puntual de los servidores NoIP. No obstante se agradece tu mejora/actualización.

S@lu2.
 
Sí, ya te digo. Fue solo en un par de ocasiones y bastante separadas en el tiempo. Pero la última me pilló de viaje y sin posibilidad de ver qué IP había cogido el router ni nadie que reiniciase todo para forzar una actualización de la IP (o del script). Además, tenía varios hosts actualizándose mediante este script y en todos ocurrió lo mismo.

Según el log sí se había detectado el cambio de IP y enviado a no-ip pero todos los hosts seguían con la ip antigua asociada.

Desde entonces decidí que el script informase siempre cada 5 minutos a no-ip, tanto con ip nueva como siguiendo con la misma. A mí no me supone ningún perjuicio y a no-ip supongo que tampoco (aunque ya es problema suyo si se lo supone jajaja).

Lo más rápido sería simplificar aún más el script y saltarse el paso de comparar ip actual e ip anterior e informar siempre pero preferí dejarlo así completo para ver en el log qué día y a qué hora se produce el cambio.
 
Os muestro un script basado en los de @diamuxin y modificado por mí para comprobar el buen funcionamiento de la "IPTV-pululante".

En este caso lo que comprobamos es que el tunel EoIP esté funcionando y si no es así lo único que hacemos es deshabilitar y habilitar Wireguard para que vuelva a levantar todo: Wireguard StS + EoIP.

Ponemos en marcha un scheduler cada cierto tiempo (15 minutos por ejemplo) para que compruebe que el tunnel EoIP está funcionando (RS).

En este ejemplo sólo utilizo el módulo de Telegram para que nos avise, de todas formas se puede añadir el módulo de email para hacer una notificación a nuestra cuenta de correo.

Ver el adjunto 93894

Con los HGU de por medio creo que es recomendable tener algún tipo de comprobación para avisarnos de algún contratiempo.

Se puede instalar en ambos extremos, tanto en el lado de "Paco" como en el de "Pepe".

Saludos.

Código:
{
:local wgInterface "wireguard-sts-iptv"
:local eoipInterface "eoip-iptv"
:local deviceName [/system identity get name]

:if ( [/interface eoip get $eoipInterface running]=false ) do={

    :log error "EoIP-IPTV interface is down";
    :log info "Reconnecting tunnel wireguard...";

    # START Send Telegram Module
    :local MessageText "\E2\9A\A0 <b>$deviceName:</b>%0A%0Aeoip-iptv interface is DOWN.";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
    # END Send Telegram Module

    # Reset wireguard interface
    /interface/wireguard/disable $wgInterface
    :delay 5
    /interface/wireguard/enable $wgInterface

    # Reset EoIP interface
    #:delay 10
    #/interface/disable $eoipInterface
    #:delay 5
    #/interface/enable $eoipInterface

    # Damos un margen de tiempo para hacer de nuevo una comprobación
    :delay 60
    :if ( [/interface eoip get $eoipInterface running]=true ) do={
    # START Send Telegram Module
    :local MessageText "\F0\9F\91\8D <b>$deviceName:</b>%0A%0Aeoip-iptv interface is UP.";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
    # END Send Telegram Module

    :log info "Wireguard and EoIP-IPTV interfaces are connected"
}

} else={
:log info "eoip-iptv interface is up"
}

}
@stargate4you , en relación a este script, cuando lo ejecuto manualmente no obtengo ningún envío a Telegram, ni "interface is up/down"
He comprobado el módulo de Telegram y funciona correctamente.

Pregunta: ¿Sólo actúa cuando el túnel cae y lo restablece? Cuando he realizado las pruebas para ver si recibía los comunicados de Telegram, el túnel estaba up (RS)

Saludos!
 
El script hace la comprobación para ver si el túnel eoip está levantado.
Si está caído es cuando actúa y manda los mensajes de aviso al telegram.

Si el túnel está levantado y funcionando correctamente no emite ningún mensaje. Sólo en el log te da el aviso de que ha hecho la comprobación y está todo correcto.

Yo tengo el script junto a un schedule para que se ejecute cada 15 minutos.

Saludos.
 
El script hace la comprobación para ver si el túnel eoip está levantado.
Si está caído es cuando actúa y manda los mensajes de aviso al telegram.

Si el túnel está levantado y funcionando correctamente no emite ningún mensaje. Sólo en el log te da el aviso de que ha hecho la comprobación y está todo correcto.

Yo tengo el script junto a un schedule para que se ejecute cada 15 minutos.

Saludos.
He revisado los logs del MK pero no aparece nada, ni info, ni warning....

En el script, aparte de las dos variables de wireguard y eoip....¿es necesario modificar algo más?

Mil gracias

Saludos!!
 
EDIT: Acabo de ejecutar el script vía terminal y me da un error en línea 8....voy a revisarlo.


Saludos!
 
EDIT: Acabo de ejecutar el script vía terminal y me da un error en línea 8....voy a revisarlo.


Saludos!
Hola @roolezz,

Si metes el script a pelo en la terminal tal cual está publicado (incluidos los corchetes "{ }" del principio y final) y con los nombres correctos de las interfaces, te va a marcar en rojo la línea donde tienes el problema.

Código:
:local wgInterface "nombre-de-tu-interfaz-wireguard"
:local eoipInterface "nombre-de-tu-interfaz-eoip"

Debe funcionarte, lo acabo de probar tal lo editó @stargate4you y funciona. Como no está caído el EoIP me reporta en el log "<nombre-de-tu-interfaz-eoip> interface is up"

S@lu2.
 
Buenas tardes, estaba probando el script de @diamuxin y probe otros scripts y me están dando fallo.

Recojo este porque es el por cual empece, pero he probado otros con el mismo resultado

:local BotToken "XXXXXXXXXX:XXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXX";
:local ChatID "XXXXXXXXX";
:local parseMode "HTML";
:local SendText $MessageText;

/tool fetch url="https://api.telegram.org/bot$BotToken/sendMessage\?chat_id=$ChatID&parse_mode=$parseMode&text=$SendText" keep-result=no;


:log info "Send Telegram message";


He configurado correctamente telegram pero cuando pongo el script no le gusta exactamente esto &text=$SendText

Si cambio solamente $text=hola, funciona perfecto y me llega el sms, sino me da el siguiente error -->

[admin@MikroTik] > /system/script/ run prueba2
status: failed

failure: closing connection: <400 Bad Request> 149.154.167.220:443 (5)


Esto es un ejemplo he probado con otros scripts y me pasa exactamente lo mismo es como si no me recogiera el valor de la variable y al encontrar el caracter de texto "$" ya no lo envia, debe ser una tontería y pido disculpas si alguien lo comento antes , pero no se que estoy haciendo mal. Un saludo y mil gracias

La ios es 7.5.

Un saludo
 
Buenas tardes, estaba probando el script de @diamuxin y probe otros scripts y me están dando fallo.

Recojo este porque es el por cual empece, pero he probado otros con el mismo resultado

:local BotToken "XXXXXXXXXX:XXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXX";
:local ChatID "XXXXXXXXX";
:local parseMode "HTML";
:local SendText $MessageText;

/tool fetch url="https://api.telegram.org/bot$BotToken/sendMessage\?chat_id=$ChatID&parse_mode=$parseMode&text=$SendText" keep-result=no;


:log info "Send Telegram message";


He configurado correctamente telegram pero cuando pongo el script no le gusta exactamente esto &text=$SendText

Si cambio solamente $text=hola, funciona perfecto y me llega el sms, sino me da el siguiente error -->

[admin@MikroTik] > /system/script/ run prueba2
status: failed

failure: closing connection: <400 Bad Request> 149.154.167.220:443 (5)


Esto es un ejemplo he probado con otros scripts y me pasa exactamente lo mismo es como si no me recogiera el valor de la variable y al encontrar el caracter de texto "$" ya no lo envia, debe ser una tontería y pido disculpas si alguien lo comento antes , pero no se que estoy haciendo mal. Un saludo y mil gracias

La ios es 7.5.

Un saludo
Hola, con la información que aportas no me dice mucho, tienes que publicar el script completo, procura que sea legible, el código formatealo con </>

Los scripts que tengo publicados en este hilo, para no repetir los mismo en cada script hacen la llamada a un módulo (es otro script) llamado MyTGBotSendMessage con este contenido (no separes la línea de "tool fetch"):

Bash:
# Sustituye las XX por tus datos
:local BotToken "XXXXXXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXXXX";
:local ChatID "XXXXXXXXXX";
:local parseMode "HTML";
:local SendText $MessageText;

/tool fetch url="https://api.telegram.org/bot$BotToken/sendMessage\?chat_id=$ChatID&parse_mode=$parseMode&text=$SendText" keep-result=no;

:log info "==> Send Telegram message";

Y ahora creas un script sencillo de pruebas con este contenido:

Bash:
# START Send Telegram Module
:local MessageText "Telegram Test OK";  <-- En negrita es lo que verías en tu bot de Telegram, las demás líneas no se tocan.
:local SendTelegramMessage [:parse [/system script get MyTGBotSendMessage source]];
$SendTelegramMessage MessageText=$MessageText;
# END Send Telegram Module

Deberías ver una notificación con el mensaje "Telegram Test OK".

S@lu2.
 
Arriba