MANUAL: Mikrotik, colección de scripting

Buenas! Estoy intentando hacer funcionar el script de backup automática al cloud. He estado probando en 2 routers distintos y al ejecutar el comando:

Código:
/system backup cloud upload-file action=create-and-upload passw
ord=MyPass

Me da error: failure: Server error: backend error

¿Hay que hacer algo para que funcionen las copias de seguridad a la nube o están fallando los servidores de Mikrotik?

Saludos!
 
Buenas! Estoy intentando hacer funcionar el script de backup automática al cloud. He estado probando en 2 routers distintos y al ejecutar el comando:

Código:
/system backup cloud upload-file action=create-and-upload passw
ord=MyPass

Me da error: failure: Server error: backend error

¿Hay que hacer algo para que funcionen las copias de seguridad a la nube o están fallando los servidores de Mikrotik?

Saludos!
Muy buenas,

Anoche se hicieron las copias bien, ahora están fallando:

Código:
/system backup cloud
upload-file action=create-and-upload password=myPasswSecure replace=[find name]

status: Server error: backend error

S@lu2.
 
Sigue dándome guerra las 2/3 veces que lo he probado estos días. Seguiré intentándolo, pero no sé hasta que punto tiene valor un backup si no puedo acceder a él.
 
Sigue dándome guerra las 2/3 veces que lo he probado estos días. Seguiré intentándolo, pero no sé hasta que punto tiene valor un backup si no puedo acceder a él.
Si, sigue dando problemas, yo lo tengo automático y veo que lo hace un día sí y luego 3 días no y asi.

No me preocupa mucho porque lo hago también en .rsc y .backup con un script y los vuelca a un servidor FTP.

S@lu2.
 
Me he tomado la libertad de modificar el script que mantiene actualizada la dirección IP de nuestros cacharros en DuckDNS de @pokoyo para que también nos mantenga actualizada la dirección IPv6 en caso que dispongamos de la misma.
Lo he hecho por si a alguien le interesa y le sirve de ayuda.

Por supuesto, esto tan sólo es una modificación del script, el reconocimiento total del mismo es para @pokoyo

Bueno, vamos a lo que es el código en si mismo, se han modificado algunos comentarios originales para aportar información que creo relevante para entender ciertas modificaciones.

Código:
###########################################
# Actualizar la dirección IPv6 en DuckDNS #
###########################################

# Modificad las siguientes dos asignaciones de variables, relativas a el dominio y el token, con vuestros datos. Se cambia lo que va entrecomillado.
# Nótese que se modifican ciertas variables para que no coincidan con las del script para la dirección IPv4. Sino se hace así daría error por ser variables globales.


# Poned aquí el dominio duckdns que queramos mantener actualizado, ejemplo:
:global domain "pericoeldelospalotes.duckdns.org"
# Nota: Si queremos actualizar más de un dominio también lo declaramos, ejemplo:
# :global domain2 "parapericoeldelospalotes.duckdns.org"
# :global domain3 "depericoeldelospalotes.duckdns.org"
# etc.
 

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

# Inicio del Script
:local actualIPv6 [/ip cloud get public-address-ipv6];
:global actualIPv6 value=[$actualIPv6 value-name=address];
:global actualIPv6 value=[:pick $actualIPv6 -1 [:find $actualIPv6 "/" -1] ];
:if ([:len [/file find where name=ipstorev6.txt]] < 1 ) do={
/file print file=ipstorev6.txt where name=ipstorev6.txt;
/delay delay-time=2;
/file set ipstorev6.txt contents="0.0.0.0";
};
:global previousIPv6 value=[/file get [find where name=ipstorev6.txt ] value-name=contents];
:if ($previousIPv6 != $actualIPv6) do={
:log info message=("Intentando actualizar DuckDNS con la IP actual ".$actualIPv6." -  La IP previa era ".$previousIPv6);
/tool fetch mode=https keep-result=yes dst-path=duckdns-resultv6.txt address=[:resolve www.duckdns.org] port=443 host=www.duckdns.org src-path=("/update?domains=$domain&token=$token&ipv6=".$actualIPv6);
# Nota: Si queremos actualizar más de un dominio también lo enviamos para que se actualice, ejemplo:
# /tool fetch mode=https keep-result=yes dst-path=duckdns-resultv6.txt address=[:resolve www.duckdns.org] port=443 host=www.duckdns.org src-path=("/update?domains=$domain2&token=$token&ipv6=".$actualIPv6);
# /tool fetch mode=https keep-result=yes dst-path=duckdns-resultv6.txt address=[:resolve www.duckdns.org] port=443 host=www.duckdns.org src-path=("/update?domains=$domain3&token=$token&ipv6=".$actualIPv6);
# etc.
/delay delay-time=5;
:global lastChangev6 value=[/file get [find where name=duckdns-resultv6.txt ] value-name=contents];
:global previousIPv6 value=$actualIPv6;
/file set ipstorev6.txt contents=$actualIPv6;
:if ($lastChangev6 = "OK") do={:log warning message=("DuckDNS actualizado correctamente con la IP ".$actualIPv6);};
:if ($lastChangev6 = "KO") do={:log error message=("Fallo al actualizar DuckDNS con la nueva IP ".$actualIPv6);};
};


