23 октября, 2014

Mikrotik - автоматический бэкап на FTP или E-mail

Микротик - отличная штука, чего и говорить. Многие мои знакомые по моей рекомендации купили себе эти роутеры. Настройку их, конечно же, поручали мне, т.к. самое сложное, что они максимум видели до этого - это прошивка для роутеров ASUS "от энтузиастов" (к слову, тоже очень милая вещь, но сейчас не об этом), ну а по сравнению с ней процедура настройки микротика выглядит для таких людей каким-то диким колдунством. Некоторые из вышеуказанных знакомых так и пользуются роутером в том виде, в котором я им его настроил (либо просят внести какие-либо изменения меня, что я делаю удаленно), иные же пытаются вносить изменения в настройки и экспериментировать самостоятельно. Последнее весьма похвально, но иногда приводит к неприятным последствиям. Впрочем, даже если пользователь ничего не правит в настройках роутера, никто не защищен от ситуаций, из-за которых роутер может прийти в негодность (примеров можно придумать массу). Для минимизации возможных неприятных последствий я написал скрипт, который каждый день создает бэкап и заливает его на мой FTP-сервер.

Исходник скрипта на github

:local saveUserDB true
:local saveSysBackup true
:local encryptSysBackup false
:local saveRawExport true
:local FTPServer "ftpserver.tld"
:local FTPPort 21
:local FTPUser "my-mikrotik"
:local FTPPass "SecurePassword"
:local ts [/system clock get time]
:set ts ([:pick $ts 0 2].[:pick $ts 3 5].[:pick $ts 6 8])
:local ds [/system clock get date]
:set ds ([:pick $ds 7 11].[:pick $ds 0 3].[:pick $ds 4 6])
:local fname ("BACKUP-".[/system identity get name]."-".$ds."-".$ts)
:local sfname ("/".$fname)
:if ($saveUserDB) do={
/tool user-manager database save name=($sfname.".umb")
:log info message="User Manager DB Backup Finished"
}
:if ($saveSysBackup) do={
:if ($encryptSysBackup = true) do={ /system backup save name=($sfname.".backup") }
:if ($encryptSysBackup = false) do={ /system backup save dont-encrypt=yes name=($sfname.".backup") }
:log info message="System Backup Finished"
}
if ($saveRawExport) do={
/export file=($sfname.".rsc")
:log info message="Raw configuration script export Finished"
}
:local backupFileName ""
:foreach backupFile in=[/file find] do={
:set backupFileName ("/".[/file get $backupFile name])
:if ([:typeof [:find $backupFileName $sfname]] != "nil") do={
/tool fetch address=$FTPServer port=$FTPPort src-path=$backupFileName user=$FTPUser mode=ftp password=$FTPPass dst-path=$backupFileName upload=yes
}
}
:delay 5s
:foreach backupFile in=[/file find] do={
:if ([:typeof [:find [/file get $backupFile name] "BACKUP-"]]!="nil") do={
/file remove $backupFile
}
}
:log info message="Successfully removed Temporary Backup Files"
:log info message="Automatic Backup Completed Successfully"


Первые четыре строки задают переменные, касающиеся того, что именно и как бэкапить:
saveUserDB - бэкапить ли базу User Manager'a
saveSysBackup - сохранять ли системный бэкап (аналогично тому, который создается по команде /system backup save в консоли)
encryptSysBackup - шифровать ли системный бэкап (поддерживается начиная с RouterOS 6.13)
saveRawExport - сохранять ли бэкап всей конфигурации в "читабельном" виде (.rsc-скрипт)

Следующие четыре строки описывают настройки для подключения к FTP и вряд ли нуждаются в комментировании.

По дополнительным просьбам сделал аналогичный скрипт, отсылающий бэкап на e-mail вместо заливки по FTP. Правда, ввиду ограничений RouterOS, каждый файл из бэкапа отправляется только отдельным письмом (т.е. получается до трех писем за один раз).

Исходник на github

:local saveUserDb true
:local saveSysBackup true
:local encryptSysBackup false
:local saveRawExport true
:local mailTo "destination@email.tld"
:local ts [/system clock get time]
:set ts ([:pick $ts 0 2].[:pick $ts 3 5].[:pick $ts 6 8])
:local ds [/system clock get date]
:set ds ([:pick $ds 7 11].[:pick $ds 0 3].[:pick $ds 4 6])
:local fname ("BACKUP-".[/system identity get name]."-".$ds."-".$ts)
:local sfname ("/".$fname)
:if ($saveUserDb) do={
/tool user-manager database save name=($sfname.".umb")
:log info message="User Manager DB Backup Finished"
}
:if ($saveSysBackup) do={
:if ($encryptSysBackup) do={
/system backup save name=($sfname.".backup")
}
else={
/system backup save dont-encrypt=yes name=($sfname.".backup")
}
:log info message="System Backup Finished"
}
if ($saveRawExport) do={
/export file=($sfname.".rsc")
:log info message="Raw configuration script export Finished"
}
:foreach backupFile in=[/file find] do={
:set backupFileName ("/".[/file get $backupFile name])
:if ([:typeof [:find $backupFileName $sfname]] != "nil") do={
/tool email send subject=([:pick $backupFileName 1 [:len $backupFileName]]) to=$mailTo file=$backupFileName
}
}
:delay 5s
:foreach backupFile in=[/file find] do={
:if ([:typeof [:find [/file get $backupFile name] "BACKUP-"]]!="nil") do={
/file remove $backupFile
}
}
:log info message="Successfully removed Temporary Backup Files"
:log info message="Automatic Backup Completed Successfully"


Настройки аналогичны первому скрипту, разве что нужно задать в переменной mailTo адрес, на который будут отправляться бэкапы.
Если вы планируете использовать скрипт, отправляющий резервные копии на почту, обязательно сначала задайте настройки отправки почты (подробно можно почитать в Mikrotik Wiki)

После добавления скрипта (допустим, мы его назвали "backup-script"), необходимо добавить задание в планировщик:
/system scheduler add interval=1d name="Run backup" on-event=backup-script \
policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive start-date=jan/01/1970 start-time=01:00:00

3 комментария:

  1. В шестой версии RouterOS
    bad command name user-manager (line 22 column 9)
    Подскажите, как быть?

    ОтветитьУдалить
    Ответы
    1. Можно уточнить полный номер версии? В актуальной 6.33.1 скрипт выполняется без проблем, с версиями ниже, по-моему, чем 6.15, могут быть ошибки из-за несколько изменившегося синтаксиса.

      Решается либо правкой команды под старый синтаксис (сам я уже не вспомню, что там именно изменилось, и роутеров с такой старой версией у меня уже тоже не осталось), либо обновлением до актуальной версии :)

      Удалить
    2. Необходимо скачать и установить пакет User Manager. Это Extra Package
      https://wiki.mikrotik.com/wiki/User_Manager/Getting_started#Download

      Удалить