MANUAL: Mikrotik, colección de scripting

Hola!

El propósito de este hilo es hacer una colección de scripting. Id añadiendo posts al hilo y yo intentaré mantener un índice en este primer post que enlace con ellos. De esta manera, nos aseguramos de que es un hilo colaborativo y de que, al mismo tiempo, no tenemos que andar copiando y pegando código de un sitio a otro haciéndolo inmanejable.

Índice


Saludos!
 
Última edición:
Crear el backup en cloud, con un script en /system scripts
Código:
/log info message="Cloud backup started"
/system backup cloud upload-file action=create-and-upload password=MySup3rb4ckUp! replace=[find name]
/tool e-mail send to=pokoyo@pericoplaotes.com subject="New cloud backup created for $[/system identity get name] router" body="A new cloud backup has been created at $[/system clock get time] on $[/system clock get date]."
/log info message="Cloud backup finished"

Hacerlo de manera periódica, todas las semanas a las 5 de la mañana
Código:
/system scheduler
add interval=1w name=backups on-event=cloud-backup policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=jan/01/2021 start-time=05:00:00
 
Limitar el logging del router a 100 líneas
Código:
/system logging action
set 0 memory-lines=100

borrarlo con un script que se pueda ejecutar manualmente desde /system scripts
Código:
/system logging action set memory memory-lines=1
/system logging action set memory memory-lines=100

programarlo para que se ejecute cada noche a las 12
Código:
add interval=1d name=logging on-event=clear-logs \
policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
    start-date=jan/01/2021 start-time=00:00:00
 
Como siempre, genial @pokoyo!

Os paso un script que conseguí hace tiempo (no recuerdo donde) que crea un reporte de IP's para posteriormente crear una regla en RAW que bloquee la citada lista, por si puede ser de utilidad:

Código:
delay 15
ip firewall address-list
:local update do={
:do {
:local data ([:tool fetch url=$url output=user as-value]->"data")
:local array [find dynamic list=blacklist]
:foreach value in=$array do={:set array (array,[get $value address])}
:while ([:len $data]!=0) do={
:if ([:pick $data 0 [:find $data "\n"]]~"^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}") do={
:local ip ([:pick $data 0 [:find $data $delimiter]].$cidr)
:do {add list=blacklist address=$ip comment=$description timeout=1d} on-error={
:do {set ($array->([:find $array $ip]-[:len $array]/2)) timeout=1d} on-error={}
}
}
:set data [:pick $data ([:find $data "\n"]+1) [:len $data]]
}
} on-error={:log warning "Address list <$description> update failed"}
}
$update url=http://feeds.dshield.org/block.txt description=DShield delimiter=("\t") cidr=/24
$update url=http://www.spamhaus.org/drop/drop.txt description="Spamhaus DROP" delimiter=("\_")
$update url=http://www.spamhaus.org/drop/edrop.txt description="Spamhaus EDROP" delimiter=("\_")
$update url=https://sslbl.abuse.ch/blacklist/sslipblacklist.txt description="Abuse.ch SSLBL" delimiter=("\r")
$update url=https://raw.githubusercontent.com/ktsaou/blocklist-ipsets/master/firehol_level2.netset description="FireHOL Level2" delimiter=("\n")
$update url=https://lists.blocklist.de/lists/all.txt description="BlockList.de" delimiter=("\n")

Saludos!
 
Última edición por un moderador:
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 currentIP
: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"
}
 
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

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;

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";
 
Última edición:
Script para enviarnos el log de nuestro router cada x tiempo (definirlo en scheduler el periodo que necesitemos)

Bash:
# vuelca el log al archivo log-mikrotik.txt    
/log print file=log-mikrotik.txt

# genera un evento de nombre "enviando log por email" visible en el log
:log info message="enviando log por email"

# capturan la fecha y hora del sistema
:global data [/system clock get date]
:global hora [/system clock get time]

# captura el nombre de nuestro router
:local DeviceName [/system identity get name];

# Define el texto en el "body" del email
:local Text "log-mikrotik $data $hora";

