MANUAL: Mikrotik, colección de scripting

Lo que quiero hacer es detectar y bloquear los intentos fallidos de acceso al router desde wan y lan.
He cambiado los puertos de los servicios www y winbox y desactivado Discovery Neighborts.

Saludos!
Desde la WAN no va a entrar ni cristo, que para eso tienes un "drop all not coming from LAN". Para la LAN, sí te vale. Y, para la LAN, ¿no la controlas tú? Porque es tan sencillo como que, si sólo quieres acceder desde un equipo concreto, le pongas la IP en IP -> Services -> Winbox. Y deshabilites el resto de accesos al router.

Saludos!
 
Entendido. Deshabilitaré la regla en IPv4 e IPv6 y sólo permitiré el acceso desde la ip del equipo habitual.
¿Haciendo esto ya no sería necesario cambiar los puertos de los servicios www y winbox?

Saludos!
 
Entendido. Deshabilitaré la regla en IPv4 e IPv6 y sólo permitiré el acceso desde la ip del equipo habitual.
¿Haciendo esto ya no sería necesario cambiar los puertos de los servicios www y winbox?

Saludos!
Diría que no.

Saludos!
 
Buenos días,
novato al aparato... intento actualizar el ddns de duckdns y tengo este script de este mismo post

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 "miduckinventado.duckdns.org"

# Poned aquí el token que nos da duckdns para nuestra cuenta, ejemplo:
:global token "mitokendelosguevos"
# 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);};
};
Además he añadido el programador pero no veo ninguna inforamción en el log del Mkt ac2 con stable 7.1.1 que uso. Lo debería ver ?? Es que no sé si funciona el script o no.
Grcs.
 
Buenos días,
novato al aparato... intento actualizar el ddns de duckdns y tengo este script de este mismo post

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 "miduckinventado.duckdns.org"

# Poned aquí el token que nos da duckdns para nuestra cuenta, ejemplo:
:global token "mitokendelosguevos"
# 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);};
};
Además he añadido el programador pero no veo ninguna inforamción en el log del Mkt ac2 con stable 7.1.1 que uso. Lo debería ver ?? Es que no sé si funciona el script o no.
Grcs.
Hola,
me autorepondo por si es de ayuda a otro novato. Funciona sustituyendo (como no podía ser de otra manera) los nombres entrecomillas por los nombres correctos. En mi caso con tan sólo reemplazar:
Código:
:global wanInterface "internet"
 
Hola,

Os paso otra opción para guardar los respaldos automáticos de nuestros Mikrotik en un servidor FTP.

He actualizado el hilo original de backups.
https://www.adslzone.net/foro/mikrotik.199/manual-mikrotik-coleccion-scripting.575217/#post-3581904

Llevo varios días usándolo y la verdad es que funciona muy bien y así quedan los respaldos a buen recaudo.

Bash:
# 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

Lo único a tener en cuenta es que Mikrotik no tiene implementado en RouterOS el envío cifrado tipo "FTP explicito sobre TLS" pero si tu servidor FTP está en tu misma LAN (por ejemplo en un NAS o Raspberry Pi) no pasa nada por enviar los datos en formato plano.

1643665852481.png


S@lu2.
 
Hola,

Os paso otra opción para guardar los respaldos automáticos de nuestros Mikrotik en un servidor FTP.

He actualizado el hilo original de backups.
https://www.adslzone.net/foro/mikrotik.199/manual-mikrotik-coleccion-scripting.575217/#post-3581904

Llevo varios días usándolo y la verdad es que funciona muy bien y así quedan los respaldos a buen recaudo.

Bash:
# 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

Lo único a tener en cuenta es que Mikrotik no tiene implementado en RouterOS el envío cifrado tipo "FTP explicito sobre TLS" pero si tu servidor FTP está en tu misma LAN (por ejemplo en un NAS o Raspberry Pi) no pasa nada por enviar los datos en formato plano.

Ver el adjunto 91452