Lo programamos para que se mantenga actualizado:
Código:
# Programar la ejecución automática del script
/system scheduler
add interval=30m name=duckduns-updater-ipv6 on-event=duckdns-update-ipv6 policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=jan/15/2023 \
    start-time=00:00:00

Un saludo.
 
Última edición:
Me he tomado la libertad de modificar el script que mantiene actualizada la dirección IP de nuestros cacharros en DuckDNS de @pokoyo para que también nos mantenga actualizada la dirección IPv6 en caso que dispongamos de la misma.
Lo he hecho por si a alguien le interesa y le sirve de ayuda.

Por supuesto, esto tan sólo es una modificación del script, el reconocimiento total del mismo es para @pokoyo

Bueno, vamos a lo que es el código en si mismo, se han modificado algunos comentarios originales para aportar información que creo relevante para entender ciertas modificaciones.

Código:
###########################################
# Actualizar la dirección IPv6 en DuckDNS #
###########################################

# 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.
# Nótese que se modifican ciertas variables para que no coincidan con las del script para la dirección IPv4. Sino se hace así daría error por ser variables globales.

# Poned aquí la interfaz por la que te conectas a internet.
# En mi caso difiere de la interfaz para IPv4, si ponía la misma no funcionaba el script y no se actualizaba en DuckDNS.
# Ejemplo:
:global wanInterface "vlan20-internet"

# Poned aquí el dominio duckdns que queramos mantener actualizado, ejemplo:
:global domain "pericoeldelospalotes.duckdns.org"
# Nota: Si queremos actualizar más de un dominio también lo declaramos, ejemplo:
# :global domain2 "parapericoeldelospalotes.duckdns.org"
# :global domain3 "depericoeldelospalotes.duckdns.org"
# etc.


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

# Inicio del Script
:global actualIPv6 value=[/ip address get [find where interface=$wanInterface] value-name=address];
:global actualIPv6 value=[:pick $actualIPv6 -1 [:find $actualIPv6 "/" -1] ];
:if ([:len [/file find where name=ipstorev6.txt]] < 1 ) do={
/file print file=ipstorev6.txt where name=ipstorev6.txt;
/delay delay-time=2;
/file set ipstorev6.txt contents="0.0.0.0";
};
:global previousIPv6 value=[/file get [find where name=ipstorev6.txt ] value-name=contents];
:if ($previousIPv6 != $actualIPv6) do={
:log info message=("Intentando actualizar DuckDNS con la IP actual ".$actualIPv6." -  La IP previa era ".$previousIPv6);
/tool fetch mode=https keep-result=yes dst-path=duckdns-resultv6.txt address=[:resolve www.duckdns.org] port=443 host=www.duckdns.org src-path=("/update?domains=$domain&token=$token&ipv6=".$actualIPv6);
# Nota: Si queremos actualizar más de un dominio también lo enviamos para que se actualice, ejemplo:
# /tool fetch mode=https keep-result=yes dst-path=duckdns-resultv6.txt address=[:resolve www.duckdns.org] port=443 host=www.duckdns.org src-path=("/update?domains=$domain2&token=$token&ipv6=".$actualIPv6);
# /tool fetch mode=https keep-result=yes dst-path=duckdns-resultv6.txt address=[:resolve www.duckdns.org] port=443 host=www.duckdns.org src-path=("/update?domains=$domain3&token=$token&ipv6=".$actualIPv6);
# etc.
/delay delay-time=5;
:global lastChangev6 value=[/file get [find where name=duckdns-resultv6.txt ] value-name=contents];
:global previousIPv6 value=$actualIPv6;
/file set ipstorev6.txt contents=$actualIPv6;
:if ($lastChangev6 = "OK") do={:log warning message=("DuckDNS actualizado correctamente con la IP ".$actualIPv6);};
:if ($lastChangev6 = "KO") do={:log error message=("Fallo al actualizar DuckDNS con la nueva IP ".$actualIPv6);};
};