# Módulo para envíos de emails
# START Send Email Module
   :local SendTo "tucorreo@gmail.com";
   :local Subject "\E2\84\B9 $DeviceName: log-mikrotik $data $hora";
   :local MessageText $Text;
   :local FileName "log-mikrotik.txt";
   :local SendEmail [:parse [/system script get SendEmailFunction source]];
   $SendEmail SendTo=$SendTo TextMail=$MessageText Subject=$Subject FileName=$FileName;
# END Send Email Module

En mensajes anteriores ya se ha indicado el contenido del módulo "SendEmailFunction" para el envío de correos.
 
Actualizar dominio DDNS de DuckDNS
Código:
# Modificad las siguientes tres asignaciones de variables, relativas a la interfaz wan, el dominio y el token, con vuestros datos. Se cambia lo que va entrecomillado.

# Poned aquí la interfaz por la que te conectas a internet, ejemplo:
:global wanInterface "ether1"

# Poned aquí el dominio duckdns que queramos mantener actualizado, ejemplo:
:global domain "pericoeldelospalotes.duckdns.org"

# Poned aquí el token que nos da duckdns para nuestra cuenta, ejemplo:
:global token "fc8e6521-35b8-1234-b915-db6345a31c75"

# Inicio del Script
:global actualIP value=[/ip address get [find where interface=$wanInterface] value-name=address];
:global actualIP value=[:pick $actualIP -1 [:find $actualIP "/" -1] ];
:if ([:len [/file find where name=ipstore.txt]] < 1 ) do={
/file print file=ipstore.txt where name=ipstore.txt;
/delay delay-time=2;
/file set ipstore.txt contents="0.0.0.0";
};
:global previousIP value=[/file get [find where name=ipstore.txt ] value-name=contents];
:if ($previousIP != $actualIP) do={
:log info message=("Try to Update DuckDNS with actual IP ".$actualIP." -  Previous IP are ".$previousIP);
/tool fetch mode=https keep-result=yes dst-path=duckdns-result.txt address=[:resolve www.duckdns.org] port=443 host=www.duckdns.org src-path=("/update?domains=$domain&token=$token&ip=".$actualIP);
/delay delay-time=5;
:global lastChange value=[/file get [find where name=duckdns-result.txt ] value-name=contents];
:global previousIP value=$actualIP;
/file set ipstore.txt contents=$actualIP;
:if ($lastChange = "OK") do={:log warning message=("DuckDNS update successfull with IP ".$actualIP);};
:if ($lastChange = "KO") do={:log error message=("Fail to update DuckDNS with new IP ".$actualIP);};
};

Y programarlo para que lo mantenga actualizado periódicamente
Código:
/system scheduler
add interval=30m name=duckduns-updater on-event=duckdns-update policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=jan/01/2021 \
    start-time=00:00:00
 
Script muy útil para darnos información a diario (programarlo en scheduler) sobre el estado de nuestro sistema

Bash:
:local ipv4 [/ip cloud get public-address];
# :local ipv6 [/ip cloud get public-address-ipv6];   En RouterOS 6.49 no funciona esta línea
:local ipv6 [:pick [/ipv6 dhcp-client get [find] prefix] 0 24];
:local uptime [/system resource get uptime];
:local CurrentTemp [/system health get temperature];
:local FreeMemory ([/system resource get free-memory]/1000000);
:local TotalMemory ([/system resource get total-memory]/1000000);
:local cpu [/system resource get cpu];
:local cpuCount [/system resource get cpu-count];
:local cpuFrequency [/system resource get cpu-frequency];
:local cpuLoad [/system resource get cpu-load];
:local freeHdd ([/system resource get free-hdd-space]/1000000);
:local totalHdd ([/system resource get total-hdd-space]/1000000);
:local architectureName [/system resource get architecture-name];
:local boardName [/system resource get board-name];
:local version [/system resource get version];
:local DeviceName [/system identity get name];