S@lu2.
Qué chulo! Te propongo una mejora: en lugar de trabajar con usuario y contraseña, hacer lo mismo con un par se claves ssh. Seguro que se puede, porque se puede subir clave privada y asociarla, por ejemplo, a un usuario de backup específico. Luego, con instalar la parte pública en el servidor ftp, ya tendríamos un login seguro y sin contraseñas de por medio.

Saludos!
 
Qué chulo! Te propongo una mejora: en lugar de trabajar con usuario y contraseña, hacer lo mismo con un par se claves ssh. Seguro que se puede, porque se puede subir clave privada y asociarla, por ejemplo, a un usuario de backup específico. Luego, con instalar la parte pública en el servidor ftp, ya tendríamos un login seguro y sin contraseñas de por medio.

Saludos!
Interesante! lo voy a estudiar a ver lo que se puede hacer, aunque en principio lo tengo complicado ya que utilizo el servidor FTP que lleva embebido el DSM mi NAS Synology y veo que tiene poca configuración.

Bueno, rectifico, el servidor si admite trabajar con SFTP pero el "fetch" de RouterOS no, como ves en la imagen anterior (la vuelvo a poner), te deja pocas opciones.

1643670701333.png


S@lu2.
 
Última edición:
Interesante! lo voy a estudiar a ver lo que se puede hacer, aunque en principio lo tengo complicado ya que utilizo el servidor FTP que lleva embebido el DSM mi NAS Synology y veo que tiene poca configuración.

Bueno, rectifico, el servidor si admite trabajar con SFTP pero el "fetch" de RouterOS no, como ves en la imagen anterior (la vuelvo a poner), te deja pocas opciones.

Ver el adjunto 91467

S@lu2.
Déjame que le eche un vistazo, me suena que añadieron soporte sftp al /tool fetch en algún momento.
Con respecto al ftp en el NAS, problema cero. Tengo un Synology y lo he estado usando por sftp mucho tiempo. Sólo necesitas instalar la clave pública en tu usuario, accediendo por ssh al NAS y mediante la instrucción “ssh-copy-id”, que instalará la clave pública en la máquina que le digas.

Lo dicho, déjame que lo pruebe, y te digo.

Saludos!
 
Déjame que le eche un vistazo, me suena que añadieron soporte sftp al /tool fetch en algún momento.
Con respecto al ftp en el NAS, problema cero. Tengo un Synology y lo he estado usando por sftp mucho tiempo. Sólo necesitas instalar la clave pública en tu usuario, accediendo por ssh al NAS y mediante la instrucción “ssh-copy-id”, que instalará la clave pública en la máquina que le digas.

Lo dicho, déjame que lo pruebe, y te digo.

Saludos!
He buscado información para los envíos vía SFTP y entiendo que debería ser así, ¿cómo lo ves?

Bash:
# SFTP Config
:local ftpserver "192.168.88.247" # NAS Synology IP
:local pathserver "volume1/backup"
:local username "mikrotik"
:local password "mikrotik"
:local port 99
:local textfilename ""

# Send file to SFTP Server
tool fetch upload=yes url="sftp://$ftpserver/$pathserver/$textfilename" \
user=$username password=$password src-path="/$textfilename" port=$port

Hasta aquí lo he probado y en principio va bien.

Lo que no me queda claro es el tema de las claves SSH.
Esto es lo que he hecho en el NAS para probar:

1. He creado el usuario "mikrotik" para que trabaje exclusivamente en la carpeta "volume1/backup" y lo he añadido al grupo de administradores.
2. Le he dado permisos para que trabaje con las aplicaciones FTP (p2132) y SFTP (p99).
3. En File Station he creado la carpeta /homes/mikrotik/.ssh
4. Accedo por SSH al NAS y ejecuto dentro de esa carpeta el comando: ssh-keygen -t rsa para generar las claves pública y privada.
5. Copio la clave pública a un nuevo fichero:
Código:
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
6. Aplico los permisos necesarios a carpetas y ficheros para que funcione:
Código:
chmod 0711 ~/.ssh
chmod 0600 ~/.ssh/authorized_keys
chmod 0711 ~
7. En Mikrotik copio la clave generada en el NAS id_rsa.pub a Files.
8. En la terminal de MIkrotik:
Código:
/user ssh-keys import public-key-file=id_rsa.pub