Lo programamos para que se mantenga actualizado:
Código:
# Programar la ejecución automática del script
/system scheduler
add interval=30m name=duckduns-updater-ipv6 on-event=duckdns-update-ipv6 policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=jan/15/2023 \
    start-time=00:00:00

Un saludo.
Ahora lo actualizo en la primera página. Gracias!

Saludos!
 
He realizado unas pequeñas modificaciones en el script que actualiza la dirección IPv6 en DuckDNS puesto que alguna vez no se ejecutaba correctamente.
Ya lo he dejado corregido en el post.

En concreto:
1.- Se ha eliminado la variable
Código:
:global wanInterface "vlan20-internet"
2.- Se ha sustituido por lo siguiente:
Código:
:local actualIPv6 [/ip cloud get public-address-ipv6];
:global actualIPv6 value=[$actualIPv6 value-name=address];

Lo he estado probando durante una semana comprobando que de esta forma funciona correctamente sin los problemas que me daba antes.

Un saludo.
 
Algo se me está escapando en la configuración del scheduler... No veo nada raro y el script a ejecutar funciona manualmente, pero el scheduler no funciona... ver si vosotros encuentra el error...

script.jpg
schedule.jpg
 
Buenas,
A mi me paso también y al final es que necesita tener una primera copia de seguridad con la clave que le pongas para que el pueda hacer las copias todos los días. Así pues haz tu una primera copia desde files-cloud backup y con la clave que tengas. Y ya nos cuentas.
Saludos,
 
Hola,

no puedo enviar mails desde hace un tiempo.

1675523892618.png


Siempre obtengo:
1675523996648.png


Cualquier ayuda será bienvenida. Gracias.
 
Hola,

no puedo enviar mails desde hace un tiempo.

Ver el adjunto 103737

Siempre obtengo:
Ver el adjunto 103740

Cualquier ayuda será bienvenida. Gracias.
Probablemente tu servicio de correo haya implementado medidas de seguridad avanzadas que impidan que uses una combinación de usuario/password como autenticación. En google, por ejemplo, tienes que habilitar este acceso como una contraseña de aplicación, aparate de tu credencial de correo, aplicando sobre ella una seguridad más laxa que le permita acceso a usar SMTP.

Saludos!
 
Buenas,
A mi me paso también y al final es que necesita tener una primera copia de seguridad con la clave que le pongas para que el pueda hacer las copias todos los días. Así pues haz tu una primera copia desde files-cloud backup y con la clave que tengas. Y ya nos cuentas.
Saludos,
Solucionado! esta noche ya ha funcionado como por milagro... lo único hecho, lo que comenta el compañero, lanzar los comandos en terminal manualmente.
 
hola!!!!

Sabeis de algun script q funcione para actualizar las ddns en cloudflare? me extraña q no lo tengais por aqui!!!!

muchas gracias a todos por vuestro currazo
 
hola!!!!

Sabeis de algun script q funcione para actualizar las ddns en cloudflare? me extraña q no lo tengais por aqui!!!!

muchas gracias a todos por vuestro currazo
Hola, no tengo cuenta en cloudflare, pero prueba este script y nos cuentas que tal va antes de añadirlo al índice.

Bash:
# Update Cloudflare DNS IPv4 address script
# RouterOS version >= 6.44 is required

# ** CONFIGURE SECTION **

# WAN IPv4 interface
:local wanif    "wan1"

# Cloudflare section
:local email    "e-mail"
:local key      "token"
:local zoneId   "zoneId"
:local hostId   "hostId"

# Domain hostname
:local hostName "host.yourdomain.com"

# ** END OF CONFIGURE SECTION **

# Get WAN interface IPv4 address
:global ip4wan
:local ip4new [/ip address get [/ip address find interface=$wanif] address]
:set ip4new [:pick [:tostr $ip4new] 0 [:find [:tostr $ip4new] "/"]]

:if ([:len $ip4new] = 0) do={
  :log error "[Cloudflare DDNS] Could not get IPv4 for interface $wanif"
  :error "[Cloudflare DDNS] Could not get IPv4 for interface $wanif"
}