# START Send Email Module
:local SendTo "micuenta@gmail.com";
:local Subject "\F0\9F\9A\80 $DeviceName System Status";
:local MessageText "IPv4: $ipv4\nIPv6: $ipv6\n\nTemperature: $CurrentTemp C\nUptime: $uptime\nFree Memory: $FreeMemory MB\nTotal Memory: $TotalMemory MB\nCPU: $cpu\nCPU Count: $cpuCount\nCPU Frequency: $cpuFrequency MHz\nCPU Load: $cpuLoad %\nFree Disk: $freeHdd MB\nTotal Disk: $totalHdd MB\nArchitecture: $architectureName\nBoard Name: $boardName\nSoftware Version: $version";
:local FileName "";
:local SendEmail [:parse [/system script get SendEmailFunction source]];
$SendEmail SendTo=$SendTo TextMail=$MessageText Subject=$Subject FileName=$FileName;
# END Send Email Module

# START Send Telegram Module
:local MessageText "\F0\9F\9A\80 $DeviceName System Status:%0AIPv4: $ipv4%0AIPv6: $ipv6%0ATemperature: $CurrentTemp %C2%B0 C%0AUptime: $uptime%0AFree Memory: $FreeMemory MB%0ATotal Memory: $TotalMemory MB%0ACPU Load: $cpuLoad %%0ACPU: $cpu%0ACPU Count: $cpuCount%0ACPU Frequency: $cpuFrequency MHz%0AArchitecture: $architectureName%0ABoard Name: $boardName%0ASoftware Version: $version%0AFree Disk: $freeHdd MB%0ATotal Disk: $totalHdd MB";
:local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
$SendTelegramMessage MessageText=$MessageText;
#END Send Telegram Module

:log info "Sent Email: WAN IP & System Status"
:log info "Sent Telegram: WAN IP & System Status"

Resultado por ejemplo en Telegram:

bwkPwNGsDr.png
 
Última edición:
Le has cogido el gustillo al scripting @diamuxin! Madre mía qué colección vamos a montar en un rato :D(y)

Saludos, y muchas gracias!
 
Script para recibir información de las sesiones de LogIN y LogOUT del router.

Bash:
:local DeviceName [/system identity get name];
:local Time [/system clock get time];
:local Date [/system clock get date];
:local EmailMessageText;
:local TelegramMessageText;

:global ParseLogAccountEndArrayID;

:local IDsEventsAccount [/log find where  topics ~ "account"];

:local LenArrayIDs [:len $IDsEventsAccount];
:local StartArrayID [:find $IDsEventsAccount $ParseLogAccountEndArrayID];
:local EndArrayID ($IDsEventsAccount -> ($LenArrayIDs-1));

:if ($EndArrayID != $ParseLogAccountEndArrayID and [:tobool $ParseLogAccountEndArrayID] ) do={

    :for KeyArray from=($StartArrayID+1) to=($LenArrayIDs-1) do={
        :local IDMessage ($IDsEventsAccount ->$KeyArray );
        :set EmailMessageText "$EmailMessageText \n\r  $[/log get number=$IDMessage time] - $[/log get number=$IDMessage message];";
        :set TelegramMessageText "$TelegramMessageText %0D%0A  $[/log get number=$IDMessage time] - $[/log get number=$IDMessage message];";
        }

    # START SEND EMAIL
    :local SendTo "tucuenta@gmail.com";
    :local Subject "\F0\9F\94\93 Info Login: $DeviceName - $Date $Time";
    :local MessageText "$EmailMessageText";
    :local FileName "";
    :local SendEmail [:parse [/system script get SendEmailFunction source]];
    $SendEmail SendTo=$SendTo TextMail=$MessageText Subject=$Subject FileName=$FileName;
    # END SEND EMAIL

    # START SEND TELEGRAM
    :local MessageText "\F0\9F\94\93 <b>$DeviceName: Info Login</b> $TelegramMessageText";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
    # END SEND TELEGRAM
}

:set ParseLogAccountEndArrayID $EndArrayID;
 
Script para apagar/encender los Leds del equipo. Además asigna la función a la tecla "mode" para apagar/encender manualmente.