Y hasta aquí he llegado, si ejecuto el comando con user+password sí funciona.

Código:
tool fetch upload=yes url="sftp://$ftpserver/$pathserver/$textfilename" \
user=$username password=$password src-path="/$textfilename" port=$port

Pero si intento hacerlo sin password, el router se queda bloqueado un par de minutos

Código:
tool fetch upload=yes url="sftp://$ftpserver/$pathserver/$textfilename" \
user=$username src-path="/$textfilename" port=$port

S@lu2.
 
Lo estás haciendo al revés. Las claves genéralas fuera, en tu máquina, de la siguiente manera:
Código:
ssh-keygen -t rsa -b 4096 -m PEM -C mikrotik -f mikrotik

Y al mikrotik subirías la clave privada, en el apartado Users -> SSH Private Keys, asociado a un usuario "mikrotik" que crees en el router, sólo para eso.

Y, para instalarla en el NAS, una vez tengas el usuario "mikrotik" creado en él y tengas acceso con usuario y contraseña vía SSH, haces un ssh-copy-id -i fichero_clave_privada mikrotik@minas.lan. Esto creará automáticamente la carpeta .ssh dentro del home del usuario "mikrotik" y creará el fichero "authorized_keys" con la clave pública asociada a dicha clave privada.

Lo que me queda ver es cómo narices le dices al /tool fetch que vas con login por claves, en lugar de por usuario y contraseña.

Sorry, que he tenido un día horrible y no me ha dado ni para probar.

Saludos!
 
Dejo por aquí un script hecho por el compañero del foro @diamuxin que he traducido y añadido también el script de consumo de megas, el modulo de telegram hay que usar el mismo, creado por el posteado unas paginas mas atras.
Pd si molesta lo borro sin problemas.

Para equipos con monitor de temperatura y voltaje:

Código:
/system script
add dont-require-permissions=yes name=MK-STATUS owner=jero policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":local ipv4 [/ip cloud get public-address];\r\
    \n:local ipv6 [/ip cloud get public-address-ipv6];\r\
    \n:local uptime [/system resource get uptime];\r\
    \n:local CurrentTemp [/system health get [find name=temperature] value];\r\
    \n:local systemvolt [/system health get [find name=voltage] value]\r\
    \n:local FreeMemory ([/system resource get free-memory] / 1024 / 1024);\r\
    \n:local TotalMemory ([/system resource get total-memory] / 1024 / 1024);\r\
    \n:local cpu [/system resource get cpu];\r\
    \n:local cpuCount [/system resource get cpu-count];\r\
    \n:local cpuFrequency [/system resource get cpu-frequency];\r\
    \n:local cpuLoad [/system resource get cpu-load];\r\
    \n:local freeHdd ([/system resource get free-hdd-space] / 1024 / 1024);\r\
    \n:local totalHdd ([/system resource get total-hdd-space] /1024 / 1024);\r\
    \n:local architectureName [/system resource get architecture-name];\r\
    \n:local boardName [/system resource get board-name];\r\
    \n:local version [/system resource get version];\r\
    \n:local DeviceName [/system identity get name];\r\
    \n:local txtotal (([/interface get [find name=ether1] tx-byte])/1073741824);\r\
    \n:local rxtotal (([/interface get [find name=ether1] rx-byte])/1073741824);\r\
    \n\r\
    \n# START Send Telegram Module\r\
    \n:local MessageText \"ESTADO DEL SISTEMA: <b>\$DeviceName</b> %0A%0AIPv4: \$ipv4%0AIPv6: \$ipv6%0ATemperatura: \$CurrentTemp %C2%B0 C%0AVoltaje: \$systemvolt V%0ATiempo encendido: \$uptim\
    e%0AMemoria RAM total: \$TotalMemory MB%0AMemoria RAM libre: \$FreeMemory MB%0ACarga del CPU: \$cpuLoad %%0ACPU: \$cpu%0ANucleos disponibles: \$cpuCount%0AFrecuencia del CPU: \$cpuFrequenc\
    y MHz%0AArquitectura: \$architectureName%0AModelo: \$boardName%0AVersion de RouterOS: \$version%0AHHD total: \$totalHdd MB%0AHDD libre: \$freeHdd MB%0A<b><i>%0AConsumo total:</i></b>%0ADes\
    carga : \$rxtotal GBs%0ASubida : \$txtotal GBs%0ATotal : \$(txtotal+rxtotal) GBs\";\r\
    \n:local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];\r\
    \n\$SendTelegramMessage MessageText=\$MessageText;\r\
    \n#END Send Telegram Module\r\
    \n\r\
    \n} "

