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


Correcciones V7



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")

Crear lista en RAW:

/ip firewall raw
add action=drop chain=prerouting src-address-list=blacklist

Saludos!
 
Última edición:
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"
}
 
Última edición:
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
};
 
Ú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.

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

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];

# Envío por correo electrónico
# START Send Email
/tool e-mail send to="tucorreo@gmail.com" subject="\E2\84\B9 $DeviceName: log-mikrotik $data $hora" body="log-mikrotik $data $hora" file="log-mikrotik.txt";
# END Send Email
 
Última edición:
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


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

Bash:
:local ipv4 [/ip cloud get public-address];
:local ipv6 [/ip cloud get public-address-ipv6];
:local uptime [/system resource get uptime];
:local CurrentTemp [/system health get [find name=temperature] value];
:local FreeMemory ([/system resource get free-memory] / 1024 / 1024);
:local TotalMemory ([/system resource get total-memory] / 1024 / 1024);
: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] / 1024 / 1024);
:local totalHdd ([/system resource get total-hdd-space] /1024 / 1024);
: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
/tool e-mail send to="ginesidh@gmail.com" from="Mikrotik Despacho" subject="\F0\9F\9A\80 $DeviceName System Status" body="IPv4: $ipv4\nIPv6: $ipv6\n\nTemp: $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"
# END Send Email

# 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"


Editado 03/feb/2022: Nuevas funcionalidades. Colaborador: @jerogabe

Se ha mejorado el script original añadiendo la obtención de información en cuanto a la cantidad de tráfico acumulado en la interfaz WAN (ether1, pppoe-out1, etc) tanto en TX, RX y Consumo total.

Para ello creamos un nuevo script que genera una variable Global y procuramos que este script se ejecute al arranque del router para que siempre esté disponible para su llamada por parte de cualquier script.

Este script o "función" se va a encargar de convertir a las distintas unidades B, KiB, MiB, GiB. dependiendo del valor obtenido "en bytes" al ejecutar la instrucción: [/interface get [find name=pppoe-out1] tx-byte]. En este caso tendríamos una respuesta por ejemplo de 849029897 pero a través de la nueva función lo convertiría a 812.2 MiB, esto ya es otra cosa...

Bien, creamos el script y lo ejecutamos:

Bash:
:global human do={
    :if ([:typeof $1]="nothing") do={
        :error "must provide a byte value to humanize";
    };
    :local input [:tonum $1];
    :if ([:typeof $input]!="num") do={
        :error "cannot convert $1 to number";
    };
    :local q;
    :local r;
    :local output;
    :if ($input<1024) do={
        :set $output "$input B";
    } else={
        :if ($input<1048576) do={
            :set q ($input/1024);
            :set r ($input-$q*1024);
            :set r ($r/102);
            :set output "$q.$r KiB";
        } else={
            :if ($input<1073741824) do={
                :set q ($input/1048576);
                :set r ($input-$q*1048576);
                :set r ($r/104858);
                :set output "$q.$r MiB"
            } else={
                :set q ($input/1073741824);
                :set r ($input-$q*1073741824);
                :set r ($r/107374182);
                :set output "$q.$r GiB"
            }
        }
    }
    :return $output
};

Como vemos, ha creado una variable global llamada "human" (la puedes llamar como quieras), ya estaría disponible para su uso. Lo puedes comprobar en Winbox en System -> Scripts -> Pestaña Environment.

Ahora el script modificado.

Bash:
# Llamada a la nueva variable global
:global human

:local ipv4 [/ip cloud get public-address];
:local ipv6 [/ip cloud get public-address-ipv6];
:local uptime [/system resource get uptime];
:local CurrentTemp [/system health get [find name=temperature] value];
:local FreeMemory ([/system resource get free-memory] / 1024 / 1024);
:local TotalMemory ([/system resource get total-memory] / 1024 / 1024);
: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] / 1024 / 1024);
:local totalHdd ([/system resource get total-hdd-space] /1024 / 1024);
: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];
# nuevas variables
:local txtotal [$human [/interface get [find name=pppoe-out1] tx-byte]];
:local rxtotal [$human [/interface get [find name=pppoe-out1] rx-byte]];
:local sumtotal [$human ([/interface get pppoe-out1 tx-byte]+[/interface get pppoe-out1 rx-byte])];