Bash:
/system script
add comment=defconf dont-require-permissions=no name=dark-mode owner=admin policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\r\
    \n   :if ([system leds settings get all-leds-off] = \"never\") do={\r\
    \n     /system leds settings set all-leds-off=immediate \r\
    \n   } else={\r\
    \n     /system leds settings set all-leds-off=never \r\
    \n   }\r\
    \n "
/system routerboard mode-button
set enabled=yes on-event="system script run dark-mode"
 
Script para obtener vía email listado de DHCP Leases. Lo puedes programar o ejecutar manualmente.

Bash:
:local time [/system clock get time];
:local date [/system clock get date];
:local DeviceName [/system identity get name];
:local i;
:local hostip;
:local hostname;
:local dhcplist "";
:local leasesall [ :len [ /ip dhcp-server lease find where server="PONER AQUÍ EL NOMBRE DE TU SERVIDOR DHCP" ] ];
:local firmware [ /system routerboard get current-firmware ];
:local routeros [ /system package get number=0 value-name=version ];
:local macaddress;

/ip dhcp-server lease;
:foreach i in=[find where server="PONER AQUÍ EL NOMBRE DE TU SERVIDOR DHCP"] do={
  :set hostname [get $i host-name];
  :set hostip [get $i address];
  :set macaddress [get $i active-mac-address];
  :set dhcplist ($dhcplist . $hostname . " " . $hostip . " ". $macaddress . "\n");
};

# START Send Email Module
   :local SendTo "tucorrreo@gmail.com";
   :local Subject "\E2\84\B9 $DeviceName: DHCP Leases [$date - $time]";
   :local MessageText "Total DHCP leases: $leasesall\n\nFirmware: $firmware\nRouterOS: $routeros\n\n$dhcplist";
   :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 "DHCP Leases sent via email"
 
Scripts para chequear las actualizaciones disponibles de RouterOS y Firmware RouterBOARD.

Upgrade packages RouterOS

Bash:
:local DeviceName [/system identity get name];
/system package update check-for-updates

:if ([/system package update get installed-version] != [/system package update get latest-version] ) do={

    # START Send Email Module
    :local SendTo "tucorreo@gmail.com";
    :local Subject "\E2\84\B9 $DeviceName: Upgrade package available";
    :local MessageText "Upgrade packages RouterOS disponible para actualizar $[/system package update get installed-version] a $[/system package update get latest-version]";
    :local FileName "";
    :local SendEmail [:parse [/system script get SendEmailFunction source]];
    $SendEmail SendTo=$SendTo TextMail=$MessageText Subject=$Subject FileName=$FileName;
    # END Send Email Module

    # START Send Telegram Module
    :local MessageText "\E2\84\B9 <b>$DeviceName:</b>%0AUpgrade packages disponible para actualizar $[/system package update get installed-version] a $[/system package update get latest-version]";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
    #END Send Telegram Module

    :log warning "Upgrade packages disponible para actualizar $[/system package update get installed-version] a $[/system package update get latest-version]";

# Si queremos que se actualice una vez detectado, des-comentamos la siguiente linea, aunque yo particularmente prefiero hacerlo manualmente.
# /system package update install

} else={
    :log info "Upgrade Packages: No es necesario actualizar. Actual: $[/system package update get installed-version]";
}

Firmware RouterBOARD

Bash:
:local currentFirmware [system routerboard get current-firmware];
:local upgradeFirmware [system routerboard get upgrade-firmware];
:local systemName      [/system identity get value-name=name];

:if ($currentFirmware != $upgradeFirmware) do={
    :log info "ATENCIÓN: Nuevo firmware $upgradeFirmware está disponible para su instalación";
    
    # Si queremos actualizar desde este mismo script, sustituir la línea anterior por las siguientes 3 lineas comentadas: y modificar los avisos de Email / Telegram a vuestro gusto jugando con las variables.
    # :log info ("...:::Nuevo firmware detectado. Actualizando desde ".$currentFirmware." a ".$upgradeFirmware.":::...");
    #   /system routerboard upgrade;   
    # :delay 2;

     # START Send Email Module
    :local SendTo "tucorreo@gmail.com";
    :local Subject "\E2\84\B9 $systemName: Actualización disponible";
    :local MessageText "Se ha detectado una nueva actualización de firmware: $upgradeFirmware. Por favor, por seguridad actualice cuanto antes desde la versión actual $currentFirmware";
    :local FileName "";
    :local SendEmail [:parse [/system script get SendEmailFunction source]];
    $SendEmail SendTo=$SendTo TextMail=$MessageText Subject=$Subject FileName=$FileName;
    # END Send Email Module

    # START Send Telegram Module
    :local MessageText "\E2\84\B9 <b>systemName:</b> Se ha detectado un nuevo firmware: $upgradeFirmware. Por favor, por seguridad actualice cuanto antes desde la actual $currentFirmware";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
    # END Send Telegram Module

    } else={
    :log info "Firmware: No es necesario actualizar. Actual: $currentFirmware";
    }
 
Última edición:
Script muy práctico que nos va a controlar periódicamente el estado de cualquier túnel IKEv2 entre dos puntos, y en caso de detectar una caída nos va a avisar por Email / Telegram.

Check tunnel A to B

Bash:
# Script name: vpn-check

{
:log info "IKEv2 Tunnel Check Started"
##### The host you want to ping ######
# Ejemplo de un host del lado B
:local HOST "192.168.99.10"
##### Location of host ########
:local LOCATION "Apartamento"
##### Interface to Remote Network #######
:local GW "bridge"
#### Ping Time out Increase or decrease as Required #####
:local TIMEOUT "100ms"
#### How Many try's ######
:local COUNT "10"
### If less than 8 successful reply's Restart IPSec #####
:local LESSTHAN "8"
##### Device Name #####
:local DeviceName [/system identity get name];

################################## DON'T EDIT BELOW ###################################
:log info "Looking for $HOST at $LOCATION"
:log info "Route to IPSec endpoint in $LOCATION is via $GW"
:if ([/ping interface=$GW $HOST interval=$TIMEOUT count=$COUNT]<$LESSTHAN) \
do={log error "$HOST at $LOCATION is unreachable Tunnel to $LOCATION is Down Forcing IPSec Restart";

/ip ipsec installed-sa flush

# START Send Email Module
    :local SendTo "tucorreo@gmail.com";
    :local Subject "\F0\9F\9F\A0 $DeviceName. Tunel IKEv2 is Down";
    :local MessageText "---";
    :local FileName "";
    :local SendEmail [:parse [/system script get SendEmailFunction source]];
    $SendEmail SendTo=$SendTo TextMail=$MessageText Subject=$Subject FileName=$FileName;
# END Send Email Module

# START Send Telegram Module
    :local MessageText "\F0\9F\9F\A0 <b>$DeviceName:</b> Tunel IKEv2 is Down";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
#END Send Telegram Module

} \
else {:log warning "IPSec Tunnel to $LOCATION is OK Nothing to do"

# START Send Email Module
    :local SendTo "tucorreo@gmail.com";
    :local Subject "\F0\9F\9F\A2 $DeviceName: Tunel IKEv2 is UP";
    :local MessageText "---";
    :local FileName "";
    :local SendEmail [:parse [/system script get SendEmailFunction source]];
    $SendEmail SendTo=$SendTo TextMail=$MessageText Subject=$Subject FileName=$FileName;
# END Send Email Module

# START Send Telegram Module
    :local MessageText "\F0\9F\9F\A2 <b>$DeviceName:</b> Tunel IKEv2 is UP";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
#END Send Telegram Module

}
}

Check tunnel B to A

Mismo script, sólo cambiamos los siguientes datos:

Bash:
##### The host you want to ping ######
# Ejemplo de un host del lado A
:local HOST "192.168.88.10"
##### Location of host ########
:local LOCATION "Casa"

Yo lo he programado para que me informe dos veces al día:

Bash:
/system scheduler
add interval=12h name=vpn-check on-event=vpn-check \
policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
start-date=jul/05/2021 start-time=10:00:00

Espero que os guste!
 
Última edición:
Script para generar ficheros de backup (.rsc y .backup) y enviar por email a nuestra cuenta. Se puede programar en "scheduler" con la frecuencia que deseemos.

Bash:
:local sysname [/system identity get name]
:local textfilename
:local backupfilename
:local time [/system clock get time]
:local date [/system clock get date]
:local newdate "";
:for i from=0 to=([:len $date]-1) do={ :local tmp [:pick $date $i];
:if ($tmp !="/") do={ :set newdate "$newdate$tmp" }
:if ($tmp ="/") do={}
}
#check for spaces in system identity to replace with underscores
:if ([:find $sysname " "] !=0) do={
:local name $sysname;
:local newname "";
:for i from=0 to=([:len $name]-1) do={ :local tmp [:pick $name $i];
:if ($tmp !=" ") do={ :set newname "$newname$tmp" }
:if ($tmp =" ") do={ :set newname "$newname_" }
}
:set sysname $newname;
}
:set textfilename ($"newdate" . "-" . $"sysname" . ".rsc")
:set backupfilename ($"newdate" . "-" . $"sysname" . ".backup")
:execute [/export file=$"textfilename"]
:execute [/system backup save name=$"backupfilename"]

#Allow time for export to complete
:delay 2s
 
#email copies
:log info "Se han enviado correos de backups"

# START Send Email Module for .RSC
    :local SendTo "destinatario@gmail.com";
    :local Subject "\F0\9F\92\BE [Config Backup] $sysname $time";
    :local MessageText "Realizado backup tipo *.rsc";
    :local FileName "$textfilename";
    :local SendEmail [:parse [/system script get SendEmailFunction source]];
    $SendEmail SendTo=$SendTo TextMail=$MessageText Subject=$Subject FileName=$FileName;
# END Send Email Module for .RSC

#Send as different subjects to force GMail to treat as new message thread.
:local time [/system clock get time]
:delay 2s

# START Send Email Module for .BACKUP
    :local SendTo "destinatario@gmail.com";
    :local Subject "\F0\9F\92\BE [Config Backup] $sysname $time";
    :local MessageText "Realizado backup *.backup";
    :local FileName "$backupfilename";
    :local SendEmail [:parse [/system script get SendEmailFunction source]];
    $SendEmail SendTo=$SendTo TextMail=$MessageText Subject=$Subject FileName=$FileName;
# END Send Email Module for .BACKUP

#Allow time to send
:delay 10s
 
#delete copies
/file remove $textfilename
/file remove $backupfilename

# START Send Telegram Module
    :local DeviceName [/system identity get name];
    :local MessageText "\F0\9F\92\BE <b>$DeviceName:</b> Config Backups OK $TelegramMessageText";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
#END Send Telegram Module

Y para "rizar el rizo" los correos adjuntos que cumpla alguna condición en GMAIL podemos guardarlos automáticamente en Google Drive y de esta forma los tendremos a buen recaudo. Yo los almaceno durante 30 días y luego los borro una vez que empieza el nuevo mes.

Tenéis la info del proceso aquí: https://www.solvetic.com/tutoriales/article/1661-guardar-correos-gmail-automaticamente-google-drive/

S@lu2!
 
Última edición:
Tengo esta duda sobre el uso de variables en los scripts.

¿Se puede invocar el valor de un campo por medio de una variable directa del sistema sin necesidad de crear una manualmente?

Script SendEmailFunction por @diamuxin

# Módulo para utilizar una cuenta Gmail para enviar emails.​

# Variables
:local SendFrom "correo-remitente@gmail.com";
:local PasswordMail "MyStrongPassword";
:local SmtpServer 173.194.76.108;
:local UserName "Router MikroTik";
:local SmtpPort 587;
:local UseTLS "yes";

Ejemplo: En Tools -> Email Setting, si hemos configurado los valores de Server, Port Start TLS, etc... llamarlos directamente en los scripts sin tener que crear variables manuales para tal fin.

1628102319711.png


Saludos!
 
Arriba