Para equipos sin sensores.


Código:
/system script
add dont-require-permissions=yes name=MK-STATUS owner=jero policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":local ipv4 [/ip cloud get public-address];\r\
    \n:local ipv6 [/ip cloud get public-address-ipv6];\r\
    \n:local uptime [/system resource get uptime];\r\
    \n# :local CurrentTemp [/system health get [find name=temperature] value];\r\
    \n# :local systemvolt [/system health get [find name=voltage] value]\r\
    \n:local FreeMemory ([/system resource get free-memory] / 1024 / 1024);\r\
    \n:local TotalMemory ([/system resource get total-memory] / 1024 / 1024);\r\
    \n:local cpu [/system resource get cpu];\r\
    \n:local cpuCount [/system resource get cpu-count];\r\
    \n:local cpuFrequency [/system resource get cpu-frequency];\r\
    \n:local cpuLoad [/system resource get cpu-load];\r\
    \n:local freeHdd ([/system resource get free-hdd-space] / 1024 / 1024);\r\
    \n:local totalHdd ([/system resource get total-hdd-space] /1024 / 1024);\r\
    \n:local architectureName [/system resource get architecture-name];\r\
    \n:local boardName [/system resource get board-name];\r\
    \n:local version [/system resource get version];\r\
    \n:local DeviceName [/system identity get name];\r\
    \n:local txtotal (([/interface get [find name=ether1] tx-byte])/1073741824);\r\
    \n:local rxtotal (([/interface get [find name=ether1] rx-byte])/1073741824);\r\
    \n\r\
    \n# START Send Telegram Module\r\
    \n:local MessageText \"ESTADO DEL SISTEMA: <b>\$DeviceName</b> %0A%0AIPv4: \$ipv4%0AIPv6: \$ipv6%0ATemperatura: \$CurrentTemp %C2%B0 C%0AVoltaje: \$systemvolt V%0ATiempo encendido: \$uptim\
    e%0AMemoria RAM total: \$TotalMemory MB%0AMemoria RAM libre: \$FreeMemory MB%0ACarga del CPU: \$cpuLoad %%0ACPU: \$cpu%0ANucleos disponibles: \$cpuCount%0AFrecuencia del CPU: \$cpuFrequenc\
    y MHz%0AArquitectura: \$architectureName%0AModelo: \$boardName%0AVersion de RouterOS: \$version%0AHHD total: \$totalHdd MB%0AHDD libre: \$freeHdd MB%0A<b><i>%0AConsumo total:</i></b>%0ADes\
    carga : \$rxtotal GBs%0ASubida : \$txtotal GBs%0ATotal : \$(txtotal+rxtotal) GBs\";\r\
    \n:local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];\r\
    \n\$SendTelegramMessage MessageText=\$MessageText;\r\
    \n#END Send Telegram Module\r\
    \n\r\
    \n}"
 

Adjuntos

  • Screenshot_20220202-234454_Telegram.jpg
    Screenshot_20220202-234454_Telegram.jpg
    487.7 KB · Visitas: 122
  • Screenshot_20220202-234545_Telegram.jpg
    Screenshot_20220202-234545_Telegram.jpg
    495.2 KB · Visitas: 122
