Saltar al contenido
Blog TIContel
Regresar

Script que envía por correo la configuración de equipos con RouterOS

Script que envía por correo la configuración de equipos con RouterOS

Este procedimiento documenta un script de RouterOS que genera el respaldo de configuración de un router MikroTik, lo envía por correo como adjuntos y lo elimina del router. Se presentan dos versiones: una de respaldo simple y otra que reinicia el equipo solo si el correo se confirmó enviado. Probado en RouterOS 7.23.1.

El script produce dos archivos: la configuración exportada en texto (.rsc, legible y editable) y el respaldo binario (.backup, restauración completa del equipo). Ambos se adjuntan al correo y luego se eliminan del almacenamiento local del router para no acumular basura.

Requisitos previos

Versión 1 — Respaldo simple (sin reinicio)

Crea el .rsc y el .backup, los envía por correo y borra los temporales. Es la versión para respaldos programados periódicos vía Scheduler.

:log warning message="BACKUP: Iniciando respaldo en $[/system identity get name]"
:global data [/system clock get date]
:global hora [/system clock get time]
:global backupfile ("Respaldo_" . [/system identity get name] . ".rsc")
:global bakfile ("Respaldo_" . [/system identity get name])
:log warning message="BACKUP: Creando export .rsc..."
/export file=$backupfile
:delay 10s
:log warning message="BACKUP: Creando backup binario .backup..."
/system backup save dont-encrypt=yes name=$bakfile
:delay 10s
:log warning message="BACKUP: Enviando por correo..."
/tool e-mail send to="alertas@ticontel.com.mx" subject=("Respaldo " . [/system identity get name] . " " . $data . " " . $hora) from=alertas@ticontel.com.mx file=($backupfile,($bakfile . ".backup")) body=("Respaldo automatico de " . [/system identity get name] . "
Fecha: " . $data . "
Hora: " . $hora)
:delay 10s
:log warning message="BACKUP: Eliminando archivos temporales..."
/file remove $backupfile
/file remove ($bakfile . ".backup")
:delay 5s
:log warning message="BACKUP: Respaldo finalizado en $[/system identity get name]"

Explicación línea por línea (Versión 1)

LíneaQué hace
:log warning message=“BACKUP: Iniciando respaldo en $[/system identity get name]“Escribe en el log del router un mensaje de severidad warning marcando el inicio del proceso. $[/system identity get name] inserta el nombre del router para identificarlo en el log.
:global data [/system clock get date]Crea la variable global data con la fecha actual del reloj del router.
:global hora [/system clock get time]Crea la variable global hora con la hora actual del reloj del router.
:global backupfile (“Respaldo_” . [/system identity get name] . “.rsc”)Arma el nombre del archivo de exportación de texto, concatenando “Respaldo_” + nombre del router + “.rsc”. El punto . es el operador de concatenación de RouterOS.
:global bakfile (“Respaldo_” . [/system identity get name])Arma el nombre base del respaldo binario, sin extensión (RouterOS le añade .backup automáticamente al guardar).
:log warning message=“BACKUP: Creando export .rsc…”Log informativo: anuncia que va a crear el export de texto.
/export file=$backupfileExporta toda la configuración del router a un archivo de texto legible con el nombre definido en $backupfile.
:delay 10sPausa 10 segundos para dar tiempo a que el archivo termine de escribirse en el almacenamiento antes de continuar.
:log warning message=“BACKUP: Creando backup binario .backup…”Log informativo: anuncia la creación del respaldo binario.
/system backup save dont-encrypt=yes name=$bakfileGenera el respaldo binario completo del sistema. dont-encrypt=yes lo guarda sin cifrar para poder restaurarlo sin contraseña.
:delay 10sPausa para asegurar que el archivo binario quede escrito por completo.
:log warning message=“BACKUP: Enviando por correo…”Log informativo: anuncia el envío del correo.
/tool e-mail send to=“alertas@ticontel.com.mx” subject=(…) from=alertas@ticontel.com.mx file=($backupfile,($bakfile . “.backup”)) body=(…)Envía el correo con ambos adjuntos. subject compone el asunto con nombre del router, fecha y hora. file=(…) adjunta el .rsc y el .backup (a este último se le concatena la extensión). body arma el cuerpo del mensaje; son saltos de línea.
:delay 10sPausa para dar margen al envío SMTP antes de borrar los archivos.
:log warning message=“BACKUP: Eliminando archivos temporales…”Log informativo: anuncia la limpieza de los archivos generados.
/file remove $backupfileBorra del router el archivo .rsc ya enviado.
/file remove ($bakfile . “.backup”)Borra del router el archivo .backup ya enviado.
:delay 5sPausa breve antes de cerrar.
:log warning message=“BACKUP: Respaldo finalizado en $[/system identity get name]“Log final que confirma que el proceso terminó.

Versión 2 — Respaldo + reinicio condicional

Idéntica a la anterior, pero al final reinicia el router. El reinicio no es ciego: en lugar de un retardo fijo, el script sondea el estado real del envío SMTP y solo reinicia si el correo se confirmó enviado. Recomendada para mantenimientos donde se requiere reinicio (aplicación de kernel, limpieza de memoria, etc.).

Diagrama de flujo del respaldo con reinicio condicional

:log warning message="BACKUP: Iniciando respaldo+reinicio en $[/system identity get name]"
:global data [/system clock get date]
:global hora [/system clock get time]
:global backupfile ("Respaldo_" . [/system identity get name] . ".rsc")
:global bakfile ("Respaldo_" . [/system identity get name])
:log warning message="BACKUP: Creando export .rsc..."
/export file=$backupfile
:delay 10s
:log warning message="BACKUP: Creando backup binario .backup..."
/system backup save dont-encrypt=yes name=$bakfile
:delay 10s
:log warning message="BACKUP: Enviando por correo..."
/tool e-mail send to="alertas@ticontel.com.mx" subject=("Respaldo " . [/system identity get name] . " " . $data . " " . $hora) from=alertas@ticontel.com.mx file=($backupfile,($bakfile . ".backup")) body=("Respaldo automatico de " . [/system identity get name] . "
Fecha: " . $data . "
Hora: " . $hora)
:local i 0
:while ([/tool e-mail get last-status] = "in-progress" && $i < 12) do={ :delay 5s; :set i ($i + 1) }
:log warning message="BACKUP: Eliminando archivos temporales..."
/file remove $backupfile
/file remove ($bakfile . ".backup")
:delay 5s
:if ([/tool e-mail get last-status] = "succeeded") do={
    :log warning message="BACKUP: Correo enviado OK, reiniciando $[/system identity get name]..."
    /system reboot
} else={
    :log error message="BACKUP: Fallo envio correo (status: $[/tool e-mail get last-status]), ABORTANDO reinicio"
}

Explicación línea por línea (Versión 2)

Las primeras líneas (del log inicial hasta el /tool e-mail send) son idénticas a la Versión 1, salvo que el mensaje de inicio dice “respaldo+reinicio”. A continuación solo se explican las líneas que cambian:

LíneaQué hace
:local i 0Crea una variable local i en cero, que servirá de contador del bucle de espera.
:while ([/tool e-mail get last-status] = “in-progress” && $i < 12) do={ :delay 5s; :set i ($i + 1) }Bucle de espera: mientras el estado del último correo sea in-progress y el contador sea menor a 12, espera 5 segundos e incrementa el contador. Espera el resultado real del envío con un tope de 60 segundos (12 × 5s) para no colgarse si el SMTP se traba.
/file remove $backupfile y /file remove ($bakfile . “.backup”)Borran los temporales una vez terminada la espera del envío.
:delay 5sPausa breve antes de la decisión de reinicio.
:if ([/tool e-mail get last-status] = “succeeded”) do={ … }Evalúa el estado final del correo. Si es succeeded (enviado), registra el log de éxito y ejecuta /system reboot para reiniciar el router.
} else={ :log error message=”…ABORTANDO reinicio” }Si el estado no es succeeded (fallo o timeout), registra un log de error con el estado real y no reinicia, dejando el router accesible para revisión.

Por qué el sondeo en vez de un retardo fijo

El envío SMTP en RouterOS es asíncrono: el comando /tool e-mail send retorna de inmediato y el envío real ocurre en segundo plano. Un :delay 10s fijo no garantiza que el correo haya salido; si el router reinicia antes de terminar el envío, se pierde el respaldo de ese ciclo. Consultar /tool e-mail get last-status en un bucle resuelve esto: solo se reinicia cuando el estado confirma el envío.

Estado de last-statusSignificadoAcción del script
in-progressEnvío en cursoEspera (sondeo cada 5s)
succeededCorreo enviadoReinicia el router
failedEnvío fallidoAborta el reinicio, log de error

Programación con Scheduler

Para automatizar la versión simple en respaldos periódicos (ejemplo, diario a las 03:00):

/system scheduler add name=respaldo-correo interval=1d start-time=03:00:00 on-event="<nombre-del-script>"

La versión con reinicio se ejecuta bajo demanda o en ventanas de mantenimiento; no se recomienda programarla en horario productivo.


Compartir esta publicación:

Publicación anterior
Alta de un PVE en Zabbix con Proxmox VE by HTTP + ICMP
Publicación siguiente
Desinstalación y reinstalación limpia de Microsoft 365 en Windows 11 (ODT)