# START Send Email
/tool e-mail send to="micuenta@gmail.com" from="Mikrotik Despacho" subject="\F0\9F\9A\80 $DeviceName System Status" body="IPv4: $ipv4\nIPv6: $ipv6\n\nTemp: $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\n\nConsumo total:\nDescarga: $rxtotal\nSubida: $txtotal\nTotal: $sumtotal"
# END Send Email

# 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%0A----%0A<b><i>Consumo total:</i></b>%0ADescarga: $rxtotal%0ASubida: $txtotal%0ATotal: $sumtotal";
: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"

Así quedaría, como veis las unidades las ha traducido para su comprensión, como lo haría Winbox.

o3RXnlEbnc.png
PLWF6Nzkmm.png


Gracias a @jerogabe por su aportación.

S@lu2.
 
Ú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;

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

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
    /tool e-mail send to="gtucuenta@gmail.com" subject="\F0\9F\94\93 Info Login: $DeviceName - $Date $Time" body="$EmailMessageText" file="";
    # 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;
 
Última edición:
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"

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

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
/tool e-mail send to="tucorreogmail@gmail.com" subject="\E2\84\B9 $DeviceName: DHCP Leases [$date - $time]" body="Total DHCP leases: $leasesall\n\nFirmware: $firmware\nRouterOS: $routeros\n\n$dhcplist" file="";
# END Send Email

/log info "DHCP Leases sent via email"
 
Última edición:
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";
    }

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

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={

    /tool e-mail send to="tucorreo@gmail.com" subject="Upgrade package available on router $DeviceName" body="Upgrade package RouterOS available on router $DeviceName from $[/system package update get installed-version] to $[/system package update get latest-version]";


    # 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 de forma manual.
# /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
    /tool e-mail send to="tucorreo@gmail.com" from="Mikrotik Despacho" subject="\E2\84\B9 $systemName: Actualizacion disponible" body="Se ha detectado una nueva actualización de firmware: $upgradeFirmware. Por favor, por seguridad actualice cuanto antes desde la versión actual $currentFirmware";
    # START Send Email

    # 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

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

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
/tool e-mail send to="tucorreo@gmail.com" subject="\F0\9F\9F\A0 $DeviceName. Tunel IKEv2 is Down" body="---" file="";
# END Send Email 

# 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
/tool e-mail send to="tucorreo@gmail.com" subject="\F0\9F\9F\A0 $DeviceName. Tunel IKEv2 is UP" body="---" file="";
# END Send Email 

# 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

}
}

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/

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

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 .RSC
/tool e-mail send to="destinatario@gmail.com" subject="\F0\9F\92\BE [Config Backup] $sysname $mydatetime" body="Backup realizado *.rsc" file="$textfilename";
# END Send Email .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 .BACKUP
/tool e-mail send to="destinatario@gmail.com" subject="\F0\9F\92\BE [Config Backup] $sysname $mydatetime" body="Backup realizado *.backup" file="$backupfilename";
# END Send Email .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

Editado 31/ene/2022: Envío de backups a servidor FTP

Bash:
# FTP Config
# Definición de variables
:local ftpserver "XXX.XXX.XXX.XXX" # Ip de tu servidor FTP
:local username "username"
:local password "MyS3cuR3P@ssWorD"
:local port 2132 # es aconsejable cambiar el puerto a otro menos conocido

# Sustituir los módulos Email por estos

# START Send .RSC to FTP Server
/tool fetch address=$ftpserver mode=ftp user=$username password=$password \
    src-path=$textfilename dst-path=$textfilename upload=yes port=$port;
:log info "Backup FTP: Enviado $textfilename via FTP"
# END Send .RSC to FTP Server

:delay 5s

# START Send .BACKUP to FTP Server
tool fetch address=$ftpserver mode=ftp user=$username password=$password \
    src-path=$backupfilename dst-path=$backupfilename upload=yes port=$port;
:log info "Backup FTP: Enviado $backupfilename via FTP"
# END Send .BACKUP to FTP Server
 
Ú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