Última edición:
Dejo por aquí un script hecho por el compañero del foro @diamuxin que he traducido y añadido también el script de consumo de megas, el modulo de telegram hay que usar el mismo, creado por el posteado unas paginas mas atras.
Pd si molesta lo borro sin problemas.
Hola @jerogabe, no molesta para nada hombre, cualquier mejora en los scripts es bienvenida.

La verdad es que los scripts dan mucho juego!

S@lu2.
 
Por cierto @jerogabe, la parte para obtener el tráfico totalizado de la interfaz WAN está genial, pero sólo cuando los valores están >1 GiB (por el filtro que le pones para convertir los bytes a GiB: /1073741824). Cuando el valor del tráfico < 1 GiB el resultado que te da = "0".

Lo he probado con un router que tiene mucho tráfico y sin problema pero con otro router que tiene poco tráfico los valores que me reporta son "cero".

Lo ideal sería implementar una función que te permita convertir esas variables a valores "entendibles" por cualquiera, independientemente del resultado obtenido con el "/interface get".

Algo así:

Código:
:local rxtotal (([/interface get [find name=ether1] rx-byte])/1073741824)
Si rxtotal < 1024 entonces resultado = $rxtotal B
Si rxtotal < 1048576 entonces resultado = $rxtotal KiB
Si rxtotal < 1073741824 entonces resultado = $rxtotal MiB
Si rxtotal > 1073741824 entonces resultado = $rxtotal GiB

Sería muy interesante ya que esa "función" valdría para cualquier script que necesitáramos trabajar con esos parámetros de velocidad o almacenamiento. ¿Quién se anima?

S@lu2.
 
Última edición:
Por cierto @jerogabe, la parte para obtener el tráfico totalizado de la interfaz WAN está genial, pero sólo cuando los valores están >1 GiB (por el filtro que le pones para convertir los bytes a GiB: /1073741824). Cuando el valor del tráfico < 1 GiB el resultado que te da = "0".

Lo he probado con un router que tiene mucho tráfico y sin problema pero con otro router que tiene poco tráfico los valores que me reporta son "cero".

Lo ideal sería implementar una función que te permita convertir esas variables a valores "entendibles" por cualquiera, independientemente del resultado obtenido con el "/interface get".

Algo así:

Código:
:local rxtotal (([/interface get [find name=ether1] rx-byte])/1073741824)
Si rxtotal < 1024 entonces resultado = $rxtotal B
Si rxtotal < 1048576 entonces resultado = $rxtotal KiB
Si rxtotal < 1073741824 entonces resultado = $rxtotal MiB
Si rxtotal > 1073741824 entonces resultado = $rxtotal GiB

Sería muy interesante ya que esa "función" valdría para cualquier script que necesitáramos trabajar con esos parámetros de velocidad o almacenamiento. ¿Quién se anima?

S@lu2.
Si, llevas razón, pero lo dejé así ya que por norma en cualquier router con que le conectes un par de móviles o una Smart TV en un rato ya pasas del giga.
Si te fijas en mi primera captura que es el tengo en casa en un par de días 180 gigas
 
Si, llevas razón, pero lo dejé así ya que por norma en cualquier router con que le conectes un par de móviles o una Smart TV en un rato ya pasas del giga.
Si te fijas en mi primera captura que es el tengo en casa en un par de días 180 gigas
Bueno, al final no se ha hecho esperar la modificación que buscaba.

Con tu permiso, se ha mejorado la parte que añadiste al script para que las cantidades de tráfico consumido se cuantifique y convierta automáticamente a KiB, MiB, GiB, etc. Se incluye las instrucciones para su configuración.

He actualizado el post original del script con las nuevas funciones.
https://www.adslzone.net/foro/mikrotik.199/manual-mikrotik-coleccion-scripting.575217/#post-3581628

Gracias por tu aportación.

S@lu2.
 
Bueno, al final no se ha hecho esperar la modificación que buscaba.

Con tu permiso, se ha mejorado la parte que añadiste al script para que las cantidades de tráfico consumido se cuantifique y convierta automáticamente a KiB, MiB, GiB, etc. Se incluye las instrucciones para su configuración.

