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
- Cliente de correo configurado en el router:
/tool e-mail set server=<smtp> port=587 from=alertas@ticontel.com.mx user=<usuario> password=<clave> tls=starttls - Hora del router sincronizada por NTP (necesaria para el asunto con fecha/hora correctas).
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ínea | Qué 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=$backupfile | Exporta toda la configuración del router a un archivo de texto legible con el nombre definido en $backupfile. |
| :delay 10s | Pausa 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=$bakfile | Genera el respaldo binario completo del sistema. dont-encrypt=yes lo guarda sin cifrar para poder restaurarlo sin contraseña. |
| :delay 10s | Pausa 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 10s | Pausa 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 $backupfile | Borra del router el archivo .rsc ya enviado. |
| /file remove ($bakfile . “.backup”) | Borra del router el archivo .backup ya enviado. |
| :delay 5s | Pausa 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.).
: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ínea | Qué hace |
|---|---|
| :local i 0 | Crea 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 5s | Pausa 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-status | Significado | Acción del script |
|---|---|---|
| in-progress | Envío en curso | Espera (sondeo cada 5s) |
| succeeded | Correo enviado | Reinicia el router |
| failed | Envío fallido | Aborta 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.