:if ($ip4new != $ip4wan) do={

  :log info "[Cloudflare DDNS] WAN IPv4 address for interface $wanif has been changed to $ip4new."

  :local url    "https://api.cloudflare.com/client/v4/zones/$zoneId/dns_records/$hostId"
  :local header "X-Auth-Email: $email, X-Auth-Key: $key, content-type: application/json"
  :local data   "{\"type\":\"A\",\"name\":\"$hostName\",\"content\":\"$ip4new\",\"ttl\":120}"

#  :log info "[Cloudflare DDNS] URL: $url"
#  :log info "[Cloudflare DDNS] HEADER: $header"
#  :log info "[Cloudflare DDNS] DATA: $data"
  :log info "[Cloudflare DDNS] Updating host $hostName address."

  :local jsonAnswer [/tool fetch mode=https http-method=put http-header-field=$header http-data=$data url=$url as-value output=user]

  :if ([:len $jsonAnswer] > 0) do={

    /system script run "JParseFunctions"; global JSONLoads; global JSONUnload
    :local result ([$JSONLoads ($jsonAnswer->"data")]->"success")
    $JSONUnload

    :if ($result = true) do={
      :log info "[Cloudflare DDNS] Successfully updated IPv4 address to $ip4new."
      :set ip4wan $ip4new
    } else={
      :log error "[Cloudflare DDNS] Error while updating IPv4 address."
    }
  } else={
    :log error "[Cloudflare DDNS] No answer from Cloudflare API."
  }
}

S@lu2.
 
Hola, no tengo cuenta en cloudflare, pero prueba este script y nos cuentas que tal va antes de añadirlo al índice.

Bash:
# Update Cloudflare DNS IPv4 address script
# RouterOS version >= 6.44 is required

# ** CONFIGURE SECTION **

# WAN IPv4 interface
:local wanif    "wan1"

# Cloudflare section
:local email    "e-mail"
:local key      "token"
:local zoneId   "zoneId"
:local hostId   "hostId"

# Domain hostname
:local hostName "host.yourdomain.com"

# ** END OF CONFIGURE SECTION **

# Get WAN interface IPv4 address
:global ip4wan
:local ip4new [/ip address get [/ip address find interface=$wanif] address]
:set ip4new [:pick [:tostr $ip4new] 0 [:find [:tostr $ip4new] "/"]]

:if ([:len $ip4new] = 0) do={
  :log error "[Cloudflare DDNS] Could not get IPv4 for interface $wanif"
  :error "[Cloudflare DDNS] Could not get IPv4 for interface $wanif"
}

:if ($ip4new != $ip4wan) do={

  :log info "[Cloudflare DDNS] WAN IPv4 address for interface $wanif has been changed to $ip4new."

  :local url    "https://api.cloudflare.com/client/v4/zones/$zoneId/dns_records/$hostId"
  :local header "X-Auth-Email: $email, X-Auth-Key: $key, content-type: application/json"
  :local data   "{\"type\":\"A\",\"name\":\"$hostName\",\"content\":\"$ip4new\",\"ttl\":120}"

#  :log info "[Cloudflare DDNS] URL: $url"
#  :log info "[Cloudflare DDNS] HEADER: $header"
#  :log info "[Cloudflare DDNS] DATA: $data"
  :log info "[Cloudflare DDNS] Updating host $hostName address."

  :local jsonAnswer [/tool fetch mode=https http-method=put http-header-field=$header http-data=$data url=$url as-value output=user]

  :if ([:len $jsonAnswer] > 0) do={

    /system script run "JParseFunctions"; global JSONLoads; global JSONUnload
    :local result ([$JSONLoads ($jsonAnswer->"data")]->"success")
    $JSONUnload

    :if ($result = true) do={
      :log info "[Cloudflare DDNS] Successfully updated IPv4 address to $ip4new."
      :set ip4wan $ip4new
    } else={
      :log error "[Cloudflare DDNS] Error while updating IPv4 address."
    }
  } else={
    :log error "[Cloudflare DDNS] No answer from Cloudflare API."
  }
}

S@lu2.

este lo tengo puesto ahora mismo con los siguientes cambios

# WAN IPv4 interface
:local wanif "ether1" (nombre de mi puerto wan)

# Cloudflare section
:local email "mi email de cloudflare"
:local key "token de zona"
:local zoneId "id de zona"
:local hostId "id de la cuenta"

# Domain hostname
:local hostName "midominio.es"



todo puede ser q yo ponga algo mal, q seria lo mas logico, pero por mucho q he buscado todo me lleva a poner esos datos en esos sitios
 
Arriba