He actualizado el post original del script con las nuevas funciones.
https://www.adslzone.net/foro/mikrotik.199/manual-mikrotik-coleccion-scripting.575217/#post-3581628

Gracias por tu aportación.

S@lu2.
Gracias a ti y al compañero @pokoyo por el currazo que se pegáis!!
 
Bueno, al final no se ha hecho esperar la modificación que buscaba.

Con tu permiso, se ha mejorado la parte que añadiste al script para que las cantidades de tráfico consumido se cuantifique y convierta automáticamente a KiB, MiB, GiB, etc. Se incluye las instrucciones para su configuración.

He actualizado el post original del script con las nuevas funciones.
https://www.adslzone.net/foro/mikrotik.199/manual-mikrotik-coleccion-scripting.575217/#post-3581628

Gracias por tu aportación.

S@lu2.
Mil gracias.
 

Adjuntos

  • Screenshot_2022-02-04-07-49-01-53_74594bd74a0419242537a8d02ba17993.jpg
    Screenshot_2022-02-04-07-49-01-53_74594bd74a0419242537a8d02ba17993.jpg
    289.5 KB · Visitas: 82
Ahora que se acerca una ola de calor de las potentes, os paso este sencillo script para avisarnos por Telegram en el momento que el router alcance el umbral de temperatura que configuremos. *Importante, sólo funcionará en aquellos Mikrotiks que dispongan de sonda de temperatura.

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

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

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

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

Nos avisará de esta forma:

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

Otro script similar:

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

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

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

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

Resultado:

Ver el adjunto 85188

S@lu2.
Hola,
Estoy intentando modificar este script para que el aviso me llegue por mail.
He hecho esto pero no funciona, ¿qué estoy haciendo mal? Gracias!!

Código:
:global tempSystem [/system health get temperature]
:local DeviceName [/system identity get name]
:local tempMax "30";

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

# START Send Email Module
:local SendTo "destino@mail.com";
:local Subject "\E2\9A\A0 <b>Router Mikrotik $DeviceName</b>%0AAlerta Temperatura ALTA: $tempSystem C";
:local MessageText "Temperatura: $CurrentTemp";
:local FileName "";
:local SendEmail [:parse [/system script get SendEmailFunction source]];
$SendEmail SendTo=$SendTo TextMail=$MessageText Subject=$Subject FileName=$FileName;
# END Send Email Module

} else={
:log warning "La temperatura está dentro de los valores normales: $tempSystem ºC"
}
 
Hola,
Estoy intentando modificar este script para que el aviso me llegue por mail.
He hecho esto pero no funciona, ¿qué estoy haciendo mal? Gracias!!

Código:
:global tempSystem [/system health get temperature]
:local DeviceName [/system identity get name]
:local tempMax "30";

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

# START Send Email Module
:local SendTo "destino@mail.com";
:local Subject "\E2\9A\A0 <b>Router Mikrotik $DeviceName</b>%0AAlerta Temperatura ALTA: $tempSystem C";
:local MessageText "Temperatura: $CurrentTemp";
:local FileName "";
:local SendEmail [:parse [/system script get SendEmailFunction source]];
$SendEmail SendTo=$SendTo TextMail=$MessageText Subject=$Subject FileName=$FileName;
# END Send Email Module

} else={
:log warning "La temperatura está dentro de los valores normales: $tempSystem ºC"
}
Que versión de RouterOS tienes?

Edito: veo que estás mezclando scripts, es imposible que te funcione si llamas a una variable que no está declarada.

Pruébalo así:

Código:
:global tempSystem [/system health get temperature]
# Para versiones de RouterOS >7.0 anular la anterior línea por la siguiente
# :global tempSystem [/system health get [find name=temperature] value]
:local DeviceName [/system identity get name]
:local tempMax "30";

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

# START Send Email
/tool e-mail send to="destinatario@gmail.com" subject="\E2\9A\A0 Router Mikrotik $DeviceName: Alerta de temperatura" body="Temperatura alta: $tempSystem";
# END Send Email

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

S@lu2.
 
Última edición:
Arriba